Browse Source

文章分渠道浏览量统计,搜索词统计记录

XMTT 7 years ago
parent
commit
726c3e6e6b

+ 21 - 0
css/model/sys/article.css

@ -46,4 +46,25 @@
46 46
47 47
.sys_article_subject .orgSize.dyn-mselect .placeholder {
48 48
    display: none !important;
49
}
50
51
.sys_article_count{
52
    width:900px;
53
    height:600px;
54
}
55
56
.sys_article_count #type{
57
    left:20px;
58
}
59
60
.sys_article_viewcount .tpl-btns .row {
61
    padding-left: 10px;
62
}
63
64
.sys_article_viewcount th.opt-check {
65
    width: 35px;
66
}
67
68
.sys_article_viewcount .table {
69
    table-layout: fixed;
49 70
}

+ 13 - 0
css/model/sys/searchword.css

@ -0,0 +1,13 @@
1
@charset "utf-8";
2
.sys_searchword_index .tpl-btns .row {
3
    padding-left: 10px;
4
}
5
6
.sys_searchword_index th.opt-check {
7
    width: 35px;
8
}
9
10
.sys_searchword_index .table {
11
    table-layout: fixed;
12
}
13

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

@ -0,0 +1,6 @@
1
<div class="sys_article_count 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>

+ 3 - 0
html/model/sys/article/index.html

@ -57,6 +57,9 @@
57 57
            <div class="btn opt-col-num">
58 58
                设置栏目
59 59
            </div>
60
            <div class="btn opt-count">
61
                流量统计
62
            </div>
60 63
            <div class="btn opt-del">
61 64
                删除
62 65
            </div>

+ 69 - 0
html/model/sys/article/viewcount.html

@ -0,0 +1,69 @@
1
<div class="sys_article_viewcount">
2
    <div class="modal-ctrl">
3
        <i class="icon icon-times"></i>
4
    </div>
5
6
    <div class="container queryForm">
7
        <div class="col-2"></div>
8
        <div class="col-1 item-caption ">发布时间</div>
9
        <div class="col-2">
10
            <div class="form-item date" defVal="" name="bt"></div>
11
        </div>
12
        <div class="col-1 item-caption center">至</div>
13
        <div class="col-2">
14
            <div class="form-item date" defVal="" name="et"></div>
15
        </div>
16
        <div class="col-2">
17
            <div class="btn opt-query pull-right">
18
                <i class="icon-search"></i> 查询
19
            </div>
20
        </div>
21
        <div class="col-3"></div>
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>
31
32
    <div class="container dt-tpl">
33
        <table class="table table-bordered">
34
            <thead>
35
            <tr>
36
                <th class="opt-check" ><i class="icon icon-st-check"></i> </th>
37
                <th>#</th>
38
                <th>文章标题</th>
39
                <th>作者</th>
40
                <th>关键词</th>
41
                <th>栏目</th>
42
                <th>发布时间</th>
43
                <th>权重</th>
44
                <th>浏览量</th>
45
                <th>点赞量</th>
46
            </tr>
47
            </thead>
48
            <tbody>
49
            <tr ch-dir="list">
50
                <td class="opt-check" ><i class="icon icon-st-check" articleId="{{id}}"></i></td>
51
                <td class="hand-id" articleId="{{id}}">{{-_index}}</td>
52
                <td class="articleTitle">{{articleTitle}}</td>
53
                <td class="professorName">{{professorName}}</td>
54
                <td class="subject">{{subject}}</td>
55
                <td class="colNum">{{colNum}}</td>
56
                <td class="publishTime">{{publishTime}}</td>
57
                <td class="sortNum">{{sortNum}}</td>
58
                <td class="pageViews">{{pageViews}}</td>
59
                <td class="articleAgree">{{articleAgree}}</td>
60
            </tr>
61
            </tbody>
62
            <tbody ch-dir="array.empty">
63
            <tr>
64
                <td class="empty-desc" colspan="9">表格暂无数据</td>
65
            </tr>
66
            </tbody>
67
        </table>
68
    </div>
69
</div>

+ 46 - 0
html/model/sys/searchword/index.html

@ -0,0 +1,46 @@
1
<div class="sys_searchword_index">
2
    <div class="modal-ctrl">
3
        <i class="icon icon-times"></i>
4
    </div>
5
    <div class="container queryForm">
6
        <div class="col-2"></div>
7
        <div class="col-1 item-caption ">发布时间</div>
8
        <div class="col-2">
9
            <div class="form-item date" defVal="" name="bt"></div>
10
        </div>
11
        <div class="col-1 item-caption center">至</div>
12
        <div class="col-2">
13
            <div class="form-item date" defVal="" name="et"></div>
14
        </div>
15
        <div class="col-2">
16
            <div class="btn opt-query pull-right">
17
                <i class="icon-search"></i> 查询
18
            </div>
19
        </div>
20
        <div class="col-3"></div>
21
    </div>
22
23
    <div class="container dt-tpl">
24
        <table class="table table-bordered">
25
            <thead>
26
            <tr>
27
                <th class="col-2">#</th>
28
                <th>搜索词</th>
29
                <th class="col-2">总数</th>
30
            </tr>
31
            </thead>
32
            <tbody>
33
            <tr ch-dir="list">
34
                <td class="hand-id" swId="{{id}}">{{-_index}}</td>
35
                <td>{{id}}</td>
36
                <td>{{pv}}</td>
37
            </tr>
38
            </tbody>
39
            <tbody ch-dir="array.empty">
40
            <tr>
41
                <td class="empty-desc" colspan="3">表格暂无数据</td>
42
            </tr>
43
            </tbody>
44
        </table>
45
    </div>
46
</div>

+ 218 - 0
js/model/sys/article/count.js

@ -0,0 +1,218 @@
1
/**
2
 * Created by TT on 2017/9/20.
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_count");
10
                // var cr = code.parseCode(root.find(".dt-tpl"));
11
                var myChart = echarts.init(document.getElementById('type'));
12
                var tableData = {data: []},
13
                    allData = [];
14
                var $data = {tn: "article", id:data.id};
15
16
                // cr.shell("count", function (env) {
17
                //     var v = env.cd[this.k];
18
                //     if (v === 0) {
19
                //         return 0;
20
                //     }
21
                //     return v;
22
                // });
23
24
                // var query = function () {
25
                //     if(allData != null) {
26
                //         var td = tableData.data = [];
27
                //         for(var i = allData.length-7; i < allData.length; ++i) {
28
                //             var item = allData[i];
29
                //             if(item) {
30
                //                 td.push(item);
31
                //             }
32
                //         }
33
                //     } else {
34
                //         tableData.data = allData;
35
                //     }
36
                //     cr.val(tableData.data);
37
                // };
38
39
                /*
40
                 用户流量统计表格 时间倒序
41
                 */
42
                // var query = function () {
43
                //     if(allData != null) {
44
                //         var td = tableData.data = [];
45
                //         for(var i = allData.length; i >= allData.length-7; --i) {
46
                //             var item = allData[i];
47
                //             if(item) {
48
                //                 td.push(item);
49
                //             }
50
                //         }
51
                //     } else {
52
                //         tableData.data = allData;
53
                //     }
54
                //     cr.val(tableData.data);
55
                // };
56
                root.find(".modal-ctrl .icon-times").on("click", function () {
57
                    spa.closeModal();
58
                });
59
60
                Date.prototype.format = function (fmt) {
61
                    var o = {
62
                        "M+": this.getMonth() + 1, //月份
63
                        "d+": this.getDate(), //日
64
                        "h+": this.getHours(), //小时
65
                        "m+": this.getMinutes(), //分
66
                        "s+": this.getSeconds(), //秒
67
                        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
68
                        "S": this.getMilliseconds() //毫秒
69
                    };
70
                    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
71
                    for (var k in o)
72
                        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
73
                    return fmt;
74
                };
75
76
                var dayList = function () {
77
                    var dayList = [];
78
                    var now = new Date();
79
                    var day1 = new Date();
80
                    day1.setMonth(now.getMonth() - 1);
81
                    day1.setDate(1);
82
                    var day2 = new Date();
83
                    day2.setDate(day2.getDate() - 1);
84
//                    var s1 = day1.format("yyyy-MM-dd");
85
//                    var s2 = day2.format("yyyy-MM-dd");
86
//                    console.log(s1, s2);
87
                    var days = (day2 - day1) / (24 * 60 * 60 * 1000);
88
                    dayList[0] = {time: day1.format("yyyy-MM-dd")};
89
                    for (var i = 1; i < days + 1; i++) {
90
                        day1.setDate(day1.getDate() + 1);
91
                        dayList[i] = {time: day1.format("yyyy-MM-dd")};
92
                    }
93
                    return dayList;
94
                };
95
                var load = function () {
96
                    $.ajax({
97
                        type: "GET",
98
                        url: "http://www.ekexiu.com:8082/log/jsonp/qm",
99
                        data:$data,
100
                        dataType: "jsonp",
101
                        success: function (data) {
102
                            allData = dayList();
103
                            allData.forEach(function (day) {
104
                                var time = (JSON.stringify(day.time)).replace(/\-|^\"|\"$/g, "");
105
                                day.pc = 0;
106
                                day.app = 0;
107
                                day.h5 = 0;
108
                                data.data.forEach(function (log) {
109
                                    if (time == log.day) {
110
                                        if (log.source == 1) {
111
                                            day.pc = log.pv;
112
                                        }
113
                                        if (log.source == 2) {
114
                                            day.app = log.pv;
115
                                        }
116
                                        if (log.source == 3) {
117
                                            day.h5 = log.pv;
118
                                        }
119
                                    }
120
                                    day.num = day.pc + day.app + day.h5;
121
                                })
122
                            });
123
                            var colors = ['#003366', "#660099", '#c23531', "#91C7AE"];
124
                            var option = {
125
126
                                color: colors,
127
                                title: {
128
                                    text: '文章流量分析',
129
                                    subtext: '分渠道'
130
                                },
131
                                tooltip: {
132
                                    trigger: 'axis'
133
                                },
134
                                legend: {
135
                                    data: ['合计', 'PC端', '移动端APP', '移动端H5']
136
                                },
137
                                xAxis: {
138
                                    data: allData.map(function (item) {
139
                                        return item.time;
140
                                    }),
141
                                    boundaryGap: false
142
                                },
143
                                yAxis: {
144
                                    splitLine: {
145
                                        show: false
146
                                    },
147
                                    boundaryGap: false,
148
                                    type: "value",
149
                                    // interval: 1,
150
                                    min: 0
151
                                },
152
                                toolbox: {
153
                                    show: true,
154
                                    feature: {
155
                                        dataZoom: {
156
                                            yAxisIndex: 'none'
157
                                        },
158
                                        dataView: {readOnly: false},
159
                                        magicType: {type: ['line', 'bar']},
160
                                        restore: {},
161
                                        saveAsImage: {}
162
                                    }
163
                                },
164
                                dataZoom: [{
165
                                    startValue: allData[allData.length - 7].time
166
                                }, {
167
                                    type: 'inside'
168
                                }],
169
                                visualMap: {
170
                                    top: 10,
171
                                    right: 10
172
                                },
173
                                series: [
174
                                        {
175
                                        name: '合计',
176
                                        type: 'line',
177
                                        label: {
178
                                            normal: {
179
                                                show: true,
180
                                                position: 'top'
181
                                            }
182
                                        },
183
                                        data: allData.map(function (item) {
184
                                            return item.num;
185
                                        })
186
                                    },
187
                                    {
188
                                        name: 'PC端',
189
                                        type: 'line',
190
                                        data: allData.map(function (item) {
191
                                            return item.pc;
192
                                        })
193
                                    }, {
194
                                        name: '移动端APP',
195
                                        type: 'line',
196
                                        data: allData.map(function (item) {
197
                                            return item.app;
198
                                        })
199
                                    }, {
200
                                        name: '移动端H5',
201
                                        type: 'line',
202
                                        data: allData.map(function (item) {
203
                                            return item.h5;
204
                                        })
205
                                    }
206
                                ]
207
                            };
208
                            myChart.setOption(option);
209
                        }
210
                    });
211
                };
212
                // cr.listen(dict.doTransfer);
213
                load();
214
            }
215
        };
216
    });
217
});
218

+ 17 - 0
js/model/sys/article/index.js

@ -149,6 +149,23 @@ spa_define(function () {
149 149
                        util.alert("请选择一篇文章");
150 150
                    }
151 151
                });
152
                root.find(".opt-count").on("click", function () {
153
                    var $article = root.find("td.opt-check>i.checked");
154
                    if ($article.length) {
155
                        if ($article.length>1) {
156
                            util.alert("只能选择一篇文章");
157
                        }else {
158
                            spa.showModal("sys_article_count", {
159
                                id: $article.attr("articleId"),
160
                                hand: function () {
161
                                    pdg.reload();
162
                                }
163
                            });
164
                        }
165
                    }else {
166
                        util.alert("请选择一篇文章");
167
                    }
168
                });
152 169
153 170
154 171
            }, mainDestory: function () {

+ 148 - 0
js/model/sys/article/viewcount.js

@ -0,0 +1,148 @@
1
/**
2
 * Created by TT on 2017/9/22.
3
 */
4
;
5
spa_define(function () {
6
    return $.use(["spa", "code", "form", "util", "dict"], function (spa, code, form, util, dict) {
7
        return {
8
            main: function () {
9
                var root = spa.findInMain(".sys_article_viewcount");
10
                var qf = form.build(root.find(".queryForm"));
11
                var cr = code.parseCode(root.find(".dt-tpl"));
12
                var queryBtn = root.find(".queryForm .opt-query");
13
                var tableData = {data: []},
14
                    allData = [],
15
                    $data = {tn: "article"};
16
17
                Date.prototype.format = function (fmt) {
18
                    var o = {
19
                        "M+": this.getMonth() + 1, //月份
20
                        "d+": this.getDate(), //日
21
                        "h+": this.getHours(), //小时
22
                        "m+": this.getMinutes(), //分
23
                        "s+": this.getSeconds(), //秒
24
                        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
25
                        "S": this.getMilliseconds() //毫秒
26
                    };
27
                    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
28
                    for (var k in o)
29
                        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
30
                    return fmt;
31
                };
32
33
                var now = new Date(),
34
                    nbt = new Date();
35
                nbt.setDate(now.getDate() - 7);
36
                var et1 = now.format("yyyyMMdd"),
37
                    bt1 = nbt.format("yyyyMMdd");
38
                qf.val({bt: bt1, et: et1});
39
                $data.bt = bt1;
40
                $data.et = et1;
41
42
                var caption = function (dicts, code) {
43
                        var items = dict.get(dicts);
44
                        var cp =  dict.getCap(items, code.toString());
45
                        if (cp) {
46
                            return cp;
47
                        }else {
48
                            return "不可翻译的";
49
                        }
50
                        // return dict.get(dicts)[code].caption;
51
                    },
52
                    showDay = function (day) {
53
                        if (day) {
54
                            return day.substring(0, 4) + "年" + day.substring(4, 6) + "月" + day.substring(6, 8) + "日";
55
                        } else return "";
56
                    },
57
                    loadContent = function () {
58
                        root.find(".hand-id").each(function () {
59
                            var $e = $(this);
60
                            var articleId = $e.attr("articleId");
61
                            if (articleId) {
62
                                util.get("../ajax/article/id",{id:articleId}, function (data) {
63
                                    if (data) {
64
                                        $e.parent().find(".articleTitle").text(data.articleTitle);
65
                                        $e.parent().find(".professorName").text(data.professorName || data.organizationName);
66
                                        $e.parent().find(".subject").text(data.subject);
67
                                        $e.parent().find(".colNum").text(caption("banner", data.colNum));
68
                                        $e.parent().find(".publishTime").text(showDay(data.publishTime));
69
                                        $e.parent().find(".sortNum").text(data.sortNum);
70
                                        $e.parent().find(".pageViews").text(data.pageViews);
71
                                        $e.parent().find(".articleAgree").text(data.articleAgree);
72
                                    }
73
                                }, {});
74
                                //     // $e.removeClass("hand-id");
75
                            }
76
                        });
77
                    },
78
                    load = function () {
79
                        console.log($data);
80
                        $.ajax({
81
                            type: "GET",
82
                            url: "http://www.ekexiu.com:8082/log/jsonp/qs",
83
                            data: $data,
84
                            dataType: "jsonp",
85
                            success: function (data) {
86
                                console.log(data);
87
                                allData = data.data || [];
88
                                // allData = [{
89
                                //     id: "8F08D2EB366140BC85A6A4CE344A15A4"
90
                                // }, {
91
                                //     id: "8DE678A43FFB4097B3E0DFF9C48CC737"
92
                                // }];
93
                                tableData.data = allData;
94
                                cr.val(tableData.data);
95
                                loadContent();
96
                            }
97
                        });
98
                    },
99
                    query = function () {
100
                        if (qf.val().bt && qf.val().et) {
101
                            $data.bt = qf.val().bt;
102
                            $data.et = qf.val().et;
103
                        }else {
104
                            $data.bt = "";
105
                            $data.et = "";
106
                        }
107
                        load();
108
                    };
109
110
111
                queryBtn.on("click", query);
112
                load();
113
                root.find(".dt-tpl").on("click", "th.opt-check>i.icon-st-check", function () {
114
                    var $this = $(this);
115
                    $this.toggleClass("checked");
116
                    if ($this.hasClass("checked")) {
117
                        root.find(".dt-tpl td.opt-check>i.icon-st-check").addClass("checked");
118
                    } else {
119
                        root.find(".dt-tpl td.opt-check>i.icon-st-check").removeClass("checked");
120
                    }
121
                });
122
                root.find(".dt-tpl").on("click", "td.opt-check>i.icon-st-check", function () {
123
                    var $this = $(this);
124
                    $this.toggleClass("checked");
125
                });
126
                root.find(".opt-count").on("click", function () {
127
                    var $article = root.find("td.opt-check>i.checked");
128
                    if ($article.length) {
129
                        if ($article.length>1) {
130
                            util.alert("只能选择一篇文章");
131
                        }else {
132
                            spa.showModal("sys_article_count", {
133
                                id: $article.attr("articleId"),
134
                                hand: function () {
135
                                    pdg.reload();
136
                                }
137
                            });
138
                        }
139
                    }else {
140
                        util.alert("请选择一篇文章");
141
                    }
142
                });
143
            },
144
            mainDestory: function () {
145
            }
146
        };
147
    });
148
});

+ 75 - 0
js/model/sys/searchword/index.js

@ -0,0 +1,75 @@
1
/**
2
 * Created by TT on 2017/9/25.
3
 */
4
;
5
spa_define(function () {
6
    return $.use(["spa", "code", "form", "util", "dict"], function (spa, code, form, util, dict) {
7
        return {
8
            main: function () {
9
                var root = spa.findInMain(".sys_searchword_index");
10
                var qf = form.build(root.find(".queryForm"));
11
                var cr = code.parseCode(root.find(".dt-tpl"));
12
                var queryBtn = root.find(".queryForm .opt-query");
13
                var tableData = {data: []},
14
                    allData = [],
15
                    $data = {tn: "kw"};
16
17
                Date.prototype.format = function (fmt) {
18
                    var o = {
19
                        "M+": this.getMonth() + 1, //月份
20
                        "d+": this.getDate(), //日
21
                        "h+": this.getHours(), //小时
22
                        "m+": this.getMinutes(), //分
23
                        "s+": this.getSeconds(), //秒
24
                        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
25
                        "S": this.getMilliseconds() //毫秒
26
                    };
27
                    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
28
                    for (var k in o)
29
                        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
30
                    return fmt;
31
                };
32
33
                var now = new Date(),
34
                    nbt = new Date();
35
                nbt.setDate(now.getDate() - 7);
36
                var et1 = now.format("yyyyMMdd"),
37
                    bt1 = nbt.format("yyyyMMdd");
38
                qf.val({bt: bt1, et: et1});
39
                $data.bt = bt1;
40
                $data.et = et1;
41
42
                var load = function () {
43
                        $.ajax({
44
                            type: "GET",
45
                            url: "http://www.ekexiu.com:8082/log/jsonp/qs",
46
                            data: $data,
47
                            dataType: "jsonp",
48
                            success: function (data) {
49
                                allData = data.data || [];
50
                                tableData.data = allData;
51
                                cr.val(tableData.data);
52
                            }
53
                        });
54
                    },
55
                    query = function () {
56
                        if (qf.val().bt && qf.val().et) {
57
                            $data.bt = qf.val().bt;
58
                            $data.et = qf.val().et;
59
                        }else {
60
                            $data.bt = "";
61
                            $data.et = "";
62
                        }
63
                        load();
64
                    };
65
66
67
                queryBtn.on("click", query);
68
                load();
69
70
            },
71
            mainDestory: function () {
72
            }
73
        };
74
    });
75
});