Merge branch 'feature/report' into 'master'
Feature/report See merge request !9
Showing
9 changed files
with
980 additions
and
122 deletions
@@ -4,6 +4,7 @@ const Router = require('koa-router'); | @@ -4,6 +4,7 @@ const Router = require('koa-router'); | ||
4 | const SqlBuilder = require('../utils/sql-builder'); | 4 | const SqlBuilder = require('../utils/sql-builder'); |
5 | const request = require('superagent'); | 5 | const request = require('superagent'); |
6 | const _ = require('lodash'); | 6 | const _ = require('lodash'); |
7 | +const alasql = require('alasql'); | ||
7 | const config = require('../../../config/config'); | 8 | const config = require('../../../config/config'); |
8 | 9 | ||
9 | const endpoint = (server) => `http://${server.host}:${server.port}`; | 10 | const endpoint = (server) => `http://${server.host}:${server.port}`; |
@@ -11,7 +12,7 @@ const endpoint = (server) => `http://${server.host}:${server.port}`; | @@ -11,7 +12,7 @@ const endpoint = (server) => `http://${server.host}:${server.port}`; | ||
11 | const r = new Router; | 12 | const r = new Router; |
12 | 13 | ||
13 | const TABLE = { | 14 | const TABLE = { |
14 | - DURATION: 'web-duration', | 15 | + DURATION: 'web-client-duration', |
15 | REPORT: 'error-report' | 16 | REPORT: 'error-report' |
16 | }; | 17 | }; |
17 | 18 | ||
@@ -38,13 +39,10 @@ async function exec(server, sql) { | @@ -38,13 +39,10 @@ async function exec(server, sql) { | ||
38 | q: sql, | 39 | q: sql, |
39 | db: DB_NAME | 40 | db: DB_NAME |
40 | }).then(({body: result}) => { | 41 | }).then(({body: result}) => { |
41 | - const series = _.get(result, 'results[0].series[0]', {}); | ||
42 | - const col = _.get(series, 'columns', []); | ||
43 | - const values = _.get(series, "values", []); | ||
44 | - | ||
45 | - return values.map(v => { | ||
46 | - return _.zipObject(col, v); | ||
47 | - }) | 42 | + return result; |
43 | + }).catch((err) => { | ||
44 | + console.log(err); | ||
45 | + return {}; | ||
48 | }); | 46 | }); |
49 | } | 47 | } |
50 | 48 | ||
@@ -54,44 +52,146 @@ const APP = { | @@ -54,44 +52,146 @@ const APP = { | ||
54 | h5: {field: 'app', op: '=', value: APP_NAME.h5} | 52 | h5: {field: 'app', op: '=', value: APP_NAME.h5} |
55 | }; | 53 | }; |
56 | 54 | ||
57 | -const DURATION = { | ||
58 | - 0: {field: '', op: '', value: ''}, | ||
59 | - 1: {field: 'duration', op: '<=', value: 100}, | ||
60 | - 2: {field: '', op: '', value: '"duration">100 and "duration"<=200'}, | ||
61 | - 3: {field: 'duration', op: '>', value: 200}, | ||
62 | -}; | ||
63 | - | ||
64 | const SERVER = { | 55 | const SERVER = { |
65 | aws: endpoint(config.apm.aws), | 56 | aws: endpoint(config.apm.aws), |
66 | qcloud: endpoint(config.apm.qcloud) | 57 | qcloud: endpoint(config.apm.qcloud) |
67 | }; | 58 | }; |
68 | 59 | ||
60 | + | ||
61 | +function handleZip(items) { | ||
62 | + const col = _.get(items, 'columns', []); | ||
63 | + const values = _.get(items, "values", []); | ||
64 | + | ||
65 | + return values.map((v) => { | ||
66 | + return _.zipObject(col, v) | ||
67 | + }); | ||
68 | +} | ||
69 | + | ||
70 | +function handleRows(rows) { | ||
71 | + let result = alasql('SELECT route, AVG(duration) as mean FROM ? GROUP BY route,type', [rows]); | ||
72 | + result = alasql('SELECT route, SUM(mean) as mean FROM ? GROUP BY route', [result]); | ||
73 | + return result; | ||
74 | +} | ||
75 | + | ||
76 | +function handleCount(rows) { | ||
77 | + let result = alasql('SELECT route, COUNT(route) as times FROM ? GROUP BY route', [rows]); | ||
78 | + return result; | ||
79 | +} | ||
80 | + | ||
69 | const profile_service = { | 81 | const profile_service = { |
70 | - async time(server, start, end, app, duration) { | 82 | + async mean(server, start, end, app, lastTime) { |
83 | + const model = profile_sql.duration() | ||
84 | + .select('*') | ||
85 | + .where(APP[app]); | ||
86 | + | ||
87 | + if (lastTime) { | ||
88 | + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`)) | ||
89 | + } | ||
90 | + | ||
91 | + if (start && end) { | ||
92 | + model.where('time', '>=', start) | ||
93 | + .where('time', '<', end); | ||
94 | + } | ||
95 | + | ||
96 | + let rows = await exec(SERVER[server],model.toSql()) | ||
97 | + .then(result => _.get(result, 'results[0].series[0]', [])) | ||
98 | + .then(handleZip); | ||
99 | + | ||
100 | + rows = handleRows(rows); | ||
101 | + | ||
102 | + return {code: 200, data: rows} | ||
103 | + }, | ||
104 | + async count(server, start, end, app, lastTime) { | ||
71 | const model = profile_sql.duration() | 105 | const model = profile_sql.duration() |
72 | .select('*') | 106 | .select('*') |
73 | - .where(DURATION[duration]) | ||
74 | - .where(APP[app]) | ||
75 | - .where('time', '>=', start) | 107 | + .where(APP[app]); |
108 | + | ||
109 | + if (lastTime) { | ||
110 | + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`)) | ||
111 | + } | ||
112 | + | ||
113 | + if (start && end) { | ||
114 | + model.where('time', '>=', start) | ||
76 | .where('time', '<', end); | 115 | .where('time', '<', end); |
116 | + } | ||
117 | + | ||
118 | + let rows = await exec(SERVER[server],model.toSql()) | ||
119 | + .then(result => _.get(result, 'results[0].series[0]', [])) | ||
120 | + .then(handleZip); | ||
121 | + | ||
122 | + rows = handleCount(rows); | ||
77 | 123 | ||
78 | - const rows = await exec(SERVER[server],model.toSql()); | ||
79 | return {code: 200, data: rows} | 124 | return {code: 200, data: rows} |
80 | }, | 125 | }, |
126 | + async time(server, start, end, app, lastTime) { | ||
127 | + const model = profile_sql.duration() | ||
128 | + .select('*') | ||
129 | + .where(APP[app]); | ||
81 | 130 | ||
82 | - async error(server, start, end, app) { | 131 | + if (lastTime) { |
132 | + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`)) | ||
133 | + } | ||
134 | + | ||
135 | + if (start && end) { | ||
136 | + model.where('time', '>=', start) | ||
137 | + .where('time', '<', end); | ||
138 | + } | ||
139 | + | ||
140 | + const rows = await exec(SERVER[server], model.toSql()) | ||
141 | + .then(result => _.get(result, 'results[0].series[0]', [])) | ||
142 | + .then(handleZip); | ||
143 | + | ||
144 | + return {cde: 200, data: rows}; | ||
145 | + }, | ||
146 | + async error(server, start, end, app, lastTime) { | ||
83 | const model = profile_sql.error() | 147 | const model = profile_sql.error() |
84 | .select('*') | 148 | .select('*') |
85 | - .where(APP[app]) | ||
86 | - .where('time', '>=', start) | 149 | + .where(APP[app]); |
150 | + | ||
151 | + if (lastTime) { | ||
152 | + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`)) | ||
153 | + } | ||
154 | + | ||
155 | + if (start && end) { | ||
156 | + model.where('time', '>=', start) | ||
87 | .where('time', '<', end); | 157 | .where('time', '<', end); |
158 | + } | ||
159 | + | ||
160 | + const rows = await exec(SERVER[server], model.toSql()) | ||
161 | + .then(result => _.get(result, 'results[0].series[0]', [])) | ||
162 | + .then(handleZip); | ||
88 | 163 | ||
89 | - const rows = await exec(SERVER[server], model.toSql()); | ||
90 | return {cde: 200, data: rows}; | 164 | return {cde: 200, data: rows}; |
91 | } | 165 | } |
92 | }; | 166 | }; |
93 | 167 | ||
94 | const profile_controller = { | 168 | const profile_controller = { |
169 | + async mean_report_index(ctx) { | ||
170 | + await ctx.render('action/profile_mean'); | ||
171 | + }, | ||
172 | + async mean_report_json(ctx) { | ||
173 | + const start = ctx.query.start; | ||
174 | + const end = ctx.query.end; | ||
175 | + const app = ctx.query.app; | ||
176 | + const server = ctx.query.server || 'aws'; | ||
177 | + const lastTime = ctx.query.lastTime; | ||
178 | + | ||
179 | + const result = await profile_service.time(server, start, end, app, lastTime); | ||
180 | + ctx.body = result; | ||
181 | + }, | ||
182 | + async count_report_index(ctx) { | ||
183 | + await ctx.render('action/profile_count'); | ||
184 | + }, | ||
185 | + async count_report_json(ctx) { | ||
186 | + const start = ctx.query.start; | ||
187 | + const end = ctx.query.end; | ||
188 | + const app = ctx.query.app; | ||
189 | + const server = ctx.query.server || 'aws'; | ||
190 | + const lastTime = ctx.query.lastTime; | ||
191 | + | ||
192 | + const result = await profile_service.count(server, start, end, app, lastTime); | ||
193 | + ctx.body = result; | ||
194 | + }, | ||
95 | async time_report_index(ctx) { | 195 | async time_report_index(ctx) { |
96 | await ctx.render('action/profile_time'); | 196 | await ctx.render('action/profile_time'); |
97 | }, | 197 | }, |
@@ -99,10 +199,10 @@ const profile_controller = { | @@ -99,10 +199,10 @@ const profile_controller = { | ||
99 | const start = ctx.query.start; | 199 | const start = ctx.query.start; |
100 | const end = ctx.query.end; | 200 | const end = ctx.query.end; |
101 | const app = ctx.query.app; | 201 | const app = ctx.query.app; |
102 | - const duration = ctx.query.duration; | ||
103 | const server = ctx.query.server || 'aws'; | 202 | const server = ctx.query.server || 'aws'; |
203 | + const lastTime = ctx.query.lastTime; | ||
104 | 204 | ||
105 | - const result = await profile_service.time(server, start, end, app, duration); | 205 | + const result = await profile_service.time(server, start, end, app, lastTime); |
106 | ctx.body = result; | 206 | ctx.body = result; |
107 | }, | 207 | }, |
108 | async error_report_index(ctx) { | 208 | async error_report_index(ctx) { |
@@ -113,15 +213,23 @@ const profile_controller = { | @@ -113,15 +213,23 @@ const profile_controller = { | ||
113 | const end = ctx.query.end; | 213 | const end = ctx.query.end; |
114 | const app = ctx.query.app; | 214 | const app = ctx.query.app; |
115 | const server = ctx.query.server || 'aws'; | 215 | const server = ctx.query.server || 'aws'; |
216 | + const lastTime = ctx.query.lastTime; | ||
116 | 217 | ||
117 | - const result = await profile_service.error(server, start, end, app); | 218 | + const result = await profile_service.error(server, start, end, app, lastTime); |
118 | ctx.body = result; | 219 | ctx.body = result; |
119 | } | 220 | } |
120 | 221 | ||
121 | }; | 222 | }; |
122 | 223 | ||
224 | +r.get('/mean', profile_controller.mean_report_index); | ||
225 | +r.get('/mean.json', profile_controller.mean_report_json); | ||
226 | + | ||
227 | +r.get('/count', profile_controller.count_report_index); | ||
228 | +r.get('/count.json', profile_controller.count_report_json); | ||
229 | + | ||
123 | r.get('/time', profile_controller.time_report_index); | 230 | r.get('/time', profile_controller.time_report_index); |
124 | r.get('/time.json', profile_controller.time_report_json); | 231 | r.get('/time.json', profile_controller.time_report_json); |
232 | + | ||
125 | r.get('/error', profile_controller.error_report_index); | 233 | r.get('/error', profile_controller.error_report_index); |
126 | r.get('/error.json', profile_controller.error_report_json); | 234 | r.get('/error.json', profile_controller.error_report_json); |
127 | 235 |
@@ -9,6 +9,7 @@ class SqlBuilder { | @@ -9,6 +9,7 @@ class SqlBuilder { | ||
9 | this._limit = null; | 9 | this._limit = null; |
10 | this._offset = null; | 10 | this._offset = null; |
11 | this._orderBy = null; | 11 | this._orderBy = null; |
12 | + this._groupBy = null; | ||
12 | } | 13 | } |
13 | 14 | ||
14 | static of(table) { | 15 | static of(table) { |
@@ -43,6 +44,10 @@ class SqlBuilder { | @@ -43,6 +44,10 @@ class SqlBuilder { | ||
43 | } | 44 | } |
44 | } | 45 | } |
45 | 46 | ||
47 | + timeWhere(value) { | ||
48 | + | ||
49 | + } | ||
50 | + | ||
46 | orWhere(field, op, value) { | 51 | orWhere(field, op, value) { |
47 | this._orWhere.push({field, op, value}); | 52 | this._orWhere.push({field, op, value}); |
48 | return this; | 53 | return this; |
@@ -73,6 +78,19 @@ class SqlBuilder { | @@ -73,6 +78,19 @@ class SqlBuilder { | ||
73 | return this.toString(); | 78 | return this.toString(); |
74 | } | 79 | } |
75 | 80 | ||
81 | + groupBy(field) { | ||
82 | + this._groupBy = field; | ||
83 | + return this; | ||
84 | + } | ||
85 | + | ||
86 | + static raw(str) { | ||
87 | + return { | ||
88 | + toString() { | ||
89 | + return str; | ||
90 | + } | ||
91 | + } | ||
92 | + } | ||
93 | + | ||
76 | toString() { | 94 | toString() { |
77 | let sql = `SELECT ${this._select.join(',')} FROM "${this._from}" `; | 95 | let sql = `SELECT ${this._select.join(',')} FROM "${this._from}" `; |
78 | 96 | ||
@@ -93,12 +111,16 @@ class SqlBuilder { | @@ -93,12 +111,16 @@ class SqlBuilder { | ||
93 | sql += `AND (${orWhere}) `; | 111 | sql += `AND (${orWhere}) `; |
94 | } else { | 112 | } else { |
95 | if (orWhere) { | 113 | if (orWhere) { |
96 | - sql += `WHERE ${orWhere}` | 114 | + sql += `WHERE ${orWhere}`; |
97 | } | 115 | } |
98 | } | 116 | } |
99 | 117 | ||
100 | if (this._orderBy) { | 118 | if (this._orderBy) { |
101 | - sql += `ORDER BY time ${this._orderBy.order} ` | 119 | + sql += `ORDER BY time ${this._orderBy.order} `; |
120 | + } | ||
121 | + | ||
122 | + if (this._groupBy) { | ||
123 | + sql += `GROUP BY ` + this._groupBy.map(f => `"${f}"`).join(',') | ||
102 | } | 124 | } |
103 | 125 | ||
104 | if (!_.isNil(this._limit)) { | 126 | if (!_.isNil(this._limit)) { |
apps/web/views/action/profile_count.hbs
0 → 100644
1 | +<div class="pageheader"> | ||
2 | + <div class="media"> | ||
3 | + <div class="pageicon pull-left"> | ||
4 | + <i class="fa fa-th-list"></i> | ||
5 | + </div> | ||
6 | + <div class="media-body"> | ||
7 | + <ul class="breadcrumb"> | ||
8 | + <li><a href=""><i class="glyphicon glyphicon-home"></i></a></li> | ||
9 | + <li><a href="">性能监控</a></li> | ||
10 | + <li>调用次数统计</li> | ||
11 | + </ul> | ||
12 | + <h4>调用次数统计</h4> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <!-- media --> | ||
16 | +</div> | ||
17 | +<!-- pageheader --> | ||
18 | + | ||
19 | +<div class="contentpanel page-servers"> | ||
20 | + <div class="panel panel-primary-head"> | ||
21 | + <div class="panel-heading" style="overflow: hidden"> | ||
22 | + | ||
23 | + <div class="pull-left"> | ||
24 | + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | ||
25 | + <option value="aws" selected>aws</option> | ||
26 | + <option value="qcloud">qcloud</option> | ||
27 | + </select> | ||
28 | + </div> | ||
29 | + | ||
30 | + <div id="reportrange" class="pull-left" | ||
31 | + style="display: inline-block; background: #fff; cursor: pointer; padding: 9px 10px; border: 1px solid #ccc; width: 250px; color: black; margin-left: 20px;"> | ||
32 | + <i class="glyphicon glyphicon-calendar fa fa-calendar"></i> | ||
33 | + <span></span> <b class="caret"></b> | ||
34 | + </div> | ||
35 | + | ||
36 | + <div class="pull-left"> | ||
37 | + <select id="selectedApp" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | ||
38 | + <option value="default">全部</option> | ||
39 | + <option value="pc">PC</option> | ||
40 | + <option value="h5">H5</option> | ||
41 | + </select> | ||
42 | + </div> | ||
43 | + | ||
44 | + <div class="pull-left"> | ||
45 | + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button> | ||
46 | + </div> | ||
47 | + </div> | ||
48 | + <!-- panel-heading --> | ||
49 | + | ||
50 | + <table id="table-servers" class="table table-striped table-bordered"> | ||
51 | + <thead class=""> | ||
52 | + <tr> | ||
53 | + <td >接口名称</td> | ||
54 | + <td >次数</td> | ||
55 | + </thead> | ||
56 | + | ||
57 | + <tbody> | ||
58 | + </tbody> | ||
59 | + </table> | ||
60 | + </div> | ||
61 | + <!-- panel --> | ||
62 | +</div> | ||
63 | + | ||
64 | + | ||
65 | +<script> | ||
66 | + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime; | ||
67 | + var data_end_point = '/profile/count.json'; | ||
68 | + var dataTable = null; | ||
69 | + | ||
70 | + function ajaxUrl() { | ||
71 | + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`; | ||
72 | + | ||
73 | + if (selectedEndTime && selectedEndTime) { | ||
74 | + url += `&start=${selectedStarTime}&end=${selectedEndTime}`; | ||
75 | + } | ||
76 | + | ||
77 | + if (lastTime) { | ||
78 | + url += `&lastTime=${lastTime}` | ||
79 | + } | ||
80 | + | ||
81 | + return url | ||
82 | + } | ||
83 | + | ||
84 | + $(function() { | ||
85 | + init(); | ||
86 | + initTable(); | ||
87 | + initDatePicker(); | ||
88 | + initSelect(); | ||
89 | + }); | ||
90 | + | ||
91 | + function init() { | ||
92 | + selectedServer = 'aws'; | ||
93 | + selectedApp = 'default'; | ||
94 | + } | ||
95 | + | ||
96 | + function initTable() { | ||
97 | + dataTable = $("#table-servers").DataTable({ | ||
98 | + pageLength: 20, | ||
99 | + retrieve: true, | ||
100 | + searching: true, | ||
101 | + dataSrc: 'data', | ||
102 | + pageLength: 25, | ||
103 | + columns: [ | ||
104 | + {data: 'route'}, | ||
105 | + {data: 'times'} | ||
106 | + ], | ||
107 | + data: [{ | ||
108 | + route: '', | ||
109 | + times: '' | ||
110 | + }], | ||
111 | + order: [[ 1, "desc" ]] | ||
112 | + }); | ||
113 | + } | ||
114 | + | ||
115 | + const TIME = { | ||
116 | + '最近1分钟': '1m', | ||
117 | + '最近30分钟': '30m', | ||
118 | + '最近1小时': '1h', | ||
119 | + '最近3小时': '3h', | ||
120 | + '最近6小时': '6h', | ||
121 | + '最近12小时': '12h' | ||
122 | + }; | ||
123 | + | ||
124 | + function initDatePicker() { | ||
125 | + var start = selectedStarTime; | ||
126 | + var end = selectedEndTime; | ||
127 | + var first = '最近1分钟'; | ||
128 | + | ||
129 | + $('#reportrange span').html(first); | ||
130 | + | ||
131 | + lastTime = TIME[first]; | ||
132 | + | ||
133 | + function cb(start, end, label) { | ||
134 | + if (label && label !== '自定义日期') { | ||
135 | + $('#reportrange span').html(label); | ||
136 | + lastTime = TIME[label]; | ||
137 | + } else if (label && label === '自定义日期'){ | ||
138 | + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')); | ||
139 | + selectedStarTime = start.format('YYYY-MM-DD'); | ||
140 | + selectedEndTime = end.format('YYYY-MM-DD'); | ||
141 | + lastTime = null | ||
142 | + } | ||
143 | + } | ||
144 | + | ||
145 | + $('#reportrange').daterangepicker({ | ||
146 | + startDate: start, | ||
147 | + endDate: end, | ||
148 | + timePicker: true, | ||
149 | + timePicker24Hour: true, | ||
150 | + dateLimit: { | ||
151 | + days: 7 | ||
152 | + }, | ||
153 | + ranges: { | ||
154 | + '最近1分钟': [moment().subtract(1, 'minutes'), moment()], | ||
155 | + '最近30分钟': [moment().subtract(30, 'minutes'), moment()], | ||
156 | + '最近1小时': [moment().subtract(1, 'hours'), moment()], | ||
157 | + '最近3小时': [moment().subtract(3, 'hours'), moment()], | ||
158 | + '最近6小时': [moment().subtract(6, 'hours'), moment()], | ||
159 | + '最近12小时': [moment().subtract(12, 'hours'), moment()] | ||
160 | + }, | ||
161 | + locale: { | ||
162 | + format: "YYYY-MM-DD", | ||
163 | + applyLabel: '确定', | ||
164 | + cancelLabel: '取消', | ||
165 | + weekLabel: 'W', | ||
166 | + customRangeLabel: '自定义日期', | ||
167 | + daysOfWeek: '一_二_三_四_五_六_日'.split('_'), | ||
168 | + monthNames: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), | ||
169 | + firstDay: 1 | ||
170 | + }, | ||
171 | + }, cb); | ||
172 | + | ||
173 | + cb(start, end); | ||
174 | + } | ||
175 | + | ||
176 | + function initSelect() { | ||
177 | + $('#selectedServer').change(function() { | ||
178 | + selectedServer = $('#selectedServer').val(); | ||
179 | + }); | ||
180 | + | ||
181 | + $('#selectedApp').change(function() { | ||
182 | + selectedApp = $('#selectedApp').val(); | ||
183 | + }); | ||
184 | + | ||
185 | + $('#search').on('click', () => { | ||
186 | + _handleChanged(); | ||
187 | + }) | ||
188 | + } | ||
189 | + | ||
190 | + function _handleChanged() { | ||
191 | + dataTable && dataTable.ajax.url(ajaxUrl()).load(); | ||
192 | + } | ||
193 | + | ||
194 | +</script> |
@@ -21,7 +21,8 @@ | @@ -21,7 +21,8 @@ | ||
21 | <div class="panel-heading" style="overflow: hidden"> | 21 | <div class="panel-heading" style="overflow: hidden"> |
22 | 22 | ||
23 | <div class="pull-left"> | 23 | <div class="pull-left"> |
24 | - <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | 24 | + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" |
25 | + style="margin-left: 10px;"> | ||
25 | <option value="aws" selected>aws</option> | 26 | <option value="aws" selected>aws</option> |
26 | <option value="qcloud">qcloud</option> | 27 | <option value="qcloud">qcloud</option> |
27 | </select> | 28 | </select> |
@@ -40,6 +41,10 @@ | @@ -40,6 +41,10 @@ | ||
40 | <option value="h5">H5</option> | 41 | <option value="h5">H5</option> |
41 | </select> | 42 | </select> |
42 | </div> | 43 | </div> |
44 | + | ||
45 | + <div class="pull-left"> | ||
46 | + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button> | ||
47 | + </div> | ||
43 | </div> | 48 | </div> |
44 | <!-- panel-heading --> | 49 | <!-- panel-heading --> |
45 | 50 | ||
@@ -70,22 +75,22 @@ | @@ -70,22 +75,22 @@ | ||
70 | 75 | ||
71 | 76 | ||
72 | <script> | 77 | <script> |
73 | - var selectedServer, selectedStarTime, selectedEndTime, selectedApp; | 78 | + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime; |
74 | var data_end_point = '/profile/error.json'; | 79 | var data_end_point = '/profile/error.json'; |
75 | var dataTable = null; | 80 | var dataTable = null; |
76 | - var handleChanged = skipOnce(_handleChanged); | ||
77 | 81 | ||
78 | function ajaxUrl() { | 82 | function ajaxUrl() { |
79 | - return `${data_end_point}?start=${selectedStarTime.format('YYYY-MM-DD')}&end=${selectedEndTime.format('YYYY-MM-DD')}&app=${selectedApp}&server=${selectedServer}` | ||
80 | - } | 83 | + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`; |
81 | 84 | ||
82 | - function skipOnce(fn) { | ||
83 | - var count = 0; | 85 | + if (selectedEndTime && selectedEndTime) { |
86 | + url += `&start=${selectedStarTime}&end=${selectedEndTime}`; | ||
87 | + } | ||
84 | 88 | ||
85 | - return function() { | ||
86 | - if (count++ >= 1) fn.apply(null, arguments); | ||
87 | - return null | 89 | + if (lastTime) { |
90 | + url += `&lastTime=${lastTime}` | ||
88 | } | 91 | } |
92 | + | ||
93 | + return url | ||
89 | } | 94 | } |
90 | 95 | ||
91 | $(function() { | 96 | $(function() { |
@@ -97,8 +102,6 @@ | @@ -97,8 +102,6 @@ | ||
97 | 102 | ||
98 | function init() { | 103 | function init() { |
99 | selectedServer = 'aws'; | 104 | selectedServer = 'aws'; |
100 | - selectedStarTime = moment(); | ||
101 | - selectedEndTime = moment().add(1, 'days'); | ||
102 | selectedApp = 'default'; | 105 | selectedApp = 'default'; |
103 | } | 106 | } |
104 | 107 | ||
@@ -113,61 +116,91 @@ | @@ -113,61 +116,91 @@ | ||
113 | pageLength: 25, | 116 | pageLength: 25, |
114 | deferLoading: 0, | 117 | deferLoading: 0, |
115 | columns: [ | 118 | columns: [ |
116 | - { data: 'time' }, | ||
117 | - { data: 'app' }, | ||
118 | - { data: 'type' }, | ||
119 | - { data: 'reqID' }, | ||
120 | - { data: 'uid' }, | ||
121 | - { data: 'udid' }, | ||
122 | - { data: 'code' }, | ||
123 | - { data: 'message' }, | ||
124 | - { data: 'script' }, | ||
125 | - { data: 'line' }, | ||
126 | - { data: 'column' }, | ||
127 | - { data: 'stack' } | 119 | + {data: 'time'}, |
120 | + {data: 'app'}, | ||
121 | + {data: 'type'}, | ||
122 | + {data: 'reqID'}, | ||
123 | + {data: 'uid'}, | ||
124 | + {data: 'udid'}, | ||
125 | + {data: 'code'}, | ||
126 | + {data: 'message'}, | ||
127 | + {data: 'script'}, | ||
128 | + {data: 'line'}, | ||
129 | + {data: 'column'}, | ||
130 | + {data: 'stack'} | ||
128 | ], | 131 | ], |
132 | + data: [{ | ||
133 | + time: "", | ||
134 | + app: "", | ||
135 | + type: "", | ||
136 | + reqID: "", | ||
137 | + uid: "", | ||
138 | + udid: "", | ||
139 | + code: "", | ||
140 | + message: "", | ||
141 | + script: "", | ||
142 | + line: "", | ||
143 | + column: "", | ||
144 | + stack: "" | ||
145 | + }], | ||
129 | columnDefs: [ | 146 | columnDefs: [ |
130 | { | 147 | { |
131 | - render: function ( data, type, row ) { | 148 | + render: function(data, type, row) { |
132 | return moment(data).format('YYYY/MM/DD HH:MM:ss'); | 149 | return moment(data).format('YYYY/MM/DD HH:MM:ss'); |
133 | }, | 150 | }, |
134 | targets: 0 | 151 | targets: 0 |
135 | } | 152 | } |
136 | ], | 153 | ], |
137 | - order: [[ 0, "desc" ]] | 154 | + order: [[0, "desc"]] |
138 | }); | 155 | }); |
139 | } | 156 | } |
140 | 157 | ||
158 | + const TIME = { | ||
159 | + '最近1分钟': '1m', | ||
160 | + '最近30分钟': '30m', | ||
161 | + '最近1小时': '1h', | ||
162 | + '最近3小时': '3h', | ||
163 | + '最近6小时': '6h', | ||
164 | + '最近12小时': '12h' | ||
165 | + }; | ||
166 | + | ||
141 | function initDatePicker() { | 167 | function initDatePicker() { |
142 | var start = selectedStarTime; | 168 | var start = selectedStarTime; |
143 | var end = selectedEndTime; | 169 | var end = selectedEndTime; |
170 | + var first = '最近1分钟'; | ||
144 | 171 | ||
172 | + $('#reportrange span').html(first); | ||
145 | 173 | ||
146 | - $('#reportrange span').html('今天'); | 174 | + lastTime = TIME[first]; |
147 | 175 | ||
148 | function cb(start, end, label) { | 176 | function cb(start, end, label) { |
149 | - if (label !== '自定义日期') { | 177 | + if (label && label !== '自定义日期') { |
150 | $('#reportrange span').html(label); | 178 | $('#reportrange span').html(label); |
151 | - } else { | ||
152 | - $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')) | 179 | + lastTime = TIME[label]; |
180 | + } else if (label && label === '自定义日期'){ | ||
181 | + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')); | ||
182 | + selectedStarTime = start.format('YYYY-MM-DD'); | ||
183 | + selectedEndTime = end.format('YYYY-MM-DD'); | ||
184 | + lastTime = null | ||
153 | } | 185 | } |
154 | 186 | ||
155 | - selectedStarTime = start; | ||
156 | - selectedEndTime = end; | ||
157 | - | ||
158 | - handleChanged(); | ||
159 | } | 187 | } |
160 | 188 | ||
161 | $('#reportrange').daterangepicker({ | 189 | $('#reportrange').daterangepicker({ |
162 | startDate: start, | 190 | startDate: start, |
163 | endDate: end, | 191 | endDate: end, |
192 | + timePicker: true, | ||
193 | + timePicker24Hour: true, | ||
194 | + dateLimit: { | ||
195 | + days: 7 | ||
196 | + }, | ||
164 | ranges: { | 197 | ranges: { |
165 | - '今天': [moment(), moment().add(1, 'days')], | ||
166 | - '昨天': [moment().subtract(1, 'days'), moment()], | ||
167 | - '最近 7 天': [moment().subtract(6, 'days'), moment().add(1, 'days')], | ||
168 | - '最近 30 天': [moment().subtract(29, 'days'), moment().add(1, 'days')], | ||
169 | - '本月': [moment().startOf('month'), moment().endOf('month')], | ||
170 | - '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] | 198 | + '最近1分钟': [moment().subtract(1, 'minutes'), moment()], |
199 | + '最近30分钟': [moment().subtract(30, 'minutes'), moment()], | ||
200 | + '最近1小时': [moment().subtract(1, 'hours'), moment()], | ||
201 | + '最近3小时': [moment().subtract(3, 'hours'), moment()], | ||
202 | + '最近6小时': [moment().subtract(6, 'hours'), moment()], | ||
203 | + '最近12小时': [moment().subtract(12, 'hours'), moment()] | ||
171 | }, | 204 | }, |
172 | locale: { | 205 | locale: { |
173 | format: "YYYY-MM-DD", | 206 | format: "YYYY-MM-DD", |
@@ -186,14 +219,16 @@ | @@ -186,14 +219,16 @@ | ||
186 | 219 | ||
187 | function initSelect() { | 220 | function initSelect() { |
188 | $('#selectedServer').change(function() { | 221 | $('#selectedServer').change(function() { |
189 | - selectedApp = $('#selectedServer').val(); | ||
190 | - handleChanged(); | 222 | + selectedServer = $('#selectedServer').val(); |
191 | }); | 223 | }); |
192 | 224 | ||
193 | $('#selectedApp').change(function() { | 225 | $('#selectedApp').change(function() { |
194 | selectedApp = $('#selectedApp').val(); | 226 | selectedApp = $('#selectedApp').val(); |
195 | - handleChanged(); | ||
196 | }); | 227 | }); |
228 | + | ||
229 | + $('#search').on('click', function() { | ||
230 | + _handleChanged(); | ||
231 | + }) | ||
197 | } | 232 | } |
198 | 233 | ||
199 | function _handleChanged() { | 234 | function _handleChanged() { |
apps/web/views/action/profile_mean.hbs
0 → 100644
1 | +<div class="pageheader"> | ||
2 | + <div class="media"> | ||
3 | + <div class="pageicon pull-left"> | ||
4 | + <i class="fa fa-th-list"></i> | ||
5 | + </div> | ||
6 | + <div class="media-body"> | ||
7 | + <ul class="breadcrumb"> | ||
8 | + <li><a href=""><i class="glyphicon glyphicon-home"></i></a></li> | ||
9 | + <li><a href="">性能监控</a></li> | ||
10 | + <li>调用时间统计</li> | ||
11 | + </ul> | ||
12 | + <h4>调用时间统计</h4> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <!-- media --> | ||
16 | +</div> | ||
17 | +<!-- pageheader --> | ||
18 | + | ||
19 | +<div class="contentpanel page-servers"> | ||
20 | + <div class="panel panel-primary-head"> | ||
21 | + <div class="panel-heading" style="overflow: hidden"> | ||
22 | + | ||
23 | + <div class="pull-left"> | ||
24 | + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | ||
25 | + <option value="aws" selected>aws</option> | ||
26 | + <option value="qcloud">qcloud</option> | ||
27 | + </select> | ||
28 | + </div> | ||
29 | + | ||
30 | + <div id="reportrange" class="pull-left" | ||
31 | + style="display: inline-block; background: #fff; cursor: pointer; padding: 9px 10px; border: 1px solid #ccc; width: 250px; color: black; margin-left: 20px;"> | ||
32 | + <i class="glyphicon glyphicon-calendar fa fa-calendar"></i> | ||
33 | + <span></span> <b class="caret"></b> | ||
34 | + </div> | ||
35 | + | ||
36 | + <div class="pull-left"> | ||
37 | + <select id="selectedApp" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | ||
38 | + <option value="default">全部</option> | ||
39 | + <option value="pc">PC</option> | ||
40 | + <option value="h5">H5</option> | ||
41 | + </select> | ||
42 | + </div> | ||
43 | + | ||
44 | + <div class="pull-left"> | ||
45 | + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button> | ||
46 | + </div> | ||
47 | + </div> | ||
48 | + <!-- panel-heading --> | ||
49 | + | ||
50 | + <table id="table-servers" class="table table-striped table-bordered"> | ||
51 | + <thead class=""> | ||
52 | + <tr> | ||
53 | + <td >接口名称</td> | ||
54 | + <td >耗时</td> | ||
55 | + </thead> | ||
56 | + | ||
57 | + <tbody> | ||
58 | + </tbody> | ||
59 | + </table> | ||
60 | + </div> | ||
61 | + <!-- panel --> | ||
62 | +</div> | ||
63 | + | ||
64 | + | ||
65 | +<script> | ||
66 | + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime; | ||
67 | + var data_end_point = '/profile/mean.json'; | ||
68 | + var dataTable = null; | ||
69 | + | ||
70 | + function ajaxUrl() { | ||
71 | + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`; | ||
72 | + | ||
73 | + if (selectedEndTime && selectedEndTime) { | ||
74 | + url += `&start=${selectedStarTime}&end=${selectedEndTime}`; | ||
75 | + } | ||
76 | + | ||
77 | + if (lastTime) { | ||
78 | + url += `&lastTime=${lastTime}` | ||
79 | + } | ||
80 | + | ||
81 | + return url | ||
82 | + } | ||
83 | + | ||
84 | + $(function() { | ||
85 | + init(); | ||
86 | + initTable(); | ||
87 | + initDatePicker(); | ||
88 | + initSelect(); | ||
89 | + }); | ||
90 | + | ||
91 | + function init() { | ||
92 | + selectedServer = 'aws'; | ||
93 | + selectedApp = 'default'; | ||
94 | + } | ||
95 | + | ||
96 | + function initTable() { | ||
97 | + dataTable = $("#table-servers").DataTable({ | ||
98 | + pageLength: 20, | ||
99 | + retrieve: true, | ||
100 | + searching: true, | ||
101 | + dataSrc: 'data', | ||
102 | + pageLength: 25, | ||
103 | + columns: [ | ||
104 | + {data: 'route'}, | ||
105 | + {data: 'mean'} | ||
106 | + ], | ||
107 | + data: [{ | ||
108 | + route: '', | ||
109 | + mean: '' | ||
110 | + }], | ||
111 | + order: [[ 1, "desc" ]] | ||
112 | + }); | ||
113 | + } | ||
114 | + | ||
115 | + const TIME = { | ||
116 | + '最近1分钟': '1m', | ||
117 | + '最近30分钟': '30m', | ||
118 | + '最近1小时': '1h', | ||
119 | + '最近3小时': '3h', | ||
120 | + '最近6小时': '6h', | ||
121 | + '最近12小时': '12h' | ||
122 | + }; | ||
123 | + | ||
124 | + function initDatePicker() { | ||
125 | + var start = selectedStarTime; | ||
126 | + var end = selectedEndTime; | ||
127 | + var first = '最近1分钟'; | ||
128 | + | ||
129 | + $('#reportrange span').html(first); | ||
130 | + | ||
131 | + lastTime = TIME[first]; | ||
132 | + | ||
133 | + function cb(start, end, label) { | ||
134 | + if (label && label !== '自定义日期') { | ||
135 | + $('#reportrange span').html(label); | ||
136 | + lastTime = TIME[label]; | ||
137 | + } else if (label && label === '自定义日期'){ | ||
138 | + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')); | ||
139 | + selectedStarTime = start.format('YYYY-MM-DD'); | ||
140 | + selectedEndTime = end.format('YYYY-MM-DD'); | ||
141 | + lastTime = null | ||
142 | + } | ||
143 | + | ||
144 | + } | ||
145 | + | ||
146 | + $('#reportrange').daterangepicker({ | ||
147 | + startDate: start, | ||
148 | + endDate: end, | ||
149 | + timePicker: true, | ||
150 | + timePicker24Hour: true, | ||
151 | + dateLimit: { | ||
152 | + days: 7 | ||
153 | + }, | ||
154 | + ranges: { | ||
155 | + '最近1分钟': [moment().subtract(1, 'minutes'), moment()], | ||
156 | + '最近30分钟': [moment().subtract(30, 'minutes'), moment()], | ||
157 | + '最近1小时': [moment().subtract(1, 'hours'), moment()], | ||
158 | + '最近3小时': [moment().subtract(3, 'hours'), moment()], | ||
159 | + '最近6小时': [moment().subtract(6, 'hours'), moment()], | ||
160 | + '最近12小时': [moment().subtract(12, 'hours'), moment()] | ||
161 | + }, | ||
162 | + locale: { | ||
163 | + format: "YYYY-MM-DD", | ||
164 | + applyLabel: '确定', | ||
165 | + cancelLabel: '取消', | ||
166 | + weekLabel: 'W', | ||
167 | + customRangeLabel: '自定义日期', | ||
168 | + daysOfWeek: '一_二_三_四_五_六_日'.split('_'), | ||
169 | + monthNames: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), | ||
170 | + firstDay: 1 | ||
171 | + }, | ||
172 | + }, cb); | ||
173 | + | ||
174 | + cb(start, end); | ||
175 | + } | ||
176 | + | ||
177 | + function initSelect() { | ||
178 | + $('#selectedServer').change(function() { | ||
179 | + selectedServer = $('#selectedServer').val(); | ||
180 | + }); | ||
181 | + | ||
182 | + $('#selectedApp').change(function() { | ||
183 | + selectedApp = $('#selectedApp').val(); | ||
184 | + }); | ||
185 | + | ||
186 | + $('#search').on('click', () => { | ||
187 | + _handleChanged(); | ||
188 | + }) | ||
189 | + } | ||
190 | + | ||
191 | + function _handleChanged() { | ||
192 | + dataTable && dataTable.ajax.url(ajaxUrl()).load(); | ||
193 | + } | ||
194 | + | ||
195 | +</script> |
@@ -21,7 +21,8 @@ | @@ -21,7 +21,8 @@ | ||
21 | <div class="panel-heading" style="overflow: hidden"> | 21 | <div class="panel-heading" style="overflow: hidden"> |
22 | 22 | ||
23 | <div class="pull-left"> | 23 | <div class="pull-left"> |
24 | - <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> | 24 | + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" |
25 | + style="margin-left: 10px;"> | ||
25 | <option value="aws" selected>aws</option> | 26 | <option value="aws" selected>aws</option> |
26 | <option value="qcloud">qcloud</option> | 27 | <option value="qcloud">qcloud</option> |
27 | </select> | 28 | </select> |
@@ -42,12 +43,7 @@ | @@ -42,12 +43,7 @@ | ||
42 | </div> | 43 | </div> |
43 | 44 | ||
44 | <div class="pull-left"> | 45 | <div class="pull-left"> |
45 | - <select id="selectedDuration" class="selectpicker show-menu-arrow form-control" style="margin-left: 20px;"> | ||
46 | - <option value="0">全部</option> | ||
47 | - <option value="1">小于100</option> | ||
48 | - <option value="2">大于100小于200</option> | ||
49 | - <option value="3">大于200</option> | ||
50 | - </select> | 46 | + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button> |
51 | </div> | 47 | </div> |
52 | </div> | 48 | </div> |
53 | <!-- panel-heading --> | 49 | <!-- panel-heading --> |
@@ -63,7 +59,8 @@ | @@ -63,7 +59,8 @@ | ||
63 | <td>耗时</td> | 59 | <td>耗时</td> |
64 | <th>请求ID</th> | 60 | <th>请求ID</th> |
65 | <td>用户ID</td> | 61 | <td>用户ID</td> |
66 | - <td>访客ID</td></tr> | 62 | + <td>访客ID</td> |
63 | + </tr> | ||
67 | </thead> | 64 | </thead> |
68 | 65 | ||
69 | <tbody> | 66 | <tbody> |
@@ -75,24 +72,23 @@ | @@ -75,24 +72,23 @@ | ||
75 | 72 | ||
76 | 73 | ||
77 | <script> | 74 | <script> |
78 | - var selectedServer, selectedStarTime, selectedEndTime, selectedApp, selectedDuration; | 75 | + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime; |
79 | var data_end_point = '/profile/time.json'; | 76 | var data_end_point = '/profile/time.json'; |
80 | var dataTable = null; | 77 | var dataTable = null; |
81 | - var handleChanged = skipOnce(_handleChanged); | ||
82 | 78 | ||
83 | function ajaxUrl() { | 79 | function ajaxUrl() { |
84 | - return `${data_end_point}?start=${selectedStarTime.format('YYYY-MM-DD')}&end=${selectedEndTime.format('YYYY-MM-DD')}&app=${selectedApp}&duration=${selectedDuration}&server=${selectedServer}` | ||
85 | - } | ||
86 | - | ||
87 | - function skipOnce(fn) { | ||
88 | - var count = 0; | 80 | + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`; |
89 | 81 | ||
90 | - return function() { | ||
91 | - if (count++ >= 1) fn.apply(null, arguments); | ||
92 | - return null | 82 | + if (selectedEndTime && selectedEndTime) { |
83 | + url += `&start=${selectedStarTime}&end=${selectedEndTime}`; | ||
93 | } | 84 | } |
85 | + | ||
86 | + if (lastTime) { | ||
87 | + url += `&lastTime=${lastTime}` | ||
94 | } | 88 | } |
95 | 89 | ||
90 | + return url | ||
91 | + } | ||
96 | 92 | ||
97 | $(function() { | 93 | $(function() { |
98 | init(); | 94 | init(); |
@@ -106,7 +102,6 @@ | @@ -106,7 +102,6 @@ | ||
106 | selectedStarTime = moment(); | 102 | selectedStarTime = moment(); |
107 | selectedEndTime = moment().add(1, 'days'); | 103 | selectedEndTime = moment().add(1, 'days'); |
108 | selectedApp = 'default'; | 104 | selectedApp = 'default'; |
109 | - selectedDuration = 0; | ||
110 | } | 105 | } |
111 | 106 | ||
112 | function initTable() { | 107 | function initTable() { |
@@ -115,7 +110,6 @@ | @@ -115,7 +110,6 @@ | ||
115 | retrieve: true, | 110 | retrieve: true, |
116 | responsive: true, | 111 | responsive: true, |
117 | searching: true, | 112 | searching: true, |
118 | - ajax: ajaxUrl(), | ||
119 | dataSrc: 'data', | 113 | dataSrc: 'data', |
120 | pageLength: 25, | 114 | pageLength: 25, |
121 | deferLoading: 0, | 115 | deferLoading: 0, |
@@ -130,48 +124,75 @@ | @@ -130,48 +124,75 @@ | ||
130 | {data: "uid"}, | 124 | {data: "uid"}, |
131 | {data: "udid"} | 125 | {data: "udid"} |
132 | ], | 126 | ], |
127 | + data: [{ | ||
128 | + time: "", | ||
129 | + app: "", | ||
130 | + type: "", | ||
131 | + api: "", | ||
132 | + route: "", | ||
133 | + duration: "", | ||
134 | + reqID: "", | ||
135 | + uid: "", | ||
136 | + udid: "" | ||
137 | + }], | ||
133 | columnDefs: [ | 138 | columnDefs: [ |
134 | { | 139 | { |
135 | - render: function ( data, type, row ) { | 140 | + render: function(data, type, row) { |
136 | return moment(data).format('YYYY/MM/DD HH:MM:ss'); | 141 | return moment(data).format('YYYY/MM/DD HH:MM:ss'); |
137 | }, | 142 | }, |
138 | targets: 0 | 143 | targets: 0 |
139 | } | 144 | } |
140 | ], | 145 | ], |
141 | - order: [[ 0, "desc" ]] | 146 | + order: [[0, "desc"]] |
142 | }); | 147 | }); |
143 | } | 148 | } |
144 | 149 | ||
150 | + const TIME = { | ||
151 | + '最近1分钟': '1m', | ||
152 | + '最近30分钟': '30m', | ||
153 | + '最近1小时': '1h', | ||
154 | + '最近3小时': '3h', | ||
155 | + '最近6小时': '6h', | ||
156 | + '最近12小时': '12h' | ||
157 | + }; | ||
158 | + | ||
145 | function initDatePicker() { | 159 | function initDatePicker() { |
146 | var start = selectedStarTime; | 160 | var start = selectedStarTime; |
147 | var end = selectedEndTime; | 161 | var end = selectedEndTime; |
162 | + var first = '最近1分钟'; | ||
148 | 163 | ||
164 | + $('#reportrange span').html(first); | ||
149 | 165 | ||
150 | - $('#reportrange span').html('今天'); | 166 | + lastTime = TIME[first]; |
151 | 167 | ||
152 | function cb(start, end, label) { | 168 | function cb(start, end, label) { |
153 | - if (label !== '自定义日期') { | 169 | + if (label && label !== '自定义日期') { |
154 | $('#reportrange span').html(label); | 170 | $('#reportrange span').html(label); |
155 | - } else { | ||
156 | - $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')) | 171 | + lastTime = TIME[label]; |
172 | + } else if (label && label === '自定义日期') { | ||
173 | + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')); | ||
174 | + selectedStarTime = start.format('YYYY-MM-DD'); | ||
175 | + selectedEndTime = end.format('YYYY-MM-DD'); | ||
176 | + lastTime = null | ||
157 | } | 177 | } |
158 | 178 | ||
159 | - selectedStarTime = start; | ||
160 | - selectedEndTime = end; | ||
161 | - | ||
162 | - handleChanged(); | ||
163 | } | 179 | } |
164 | 180 | ||
165 | $('#reportrange').daterangepicker({ | 181 | $('#reportrange').daterangepicker({ |
166 | startDate: start, | 182 | startDate: start, |
167 | endDate: end, | 183 | endDate: end, |
184 | + timePicker: true, | ||
185 | + timePicker24Hour: true, | ||
186 | + dateLimit: { | ||
187 | + days: 7 | ||
188 | + }, | ||
168 | ranges: { | 189 | ranges: { |
169 | - '今天': [moment(), moment().add(1, 'days')], | ||
170 | - '昨天': [moment().subtract(1, 'days'), moment()], | ||
171 | - '最近 7 天': [moment().subtract(6, 'days'), moment().add(1, 'days')], | ||
172 | - '最近 30 天': [moment().subtract(29, 'days'), moment().add(1, 'days')], | ||
173 | - '本月': [moment().startOf('month'), moment().endOf('month')], | ||
174 | - '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] | 190 | + '最近1分钟': [moment().subtract(1, 'minutes'), moment()], |
191 | + '最近30分钟': [moment().subtract(30, 'minutes'), moment()], | ||
192 | + '最近1小时': [moment().subtract(1, 'hours'), moment()], | ||
193 | + '最近3小时': [moment().subtract(3, 'hours'), moment()], | ||
194 | + '最近6小时': [moment().subtract(6, 'hours'), moment()], | ||
195 | + '最近12小时': [moment().subtract(12, 'hours'), moment()] | ||
175 | }, | 196 | }, |
176 | locale: { | 197 | locale: { |
177 | format: "YYYY-MM-DD", | 198 | format: "YYYY-MM-DD", |
@@ -191,18 +212,15 @@ | @@ -191,18 +212,15 @@ | ||
191 | function initSelect() { | 212 | function initSelect() { |
192 | $('#selectedServer').change(function() { | 213 | $('#selectedServer').change(function() { |
193 | selectedServer = $('#selectedServer').val(); | 214 | selectedServer = $('#selectedServer').val(); |
194 | - handleChanged(); | ||
195 | }); | 215 | }); |
196 | 216 | ||
197 | $('#selectedApp').change(function() { | 217 | $('#selectedApp').change(function() { |
198 | selectedApp = $('#selectedApp').val(); | 218 | selectedApp = $('#selectedApp').val(); |
199 | - handleChanged(); | ||
200 | }); | 219 | }); |
201 | 220 | ||
202 | - $('#selectedDuration').change(function() { | ||
203 | - selectedDuration = $('#selectedDuration').val(); | ||
204 | - handleChanged(); | ||
205 | - }); | 221 | + $('#search').on('click', () => { |
222 | + _handleChanged(); | ||
223 | + }) | ||
206 | } | 224 | } |
207 | 225 | ||
208 | function _handleChanged() { | 226 | function _handleChanged() { |
@@ -75,10 +75,12 @@ | @@ -75,10 +75,12 @@ | ||
75 | </ul> | 75 | </ul> |
76 | </li> | 76 | </li> |
77 | 77 | ||
78 | - <li class="parent"><a><i class="fa fa-list"></i> <span>性能分析</span></a> | 78 | + <li class="parent"><a><i class="fa fa-list"></i> <span>性能统计</span></a> |
79 | <ul class="children"> | 79 | <ul class="children"> |
80 | - <li><a href="/profile/time"> <span>耗时</span></a></li> | ||
81 | - <li><a href="/profile/error"> <span>错误</span></a></li> | 80 | + <li><a href="/profile/mean"> <span>调用时间统计</span></a></li> |
81 | + <li><a href="/profile/count"> <span>调用次数统计</span></a></li> | ||
82 | + <li><a href="/profile/time"> <span>调用时间统计</span></a></li> | ||
83 | + <li><a href="/profile/error"> <span>错误信息统计</span></a></li> | ||
82 | </ul> | 84 | </ul> |
83 | </li> | 85 | </li> |
84 | {{/if}} | 86 | {{/if}} |
@@ -25,6 +25,7 @@ | @@ -25,6 +25,7 @@ | ||
25 | "author": "jiangfeng <jeff.jiang@yoho.cn>", | 25 | "author": "jiangfeng <jeff.jiang@yoho.cn>", |
26 | "license": "ISC", | 26 | "license": "ISC", |
27 | "dependencies": { | 27 | "dependencies": { |
28 | + "alasql": "^0.4.3", | ||
28 | "bluebird": "^3.5.0", | 29 | "bluebird": "^3.5.0", |
29 | "co": "^4.6.0", | 30 | "co": "^4.6.0", |
30 | "co-body": "^4.2.0", | 31 | "co-body": "^4.2.0", |
@@ -29,6 +29,13 @@ adler-32@: | @@ -29,6 +29,13 @@ adler-32@: | ||
29 | exit-on-epipe "" | 29 | exit-on-epipe "" |
30 | printj "" | 30 | printj "" |
31 | 31 | ||
32 | +adler-32@~1.1.0: | ||
33 | + version "1.1.0" | ||
34 | + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.1.0.tgz#03551a5c7f0edfbd4fc8fa12a6814978eab651c3" | ||
35 | + dependencies: | ||
36 | + exit-on-epipe "~1.0.1" | ||
37 | + printj "~1.1.0" | ||
38 | + | ||
32 | after@0.8.1: | 39 | after@0.8.1: |
33 | version "0.8.1" | 40 | version "0.8.1" |
34 | resolved "http://registry.npm.taobao.org/after/download/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" | 41 | resolved "http://registry.npm.taobao.org/after/download/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" |
@@ -53,6 +60,17 @@ ajv@^5.1.0: | @@ -53,6 +60,17 @@ ajv@^5.1.0: | ||
53 | json-schema-traverse "^0.3.0" | 60 | json-schema-traverse "^0.3.0" |
54 | json-stable-stringify "^1.0.1" | 61 | json-stable-stringify "^1.0.1" |
55 | 62 | ||
63 | +alasql@^0.4.3: | ||
64 | + version "0.4.3" | ||
65 | + resolved "https://registry.yarnpkg.com/alasql/-/alasql-0.4.3.tgz#46f2c3552be7b5c3ff1c01e5e5ae3706bbe075cb" | ||
66 | + dependencies: | ||
67 | + dom-storage "^2.0.1" | ||
68 | + es6-promise "^4.0.5" | ||
69 | + lodash "^4.17.4" | ||
70 | + request "2.79.0" | ||
71 | + xlsx "^0.11.5" | ||
72 | + yargs "^5.0.0" | ||
73 | + | ||
56 | align-text@^0.1.1, align-text@^0.1.3: | 74 | align-text@^0.1.1, align-text@^0.1.3: |
57 | version "0.1.4" | 75 | version "0.1.4" |
58 | resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" | 76 | resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" |
@@ -362,6 +380,10 @@ camelcase@^1.0.2: | @@ -362,6 +380,10 @@ camelcase@^1.0.2: | ||
362 | version "1.2.1" | 380 | version "1.2.1" |
363 | resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" | 381 | resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" |
364 | 382 | ||
383 | +camelcase@^3.0.0: | ||
384 | + version "3.0.0" | ||
385 | + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" | ||
386 | + | ||
365 | camelcase@^4.0.0: | 387 | camelcase@^4.0.0: |
366 | version "4.1.0" | 388 | version "4.1.0" |
367 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" | 389 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" |
@@ -391,6 +413,13 @@ cfb@>=0.10.0: | @@ -391,6 +413,13 @@ cfb@>=0.10.0: | ||
391 | dependencies: | 413 | dependencies: |
392 | commander "" | 414 | commander "" |
393 | 415 | ||
416 | +cfb@~0.13.1: | ||
417 | + version "0.13.1" | ||
418 | + resolved "https://registry.yarnpkg.com/cfb/-/cfb-0.13.1.tgz#6506e0ab9b6846be7ef25c758932fe16f64c9c71" | ||
419 | + dependencies: | ||
420 | + commander "~2.11.0" | ||
421 | + printj "~1.1.0" | ||
422 | + | ||
394 | chalk@^1.0.0, chalk@^1.1.1: | 423 | chalk@^1.0.0, chalk@^1.1.1: |
395 | version "1.1.3" | 424 | version "1.1.3" |
396 | resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" | 425 | resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" |
@@ -444,6 +473,14 @@ cliui@^2.1.0: | @@ -444,6 +473,14 @@ cliui@^2.1.0: | ||
444 | right-align "^0.1.1" | 473 | right-align "^0.1.1" |
445 | wordwrap "0.0.2" | 474 | wordwrap "0.0.2" |
446 | 475 | ||
476 | +cliui@^3.2.0: | ||
477 | + version "3.2.0" | ||
478 | + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" | ||
479 | + dependencies: | ||
480 | + string-width "^1.0.1" | ||
481 | + strip-ansi "^3.0.1" | ||
482 | + wrap-ansi "^2.0.0" | ||
483 | + | ||
447 | clone@^1.0.2: | 484 | clone@^1.0.2: |
448 | version "1.0.2" | 485 | version "1.0.2" |
449 | resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" | 486 | resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" |
@@ -472,6 +509,14 @@ code-point-at@^1.0.0: | @@ -472,6 +509,14 @@ code-point-at@^1.0.0: | ||
472 | version "1.1.0" | 509 | version "1.1.0" |
473 | resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" | 510 | resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" |
474 | 511 | ||
512 | +codepage@~1.11.0: | ||
513 | + version "1.11.0" | ||
514 | + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.11.0.tgz#1076095b9f03b5ca04f43873fa1a627742285de2" | ||
515 | + dependencies: | ||
516 | + commander "~2.11.0" | ||
517 | + exit-on-epipe "~1.0.1" | ||
518 | + voc "~1.0.0" | ||
519 | + | ||
475 | codepage@~1.3.6: | 520 | codepage@~1.3.6: |
476 | version "1.3.8" | 521 | version "1.3.8" |
477 | resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.3.8.tgz#4f2e5d7c0975de28f88498058dcb5afcab6a5f71" | 522 | resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.3.8.tgz#4f2e5d7c0975de28f88498058dcb5afcab6a5f71" |
@@ -513,6 +558,10 @@ commander@, commander@^2.9.0: | @@ -513,6 +558,10 @@ commander@, commander@^2.9.0: | ||
513 | dependencies: | 558 | dependencies: |
514 | graceful-readlink ">= 1.0.0" | 559 | graceful-readlink ">= 1.0.0" |
515 | 560 | ||
561 | +commander@~2.11.0: | ||
562 | + version "2.11.0" | ||
563 | + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" | ||
564 | + | ||
516 | component-bind@1.0.0: | 565 | component-bind@1.0.0: |
517 | version "1.0.0" | 566 | version "1.0.0" |
518 | resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" | 567 | resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" |
@@ -606,6 +655,13 @@ crc-32@: | @@ -606,6 +655,13 @@ crc-32@: | ||
606 | exit-on-epipe "" | 655 | exit-on-epipe "" |
607 | printj "" | 656 | printj "" |
608 | 657 | ||
658 | +crc-32@~1.1.1: | ||
659 | + version "1.1.1" | ||
660 | + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.1.1.tgz#5d739d5e4c6e352ad8304d73223d483fe55adb8d" | ||
661 | + dependencies: | ||
662 | + exit-on-epipe "~1.0.1" | ||
663 | + printj "~1.1.0" | ||
664 | + | ||
609 | create-error-class@^3.0.0: | 665 | create-error-class@^3.0.0: |
610 | version "3.0.2" | 666 | version "3.0.2" |
611 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" | 667 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" |
@@ -691,7 +747,7 @@ debuglog@^1.0.1: | @@ -691,7 +747,7 @@ debuglog@^1.0.1: | ||
691 | version "1.0.1" | 747 | version "1.0.1" |
692 | resolved "http://registry.npm.taobao.org/debuglog/download/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" | 748 | resolved "http://registry.npm.taobao.org/debuglog/download/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" |
693 | 749 | ||
694 | -decamelize@^1.0.0: | 750 | +decamelize@^1.0.0, decamelize@^1.1.1: |
695 | version "1.2.0" | 751 | version "1.2.0" |
696 | resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" | 752 | resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" |
697 | 753 | ||
@@ -755,6 +811,10 @@ digest-header@^0.0.1: | @@ -755,6 +811,10 @@ digest-header@^0.0.1: | ||
755 | dependencies: | 811 | dependencies: |
756 | utility "0.1.11" | 812 | utility "0.1.11" |
757 | 813 | ||
814 | +dom-storage@^2.0.1: | ||
815 | + version "2.0.2" | ||
816 | + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.0.2.tgz#ed17cbf68abd10e0aef8182713e297c5e4b500b0" | ||
817 | + | ||
758 | dot-prop@^4.1.0: | 818 | dot-prop@^4.1.0: |
759 | version "4.2.0" | 819 | version "4.2.0" |
760 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" | 820 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" |
@@ -829,6 +889,12 @@ engine.io@1.7.2: | @@ -829,6 +889,12 @@ engine.io@1.7.2: | ||
829 | engine.io-parser "1.3.1" | 889 | engine.io-parser "1.3.1" |
830 | ws "1.1.1" | 890 | ws "1.1.1" |
831 | 891 | ||
892 | +error-ex@^1.2.0: | ||
893 | + version "1.3.1" | ||
894 | + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" | ||
895 | + dependencies: | ||
896 | + is-arrayish "^0.2.1" | ||
897 | + | ||
832 | error-inject@~1.0.0: | 898 | error-inject@~1.0.0: |
833 | version "1.0.0" | 899 | version "1.0.0" |
834 | resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" | 900 | resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" |
@@ -878,6 +944,10 @@ es6-promise@^3.3.1: | @@ -878,6 +944,10 @@ es6-promise@^3.3.1: | ||
878 | version "3.3.1" | 944 | version "3.3.1" |
879 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" | 945 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" |
880 | 946 | ||
947 | +es6-promise@^4.0.5: | ||
948 | + version "4.1.1" | ||
949 | + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" | ||
950 | + | ||
881 | es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1: | 951 | es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1: |
882 | version "3.1.0" | 952 | version "3.1.0" |
883 | resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" | 953 | resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" |
@@ -933,6 +1003,10 @@ exit-on-epipe@: | @@ -933,6 +1003,10 @@ exit-on-epipe@: | ||
933 | version "0.1.0" | 1003 | version "0.1.0" |
934 | resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-0.1.0.tgz#aa2f0155b78b34fe60dd2b462e84637ba5ed0697" | 1004 | resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-0.1.0.tgz#aa2f0155b78b34fe60dd2b462e84637ba5ed0697" |
935 | 1005 | ||
1006 | +exit-on-epipe@~1.0.1: | ||
1007 | + version "1.0.1" | ||
1008 | + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" | ||
1009 | + | ||
936 | expand-brackets@^0.1.4: | 1010 | expand-brackets@^0.1.4: |
937 | version "0.1.5" | 1011 | version "0.1.5" |
938 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" | 1012 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" |
@@ -994,6 +1068,13 @@ fill-range@^2.1.0: | @@ -994,6 +1068,13 @@ fill-range@^2.1.0: | ||
994 | repeat-element "^1.1.2" | 1068 | repeat-element "^1.1.2" |
995 | repeat-string "^1.5.2" | 1069 | repeat-string "^1.5.2" |
996 | 1070 | ||
1071 | +find-up@^1.0.0: | ||
1072 | + version "1.1.2" | ||
1073 | + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" | ||
1074 | + dependencies: | ||
1075 | + path-exists "^2.0.0" | ||
1076 | + pinkie-promise "^2.0.0" | ||
1077 | + | ||
997 | for-each@~0.3.2: | 1078 | for-each@~0.3.2: |
998 | version "0.3.2" | 1079 | version "0.3.2" |
999 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" | 1080 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" |
@@ -1063,6 +1144,12 @@ frac@0.3.1: | @@ -1063,6 +1144,12 @@ frac@0.3.1: | ||
1063 | version "0.3.1" | 1144 | version "0.3.1" |
1064 | resolved "http://registry.npm.taobao.org/frac/download/frac-0.3.1.tgz#577677b7fdcbe6faf7c461f1801d34137cda4354" | 1145 | resolved "http://registry.npm.taobao.org/frac/download/frac-0.3.1.tgz#577677b7fdcbe6faf7c461f1801d34137cda4354" |
1065 | 1146 | ||
1147 | +frac@~1.1.0: | ||
1148 | + version "1.1.0" | ||
1149 | + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.0.tgz#dc437e9c6a646b60b127d82ac4902464445cc1e3" | ||
1150 | + dependencies: | ||
1151 | + voc "~1.0.0" | ||
1152 | + | ||
1066 | fresh@^0.3.0: | 1153 | fresh@^0.3.0: |
1067 | version "0.3.0" | 1154 | version "0.3.0" |
1068 | resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" | 1155 | resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" |
@@ -1192,6 +1279,10 @@ generate-object-property@^1.1.0: | @@ -1192,6 +1279,10 @@ generate-object-property@^1.1.0: | ||
1192 | dependencies: | 1279 | dependencies: |
1193 | is-property "^1.0.0" | 1280 | is-property "^1.0.0" |
1194 | 1281 | ||
1282 | +get-caller-file@^1.0.1: | ||
1283 | + version "1.0.2" | ||
1284 | + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" | ||
1285 | + | ||
1195 | get-stream@^3.0.0: | 1286 | get-stream@^3.0.0: |
1196 | version "3.0.0" | 1287 | version "3.0.0" |
1197 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" | 1288 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" |
@@ -1523,6 +1614,14 @@ interpret@^1.0.0: | @@ -1523,6 +1614,14 @@ interpret@^1.0.0: | ||
1523 | version "1.0.1" | 1614 | version "1.0.1" |
1524 | resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" | 1615 | resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" |
1525 | 1616 | ||
1617 | +invert-kv@^1.0.0: | ||
1618 | + version "1.0.0" | ||
1619 | + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" | ||
1620 | + | ||
1621 | +is-arrayish@^0.2.1: | ||
1622 | + version "0.2.1" | ||
1623 | + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" | ||
1624 | + | ||
1526 | is-binary-path@^1.0.0: | 1625 | is-binary-path@^1.0.0: |
1527 | version "1.0.1" | 1626 | version "1.0.1" |
1528 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" | 1627 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" |
@@ -1666,6 +1765,10 @@ is-typedarray@~1.0.0: | @@ -1666,6 +1765,10 @@ is-typedarray@~1.0.0: | ||
1666 | version "1.0.0" | 1765 | version "1.0.0" |
1667 | resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" | 1766 | resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" |
1668 | 1767 | ||
1768 | +is-utf8@^0.2.0: | ||
1769 | + version "0.2.1" | ||
1770 | + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" | ||
1771 | + | ||
1669 | isarray@0.0.1: | 1772 | isarray@0.0.1: |
1670 | version "0.0.1" | 1773 | version "0.0.1" |
1671 | resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" | 1774 | resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" |
@@ -1913,6 +2016,12 @@ lazy-cache@^1.0.3: | @@ -1913,6 +2016,12 @@ lazy-cache@^1.0.3: | ||
1913 | version "1.0.4" | 2016 | version "1.0.4" |
1914 | resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" | 2017 | resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" |
1915 | 2018 | ||
2019 | +lcid@^1.0.0: | ||
2020 | + version "1.0.0" | ||
2021 | + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" | ||
2022 | + dependencies: | ||
2023 | + invert-kv "^1.0.0" | ||
2024 | + | ||
1916 | lie@3.0.2: | 2025 | lie@3.0.2: |
1917 | version "3.0.2" | 2026 | version "3.0.2" |
1918 | resolved "http://registry.npm.taobao.org/lie/download/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea" | 2027 | resolved "http://registry.npm.taobao.org/lie/download/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea" |
@@ -1922,6 +2031,16 @@ lie@3.0.2: | @@ -1922,6 +2031,16 @@ lie@3.0.2: | ||
1922 | inline-process-browser "^1.0.0" | 2031 | inline-process-browser "^1.0.0" |
1923 | unreachable-branch-transform "^0.3.0" | 2032 | unreachable-branch-transform "^0.3.0" |
1924 | 2033 | ||
2034 | +load-json-file@^1.0.0: | ||
2035 | + version "1.1.0" | ||
2036 | + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" | ||
2037 | + dependencies: | ||
2038 | + graceful-fs "^4.1.2" | ||
2039 | + parse-json "^2.2.0" | ||
2040 | + pify "^2.0.0" | ||
2041 | + pinkie-promise "^2.0.0" | ||
2042 | + strip-bom "^2.0.0" | ||
2043 | + | ||
1925 | localforage@^1.3.0: | 2044 | localforage@^1.3.0: |
1926 | version "1.4.3" | 2045 | version "1.4.3" |
1927 | resolved "http://registry.npm.taobao.org/localforage/download/localforage-1.4.3.tgz#a212543c39c7c76424edd12bf474c489aaca494c" | 2046 | resolved "http://registry.npm.taobao.org/localforage/download/localforage-1.4.3.tgz#a212543c39c7c76424edd12bf474c489aaca494c" |
@@ -1986,6 +2105,10 @@ lodash.assign@^3.0.0: | @@ -1986,6 +2105,10 @@ lodash.assign@^3.0.0: | ||
1986 | lodash._createassigner "^3.0.0" | 2105 | lodash._createassigner "^3.0.0" |
1987 | lodash.keys "^3.0.0" | 2106 | lodash.keys "^3.0.0" |
1988 | 2107 | ||
2108 | +lodash.assign@^4.1.0, lodash.assign@^4.2.0: | ||
2109 | + version "4.2.0" | ||
2110 | + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" | ||
2111 | + | ||
1989 | lodash.clonedeep@~4.5.0: | 2112 | lodash.clonedeep@~4.5.0: |
1990 | version "4.5.0" | 2113 | version "4.5.0" |
1991 | resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" | 2114 | resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" |
@@ -2029,7 +2152,7 @@ lodash.without@~4.4.0: | @@ -2029,7 +2152,7 @@ lodash.without@~4.4.0: | ||
2029 | version "4.4.0" | 2152 | version "4.4.0" |
2030 | resolved "http://registry.npm.taobao.org/lodash.without/download/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" | 2153 | resolved "http://registry.npm.taobao.org/lodash.without/download/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" |
2031 | 2154 | ||
2032 | -lodash@^4.11.1: | 2155 | +lodash@^4.11.1, lodash@^4.17.4: |
2033 | version "4.17.4" | 2156 | version "4.17.4" |
2034 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" | 2157 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" |
2035 | 2158 | ||
@@ -2351,6 +2474,15 @@ normalize-package-data@^2.0.0, "normalize-package-data@~1.0.1 || ^2.0.0", normal | @@ -2351,6 +2474,15 @@ normalize-package-data@^2.0.0, "normalize-package-data@~1.0.1 || ^2.0.0", normal | ||
2351 | semver "2 || 3 || 4 || 5" | 2474 | semver "2 || 3 || 4 || 5" |
2352 | validate-npm-package-license "^3.0.1" | 2475 | validate-npm-package-license "^3.0.1" |
2353 | 2476 | ||
2477 | +normalize-package-data@^2.3.2: | ||
2478 | + version "2.4.0" | ||
2479 | + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" | ||
2480 | + dependencies: | ||
2481 | + hosted-git-info "^2.1.4" | ||
2482 | + is-builtin-module "^1.0.0" | ||
2483 | + semver "2 || 3 || 4 || 5" | ||
2484 | + validate-npm-package-license "^3.0.1" | ||
2485 | + | ||
2354 | normalize-path@^2.0.0, normalize-path@^2.0.1: | 2486 | normalize-path@^2.0.0, normalize-path@^2.0.1: |
2355 | version "2.1.1" | 2487 | version "2.1.1" |
2356 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" | 2488 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" |
@@ -2573,6 +2705,12 @@ os-homedir@^1.0.0: | @@ -2573,6 +2705,12 @@ os-homedir@^1.0.0: | ||
2573 | version "1.0.2" | 2705 | version "1.0.2" |
2574 | resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" | 2706 | resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" |
2575 | 2707 | ||
2708 | +os-locale@^1.4.0: | ||
2709 | + version "1.4.0" | ||
2710 | + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" | ||
2711 | + dependencies: | ||
2712 | + lcid "^1.0.0" | ||
2713 | + | ||
2576 | os-name@~1.0.3: | 2714 | os-name@~1.0.3: |
2577 | version "1.0.3" | 2715 | version "1.0.3" |
2578 | resolved "http://registry.npm.taobao.org/os-name/download/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" | 2716 | resolved "http://registry.npm.taobao.org/os-name/download/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" |
@@ -2630,6 +2768,12 @@ parse-glob@^3.0.4: | @@ -2630,6 +2768,12 @@ parse-glob@^3.0.4: | ||
2630 | is-extglob "^1.0.0" | 2768 | is-extglob "^1.0.0" |
2631 | is-glob "^2.0.0" | 2769 | is-glob "^2.0.0" |
2632 | 2770 | ||
2771 | +parse-json@^2.2.0: | ||
2772 | + version "2.2.0" | ||
2773 | + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" | ||
2774 | + dependencies: | ||
2775 | + error-ex "^1.2.0" | ||
2776 | + | ||
2633 | parsejson@0.0.1: | 2777 | parsejson@0.0.1: |
2634 | version "0.0.1" | 2778 | version "0.0.1" |
2635 | resolved "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" | 2779 | resolved "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" |
@@ -2658,6 +2802,12 @@ path-array@^1.0.0: | @@ -2658,6 +2802,12 @@ path-array@^1.0.0: | ||
2658 | dependencies: | 2802 | dependencies: |
2659 | array-index "^1.0.0" | 2803 | array-index "^1.0.0" |
2660 | 2804 | ||
2805 | +path-exists@^2.0.0: | ||
2806 | + version "2.1.0" | ||
2807 | + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" | ||
2808 | + dependencies: | ||
2809 | + pinkie-promise "^2.0.0" | ||
2810 | + | ||
2661 | path-is-absolute@1.0.0: | 2811 | path-is-absolute@1.0.0: |
2662 | version "1.0.0" | 2812 | version "1.0.0" |
2663 | resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.0.tgz#263dada66ab3f2fb10bf7f9d24dd8f3e570ef912" | 2813 | resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.0.tgz#263dada66ab3f2fb10bf7f9d24dd8f3e570ef912" |
@@ -2684,6 +2834,14 @@ path-to-regexp@^1.1.1: | @@ -2684,6 +2834,14 @@ path-to-regexp@^1.1.1: | ||
2684 | dependencies: | 2834 | dependencies: |
2685 | isarray "0.0.1" | 2835 | isarray "0.0.1" |
2686 | 2836 | ||
2837 | +path-type@^1.0.0: | ||
2838 | + version "1.1.0" | ||
2839 | + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" | ||
2840 | + dependencies: | ||
2841 | + graceful-fs "^4.1.2" | ||
2842 | + pify "^2.0.0" | ||
2843 | + pinkie-promise "^2.0.0" | ||
2844 | + | ||
2687 | pause-stream@0.0.11, pause-stream@~0.0.11: | 2845 | pause-stream@0.0.11, pause-stream@~0.0.11: |
2688 | version "0.0.11" | 2846 | version "0.0.11" |
2689 | resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" | 2847 | resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" |
@@ -2698,7 +2856,7 @@ performance-now@^2.1.0: | @@ -2698,7 +2856,7 @@ performance-now@^2.1.0: | ||
2698 | version "2.1.0" | 2856 | version "2.1.0" |
2699 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" | 2857 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" |
2700 | 2858 | ||
2701 | -pify@^2.3.0: | 2859 | +pify@^2.0.0, pify@^2.3.0: |
2702 | version "2.3.0" | 2860 | version "2.3.0" |
2703 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" | 2861 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" |
2704 | 2862 | ||
@@ -2724,6 +2882,10 @@ printj@: | @@ -2724,6 +2882,10 @@ printj@: | ||
2724 | version "0.1.1" | 2882 | version "0.1.1" |
2725 | resolved "http://registry.npm.taobao.org/printj/download/printj-0.1.1.tgz#9d07ef9db9234da8659579e468bd46a7510489b0" | 2883 | resolved "http://registry.npm.taobao.org/printj/download/printj-0.1.1.tgz#9d07ef9db9234da8659579e468bd46a7510489b0" |
2726 | 2884 | ||
2885 | +printj@~1.1.0: | ||
2886 | + version "1.1.0" | ||
2887 | + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.0.tgz#85487b5e8f96763b0b4a253613bef9dd9b387e3c" | ||
2888 | + | ||
2727 | private@~0.1.5: | 2889 | private@~0.1.5: |
2728 | version "0.1.6" | 2890 | version "0.1.6" |
2729 | resolved "http://registry.npm.taobao.org/private/download/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" | 2891 | resolved "http://registry.npm.taobao.org/private/download/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" |
@@ -2865,6 +3027,21 @@ read-package-tree@~5.1.5: | @@ -2865,6 +3027,21 @@ read-package-tree@~5.1.5: | ||
2865 | read-package-json "^2.0.0" | 3027 | read-package-json "^2.0.0" |
2866 | readdir-scoped-modules "^1.0.0" | 3028 | readdir-scoped-modules "^1.0.0" |
2867 | 3029 | ||
3030 | +read-pkg-up@^1.0.1: | ||
3031 | + version "1.0.1" | ||
3032 | + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" | ||
3033 | + dependencies: | ||
3034 | + find-up "^1.0.0" | ||
3035 | + read-pkg "^1.0.0" | ||
3036 | + | ||
3037 | +read-pkg@^1.0.0: | ||
3038 | + version "1.1.0" | ||
3039 | + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" | ||
3040 | + dependencies: | ||
3041 | + load-json-file "^1.0.0" | ||
3042 | + normalize-package-data "^2.3.2" | ||
3043 | + path-type "^1.0.0" | ||
3044 | + | ||
2868 | read@1, read@~1.0.1, read@~1.0.7: | 3045 | read@1, read@~1.0.1, read@~1.0.7: |
2869 | version "1.0.7" | 3046 | version "1.0.7" |
2870 | resolved "http://registry.npm.taobao.org/read/download/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" | 3047 | resolved "http://registry.npm.taobao.org/read/download/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" |
@@ -3053,6 +3230,31 @@ request@2, request@^2.74.0: | @@ -3053,6 +3230,31 @@ request@2, request@^2.74.0: | ||
3053 | tough-cookie "~2.3.0" | 3230 | tough-cookie "~2.3.0" |
3054 | tunnel-agent "~0.4.1" | 3231 | tunnel-agent "~0.4.1" |
3055 | 3232 | ||
3233 | +request@2.79.0: | ||
3234 | + version "2.79.0" | ||
3235 | + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" | ||
3236 | + dependencies: | ||
3237 | + aws-sign2 "~0.6.0" | ||
3238 | + aws4 "^1.2.1" | ||
3239 | + caseless "~0.11.0" | ||
3240 | + combined-stream "~1.0.5" | ||
3241 | + extend "~3.0.0" | ||
3242 | + forever-agent "~0.6.1" | ||
3243 | + form-data "~2.1.1" | ||
3244 | + har-validator "~2.0.6" | ||
3245 | + hawk "~3.1.3" | ||
3246 | + http-signature "~1.1.0" | ||
3247 | + is-typedarray "~1.0.0" | ||
3248 | + isstream "~0.1.2" | ||
3249 | + json-stringify-safe "~5.0.1" | ||
3250 | + mime-types "~2.1.7" | ||
3251 | + oauth-sign "~0.8.1" | ||
3252 | + qs "~6.3.0" | ||
3253 | + stringstream "~0.0.4" | ||
3254 | + tough-cookie "~2.3.0" | ||
3255 | + tunnel-agent "~0.4.1" | ||
3256 | + uuid "^3.0.0" | ||
3257 | + | ||
3056 | request@2.x: | 3258 | request@2.x: |
3057 | version "2.82.0" | 3259 | version "2.82.0" |
3058 | resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea" | 3260 | resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea" |
@@ -3133,6 +3335,14 @@ request@~2.75.0: | @@ -3133,6 +3335,14 @@ request@~2.75.0: | ||
3133 | tough-cookie "~2.3.0" | 3335 | tough-cookie "~2.3.0" |
3134 | tunnel-agent "~0.4.1" | 3336 | tunnel-agent "~0.4.1" |
3135 | 3337 | ||
3338 | +require-directory@^2.1.1: | ||
3339 | + version "2.1.1" | ||
3340 | + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" | ||
3341 | + | ||
3342 | +require-main-filename@^1.0.1: | ||
3343 | + version "1.0.1" | ||
3344 | + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" | ||
3345 | + | ||
3136 | resolve-path@^1.3.1: | 3346 | resolve-path@^1.3.1: |
3137 | version "1.3.2" | 3347 | version "1.3.2" |
3138 | resolved "http://registry.npm.taobao.org/resolve-path/download/resolve-path-1.3.2.tgz#c20924408aff77466e819da548d7ce40a81d561f" | 3348 | resolved "http://registry.npm.taobao.org/resolve-path/download/resolve-path-1.3.2.tgz#c20924408aff77466e819da548d7ce40a81d561f" |
@@ -3200,7 +3410,7 @@ semver@^5.0.3, semver@^5.3.0: | @@ -3200,7 +3410,7 @@ semver@^5.0.3, semver@^5.3.0: | ||
3200 | version "5.4.1" | 3410 | version "5.4.1" |
3201 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" | 3411 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" |
3202 | 3412 | ||
3203 | -set-blocking@~2.0.0: | 3413 | +set-blocking@^2.0.0, set-blocking@~2.0.0: |
3204 | version "2.0.0" | 3414 | version "2.0.0" |
3205 | resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" | 3415 | resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" |
3206 | 3416 | ||
@@ -3366,6 +3576,12 @@ sqlstring@2.2.0: | @@ -3366,6 +3576,12 @@ sqlstring@2.2.0: | ||
3366 | version "2.2.0" | 3576 | version "2.2.0" |
3367 | resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.2.0.tgz#c3135c4ea8abcd7e7ee741a4966a891d86a4f191" | 3577 | resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.2.0.tgz#c3135c4ea8abcd7e7ee741a4966a891d86a4f191" |
3368 | 3578 | ||
3579 | +ssf@~0.10.1: | ||
3580 | + version "0.10.1" | ||
3581 | + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.10.1.tgz#f23d82b63792ef56089089c1cd0c848e911cdba6" | ||
3582 | + dependencies: | ||
3583 | + frac "~1.1.0" | ||
3584 | + | ||
3369 | ssf@~0.8.1: | 3585 | ssf@~0.8.1: |
3370 | version "0.8.2" | 3586 | version "0.8.2" |
3371 | resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.8.2.tgz#b9d4dc6a1c1bcf76f8abfa96d7d7656fb2abecd6" | 3587 | resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.8.2.tgz#b9d4dc6a1c1bcf76f8abfa96d7d7656fb2abecd6" |
@@ -3428,7 +3644,7 @@ streamsearch@~0.1.2: | @@ -3428,7 +3644,7 @@ streamsearch@~0.1.2: | ||
3428 | version "0.1.2" | 3644 | version "0.1.2" |
3429 | resolved "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" | 3645 | resolved "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" |
3430 | 3646 | ||
3431 | -string-width@^1.0.1: | 3647 | +string-width@^1.0.1, string-width@^1.0.2: |
3432 | version "1.0.2" | 3648 | version "1.0.2" |
3433 | resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" | 3649 | resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" |
3434 | dependencies: | 3650 | dependencies: |
@@ -3477,6 +3693,12 @@ strip-ansi@^4.0.0: | @@ -3477,6 +3693,12 @@ strip-ansi@^4.0.0: | ||
3477 | dependencies: | 3693 | dependencies: |
3478 | ansi-regex "^3.0.0" | 3694 | ansi-regex "^3.0.0" |
3479 | 3695 | ||
3696 | +strip-bom@^2.0.0: | ||
3697 | + version "2.0.0" | ||
3698 | + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" | ||
3699 | + dependencies: | ||
3700 | + is-utf8 "^0.2.0" | ||
3701 | + | ||
3480 | strip-eof@^1.0.0: | 3702 | strip-eof@^1.0.0: |
3481 | version "1.0.0" | 3703 | version "1.0.0" |
3482 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" | 3704 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" |
@@ -3784,12 +4006,20 @@ voc@: | @@ -3784,12 +4006,20 @@ voc@: | ||
3784 | version "0.5.0" | 4006 | version "0.5.0" |
3785 | resolved "http://registry.npm.taobao.org/voc/download/voc-0.5.0.tgz#be6ca7c76e4a57d930cc80f6b31fbd80ca86045c" | 4007 | resolved "http://registry.npm.taobao.org/voc/download/voc-0.5.0.tgz#be6ca7c76e4a57d930cc80f6b31fbd80ca86045c" |
3786 | 4008 | ||
4009 | +voc@~1.0.0: | ||
4010 | + version "1.0.0" | ||
4011 | + resolved "https://registry.yarnpkg.com/voc/-/voc-1.0.0.tgz#5465c0ce11d0881f7d8e36d8ca587043f33a25ae" | ||
4012 | + | ||
3787 | wcwidth@^1.0.0: | 4013 | wcwidth@^1.0.0: |
3788 | version "1.0.1" | 4014 | version "1.0.1" |
3789 | resolved "http://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" | 4015 | resolved "http://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" |
3790 | dependencies: | 4016 | dependencies: |
3791 | defaults "^1.0.3" | 4017 | defaults "^1.0.3" |
3792 | 4018 | ||
4019 | +which-module@^1.0.0: | ||
4020 | + version "1.0.0" | ||
4021 | + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" | ||
4022 | + | ||
3793 | which@1, which@~1.2.11: | 4023 | which@1, which@~1.2.11: |
3794 | version "1.2.11" | 4024 | version "1.2.11" |
3795 | resolved "http://registry.npm.taobao.org/which/download/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" | 4025 | resolved "http://registry.npm.taobao.org/which/download/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" |
@@ -3824,6 +4054,10 @@ window-size@0.1.0: | @@ -3824,6 +4054,10 @@ window-size@0.1.0: | ||
3824 | version "0.1.0" | 4054 | version "0.1.0" |
3825 | resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" | 4055 | resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" |
3826 | 4056 | ||
4057 | +window-size@^0.2.0: | ||
4058 | + version "0.2.0" | ||
4059 | + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" | ||
4060 | + | ||
3827 | wordwrap@0.0.2: | 4061 | wordwrap@0.0.2: |
3828 | version "0.0.2" | 4062 | version "0.0.2" |
3829 | resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" | 4063 | resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" |
@@ -3832,6 +4066,13 @@ wordwrap@~0.0.2: | @@ -3832,6 +4066,13 @@ wordwrap@~0.0.2: | ||
3832 | version "0.0.3" | 4066 | version "0.0.3" |
3833 | resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" | 4067 | resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" |
3834 | 4068 | ||
4069 | +wrap-ansi@^2.0.0: | ||
4070 | + version "2.1.0" | ||
4071 | + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" | ||
4072 | + dependencies: | ||
4073 | + string-width "^1.0.1" | ||
4074 | + strip-ansi "^3.0.1" | ||
4075 | + | ||
3835 | wrappy@1, wrappy@~1.0.2: | 4076 | wrappy@1, wrappy@~1.0.2: |
3836 | version "1.0.2" | 4077 | version "1.0.2" |
3837 | resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" | 4078 | resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" |
@@ -3867,6 +4108,18 @@ xdg-basedir@^3.0.0: | @@ -3867,6 +4108,18 @@ xdg-basedir@^3.0.0: | ||
3867 | version "3.0.0" | 4108 | version "3.0.0" |
3868 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" | 4109 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" |
3869 | 4110 | ||
4111 | +xlsx@^0.11.5: | ||
4112 | + version "0.11.5" | ||
4113 | + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.11.5.tgz#8c66cd97140be072e3dd320d12baa099689ceb74" | ||
4114 | + dependencies: | ||
4115 | + adler-32 "~1.1.0" | ||
4116 | + cfb "~0.13.1" | ||
4117 | + codepage "~1.11.0" | ||
4118 | + commander "~2.11.0" | ||
4119 | + crc-32 "~1.1.1" | ||
4120 | + exit-on-epipe "~1.0.1" | ||
4121 | + ssf "~0.10.1" | ||
4122 | + | ||
3870 | xlsx@^0.8.0: | 4123 | xlsx@^0.8.0: |
3871 | version "0.8.0" | 4124 | version "0.8.0" |
3872 | resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.8.0.tgz#253ca61c9e1e14aa4b905dece4ce4757ace99d26" | 4125 | resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.8.0.tgz#253ca61c9e1e14aa4b905dece4ce4757ace99d26" |
@@ -3887,10 +4140,40 @@ xmlhttprequest-ssl@1.5.1: | @@ -3887,10 +4140,40 @@ xmlhttprequest-ssl@1.5.1: | ||
3887 | version "4.0.1" | 4140 | version "4.0.1" |
3888 | resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" | 4141 | resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" |
3889 | 4142 | ||
4143 | +y18n@^3.2.1: | ||
4144 | + version "3.2.1" | ||
4145 | + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" | ||
4146 | + | ||
3890 | yallist@^2.1.2: | 4147 | yallist@^2.1.2: |
3891 | version "2.1.2" | 4148 | version "2.1.2" |
3892 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" | 4149 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" |
3893 | 4150 | ||
4151 | +yargs-parser@^3.2.0: | ||
4152 | + version "3.2.0" | ||
4153 | + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" | ||
4154 | + dependencies: | ||
4155 | + camelcase "^3.0.0" | ||
4156 | + lodash.assign "^4.1.0" | ||
4157 | + | ||
4158 | +yargs@^5.0.0: | ||
4159 | + version "5.0.0" | ||
4160 | + resolved "https://registry.yarnpkg.com/yargs/-/yargs-5.0.0.tgz#3355144977d05757dbb86d6e38ec056123b3a66e" | ||
4161 | + dependencies: | ||
4162 | + cliui "^3.2.0" | ||
4163 | + decamelize "^1.1.1" | ||
4164 | + get-caller-file "^1.0.1" | ||
4165 | + lodash.assign "^4.2.0" | ||
4166 | + os-locale "^1.4.0" | ||
4167 | + read-pkg-up "^1.0.1" | ||
4168 | + require-directory "^2.1.1" | ||
4169 | + require-main-filename "^1.0.1" | ||
4170 | + set-blocking "^2.0.0" | ||
4171 | + string-width "^1.0.2" | ||
4172 | + which-module "^1.0.0" | ||
4173 | + window-size "^0.2.0" | ||
4174 | + y18n "^3.2.1" | ||
4175 | + yargs-parser "^3.2.0" | ||
4176 | + | ||
3894 | yargs@~3.10.0: | 4177 | yargs@~3.10.0: |
3895 | version "3.10.0" | 4178 | version "3.10.0" |
3896 | resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" | 4179 | resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" |
-
Please register or login to post a comment