Browse Source

文章总浏览量图标、文章编辑器

XMTT 7 years ago
parent
commit
ca3c1aaa52

+ 2 - 2
css/model/sys/article.css

@ -52,12 +52,12 @@
52 52
    display: none !important;
53 53
}
54 54
55
.sys_article_count{
55
.sys_article_count,.sys_article_total{
56 56
    width:900px;
57 57
    height:600px;
58 58
}
59 59
60
.sys_article_count #type{
60
.sys_article_count #type,.sys_article_total #type{
61 61
    left:20px;
62 62
}
63 63

+ 1 - 1
css/model/sys/articleModify.css

@ -150,7 +150,7 @@ footer .appcode { background-image: url("../images/home_bg_xiazaiapp_nor.png");
150 150
footer .appcode span { background-image: url("../images/home_code_app.jpg"); background-size: cover; }
151 151
footer .weixincode { background-image: url("../images/home_bg_guanzhu_nor.png"); }
152 152
footer .weixincode span { background-image: url("../images/home_code_weixin.jpg"); background-size: cover; }
153
header { position: fixed; top: 0px; left: 0px; right: 0px; z-index: 1012; font-size: 16px; line-height: 32px; }
153
header { position: fixed; top: 0px; left: 0px; right: 0px; z-index: 1000; font-size: 16px; line-height: 32px; }
154 154
header .navheader { background: rgb(255, 255, 255); height: 62px; border-bottom: 2px solid rgb(229, 229, 229); }
155 155
header .topheader { background: rgb(51, 51, 51); height: 30px; font-size: 14px; line-height: 30px; }
156 156
header .topheader .containerCon { background: rgb(51, 51, 51); }

+ 6 - 0
html/model/sys/article/total.html

@ -0,0 +1,6 @@
1
<div class="sys_article_total centerModal">
2
    <div class="modal-ctrl">
3
        <i class="icon icon-times"></i>
4
    </div>
5
    <div id="type" style="height: 400px;width: 850px"></div>
6
</div>

+ 8 - 8
html/model/sys/article/viewcount.html

@ -20,14 +20,14 @@
20 20
        </div>
21 21
        <div class="col-3"></div>
22 22
    </div>
23
    <!--<div class="row"></div>-->
24
    <!--<div class="container tpl-btns">-->
25
        <!--<div class="row">-->
26
            <!--<div class="btn opt-count">-->
27
                <!--统计图表-->
28
            <!--</div>-->
29
        <!--</div>-->
30
    <!--</div>-->
23
    <div class="row"></div>
24
    <div class="container tpl-btns">
25
        <div class="row">
26
            <div class="btn opt-total">
27
                文章总浏览量
28
            </div>
29
        </div>
30
    </div>
31 31
32 32
    <div class="container dt-tpl">
33 33
        <table class="table table-bordered">

+ 305 - 0
js/model/sys/article/total.js

@ -0,0 +1,305 @@
1
/**
2
 * Created by TT on 2017/11/24.
3
 */
4
;
5
spa_define(function () {
6
    return $.use(["spa", "code", "form", "util", "dict"], function (spa, code, form, util, dict) {
7
        return {
8
            modal: function (data) {
9
                var root = spa.findInModal(".sys_article_total");;
10
                var myChart = echarts.init(document.getElementById('type'));
11
                var tableData = {data: []},
12
                    allData = [];
13
                // var $data = {tn: "article", id:data.id};
14
                /*
15
                 用户流量统计表格 时间倒序
16
                 */
17
                // var query = function () {
18
                //     if(allData != null) {
19
                //         var td = tableData.data = [];
20
                //         for(var i = allData.length; i >= allData.length-7; --i) {
21
                //             var item = allData[i];
22
                //             if(item) {
23
                //                 td.push(item);
24
                //             }
25
                //         }
26
                //     } else {
27
                //         tableData.data = allData;
28
                //     }
29
                //     cr.val(tableData.data);
30
                // };
31
                root.find(".modal-ctrl .icon-times").on("click", function () {
32
                    spa.closeModal();
33
                });
34
35
36
                var dayList = function () {
37
                    var dayList = [];
38
                    var now = new Date();
39
                    var day1 = new Date();
40
                    day1.setMonth(now.getMonth() - 1);
41
                    day1.setDate(1);
42
                    var day2 = new Date();
43
                    day2.setDate(day2.getDate() - 1);
44
//                    var s1 = day1.format("yyyy-MM-dd");
45
//                    var s2 = day2.format("yyyy-MM-dd");
46
//                    console.log(s1, s2);
47
                    var days = (day2 - day1) / (24 * 60 * 60 * 1000);
48
                    dayList[0] = {time: day1.format("yyyy-MM-dd")};
49
                    for (var i = 1; i < days + 1; i++) {
50
                        day1.setDate(day1.getDate() + 1);
51
                        dayList[i] = {time: day1.format("yyyy-MM-dd")};
52
                    }
53
                    return dayList;
54
                };
55
                var load = function () {
56
                    $.ajax({
57
                        type: "GET",
58
                        url: "/ajax/operation/statist/total",
59
                        success: function (data) {
60
                            allData = dayList();
61
                            allData.forEach(function (day) {
62
                                var time = (JSON.stringify(day.time)).replace(/\-|^\"|\"$/g, "");
63
                                day.pc = 0;
64
                                day.app = 0;
65
                                day.h5 = 0;
66
                                data.data.forEach(function (log) {
67
                                    if (time == log.day) {
68
                                        if (log.source == 1) {
69
                                            day.pc = log.pv;
70
                                        }
71
                                        if (log.source == 2) {
72
                                            day.app = log.pv;
73
                                        }
74
                                        if (log.source == 3) {
75
                                            day.h5 = log.pv;
76
                                        }
77
                                    }
78
                                    day.num = day.pc + day.app + day.h5;
79
                                })
80
                            });
81
                            var colors = ['#003366', "#660099", '#c23531', "#c23531"];
82
                            var option = {
83
84
                                // color: colors,
85
                                title: {
86
                                    text: '文章总浏览量',
87
                                    subtext: '分渠道'
88
                                },
89
                                tooltip: {
90
                                    trigger: 'axis',
91
                                    // formatter:function (params) {
92
                                    //     // return params[0].name + '<br/>'
93
                                    //     //     + params[3].seriesName + ' : ' + (params[2].value + params[1].value + params[0].value)+ '<br/>'
94
                                    //     //     + params[2].seriesName + ' : ' + params[2].value + '<br/>'
95
                                    //     //     + params[1].seriesName + ' : ' + params[1].value + '<br/>'
96
                                    //     //     + params[0].seriesName + ' : ' + params[0].value + '<br/>';
97
                                    //     console.log(params);
98
                                    // },
99
                                    "axisPointer": {
100
                                        "type": "shadow",
101
                                        textStyle: {
102
                                            color: "#fff"
103
                                        }
104
105
                                    }
106
                                },
107
                                legend: {
108
                                    // selectedMode:false,
109
                                    data: ['PC端', '移动端APP', '移动端H5','合计']
110
                                },
111
                                xAxis: {
112
                                    "type": "category",
113
                                    "axisLine": {
114
                                        lineStyle: {
115
                                            color: '#90979c'
116
                                        }
117
                                    },
118
                                    "splitLine": {
119
                                        "show": false
120
                                    },
121
                                    "axisTick": {
122
                                        "show": false
123
                                    },
124
                                    "splitArea": {
125
                                        "show": false
126
                                    },
127
                                    axisLabel: {
128
                                        showMinLabel:true,
129
                                        showMaxLabel:true
130
                                    },
131
                                    "data": allData.map(function (item) {
132
                                        return item.time;
133
                                    })
134
                                },
135
                                yAxis: {
136
                                    "type": "value",
137
                                    "splitLine": {
138
                                        "show": false
139
                                    },
140
                                    "axisLine": {
141
                                        lineStyle: {
142
                                            color: '#90979c'
143
                                        }
144
                                    },
145
                                    "axisTick": {
146
                                        "show": false
147
                                    },
148
                                    "axisLabel": {
149
                                        showMinLabel:true,
150
                                        showMaxLabel:true
151
                                    },
152
                                    "splitArea": {
153
                                        "show": false
154
                                    }
155
                                },
156
                                toolbox: {
157
                                    show: true,
158
                                    feature: {
159
                                        dataZoom: {
160
                                            yAxisIndex: 'none'
161
                                        },
162
                                        dataView: {readOnly: false},
163
                                        magicType: {type: ['line', 'bar']},
164
                                        restore: {},
165
                                        saveAsImage: {}
166
                                    }
167
                                },
168
                                dataZoom: [{
169
                                    startValue: allData[allData.length - 7].time
170
                                }, {
171
                                    type: 'inside'
172
                                }],
173
                                visualMap: {
174
                                    top: 10,
175
                                    right: 10
176
                                },
177
                                series: [
178
                                    {
179
                                        name: '移动端H5',
180
                                        type: 'bar',
181
                                        stack: '总量',
182
                                        "barMaxWidth": 35,
183
                                        "barGap": "10%",
184
                                        "itemStyle": {
185
                                            "normal": {
186
                                                "color": "#dd4444",
187
                                                "label": {
188
                                                    "show": false,
189
                                                    "textStyle": {
190
                                                        "color": "#fff"
191
                                                    },
192
                                                    "position": "insideTop",
193
                                                    formatter: function(p) {
194
                                                        return p.value > 0 ? (p.value) : '';
195
                                                    }
196
                                                }
197
                                            }
198
                                        },
199
                                        data: allData.map(function (item) {
200
                                            return item.h5;
201
                                        })
202
                                    },
203
                                    {
204
                                        name: 'PC端',
205
                                        type: 'bar',
206
                                        stack: '总量',
207
                                        "barMaxWidth": 35,
208
                                        "barGap": "10%",
209
                                        "itemStyle": {
210
                                            "normal": {
211
                                                "color": "#80F1BE",
212
                                                "label": {
213
                                                    "show": false,
214
                                                    "textStyle": {
215
                                                        "color": "#fff"
216
                                                    },
217
                                                    "position": "insideTop",
218
                                                    formatter: function(p) {
219
                                                        return p.value > 0 ? (p.value) : '';
220
                                                    }
221
                                                }
222
                                            }
223
                                        },
224
                                        data: allData.map(function (item) {
225
                                            return item.pc;
226
                                        })
227
                                    }, {
228
                                        name: '移动端APP',
229
                                        type: 'bar',
230
                                        stack: '总量',
231
                                        "barMaxWidth": 35,
232
                                        "barGap": "10%",
233
                                        "itemStyle": {
234
                                            "normal": {
235
                                                "color": "#fec42c",
236
                                                "label": {
237
                                                    "show": false,
238
                                                    "textStyle": {
239
                                                        "color": "#fff"
240
                                                    },
241
                                                    "position": "insideTop",
242
                                                    formatter: function(p) {
243
                                                        return p.value > 0 ? (p.value) : '';
244
                                                    }
245
                                                }
246
                                            }
247
                                        },
248
                                        data: allData.map(function (item) {
249
                                            return item.app;
250
                                        })
251
                                    },
252
                                    {
253
                                        name: '合计',
254
                                        type: 'line',
255
                                        stack: '总量',
256
                                        symbolSize:7,
257
                                        symbol:'circle',
258
                                        // areaStyle: {normal: {}},
259
                                        // label: {
260
                                        //     normal: {
261
                                        //         show: true,
262
                                        //         position: 'top',
263
                                        //         formatter: function (params) {
264
                                        //             for (var i = 0, l = option.xAxis.data.length; i < l; i++) {
265
                                        //                 if (option.xAxis.data[i] == params.name) {
266
                                        //                     // option.series[0].data[i];
267
                                        //                     var num = option.series[0].data[i]+option.series[1].data[i]+option.series[2].data[i];
268
                                        //                     return '合计:' + num;
269
                                        //                 }
270
                                        //             }
271
                                        //         }
272
                                        //
273
                                        //     }
274
                                        // },
275
                                        itemStyle:{
276
                                            normal:{
277
                                                color:"#dd4444",
278
                                                barBorderRadius:0,
279
                                                label:{
280
                                                    show:true,
281
                                                    position:"top",
282
                                                    formatter:function (params) {
283
                                                        return params.val;
284
                                                    }
285
                                                }
286
                                            }
287
                                        },
288
                                        data: allData.map(function (item) {
289
                                            return item.num;
290
                                        })
291
                                    }
292
                                ]
293
                            };
294
                            myChart.setOption(option);
295
                        }
296
                    });
297
                };
298
                load();
299
            }
300
        };
301
    });
302
});
303
304
305

+ 3 - 17
js/model/sys/article/viewcount.js

@ -107,23 +107,9 @@ spa_define(function () {
107 107
                    var $this = $(this);
108 108
                    $this.toggleClass("checked");
109 109
                });
110
                // root.find(".opt-count").on("click", function () {
111
                //     var $article = root.find("td.opt-check>i.checked");
112
                //     if ($article.length) {
113
                //         if ($article.length>1) {
114
                //             util.alert("只能选择一篇文章");
115
                //         }else {
116
                //             spa.showModal("sys_article_count", {
117
                //                 id: $article.attr("articleId"),
118
                //                 hand: function () {
119
                //                     pdg.reload();
120
                //                 }
121
                //             });
122
                //         }
123
                //     }else {
124
                //         util.alert("请选择一篇文章");
125
                //     }
126
                // });
110
                root.find(".opt-total").on("click", function () {
111
                    spa.showModal("sys_article_total");
112
                });
127 113
                root.on("click",".icon-line-chart",function () {
128 114
                    var $this = $(this);
129 115
                    var articleId = $this.parent().attr("articleId");

+ 4 - 4
js/ueditor/ueditor.config.js

@ -41,7 +41,7 @@
41 41
            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|',
42 42
            'spechars', '|',
43 43
           	'superscript', 'subscript','|',
44
            'simpleupload'
44
            'simpleupload','link'
45 45
        ]]
46 46
        
47 47
        /*, toolbars: [[
@ -356,7 +356,7 @@
356 356
        //}
357 357
358 358
        //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http
359
        //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:']
359
        , allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:']
360 360
361 361
        //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html
362 362
        //, webAppKey: ""
@ -374,7 +374,7 @@
374 374
		,outputXssFilter: true
375 375
		// xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
376 376
		,whitList: {
377
			/*a:      ['target', 'href', 'title', 'class', 'style'],
377
			/*a:      [],
378 378
			abbr:   ['title', 'class', 'style'],
379 379
			address: ['class', 'style'],
380 380
			area:   ['shape', 'coords', 'href', 'alt'],
@ -437,7 +437,7 @@
437 437
			u:      [],
438 438
			ul:     ['class', 'style'],
439 439
			video:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style']*/
440
			a:      [],
440
			a:      ['target', 'href', 'title', 'class', 'style'],
441 441
			abbr:   [],
442 442
			address: [],
443 443
			area:   [],