Commit 0132de15 authored by 刘松's avatar 刘松

update

parent cff93891
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -63,4 +63,28 @@ body{
border-radius: 6px;
margin: 16px 24px 16px 0;
float: left;
}
.box{
box-shadow: 0 0 1px #ddd;
background: #f7f7f7;
border-radius: 4px;
display: flex;
justify-content: flex-start;
align-items: center;
overflow: hidden;
margin: 5px 10px;
}
.box h3{
width: 40%;
height: 100%;
padding: 10px;
color: #fff;
text-align: center;
background: #5587b3;
}
.box span{
font-size: 20px;
width: 58%;
padding: 0 20px;
text-align: center;
}
\ No newline at end of file
......@@ -40,7 +40,6 @@ exports.getCountData= () => {
exports.getDetailData = (data) => {
return (dispatch) => {
api('POST', 'detail', data).then((res) => {
console.dir(res.data);
dispatch({ status:res.result, data:res.data, type: types.DETAILDATA});
});
};
......
......@@ -9,23 +9,23 @@ const defaultData = {
upstreams:[],
upCount:0,
userCount:0,
count:{user:0,upstream:0},
count:{user: 0, upstream: 0, admin: 0},
detail:{
pagination:{ current:1,total:1,pageSize:3 },
pagination:{ current:1, total:1, pageSize:3 },
users:[],
upstreams:[]
},
range:[moment().subtract(6,'days').format('YYYYMMDD'), moment().format('YYYYMMDD')]
};
module.exports = function login (state = defaultData, action) {
module.exports = function data (state = defaultData, action) {
switch (action.type) {
case types.MAINDATA:
return _.assign({}, state, {status: action.status,userCount:action.data.userCount,upCount:action.data.upCount, users: action.data.users,upstreams:action.data.upstreams,range: action.data.range});
case types.COUNTDATA:
return _.assign({}, state, {count:action.data});
case types.DETAILDATA:
return _.assign({}, state, {detail:action.data});
return _.assign({}, state, {status: action.status,detail:action.data});
default:
return state;
}
......
......@@ -3,7 +3,7 @@ const connect = require('react-redux').connect;
const actions = require('../../js/actions');
const moment = require('moment');
import { Table, Icon, DatePicker, Alert} from 'antd';
import { Table, Icon, DatePicker, Alert, Row, Col} from 'antd';
const { RangePicker } = DatePicker;
class DashBoard extends React.Component{
......@@ -130,10 +130,32 @@ class DashBoard extends React.Component{
return (
<div>
<Alert
message = { "截止目前,注册用户数 " + this.props.data.count.user + ' ,绑定账号数 ' + this.props.data.count.upstream }
type = "info"
/>
<Row>
<Col span="6">
<div className = "box" style={{ marginLeft:'0px'}}>
<h3>用户数</h3>
<span>{ this.props.data.count.user }</span>
</div>
</Col>
<Col span="6">
<div className = "box">
<h3>账号数</h3>
<span>{ this.props.data.count.upstream }</span>
</div>
</Col>
<Col span="6">
<div className = "box" style={{ marginRight:'0px'}}>
<h3>内部用户</h3>
<span>{ this.props.data.count.admin }</span>
</div>
</Col>
<Col span="6">
<div className = "box">
<h3>外部用户</h3>
<span>{ this.props.data.count.upstream - this.props.data.count.admin }</span>
</div>
</Col>
</Row>
<RangePicker onChange={ this.onChange.bind(this) } value={ ranges } format={'YYYYMMDD'} style={{margin:'10px 0px'}}/>
<Table columns={columns} dataSource = { data } size="middle" />
</div>
......
......@@ -4,7 +4,7 @@ const actions = require('../../js/actions');
const types = require('../../js/actions/actionTypes');
const moment = require('moment');
import { Table } from 'antd';
import { Table, Spin} from 'antd';
class Detail extends React.Component{
constructor(props){
......@@ -15,6 +15,7 @@ class Detail extends React.Component{
componentDidMount (){
let limit = 30;
let skip = 0;
// await this.props.dispatch({status:'pending',type:types.DETAILDATA});
this.props.dispatch(actions.getDetailData({limit,skip}));
}
......@@ -29,12 +30,39 @@ class Detail extends React.Component{
}
render(){
let users = this.props.data.detail.users;
let upstreams = this.props.data.detail.upstreams;
console.dir(users);
console.dir(upstreams);
let columns = [
{
title: '用户',
dataIndex: 'name',
key: 'name',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '电话',
dataIndex: 'phone',
key: 'phone',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '账户数量',
dataIndex: 'ups',
key: 'ups',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '注册时间',
dataIndex: 'date',
key: 'date',
width: 100,
render: text => <a href="#">{text}</a>,
},
];
let users = this.props.data.detail ? this.props.data.detail.users : [];
let upstreams = this.props.data.detail ? this.props.data.detail.upstreams : [];
let upMap = {};
let data = [];
for(let i = 0;i < upstreams.length; i++){
......@@ -51,39 +79,9 @@ class Detail extends React.Component{
date : moment(item['createdAt']).format('YYYY/MM/DD hh:mm:ss')
})
}
console.dir(data);
let columns = [
{
title: '用户',
dataIndex: 'name',
key: 'name',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '电话',
dataIndex: 'phone',
key: 'phone',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '账户数量',
dataIndex: 'ups',
key: 'ups',
width: 100,
render: text => <a href="#">{text}</a>,
},
{
title: '注册时间',
dataIndex: 'date',
key: 'date',
width: 100,
render: text => <a href="#">{text}</a>,
},
];
return (
<Table columns={columns} dataSource = { data } pagination={ this.props.data.detail.pagination } size="middle" onChange = { this.handleTableChange.bind(this) }/>
<Table columns={columns} dataSource = { data } pagination={ this.props.data.detail.pagination } size="middle" onChange = { this.handleTableChange.bind(this) }/>
)
}
}
......
try {
module.exports = require('./config_current.js');
} catch (err) {
module.exports = require('./config.default.js');
}
\ No newline at end of file
module.exports = require('./config.default.js');
\ No newline at end of file
......@@ -2,10 +2,11 @@ const express = require('request-promise');
const user = require('../db/mongo/user');
const upstream = require('../db/mongo/upstream');
const moment = require('moment');
const mongoose = require('mongoose');
exports.data = async (req,res,next) => {
let {start,end} = req.body;
const condition = {'$and': [{'createdAt': {'$gte': moment(start, 'YYYYMMDD').startOf('day').toDate()}}, {'createdAt': {'$lte': moment(end, 'YYYYMMDD').endOf('day').toDate()}}]};
const condition = {'$and': [{'createdAt': {'$gte': moment(start, 'YYYYMMDD').startOf('day').toDate()}}, {'createdAt': {'$lt': moment(end, 'YYYYMMDD').endOf('day').toDate()}}]};
const basicCondition = {'createdAt': {'$lt': moment(start, 'YYYYMMDD').startOf('day').toDate()}};
console.dir(condition['$and']);
console.dir(basicCondition);
......@@ -29,7 +30,7 @@ exports.data = async (req,res,next) => {
const userPromise = await user.aggregate(pipeline);
const basicUserPromise = await user.count(basicCondition);
const upstreamPromise = await upstream.aggregate(pipeline);
const basicUpstreamPromise = await user.count(basicCondition);
const basicUpstreamPromise = await upstream.count(basicCondition);
let userResult = [];
let upstreamsResult = [];
......@@ -48,22 +49,25 @@ exports.count = async(req,res,next) => {
const userPromise = await user.count({});
const upstreamPromise = await upstream.count({});
const adminPromise = await upstream.count({ creater:mongoose.Types.ObjectId('58afdd80aa96916a41598698') });
let userCount= 0;
let upstreamCount = 0;
await Promise.all([userPromise,upstreamPromise]).then( ([users,upstreams]) => {
let adminCount = 0;
await Promise.all([userPromise,upstreamPromise,adminPromise]).then( ([users,upstreams,admin]) => {
userCount = users;
upstreamCount = upstreams;
adminCount = admin;
});
res.send({result: 'ok' ,data: {user: userCount, upstream: upstreamCount}})
res.send({result: 'ok' ,data: {user: userCount, upstream: upstreamCount, admin: adminCount}})
}
exports.detail = async(req,res,next) => {
let { limit = 3 , skip = 0} = req.body;
let { limit = 30 , skip = 0} = req.body;
try{
const users = await user.find({},null,{limit: limit,skip: skip});
const users = await user.find({},null,{limit: parseInt(limit),skip: parseInt(skip)*30}).sort({createdAt: -1});
const total = await user.count({},null);
let creaters = [];
users.forEach( item => {
......@@ -79,7 +83,7 @@ exports.detail = async(req,res,next) => {
}
];
const upstreams = await upstream.aggregate(pipeline);
res.send({result: 'ok' ,data: { users: users.map(x => x.toJSON()), upstreams: upstreams, pagination:{ current:skip,total: total, pageSize:limit}}})
res.send({result: 'ok' ,data: { users: users.map(x => x.toJSON()), upstreams: upstreams, pagination:{ current:parseInt(skip),total: total, pageSize:parseInt(limit)}}})
} catch ( err ) {
console.dir(err);
res.status(400);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment