Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
K
kouling-admin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘松
kouling-admin
Commits
723579fc
Commit
723579fc
authored
Dec 02, 2017
by
刘松
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update query
parent
b7117971
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
181 additions
and
39 deletions
+181
-39
app.bundle.js
app/built/app.bundle.js
+0
-0
main.jsx
app/jsx/main.jsx
+2
-2
dashboard.jsx
app/jsx/statistics/dashboard.jsx
+30
-8
gather.jsx
app/jsx/statistics/gather.jsx
+127
-0
controller.js
lib/controller.js
+10
-12
cron.js
lib/cron.js
+12
-13
tao.js
lib/tao.js
+0
-4
No files found.
app/built/app.bundle.js
View file @
723579fc
This source diff could not be displayed because it is too large. You can
view the blob
instead.
app/jsx/main.jsx
View file @
723579fc
...
...
@@ -53,7 +53,7 @@ class Main extends React.Component{
>
<
SubMenu
title=
{
<
span
>
数据统计
</
span
>
}
>
<
Menu
.
Item
key=
"0"
>
口令数据
</
Menu
.
Item
>
<
Menu
.
Item
key=
"1"
>
每日汇总
</
Menu
.
Item
>
<
Menu
.
Item
key=
"1"
>
汇总数据
</
Menu
.
Item
>
</
SubMenu
>
<
Menu
.
Item
key=
"2"
>
推广页管理
</
Menu
.
Item
>
<
Menu
.
Item
key=
"3"
>
淘口令
</
Menu
.
Item
>
...
...
@@ -63,7 +63,7 @@ class Main extends React.Component{
<
Content
style=
{
{
padding
:
'0 50px'
}
}
>
<
Breadcrumb
style=
{
{
margin
:
'12px 0'
}
}
>
<
Breadcrumb
.
Item
>
{
this
.
map
[
this
.
props
.
menu
.
currentPage
]
}
</
Breadcrumb
.
Item
>
<
Breadcrumb
.
Item
>
{
this
.
props
.
menu
.
currentPage
==
'0'
?
'数据统计'
:
(
this
.
props
.
menu
.
currentPage
==
'1'
?
'
每日汇总
'
:
"配置"
)
}
</
Breadcrumb
.
Item
>
<
Breadcrumb
.
Item
>
{
this
.
props
.
menu
.
currentPage
==
'0'
?
'数据统计'
:
(
this
.
props
.
menu
.
currentPage
==
'1'
?
'
汇总数据
'
:
"配置"
)
}
</
Breadcrumb
.
Item
>
</
Breadcrumb
>
<
div
style=
{
{
background
:
'#fff'
,
padding
:
24
,
minHeight
:
280
}
}
>
{
this
.
props
.
children
...
...
app/jsx/statistics/dashboard.jsx
View file @
723579fc
...
...
@@ -14,20 +14,33 @@ class DashBoard extends React.Component{
constructor
(
props
){
super
(
props
);
this
.
range
=
[
moment
().
subtract
(
6
,
'days'
).
format
(
'YYYYMMDD'
),
moment
().
format
(
'YYYYMMDD'
)];
this
.
state
=
{
logs
:[],
status
:
'pending'
};
this
.
state
=
{
logs
:[],
status
:
'pending'
,
pagination
:{
current
:
1
,
pageSize
:
10
,
total
:
100
}
};
}
componentDidMount
(){
let
pagination
=
this
.
state
.
pagination
;
let
data
=
{
start
:
moment
().
add
(
-
6
,
'days'
).
format
(
'YYYYMMDD'
),
end
:
moment
().
format
(
'YYYYMMDD'
)};
api
(
'GET'
,
'logs
'
).
then
((
res
)
=>
{
this
.
setState
({
logs
:
res
.
result
,
status
:
'ready'
})
api
(
'GET'
,
'logs
?'
+
'skip=0&limit='
+
pagination
.
pageSize
).
then
((
res
)
=>
{
this
.
setState
({
logs
:
res
.
result
,
status
:
'ready'
,
pagination
:{
current
:
res
.
pagination
.
skip
,
pageSize
:
res
.
pagination
.
limit
,
total
:
res
.
pagination
.
total
}
})
console
.
dir
(
res
.
result
);
});
}
onChange
(
date
,
dateString
)
{
let
data
=
{
start
:
dateString
[
0
],
end
:
dateString
[
1
]};
getlogs
(
pagination
){
this
.
setState
({
status
:
'pending'
})
api
(
'GET'
,
'logs?'
+
'skip='
+
(
pagination
.
current
-
1
)
+
'&limit='
+
pagination
.
pageSize
).
then
((
res
)
=>
{
this
.
setState
({
tbkls
:
res
.
result
,
status
:
'ready'
})
console
.
dir
(
res
.
result
);
});
}
onChange
(
pagination
)
{
//let data = { start:dateString[0],end:dateString[1]};
this
.
getlogs
(
pagination
);
//this.props.dispatch(actions.getMainData(data));
}
onChangeRange
(
date
,
dateString
){
}
exportData
(){
...
...
@@ -58,6 +71,13 @@ class DashBoard extends React.Component{
},
{
title
:
'推广计划'
,
dataIndex
:
'schedule'
,
key
:
'schedule'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},
{
title
:
'渠道'
,
dataIndex
:
'qd'
,
key
:
'qd'
,
width
:
100
,
...
...
@@ -88,25 +108,27 @@ class DashBoard extends React.Component{
let
count
=
0
;
let
logs
=
this
.
state
.
logs
;
for
(
let
i
=
0
;
i
<
logs
.
length
;
i
++
){
console
.
dir
(
logs
[
i
]);
data
.
push
({
key
:
i
,
date
:
logs
[
i
].
date
,
info
:
logs
[
i
].
key
,
times
:
logs
[
i
].
times
,
status
:
logs
[
i
].
status
==
'disable'
?
'已归档'
:
'--'
,
qd
:(
logs
[
i
].
schedule
)
||
'--'
,
schedule
:(
logs
[
i
].
schedule
&&
logs
[
i
].
schedule
[
'_id'
])
||
'--'
,
qd
:(
logs
[
i
].
schedule
&&
logs
[
i
].
schedule
[
'qd'
]
&&
logs
[
i
].
schedule
[
'qd'
][
'user'
])
||
'--'
,
update
:
logs
[
i
].
updatedAt
});
}
return
(
<
div
>
<
RangePicker
onChange=
{
this
.
onChange
.
bind
(
this
)
}
value=
{
ranges
}
format=
{
'YYYYMMDD'
}
style=
{
{
margin
:
'10px 0px'
}
}
/>
<
RangePicker
onChange=
{
this
.
onChange
Range
.
bind
(
this
)
}
value=
{
ranges
}
format=
{
'YYYYMMDD'
}
style=
{
{
margin
:
'10px 0px'
}
}
/>
<
Button
type=
"primary"
icon=
"export"
onClick=
{
this
.
exportData
.
bind
(
this
)
}
style=
{
{
float
:
'right'
,
margin
:
'10px 0px'
}
}
>
导出数据
</
Button
>
<
Spin
spinning=
{
this
.
state
.
status
==
'pending'
}
>
<
Table
columns=
{
columns
}
dataSource
=
{
data
}
size=
"middle"
bordered
/>
<
Table
columns=
{
columns
}
dataSource
=
{
data
}
size=
"middle"
pagination=
{
this
.
state
.
pagination
}
onChange
=
{
this
.
onChange
.
bind
(
this
)}
bordered
/>
</
Spin
>
</
div
>
)
...
...
app/jsx/statistics/gather.jsx
0 → 100644
View file @
723579fc
const
React
=
require
(
'react'
);
/*const connect = require('react-redux').connect;
const actions = require('../../js/actions');*/
const
moment
=
require
(
'moment'
);
const
api
=
require
(
'../../js/api'
);
import
json2xlsx
from
'../../js/json2xlsx'
;
import
{
Table
,
Icon
,
DatePicker
,
Alert
,
Row
,
Col
,
Spin
,
Button
}
from
'antd'
;
const
{
RangePicker
}
=
DatePicker
;
class
Gather
extends
React
.
Component
{
constructor
(
props
){
super
(
props
);
this
.
range
=
[
moment
().
subtract
(
6
,
'days'
).
format
(
'YYYYMMDD'
),
moment
().
format
(
'YYYYMMDD'
)];
this
.
state
=
{
logs
:[],
status
:
'pending'
};
}
componentDidMount
(){
let
data
=
{
start
:
moment
().
add
(
-
6
,
'days'
).
format
(
'YYYYMMDD'
),
end
:
moment
().
format
(
'YYYYMMDD'
)};
api
(
'GET'
,
'logs'
).
then
((
res
)
=>
{
this
.
setState
({
logs
:
res
.
result
,
status
:
'ready'
})
console
.
dir
(
res
.
result
);
});
}
onChange
(
date
,
dateString
)
{
let
data
=
{
start
:
dateString
[
0
],
end
:
dateString
[
1
]};
//this.props.dispatch(actions.getMainData(data));
}
exportData
(){
//json2xlsx(data,{sheetName:"基础数据", filename : '基础数据'+moment().format('YYYYMMDD')+'.xlsx'});
}
render
(){
const
columns
=
[
{
title
:
'日期'
,
dataIndex
:
'date'
,
key
:
'date'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},
{
title
:
'计划ID'
,
dataIndex
:
'schedule'
,
key
:
'schedule'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},{
title
:
'请求数'
,
dataIndex
:
'times'
,
key
:
'times'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},
{
title
:
'总口令'
,
dataIndex
:
'total'
,
key
:
'total'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},
{
title
:
'可用口令'
,
dataIndex
:
'available'
,
key
:
'available'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
},
{
title
:
'渠道'
,
dataIndex
:
'user'
,
key
:
'user'
,
width
:
100
,
render
:
text
=>
<
a
href=
"#"
>
{
text
}
</
a
>,
}
];
let
range
=
this
.
range
;
var
start
=
range
[
0
];
var
end
=
range
[
1
];
let
ranges
=
[];
ranges
.
push
(
moment
(
start
,
'YYYYMMDD'
));
ranges
.
push
(
moment
(
end
,
'YYYYMMDD'
));
let
data
=
[];
let
count
=
0
;
let
logs
=
this
.
state
.
logs
;
for
(
let
i
=
0
;
i
<
logs
.
length
;
i
++
){
data
.
push
({
key
:
i
,
date
:
logs
[
i
].
date
,
info
:
logs
[
i
].
key
,
times
:
logs
[
i
].
times
,
status
:
logs
[
i
].
status
==
'disable'
?
'已归档'
:
'--'
,
qd
:(
logs
[
i
].
schedule
)
||
'--'
,
update
:
logs
[
i
].
updatedAt
});
}
return
(
<
div
>
<
RangePicker
onChange=
{
this
.
onChange
.
bind
(
this
)
}
value=
{
ranges
}
format=
{
'YYYYMMDD'
}
style=
{
{
margin
:
'10px 0px'
}
}
/>
<
Button
type=
"primary"
icon=
"export"
onClick=
{
this
.
exportData
.
bind
(
this
)
}
style=
{
{
float
:
'right'
,
margin
:
'10px 0px'
}
}
>
导出数据
</
Button
>
<
Spin
spinning=
{
this
.
state
.
status
==
'pending'
}
>
<
Table
columns=
{
columns
}
dataSource
=
{
data
}
size=
"middle"
bordered
/>
</
Spin
>
</
div
>
)
}
}
/*
function mapStateToProps (state) {
return state;
}
module.exports = connect(mapStateToProps)(DashBoard);*/
module
.
exports
=
Gather
;
lib/controller.js
View file @
723579fc
...
...
@@ -60,20 +60,19 @@ exports.putTbkl = async (req, res, next) => {
}
};
exports
.
logs
=
async
(
req
,
res
,
next
)
=>
{
try
{
var
options
=
{
limit
:
1000
,
skip
:
0
,
sort
:
{
'updatedAt'
:
-
1
}};
var
logs
=
await
Log
.
find
({},
null
,
options
).
populate
(
'qd'
,
'user role'
);
let
{
start
,
end
}
=
req
.
body
;
const
condition
=
{
'$and'
:
[{
'createdAt'
:
{
'$gte'
:
moment
(
start
,
'YYYYMMDD'
).
startOf
(
'day'
).
toDate
()}},
{
'createdAt'
:
{
'$lt'
:
moment
(
end
,
'YYYYMMDD'
).
endOf
(
'day'
).
toDate
()}}]};
let
{
limit
=
100
,
skip
=
0
,
sort
=
{
'updatedAt'
:
-
1
}}
=
req
.
query
;
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
)
*
limit
,
sort
};
var
logs
=
await
Log
.
find
({},
null
,
options
).
populate
({
path
:
"schedule"
,
select
:
"links qd"
,
populate
:{
path
:
'qd'
,
select
:
'user'
}});
let
total
=
await
Log
.
count
({},
null
);
logs
=
logs
.
map
(
x
=>
{
var
d
=
x
.
toJSON
();
d
[
'updatedAt'
]
=
dateFormat
(
d
[
'updatedAt'
]);
return
d
;});
res
.
send
({
status
:
'ok'
,
result
:
logs
});
}
catch
(
e
){
console
.
dir
(
e
);
}
res
.
send
({
status
:
'ok'
,
result
:
logs
,
pagination
:{
total
:
total
,
skip
:
skip
,
limit
:
limit
}});
}
exports
.
getTbkls
=
async
(
req
,
res
,
next
)
=>
{
let
{
limit
=
100
,
skip
=
0
,
sort
=
{
'updatedAt'
:
-
1
}}
=
req
.
query
;
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
),
sort
};
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
)
*
limit
,
sort
};
let
tbkls
=
await
Kouling
.
find
({},
null
,
options
).
populate
(
'link'
,
'title target'
);
let
total
=
await
Kouling
.
count
({},
null
);
res
.
send
({
status
:
'ok'
,
result
:
tbkls
,
pagination
:{
total
:
total
,
skip
:
skip
,
limit
:
limit
}});
...
...
@@ -81,7 +80,7 @@ exports.getTbkls = async (req, res, next) => {
exports
.
getLinks
=
async
(
req
,
res
,
next
)
=>
{
let
{
limit
=
100
,
skip
=
0
,
sort
=
{
'updatedAt'
:
-
1
}}
=
req
.
query
;
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
),
sort
};
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
)
*
limit
,
sort
};
let
tbkls
=
await
Link
.
find
({},
null
,
options
).
populate
(
'qd'
,
'user role'
);
let
total
=
await
Link
.
count
({},
null
);
res
.
send
({
status
:
'ok'
,
result
:
tbkls
,
pagination
:{
total
:
total
,
skip
:
skip
,
limit
:
limit
}});
...
...
@@ -120,7 +119,7 @@ exports.createLink = async (req, res, next) => {
exports
.
getSchedules
=
async
(
req
,
res
,
next
)
=>
{
let
{
limit
=
100
,
skip
=
0
,
sort
=
{
'updatedAt'
:
-
1
}}
=
req
.
query
;
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
),
sort
};
let
options
=
{
limit
:
parseInt
(
limit
),
skip
:
parseInt
(
skip
)
*
limit
,
sort
};
let
schedules
=
await
Schedule
.
find
({},
null
,
options
).
populate
(
'links'
,
'name title target'
).
populate
(
'qd'
,
'user'
);
let
total
=
await
Schedule
.
count
({},
null
);
res
.
send
({
status
:
'ok'
,
result
:
schedules
,
pagination
:{
total
:
total
,
skip
:
skip
,
limit
:
limit
}});
...
...
@@ -173,7 +172,6 @@ exports.createSchedule = async (req, res, next) => {
}
var
createTbkl
=
async
(
data
)
=>
{
console
.
dir
(
data
);
let
{
title
,
target
,
pic
}
=
data
;
return
new
Promise
(
async
(
r
,
d
)
=>
{
try
{
...
...
lib/cron.js
View file @
723579fc
...
...
@@ -7,10 +7,10 @@ const tao = require('./tao');
const
_
=
require
(
'lodash'
);
const
moment
=
require
(
'moment'
);
const
controller
=
require
(
'./controller'
);
const
max
=
2
0000
;
const
max
=
40
0000
;
var
CronJob
=
cron
.
CronJob
;
var
job
=
new
CronJob
({
cronTime
:
'
* */1
* * *'
,
cronTime
:
'
0 */2 *
* * *'
,
onTick
:
function
()
{
tbklTask
();
},
...
...
@@ -43,22 +43,21 @@ async function sendMail(email,body) {
async
function
tbklTask
()
{
console
.
log
(
'定时更新开始 =====> '
);
try
{
console
.
log
(
'=====> '
);
//let tkls = await Kouling.find({status:'use'}).populate('link','title target').limit(1000);
// 查询进行中计划
let
schedules
=
await
Schedule
.
find
({
status
:
'use'
}).
limit
(
500
);
schedules
.
forEach
(
async
item
=>
{
let
schedule
=
item
.
toJSON
().
_id
;
schedules
.
forEach
(
async
item
=>
{
let
schedule
=
item
.
toJSON
().
_id
;
// console.dir(schedule);
// 查询计划内 超过20000 请求 淘口令
//console.dir({times:{$gte:10},status:'use',schedule:schedule});
let
logs
=
await
Log
.
find
({
times
:{
$gte
:
max
},
schedule
:
schedule
,
status
:{
$ne
:
'disable'
}}).
populate
(
'link'
,
'title target pic'
).
limit
(
1000
);
//console.dir(logs.length);
var
tasks_new
=
[];
var
tasks_old
=
[];
var
tasks_log
=
[];
logs
.
forEach
(
item
=>
{
item
=
item
.
toJSON
();
console
.
log
(
item
.
_id
);
//console.dir(item);
if
(
item
.
link
&&
item
.
link
.
title
&&
item
.
link
.
target
&&
item
.
times
>=
max
){
var
data
=
{
...
...
@@ -70,23 +69,24 @@ async function tbklTask () {
pic
:
item
.
link
.
pic
}
tasks_new
.
push
(
controller
.
createTbkl
(
data
));
tasks_old
.
push
(
Kouling
.
update
({
info
:
item
.
key
},{
$set
:{
status
:
'disable'
}}));
tasks_log
.
push
(
Log
.
update
({
key
:
item
.
key
},{
$set
:{
status
:
'disable'
}}));
tasks_old
.
push
(
Kouling
.
update
({
info
:
item
.
key
,
status
:{
$ne
:
'disable'
}
},{
$set
:{
status
:
'disable'
}}));
tasks_log
.
push
(
Log
.
update
({
_id
:
item
.
_id
},{
$set
:{
status
:
'disable'
}}));
}
});
if
(
tasks_new
.
length
&&
tasks_old
.
length
&&
tasks_log
.
length
){
Promise
.
all
(
tasks_new
).
then
(
function
(
arr
){
console
.
log
(
'增加老口令 结束 影响'
+
arr
.
length
+
'条数据'
);
});
Promise
.
all
(
tasks_old
).
then
(
function
(
arr
){
console
.
log
(
'删除老口令 结束 影响'
+
arr
.
length
+
'条数据'
);
});
Promise
.
all
(
tasks_log
).
then
(
function
(
arr
){
console
.
log
(
'更新log数据 影响'
+
arr
.
length
+
'条数据'
);
});
Promise
.
all
(
tasks_new
).
then
(
function
(
arr
){
console
.
log
(
'增加新口令 结束 影响'
+
arr
.
length
+
'条数据'
);
});
console
.
log
(
' 更新结束 有任务'
);
}
else
{
console
.
log
(
'
没有任务 影响0条数据
'
);
console
.
log
(
'
更新结束 无任务
'
);
}
});
...
...
@@ -96,7 +96,6 @@ async function tbklTask () {
let
mailList
=
'liusong@goyoo.com'
;
sendMail
(
mailList
,
err
.
toString
());
}
console
.
log
(
' 更新结束 '
);
}
module
.
exports
.
start
=
function
()
...
...
lib/tao.js
View file @
723579fc
...
...
@@ -24,7 +24,6 @@ exports.saveKouling = async (data,cb) => {
exports
.
saveLink
=
async
(
data
,
cb
)
=>
{
try
{
console
.
dir
(
data
);
var
link
=
new
Link
(
data
);
cb
(
null
,
await
link
.
save
());
}
catch
(
e
){
...
...
@@ -83,9 +82,6 @@ exports.getGood = (id) => {
}
exports
.
createTbkl
=
(
title
,
url
,
pic
)
=>
{
console
.
dir
(
title
);
console
.
dir
(
url
)
console
.
dir
(
pic
)
return
new
Promise
((
r
,
d
)
=>
{
client
.
execute
(
'taobao.tbk.tpwd.create'
,
{
'text'
:
title
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment