parent
94a8a66759
commit
6d0488f775
6 changed files with 456 additions and 12 deletions
@ -0,0 +1,127 @@ |
||||
<template> |
||||
<div class="hot-search"> |
||||
<a-row style="margin: 0 -34px"> |
||||
<a-col style="padding: 0 34px; margin-bottom: 24px" :sm="12" :xs="24"> |
||||
<div class="num-info"> |
||||
<span class="title">搜索用户数</span> |
||||
<div class="value"> |
||||
<span class="total">12321</span> |
||||
<span class="subtotal">71.2<a-icon type="caret-up" /></span> |
||||
</div> |
||||
</div> |
||||
<mini-area style="height: 45px" /> |
||||
</a-col> |
||||
<a-col style="padding: 0 34px; margin-bottom: 24px" :sm="12" :xs="24"> |
||||
<div class="num-info"> |
||||
<span class="title">搜索用户数</span> |
||||
<div class="value"> |
||||
<span class="total">2.7</span> |
||||
<span class="subtotal">71.2<a-icon type="caret-down" /></span> |
||||
</div> |
||||
</div> |
||||
<mini-area style="height: 45px" /> |
||||
</a-col> |
||||
</a-row> |
||||
<a-table |
||||
:dataSource="searchData" |
||||
:columns="columns" size="small" |
||||
:pagination="{style: { marginBottom: 0 }, pageSize: 5}" |
||||
> |
||||
<a href="#/" slot="keyword" slot-scope="text">{{text}}</a> |
||||
<span slot="rang" slot-scope="text">{{text}} %<a-icon type="caret-up" /> </span> |
||||
</a-table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import ARow from 'vue-antd-ui/es/grid/Row' |
||||
import ACol from 'vue-antd-ui/es/grid/Col' |
||||
import AIcon from 'vue-antd-ui/es/icon/icon' |
||||
import MiniArea from '../chart/MiniArea' |
||||
import ATable from 'vue-antd-ui/es/table' |
||||
|
||||
const searchData = [] |
||||
for (let i = 0; i < 50; i++) { |
||||
searchData.push({ |
||||
index: i + 1, |
||||
keyword: '关键词-' + i, |
||||
count: Math.floor(Math.random() * 1000), |
||||
range: Math.floor(Math.random() * 100), |
||||
status: Math.floor((Math.random() * 10) % 2) |
||||
}) |
||||
} |
||||
|
||||
const columns = [ |
||||
{ |
||||
title: '排名', |
||||
dataIndex: 'index', |
||||
key: 'index' |
||||
}, |
||||
{ |
||||
title: '搜索关键词', |
||||
dataIndex: 'keyword', |
||||
key: 'keyword', |
||||
scopedSlots: {customRender: 'keyword'} |
||||
}, |
||||
{ |
||||
title: '用户数', |
||||
dataIndex: 'count', |
||||
key: 'count', |
||||
sorter: (a, b) => a.count - b.count |
||||
}, |
||||
{ |
||||
title: '周涨幅', |
||||
dataIndex: 'range', |
||||
key: 'range', |
||||
scopedSlots: {customRender: 'rang'} |
||||
} |
||||
] |
||||
|
||||
export default { |
||||
name: 'HotSearch', |
||||
components: {ATable, MiniArea, AIcon, ARow, ACol}, |
||||
data () { |
||||
return { |
||||
searchData, |
||||
columns |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="less" scoped> |
||||
.num-info{ |
||||
.title{ |
||||
color: rgba(0,0,0,.45); |
||||
font-size: 14px; |
||||
height: 22px; |
||||
line-height: 22px; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
word-break: break-all; |
||||
white-space: nowrap; |
||||
} |
||||
.value{ |
||||
.total{ |
||||
color: rgba(0,0,0,.85); |
||||
display: inline-block; |
||||
line-height: 32px; |
||||
height: 32px; |
||||
font-size: 24px; |
||||
margin-right: 32px; |
||||
} |
||||
.subtotal{ |
||||
color: rgba(0,0,0,.45); |
||||
font-size: 16px; |
||||
vertical-align: top; |
||||
margin-right: 0; |
||||
i{ |
||||
font-size: 12px; |
||||
color: red; |
||||
transform: scale(.82); |
||||
margin-left: 4px; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,71 @@ |
||||
<template> |
||||
<div style=""> |
||||
<a-radio-group> |
||||
<a-radio-button value="a">全渠道</a-radio-button> |
||||
<a-radio-button value="b">线上</a-radio-button> |
||||
<a-radio-button value="c">门店</a-radio-button> |
||||
</a-radio-group> |
||||
<v-chart :forceFit="true" :height="height" :data="data" :scale="scale"> |
||||
<v-tooltip :showTitle="false" dataKey="item*percent" /> |
||||
<v-axis /> |
||||
<v-legend dataKey="item" position="right" :offsetX="-140"/> |
||||
<v-pie position="percent" color="item" :vStyle="pieStyle" :label="labelConfig" /> |
||||
<v-coord type="theta" :radius="0.75" :innerRadius="0.6" /> |
||||
</v-chart> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import ARadio from 'vue-antd-ui/es/radio' |
||||
const DataSet = require('@antv/data-set') |
||||
|
||||
const ARadioGroup = ARadio.Group |
||||
const ARadioButton = ARadio.Button |
||||
|
||||
const sourceData = [ |
||||
{ item: '事例一', count: 40 }, |
||||
{ item: '事例二', count: 21 }, |
||||
{ item: '事例三', count: 17 }, |
||||
{ item: '事例四', count: 13 }, |
||||
{ item: '事例五', count: 9 } |
||||
] |
||||
|
||||
const scale = [{ |
||||
dataKey: 'percent', |
||||
min: 0, |
||||
formatter: '.0%' |
||||
}] |
||||
|
||||
const dv = new DataSet.View().source(sourceData) |
||||
dv.transform({ |
||||
type: 'percent', |
||||
field: 'count', |
||||
dimension: 'item', |
||||
as: 'percent' |
||||
}) |
||||
const data = dv.rows |
||||
export default { |
||||
name: 'SalesData', |
||||
components: {ARadioGroup, ARadioButton}, |
||||
data () { |
||||
return { |
||||
data, |
||||
scale, |
||||
height: 356, |
||||
pieStyle: { |
||||
stroke: '#fff', |
||||
lineWidth: 1 |
||||
}, |
||||
labelConfig: ['percent', { |
||||
formatter: (val, item) => { |
||||
return item.point.item + ': ' + val; |
||||
} |
||||
}] |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
|
||||
</style> |
@ -0,0 +1,59 @@ |
||||
<template> |
||||
<div class="rank"> |
||||
<h4 class="title">{{title}}</h4> |
||||
<ul class="list"> |
||||
<li :key="index" v-for="(item, index) in list"> |
||||
<span :class="index < 3 ? 'active' : null">{{index + 1}}</span> |
||||
<span >{{item.name}}</span> |
||||
<span >{{item.total}}</span> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'RankingList', |
||||
props: ['title', 'list'] |
||||
} |
||||
</script> |
||||
|
||||
<style lang="less" scoped> |
||||
.rank{ |
||||
padding: 0 32px 32px 72px; |
||||
.title{ |
||||
} |
||||
.list{ |
||||
margin: 25px 0 0; |
||||
padding: 0; |
||||
list-style: none; |
||||
li { |
||||
margin-top: 16px; |
||||
span { |
||||
color: rgba(0,0,0,.65); |
||||
font-size: 14px; |
||||
line-height: 22px; |
||||
} |
||||
span:first-child { |
||||
background-color: #f5f5f5; |
||||
border-radius: 20px; |
||||
display: inline-block; |
||||
font-size: 12px; |
||||
font-weight: 600; |
||||
margin-right: 24px; |
||||
height: 20px; |
||||
line-height: 20px; |
||||
width: 20px; |
||||
text-align: center; |
||||
} |
||||
span.active { |
||||
background-color: #314659; |
||||
color: #fff; |
||||
} |
||||
span:last-child { |
||||
float: right; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
Loading…
Reference in new issue