index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <template>
  2. <div>
  3. <el-card>
  4. <el-form :model="skillParams" ref="skillParams" class="clearfix topForm" style="float: left">
  5. <div class="leftForm-skill">
  6. <el-form-item
  7. class="pruductForm-skill"
  8. prop="channel"
  9. label="渠道选择"
  10. :rules="[{ required: true, message: '请选择渠道', trigger: 'blur' }]"
  11. >
  12. <el-select v-model="skillParams.channel" placeholder="请选择渠道" @change="skillChange" style="width:160px">
  13. <el-option key="2016" label="天猫精灵" value="2016" ></el-option>
  14. <el-option key="3001" label="微信小程序" value="3001" ></el-option>
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item class="dateForm-skill" name="data" label="查询日期" style="display:flex">
  18. <el-date-picker
  19. style="width:140px"
  20. v-model="skillParams.startDay"
  21. type="date"
  22. placeholder="起"
  23. ></el-date-picker>
  24. <el-date-picker
  25. style="width:140px"
  26. v-model="skillParams.endDay"
  27. type="date"
  28. placeholder="止"
  29. ></el-date-picker>
  30. </el-form-item>
  31. </div>
  32. <el-form-item>
  33. <el-button type="primary" @click="submitForm('skillParams')">搜索</el-button>
  34. </el-form-item>
  35. </el-form>
  36. <el-button type="primary" @click="onExportExcel" style="float: right">导出</el-button>
  37. <el-table id="table" ref="table1" :data="readerData" border style="width: 100%" :height="tableHeight" >
  38. <el-table-column
  39. label="日期"
  40. fixed
  41. align="left"
  42. header-align="center"
  43. min-width="140px"
  44. >
  45. <template slot-scope="scope">
  46. <span>{{changeDate(scope.row.day)}}</span>
  47. </template>
  48. </el-table-column>
  49. <el-table-column label="流量与观看" header-align="center">
  50. <el-table-column
  51. label="UV"
  52. prop="uv"
  53. align="right"
  54. header-align="center"
  55. min-width="100px"
  56. ></el-table-column>
  57. <el-table-column
  58. label="VIP用户 | -UV1"
  59. align="right"
  60. header-align="center"
  61. :render-header="renderheader"
  62. prop="vipUv"
  63. min-width="120px"
  64. ></el-table-column>
  65. <el-table-column
  66. label="非VIP用户 | UV2=UV-UV1"
  67. align="right"
  68. header-align="center"
  69. :render-header="renderheader"
  70. prop="waitVipUv"
  71. min-width="140px"
  72. ></el-table-column>
  73. <el-table-column
  74. label="VIP用户占比 | =UV1/UV"
  75. align="right"
  76. header-align="center"
  77. :render-header="renderheader"
  78. prop="vipProportion"
  79. min-width="140px"
  80. ></el-table-column>
  81. <el-table-column
  82. label="VIP权限用户 | =V0"
  83. align="right"
  84. header-align="center"
  85. :render-header="renderheader"
  86. prop="vipCount"
  87. min-width="140px"
  88. ></el-table-column>
  89. <el-table-column
  90. label="VIP用户活跃率 | =UV1/V0"
  91. align="right"
  92. header-align="center"
  93. :render-header="renderheader"
  94. min-width="140px"
  95. prop="aliveVipProportion"
  96. >
  97. </el-table-column>
  98. <!-- <el-table-column
  99. label="VV"
  100. prop="vv"
  101. align="right"
  102. header-align="center"
  103. min-width="100px"
  104. ></el-table-column>-->
  105. <el-table-column
  106. label="VV"
  107. align="right"
  108. header-align="center"
  109. :render-header="renderheader"
  110. prop="vv"
  111. min-width="140px"
  112. ></el-table-column>
  113. <el-table-column
  114. label="新增用户"
  115. align="right"
  116. header-align="center"
  117. :render-header="renderheader"
  118. prop="registerAmount"
  119. min-width="140px"
  120. ></el-table-column>
  121. <el-table-column
  122. label="累计用户"
  123. align="right"
  124. header-align="center"
  125. :render-header="renderheader"
  126. prop="totalRegisterAmount"
  127. min-width="140px"
  128. ></el-table-column>
  129. <el-table-column
  130. label="人均播放 | =VV/UV"
  131. align="right"
  132. header-align="center"
  133. :render-header="renderheader"
  134. prop="perCapitaPlay"
  135. min-width="140px"
  136. ></el-table-column>
  137. </el-table-column>
  138. <el-table-column label="拉新,付费与转换率" header-align="center">
  139. <el-table-column
  140. label="连续包月 | -Qm1"
  141. align="right"
  142. header-align="center"
  143. :render-header="renderheader"
  144. prop="consecutiveMonthly"
  145. min-width="100px"
  146. ></el-table-column>
  147. <el-table-column
  148. label="新增连续包月 | -Qm1-1"
  149. align="right"
  150. header-align="center"
  151. :render-header="renderheader"
  152. min-width="140px"
  153. >
  154. <template slot-scope="scope">
  155. <span>{{scope.row.appendConsecutiveMonthly || 0}}</span>
  156. </template>
  157. </el-table-column>
  158. <el-table-column
  159. label="续包月续费 | -Qm1-2"
  160. align="right"
  161. header-align="center"
  162. :render-header="renderheader"
  163. min-width="140px"
  164. >
  165. <template slot-scope="scope">
  166. <span>{{scope.row.continueConsecutiveMonthly || 0}}</span>
  167. </template>
  168. </el-table-column>
  169. <el-table-column
  170. label="月包 | -Qm2"
  171. align="right"
  172. header-align="center"
  173. :render-header="renderheader"
  174. prop="monthlyPayment"
  175. min-width="90px"
  176. ></el-table-column>
  177. <el-table-column
  178. label="年包 | -Qy"
  179. align="right"
  180. header-align="center"
  181. :render-header="renderheader"
  182. prop="yearlyPayment"
  183. ></el-table-column>
  184. <el-table-column
  185. label="付费订单数量| Q=Qm1+Qm2+Qy"
  186. align="right"
  187. header-align="center"
  188. :render-header="renderheader"
  189. prop="totalPayment"
  190. min-width="160px"
  191. ></el-table-column>
  192. <el-table-column
  193. label="r1 | =Qm1/Q"
  194. align="right"
  195. header-align="center"
  196. :render-header="renderheader"
  197. prop="consecutiveConversion"
  198. min-width="130px"
  199. ></el-table-column>// 月包占比
  200. <el-table-column
  201. label="r2 | =Qm2/Q"
  202. align="right"
  203. header-align="center"
  204. :render-header="renderheader"
  205. prop="monthlyConversion"
  206. min-width="130px"
  207. ></el-table-column>// 年包占比
  208. <el-table-column
  209. label="r3 | =Qy/Q"
  210. align="right"
  211. header-align="center"
  212. :render-header="renderheader"
  213. prop="yearlyConversion"
  214. min-width="130px"
  215. ></el-table-column>
  216. <el-table-column
  217. label="R | =(Qm1+Qm2+Qy)/UV2"
  218. align="right"
  219. header-align="center"
  220. :render-header="renderheader"
  221. prop="totalConversion"
  222. min-width="190px"
  223. ></el-table-column>
  224. <!--<el-table-column
  225. label="R1 | =(Qm1-1+Qm2+Qy)/UV2"
  226. align="right"
  227. header-align="center"
  228. :render-header="renderheader"
  229. min-width="190px"
  230. >
  231. <template slot-scope="scope">
  232. <span>{{scope.row.appendTotalConversion || 0}}</span>
  233. </template>
  234. </el-table-column>-->
  235. </el-table-column>
  236. </el-table>
  237. </el-card>
  238. </div>
  239. </template>
  240. <script>
  241. import { mapGetters } from "vuex";
  242. import formatDate from "../../utils/formatTime";
  243. import { getBaiduCourseList } from '../../api/skill'
  244. import downTable from '@/utils/downTable'
  245. export default {
  246. data() {
  247. return {
  248. tableHeight: 500,
  249. dateValue: "",
  250. skillParams: {
  251. startDay: "",
  252. endDay: "",
  253. channel: "",
  254. },
  255. };
  256. },
  257. computed: {
  258. ...mapGetters({
  259. readerData: "readerData"
  260. })
  261. },
  262. created() {
  263. this.$store.dispatch("clearList");
  264. // this.$store.dispatch("getOrderList", this.skillParams);
  265. this.skillParams.startDay = this.getYesterDay();
  266. this.skillParams.endDay = this.getYesterDay();
  267. this.tableHeight = document.documentElement.clientHeight * 0.75;
  268. },
  269. methods: {
  270. // 搜索
  271. submitForm(formName) {
  272. this.skillParams.startDay = this.skillParams.startDay
  273. ? formatDate(this.skillParams.startDay, 2)
  274. : "";
  275. this.skillParams.endDay = this.skillParams.endDay
  276. ? formatDate(this.skillParams.endDay, 2)
  277. : "";
  278. this.$refs[formName].validate(valid => {
  279. if (valid) {
  280. this.$store.dispatch("getReaderData", this.skillParams);
  281. } else {
  282. console.log("error submit!!");
  283. return false;
  284. }
  285. });
  286. this.$refs.table1.doLayout();
  287. },
  288. // 渠道下课程分页
  289. changePage(e) {
  290. this.skillParams.pageNo = e;
  291. // this.$store.dispatch("getSkillData", this.skillParams);
  292. },
  293. // 表头折行
  294. renderheader(h, { column, $index }) {
  295. return h("span", {}, [
  296. h("span", {}, column.label.split("|")[0]),
  297. h("br"),
  298. h("span", {}, column.label.split("|")[1])
  299. ]);
  300. },
  301. getYesterDay() {
  302. let yesterday = new Date().getTime() - 86400000;
  303. return formatDate(yesterday, 2);
  304. },
  305. channelChange(val) {
  306. // 清空数据
  307. this.$store.dispatch("clearList");
  308. },
  309. skillChange(val) {
  310. console.log(val)
  311. },
  312. columnZero() {
  313. return "0";
  314. },
  315. columnZeroPercent(row, column, index) {
  316. if (row.totalPayment && column.property === "yearlyConversion") {
  317. return "100.00%";
  318. } else {
  319. return "0.00%";
  320. }
  321. // if(row.)
  322. },
  323. changeDate(date) {
  324. return formatDate(date, 4)
  325. },
  326. // 导出表格
  327. onExportExcel() {
  328. const name = '朗读配音'
  329. const date = this.skillParams.startDay + '至' + this.skillParams.endDay
  330. downTable('table', [
  331. {wch: 15}, // "characters"
  332. {wch: 6},
  333. {wch: 15},
  334. {wch: 20},
  335. {wch: 20},
  336. {wch: 6},
  337. {wch: 15},
  338. {wch: 15},
  339. {wch: 18},
  340. {wch: 18},
  341. {wch: 10},
  342. {wch: 15},
  343. {wch: 25},
  344. {wch: 10},
  345. {wch: 10},
  346. {wch: 10},
  347. {wch: 20},
  348. {wch: 25}
  349. ], name + date)
  350. }
  351. }
  352. };
  353. </script>
  354. <style lang="less" scoped>
  355. .pruductForm-skill {
  356. margin-left: 10px;
  357. display: flex;
  358. }
  359. .topForm {
  360. display: flex;
  361. align-items: center;
  362. flex-direction: row;
  363. flex-shrink: 0;
  364. justify-content: space-between;
  365. }
  366. .leftForm-skill {
  367. display: flex;
  368. align-items: center;
  369. flex-direction: row;
  370. justify-content: space-between;
  371. }
  372. .dateForm-skill {
  373. margin-left: 18px;
  374. }
  375. </style>