|
@@ -9,67 +9,23 @@
|
9
|
9
|
end-placeholder="结束日期"
|
10
|
10
|
default-value="2019-08-08">
|
11
|
11
|
</el-date-picker></p>
|
12
|
|
- <el-row :gutter="20" :style="{ height: '560px',margin:'20px 0',border:'1px solid #eee',borderRadius:'5px'}">
|
13
|
|
- <el-col :span="14">
|
14
|
|
- <div class="grid-content" ref="firstChart" id="firstChart" :style="{ height: '500px' ,padding:'20px 10px'}" >
|
15
|
|
- </div>
|
16
|
|
- </el-col>
|
17
|
|
- <el-col :span="10" :style="{ height: '560px',borderLeft:'1px solid #eee'}">
|
18
|
|
- <div class="grid-content" ref="secondChart" id="secondChart" :style="{ height: '500px',padding:'20px 10px'}" >
|
19
|
|
- </div>
|
20
|
|
-<!-- <pie-second-chart :style="{ height: '500px',padding:'20px 10px'}" ></pie-second-chart>-->
|
21
|
|
- </el-col>
|
22
|
|
- </el-row>
|
23
|
|
- <el-select :style="{ margin:'10px 0'}" v-model="registeredType" @change="getInfo" placeholder="请选择">
|
24
|
|
- <el-option
|
25
|
|
- v-for="item in options"
|
26
|
|
- :key="item.value"
|
27
|
|
- :label="item.label"
|
28
|
|
- :value="item.value">
|
29
|
|
- </el-option>
|
30
|
|
- </el-select>
|
31
|
|
- <el-table :data="tableData2" border center style="width: 100%">
|
32
|
|
- <el-table-column label="类型" prop="fromName" width="120" />
|
33
|
|
- <template v-for="(item, index ) in header">
|
34
|
|
- <el-table-column :label="header[index]" :prop="header[index]" :key="index" width="110"/>
|
35
|
|
- </template>
|
36
|
|
-
|
37
|
|
-
|
38
|
|
- </el-table>
|
39
|
|
-
|
|
12
|
+ <user-source :value="userData" mode="all"></user-source>
|
40
|
13
|
</div>
|
41
|
14
|
</template>
|
42
|
15
|
|
43
|
16
|
<script>
|
44
|
17
|
import { createNamespacedHelpers } from "vuex";
|
45
|
|
-import PieSecondChart from '../../components/charts/PieSecondChart';
|
|
18
|
+
|
46
|
19
|
const { mapActions: mapEchartsActions } = createNamespacedHelpers("indexEcharts")
|
47
|
|
-import apis from "../../config/api";
|
48
|
|
-import { mapState } from "vuex";
|
49
|
|
-import Echarts from "echarts";
|
50
|
20
|
|
51
|
21
|
export default {
|
52
|
22
|
components: {
|
53
|
|
- // eslint-disable-next-line vue/no-unused-components
|
54
|
|
- 'pie-second-chart' : PieSecondChart
|
|
23
|
+ UserSource: () => import('./components/UserSource'),
|
55
|
24
|
},
|
56
|
25
|
data() {
|
57
|
26
|
return {
|
58
|
27
|
value: '', // 时间
|
59
|
|
- header: [], // 表头
|
60
|
|
- tableData2: [], // 表格
|
61
|
|
- fromNameType: [], // 类型名
|
62
|
|
- options: [{
|
63
|
|
- value: '',
|
64
|
|
- label: '所有用户'
|
65
|
|
- }, {
|
66
|
|
- value: 'registered',
|
67
|
|
- label: '注册用户'
|
68
|
|
- }],
|
69
|
|
- registeredType: '', // 类型 所有用户 或 注册用户 的值
|
70
|
|
- pieSecondChart: '', // 饼状图实例
|
71
|
|
- columnarSecondChart: '', // 柱状图
|
72
|
|
-
|
|
28
|
+ userData: {},
|
73
|
29
|
};
|
74
|
30
|
},
|
75
|
31
|
computed: {},
|
|
@@ -80,153 +36,6 @@ export default {
|
80
|
36
|
...mapEchartsActions([
|
81
|
37
|
'getUserResource'
|
82
|
38
|
]),
|
83
|
|
- drawLine() {
|
84
|
|
- // 基于准备好的dom,初始化echarts实例
|
85
|
|
- this.columnarSecondChart = Echarts.init(this.$refs.firstChart);
|
86
|
|
- // 饼图
|
87
|
|
- this.pieSecondChart = Echarts.init(this.$refs.secondChart);
|
88
|
|
- },
|
89
|
|
- pie (obj) { // 饼状图绘制
|
90
|
|
- // 绘制图表
|
91
|
|
- this.pieSecondChart.setOption({
|
92
|
|
- color: ["#7974ce","#f5749d","#3688f8"],
|
93
|
|
- tooltip: {
|
94
|
|
- trigger: "item",
|
95
|
|
- formatter: "{a} <br/>{b} : {c} ({d}%)"
|
96
|
|
- },
|
97
|
|
- legend: {
|
98
|
|
- orient: "vertical",
|
99
|
|
- left: "left",
|
100
|
|
- data: ["自主进入", "来源全民经纪人", "来源置业顾问"]
|
101
|
|
- },
|
102
|
|
- series: [
|
103
|
|
- {
|
104
|
|
- name: "访问来源",
|
105
|
|
- type: "pie",
|
106
|
|
- radius: "55%",
|
107
|
|
- center: ["50%", "60%"],
|
108
|
|
- // label: {
|
109
|
|
- // normal: {
|
110
|
|
- // position: "inner"
|
111
|
|
- // }
|
112
|
|
- // },
|
113
|
|
- data: [
|
114
|
|
- { value: obj.person_null, name: "自主进入" },
|
115
|
|
- { value: obj.person_estate_agent, name: "来源全民经纪人" },
|
116
|
|
- { value: obj.person_realty_consultant, name: "来源置业顾问" }
|
117
|
|
- ],
|
118
|
|
- itemStyle: {
|
119
|
|
- emphasis: {
|
120
|
|
- shadowBlur: 10,
|
121
|
|
- shadowOffsetX: 0,
|
122
|
|
- shadowColor: "rgba(0, 0, 0, 0.5)"
|
123
|
|
- }
|
124
|
|
- }
|
125
|
|
- }
|
126
|
|
- ]
|
127
|
|
- });
|
128
|
|
- },
|
129
|
|
- columnar(obj) { // 柱状图
|
130
|
|
- // 活动名称
|
131
|
|
- const fromName = []
|
132
|
|
-
|
133
|
|
- // 注册人数
|
134
|
|
- const registered = []
|
135
|
|
-
|
136
|
|
- // 注册人数
|
137
|
|
- const userCount = []
|
138
|
|
-
|
139
|
|
- obj.map((item, index) => {
|
140
|
|
- fromName.push(item.fromName)
|
141
|
|
- registered.push(item.registered)
|
142
|
|
- userCount.push(item.userCount)
|
143
|
|
- })
|
144
|
|
-
|
145
|
|
- let labelOption = {
|
146
|
|
- normal: {
|
147
|
|
- show: true,
|
148
|
|
- position: "top",
|
149
|
|
- fontSize: 15,
|
150
|
|
- rich: {
|
151
|
|
- name: {
|
152
|
|
- textBorderColor: "#fff"
|
153
|
|
- }
|
154
|
|
- }
|
155
|
|
- }
|
156
|
|
- };
|
157
|
|
- // 绘制图表
|
158
|
|
- this.columnarSecondChart.setOption({
|
159
|
|
- color: ["#3688f8", "#7974ce"],
|
160
|
|
- backgroundColor: "#fff",
|
161
|
|
- tooltip: {
|
162
|
|
- trigger: "axis"
|
163
|
|
- },
|
164
|
|
- toolbox: {
|
165
|
|
- show: false,
|
166
|
|
- feature: {
|
167
|
|
- mark: { show: true },
|
168
|
|
- dataView: { show: true, readOnly: false },
|
169
|
|
- magicType: { show: true, type: ["bar"] },
|
170
|
|
- restore: { show: true },
|
171
|
|
- saveAsImage: { show: true }
|
172
|
|
- }
|
173
|
|
- },
|
174
|
|
- calculable: true,
|
175
|
|
- legend: {
|
176
|
|
- data: ["所有用户", "注册用户"]
|
177
|
|
- },
|
178
|
|
- xAxis: [
|
179
|
|
- {
|
180
|
|
- type: "category",
|
181
|
|
- axisLabel: {
|
182
|
|
- interval: 0,
|
183
|
|
- formatter: function(val) {
|
184
|
|
- // return val.split("").join("\n");
|
185
|
|
- return val;
|
186
|
|
- }
|
187
|
|
- },
|
188
|
|
- // data: ["生成海报", "好友分享", "群分享", "线下扫码", "名片分享", "小程序搜索"]
|
189
|
|
- data: fromName
|
190
|
|
- }
|
191
|
|
- ],
|
192
|
|
- yAxis: [
|
193
|
|
- {
|
194
|
|
- type: "value",
|
195
|
|
- name: "人数(人)",
|
196
|
|
- axisTick: {
|
197
|
|
- inside: true
|
198
|
|
- },
|
199
|
|
- axisLabel: {
|
200
|
|
- formatter: "{value}"
|
201
|
|
- }
|
202
|
|
- }
|
203
|
|
- ],
|
204
|
|
- grid: {
|
205
|
|
- left: "1%",
|
206
|
|
- right: "1%",
|
207
|
|
- containLabel: true,
|
208
|
|
- y2: 10
|
209
|
|
- },
|
210
|
|
- series: [
|
211
|
|
- {
|
212
|
|
- name: "所有用户",
|
213
|
|
- type: "bar",
|
214
|
|
- smooth: true,
|
215
|
|
- label: labelOption,
|
216
|
|
- // data: [78, 90, 13, 81, 170, 77]
|
217
|
|
- data: registered
|
218
|
|
- },
|
219
|
|
- {
|
220
|
|
- name: "注册用户",
|
221
|
|
- type: "bar",
|
222
|
|
- smooth: true,
|
223
|
|
- label: labelOption,
|
224
|
|
- // data: [26, 49, 62, 45, 21, 89]
|
225
|
|
- data: userCount
|
226
|
|
- }
|
227
|
|
- ]
|
228
|
|
- });
|
229
|
|
- },
|
230
|
39
|
getInfo() { // 获取信息
|
231
|
40
|
|
232
|
41
|
this.getUserResource({
|
|
@@ -234,67 +43,14 @@ export default {
|
234
|
43
|
endDate: this.value[1],
|
235
|
44
|
registeredType: this.registeredType
|
236
|
45
|
}).then((res) => {
|
237
|
|
- console.log(res)
|
238
|
|
- this.setHeaderData(res)
|
239
|
|
- this.pie(res.pie)
|
240
|
|
- this.columnar(res.columnar)
|
|
46
|
+ this.userData = res
|
241
|
47
|
}).catch((err) => {
|
242
|
48
|
this.$notify.error(err.msg || err.message);
|
243
|
49
|
console.log('indexEcharts/getUserResource err')
|
244
|
50
|
})
|
245
|
51
|
},
|
246
|
|
- setHeaderData(obj) { // 设置表头
|
247
|
|
- const header_data = new Set()
|
248
|
|
- const from_name_type = new Set()
|
249
|
|
-
|
250
|
|
- // 装载
|
251
|
|
- const tab = []
|
252
|
|
-
|
253
|
|
- // 请求的数据列表
|
254
|
|
- const objData = obj.data
|
255
|
|
- // 装载表头
|
256
|
|
- objData.map((item, index) => {
|
257
|
|
- // 时间表头
|
258
|
|
- header_data.add(item.date)
|
259
|
|
- from_name_type.add(item.fromCode)
|
260
|
|
- })
|
261
|
|
-
|
262
|
|
- this.header = Array.from(header_data).sort()
|
263
|
|
- const fromNameType = Array.from(from_name_type)
|
264
|
|
-
|
265
|
|
-
|
266
|
|
- fromNameType.map((type, index) => {
|
267
|
|
- const dataObj = {}
|
268
|
|
-
|
269
|
|
- // 获取类型和名称
|
270
|
|
- objData.map((item, index) => {
|
271
|
|
- if (type === item.fromCode) {
|
272
|
|
- dataObj.fromName = item.fromName
|
273
|
|
- dataObj.fromCode = item.fromCode
|
274
|
|
- return
|
275
|
|
- }
|
276
|
|
- })
|
277
|
|
-
|
278
|
|
- // 装载时间
|
279
|
|
- objData.map((item, index) => {
|
280
|
|
- if (type === item.fromCode) {
|
281
|
|
- let date = item.date
|
282
|
|
- dataObj[date] = item.count
|
283
|
|
- }
|
284
|
|
- })
|
285
|
|
-
|
286
|
|
- tab.push(dataObj)
|
287
|
|
- })
|
288
|
|
- this.tableData2 = tab
|
289
|
|
-
|
290
|
|
-
|
291
|
|
-
|
292
|
|
-
|
293
|
|
-
|
294
|
|
- }
|
295
|
52
|
},
|
296
|
53
|
mounted() {
|
297
|
|
- this.drawLine();
|
298
|
54
|
}
|
299
|
55
|
};
|
300
|
56
|
</script>
|