123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578 |
- <template>
- <div style="font-size: 0; background-color: #fff">
- <img
- src="https://cxzx.smcic.net/zhoubao/assets/tv01.jpg"
- width="100%"
- class="content"
- style="margin-bottom: 1em; display: block"
- alt=""
- />
- <p
- class="content"
- :style="
- 'text-indent: 2em; font-weight: 700; padding: 0.5em 3px;font-size: ' +
- fontSize +
- 'px;'
- "
- v-html="title.desc"
- ></p>
- <div :style="'height: ' + fontSize + 'px;'"></div>
- <div class="tv-list" :style="'font-size:' + fontSize + 'px'">
- <div class="content">
- <!-- <div class="titleTop">
- <p v-text="title.company"></p>
- <p v-text="title.name"></p>
- <p v-text="title.title"></p>
- </div> -->
- <div class="itemHead">
- <van-row>
- <van-col span="3" class="td"> 排名 </van-col>
- <van-col span="7" class="td"> 频道 </van-col>
- <van-col span="5">
- <van-popover
- v-model="fene"
- trigger="click"
- @select="fene = !fene"
- >
- <div style="padding: 5px">
- 市场份额=本频道收视率/所有频道收视率
- </div>
- <template #reference>
- <p class="td">市场份额</p>
- </template>
- </van-popover>
- </van-col>
- <!-- td2 :style="width > 667 ? 'line-height: 2.5em' : 'line-height: 1.5em'" -->
- <van-col span="7">
- <van-popover
- v-model="shichang"
- trigger="click"
- @select="shichang = !shichang"
- >
- <div style="padding: 5px">
- 市场份额=本频道收视率/所有频道收视率
- </div>
- <template #reference>
- <p class="td">周人均时长(分)</p>
- </template>
- </van-popover>
- </van-col>
- <van-col span="2" class="td">
- <img
- src="../../../assets/image/shou.png"
- width="26px"
- alt=""
- style="vertical-align: middle"
- />
- </van-col>
- </van-row>
- </div>
- <div v-for="(v, o) in platfromData || []" :key="v.name">
- <div
- style="border-bottom: 1px dashed #eee; margin: 11px 0 0 0"
- v-if="o === 20"
- ></div>
- <van-row
- :style="v.shanxi_channel ? 'background: #F5DEB3' : ''"
- class="item"
- @click="() => showPopup(o)"
- >
- <van-col
- span="3"
- :class="{ td: true }"
- :style="{ color: color[o] || '#000', fontWeight: 600 }"
- >
- {{ v.rank }}
- </van-col>
- <van-col
- :style="v.shanxi_channel ? 'font-weight: 600' : ''"
- span="7"
- :class="{ td: true }"
- >
- {{ v.channelname }}
- </van-col>
- <van-col span="5" :class="{ td: true }">
- {{ formatNum(v.occrate, 2) }}%
- <van-icon
- v-if="v.occrate_change !== '相等'"
- name="down"
- :color="v.occrate_change === '上升' ? '#f00' : '#0f0'"
- :class="{ rise: v.occrate_change === '上升' }"
- />
- </van-col>
- <van-col span="7" :class="{ td: true }">
- {{ timeFormat(v.user_duration) }}
- <van-icon
- v-if="v.user_duration_change !== '相等'"
- name="down"
- :color="v.user_duration_change === '上升' ? '#f00' : '#0f0'"
- :class="{ rise: v.user_duration_change === '上升' }"
- />
- </van-col>
- <van-col span="2" class="td" style="cursor: pointer">
- <van-icon name="arrow" />
- </van-col>
- </van-row>
- </div>
- <van-popup
- :style="{ height: '100%', width: '100%' }"
- position="right"
- v-model="show"
- >
- <div class="main">
- <van-cell
- title-style="flex: 3"
- :title="ratios.schedulename"
- :label="ratios.channelname"
- >
- <div
- @click="show = false"
- style="color: #5470c6; cursor: pointer"
- >
- <van-icon name="revoke" />
- {{ ratios.channelname }}
- </div>
- </van-cell>
- <van-cell-group title="视听收视新指标">
- <van-row>
- <van-col span="10" class="td" style="text-align: right;"> 收视总时长: </van-col>
- <van-col span="14" class="td">
- <counto
- :startVal="0"
- :endVal="ratios.timecount || 0"
- :duration="1000"
- ></counto>
- <span v-if="ratios.timecountP">.</span>
- {{
- (ratios.timecountP > 0 ? ratios.timecountP : "") +
- ratios.timecountWei
- }}
- </van-col>
- <van-col span="10" class="td" style="text-align: right;"> 收视总次数: </van-col>
- <van-col span="14" class="td">
- <counto
- :startVal="0"
- :endVal="ratios.hitcount || 0"
- :duration="1000"
- ></counto>
- <span v-if="ratios.hitcountP">.</span>
- {{
- (ratios.hitcountP > 0 ? ratios.hitcountP : "") +
- ratios.hitcountWei
- }}
- </van-col>
- <van-col span="10" class="td" style="text-align: right;"> 周活跃户数: </van-col>
- <van-col span="14" class="td">
- <counto
- :startVal="0"
- :endVal="ratios.usrcount || 0"
- :duration="1000"
- ></counto>
- <span v-if="ratios.usrcountP">.</span>
- {{
- (ratios.usrcountP > 0 ? ratios.usrcountP : "") +
- ratios.usrcountWei
- }}
- </van-col>
- </van-row>
- </van-cell-group>
- <van-cell-group title="传统指标">
- <van-row>
- <van-col span="5" class="td"> 到达率: </van-col>
- <van-col span="5" class="td"
- >{{ formatNum(ratios.reachrate, 2) }}%
- </van-col>
- <van-col span="7" class="td"> 周人均时长: </van-col>
- <van-col span="7" class="td"
- >{{ timeFormat(ratios.user_duration, 0) }}分钟
- </van-col>
- <van-col span="5" class="td"> 收视率: </van-col>
- <van-col span="5" class="td">
- {{ formatNum(ratios.watchrate, 2) }}%
- </van-col>
- <van-col span="7" class="td"> 市场占有率: </van-col>
- <van-col span="7" class="td"
- >{{ formatNum(ratios.occrate, 2) }}%
- </van-col>
- <van-col span="5" class="td"> 忠诚度: </van-col>
- <van-col span="5" class="td"
- >{{ formatNum(ratios.loyalty, 2) }}%
- </van-col>
- </van-row>
- </van-cell-group>
- <div ref="pie"></div>
- <div ref="day"></div>
- </div>
- <div class="bottom content">
- 本数据由“陕西广电融媒体集团大数据平台”提供。
- <p>
- 技术支持 <span style="white-space: nowrap">白帆13325452244;</span
- ><span style="white-space: nowrap">陈科18629350958。</span>
- </p>
- </div>
- </van-popup>
- </div>
- <div class="bottom content">
- 本数据由“陕西广电融媒体集团大数据平台”提供。
- <p>
- 技术支持 <span style="white-space: nowrap">白帆13325452244;</span
- ><span style="white-space: nowrap">陈科18629350958。</span>
- </p>
- </div>
- </div>
- </div>
- </template>
- <script>
- // @ is an alias to /src
- import counto from "@/components/counto/vue-countTo.vue";
- import watermark from "watermark-package";
- import {
- Col as vanCol,
- Row as vanRow,
- Icon as vanIcon,
- Popup as vanPopup,
- cellGroup as vanCellGroup,
- Cell as vanCell,
- Popover as vanPopover,
- } from "vant";
- import "vant/lib/popover/style/index";
- import "vant/lib/cell-group/style/index";
- import "vant/lib/cell/style/index";
- import "vant/lib/popup/style/index";
- import "vant/lib/icon/style/index";
- import "vant/lib/col/style/index";
- import "vant/lib/row/style/index";
- // import {} from "../utils/tool";
- import Dayjs from "dayjs";
- import { jsonZhou } from "../../../api/index";
- import echarts from "../../../utils/echarts";
- export default {
- name: "tv-list",
- data() {
- return {
- shichang: false,
- fene: false,
- fontSize: 17,
- show: false,
- charts: undefined,
- ratios: {},
- platfromData: [],
- color: ["#ff0036", "#ff9b00", "#ffcc00"],
- echarts: undefined,
- dayEcharts: undefined,
- title: {},
- width: document.body.offsetWidth || 0,
- };
- },
- watch: {},
- mounted() {
- if (
- this.$route.query.auto !==
- "06fd56cdf5a6cfc3a2139cc8514d05aa0439ee8c1fb4d81145bc9647"
- )
- return;
- this.fontSize = (document.body.offsetWidth / 24).toFixed(2) - 0;
- if (document.body.offsetWidth > 677) this.fontSize = 22;
- watermark.setWaterMark({
- w_texts: ["陕西视听大数据"],
- w_options: {
- w_opacity: "0.1",
- },
- });
- const time = new Date(this.$route.query.date);
- let D = new Date(time);
- const lasetDay = new Dayjs(D.getTime() - D.getDay() * 86400000);
- const firstDay = new Dayjs(lasetDay - 6 * 86400000);
- jsonZhou({
- start: firstDay.format("YYYYMMDD"),
- end: lasetDay.format("YYYYMMDD"),
- })
- .then(res => {
- const title = {
- company: res.company || "",
- name: res.name || "",
- title: res.title || "",
- desc: res.desc || "",
- };
- this.title = title;
- this.platfromData = res.list || [];
- this.$emit("start", {
- status: 200,
- });
- })
- .catch(err => {
- this.$emit("start", {
- status: err,
- });
- });
- window.onresize = () => {
- const doc = document.body;
- const width = doc.offsetWidth - 32;
- let height = (width / 4) * 3;
- this.width = document.body.offsetWidth || 0;
- this.dayEcharts &&
- this.dayEcharts.resize({
- width,
- height: width,
- });
- this.echarts &&
- this.echarts.resize({
- width,
- height,
- });
- };
- },
- computed: {},
- methods: {
- formatNum(num, w) {
- if (isNaN(num)) return 0;
- return Number(num).toFixed(w || 4) - 0;
- },
- formatType(num, W) {
- let N = this.formatNum(num, 2);
- let wei = "";
- if (N >= 100000000) {
- N = (N / 100000000).toFixed(W || 2);
- wei = "亿";
- } else if (N >= 10000) {
- N = (N / 10000).toFixed(W || 2);
- wei = "万";
- }
- N = N.toString().split(".");
- return {
- N: (N[0] || 0) * 1,
- P: N[1] || 0,
- wei,
- };
- },
- timeFormat(t, w) {
- const Time = t || 0;
- let out = Time.toFixed(w || 0) - 0;
- return out;
- },
- showPopup(i) {
- this.show = true;
- const reaios = JSON.parse(JSON.stringify(this.platfromData[i] || {}));
- let hitcount = this.formatType(reaios.hitcount, 1);
- reaios.hitcount = hitcount.N;
- reaios.hitcountP = hitcount.P;
- reaios.hitcountWei = hitcount.wei;
- let usrcount = this.formatType(reaios.usrcount, 1);
- reaios.usrcount = usrcount.N;
- reaios.usrcountP = usrcount.P;
- reaios.usrcountWei = usrcount.wei;
- let timecount = this.formatType(reaios.timecount / 60, 1);
- reaios.timecount = timecount.N;
- reaios.timecountP = timecount.P;
- reaios.timecountWei = timecount.wei + "小时";
- this.ratios = reaios;
- this.$nextTick(() => {
- this.upEcharts();
- this.dayEchartsFun();
- });
- },
- dayEchartsFun() {
- this.dayEcharts && this.dayEcharts.clear && this.dayEcharts.clear();
- if (!this.dayEcharts) {
- const doc = document.body;
- const width = doc.offsetWidth - 32;
- let height = (width / 4) * 3;
- if (height > 400) height = 400;
- this.dayEcharts = echarts.init(
- this.$refs.day,
- {},
- {
- width,
- height,
- }
- );
- }
- const key = [],
- value = [];
- this.ratios.detail_list.map(v => {
- let val = v.usrcount;
- key.push(v.dt);
- value.push(val);
- });
- this.dayEcharts.setOption({
- title: {
- text: "家庭户收视规模",
- subtext: this.ratios.usrcount_compare
- ? this.ratios.usrcount_compare + " 单位:户"
- : "单位:户",
- textStyle: {
- fontSize: 14,
- },
- },
- tooltip: {
- show: true,
- trigger: "axis",
- },
- xAxis: {
- type: "category",
- boundaryGap: false,
- data: key,
- },
- grid: {
- right: "25px",
- left: "40px",
- },
- yAxis: {
- type: "value",
- axisLabel: {
- formatter: e => {
- const T = this.formatType(e);
- let out = T.N;
- if (T.P > 0) out += "." + (T.P - 0);
- out += T.wei;
- return out;
- },
- },
- },
- series: [
- {
- type: "line",
- data: value,
- },
- ],
- });
- },
- upEcharts() {
- this.echarts && this.echarts.clear && this.echarts.clear();
- if (!this.echarts) {
- const doc = document.body;
- const width = doc.offsetWidth - 32;
- let height = width;
- if (height > 667) height = 667;
- this.echarts = echarts.init(
- this.$refs.pie,
- {},
- {
- width,
- height,
- }
- );
- }
- this.echarts.setOption({
- title: {
- text: "观看时长用户分布",
- subtext: "单位:%",
- textStyle: {
- fontSize: 14,
- },
- },
- color: [
- "#87cefa",
- "#00bfff",
- "#1e90ff",
- "#0000ff",
- "#00008b",
- "#191970",
- "#000080",
- "#0000cd",
- "#4169e1",
- "#6495ed",
- ],
- series: [
- {
- name: "Nightingale Chart",
- type: "pie",
- radius: [30, 70],
- center: ["50%", "50%"],
- data: this.ratios.duration_list.map(v => {
- let bfb = (v.value * 100).toFixed(0) - 0;
- return {
- value: bfb,
- name: v.range + "\n 占比" + bfb + "%",
- };
- }),
- },
- ],
- });
- },
- },
- beforeUnmount() {},
- components: {
- counto,
- vanCol,
- vanRow,
- vanIcon,
- vanPopup,
- vanCell,
- vanCellGroup,
- vanPopover,
- },
- };
- </script>
- <style scoped>
- .tv-list {
- background-color: #fff;
- padding: 5px;
- height: 100%;
- overflow-y: scroll;
- box-sizing: border-box;
- }
- .bottom {
- border: 4px solid #0983a8;
- margin-top: 1em;
- padding: 10px;
- font-size: 0.9rem;
- padding-left: 5px;
- font-weight: 600;
- overflow: hidden;
- }
- .td {
- text-align: center;
- line-height: 2.5em;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
- .td2 {
- line-height: 1.5em;
- white-space: initial;
- }
- .item {
- overflow: hidden;
- border-radius: 3px;
- margin-top: 11px;
- background-color: #f5f6f8;
- }
- .itemHead {
- margin-top: 0;
- background-color: #f5f6f8;
- }
- .main {
- padding: 0.5em;
- }
- .content {
- margin: 0 auto;
- max-width: 667px;
- }
- .rise {
- /* 上升 */
- transform: rotate(180deg);
- }
- .titleTop {
- padding: 1em 0;
- font-weight: 600;
- background-image: linear-gradient(to right, #014392, #008fc4, #00428c);
- color: #fff;
- text-align: center;
- }
- </style>
- <style>
- .van-cell-group__title {
- font-size: 1.1rem;
- padding-left: 8px;
- color: #000;
- font-weight: 600;
- }
- </style>
|