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

update

parent cff93891
This diff is collapsed.
...@@ -64,3 +64,27 @@ body{ ...@@ -64,3 +64,27 @@ body{
margin: 16px 24px 16px 0; margin: 16px 24px 16px 0;
float: left; 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= () => { ...@@ -40,7 +40,6 @@ exports.getCountData= () => {
exports.getDetailData = (data) => { exports.getDetailData = (data) => {
return (dispatch) => { return (dispatch) => {
api('POST', 'detail', data).then((res) => { api('POST', 'detail', data).then((res) => {
console.dir(res.data);
dispatch({ status:res.result, data:res.data, type: types.DETAILDATA}); dispatch({ status:res.result, data:res.data, type: types.DETAILDATA});
}); });
}; };
......
...@@ -9,23 +9,23 @@ const defaultData = { ...@@ -9,23 +9,23 @@ const defaultData = {
upstreams:[], upstreams:[],
upCount:0, upCount:0,
userCount:0, userCount:0,
count:{user:0,upstream:0}, count:{user: 0, upstream: 0, admin: 0},
detail:{ detail:{
pagination:{ current:1,total:1,pageSize:3 }, pagination:{ current:1, total:1, pageSize:3 },
users:[], users:[],
upstreams:[] upstreams:[]
}, },
range:[moment().subtract(6,'days').format('YYYYMMDD'), moment().format('YYYYMMDD')] 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) { switch (action.type) {
case types.MAINDATA: 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}); 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: case types.COUNTDATA:
return _.assign({}, state, {count:action.data}); return _.assign({}, state, {count:action.data});
case types.DETAILDATA: case types.DETAILDATA:
return _.assign({}, state, {detail:action.data}); return _.assign({}, state, {status: action.status,detail:action.data});
default: default:
return state; return state;
} }
......
...@@ -3,7 +3,7 @@ const connect = require('react-redux').connect; ...@@ -3,7 +3,7 @@ const connect = require('react-redux').connect;
const actions = require('../../js/actions'); const actions = require('../../js/actions');
const moment = require('moment'); const moment = require('moment');
import { Table, Icon, DatePicker, Alert} from 'antd'; import { Table, Icon, DatePicker, Alert, Row, Col} from 'antd';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
class DashBoard extends React.Component{ class DashBoard extends React.Component{
...@@ -130,10 +130,32 @@ class DashBoard extends React.Component{ ...@@ -130,10 +130,32 @@ class DashBoard extends React.Component{
return ( return (
<div> <div>
<Alert <Row>
message = { "截止目前,注册用户数 " + this.props.data.count.user + ' ,绑定账号数 ' + this.props.data.count.upstream } <Col span="6">
type = "info" <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'}}/> <RangePicker onChange={ this.onChange.bind(this) } value={ ranges } format={'YYYYMMDD'} style={{margin:'10px 0px'}}/>
<Table columns={columns} dataSource = { data } size="middle" /> <Table columns={columns} dataSource = { data } size="middle" />
</div> </div>
......
...@@ -4,7 +4,7 @@ const actions = require('../../js/actions'); ...@@ -4,7 +4,7 @@ const actions = require('../../js/actions');
const types = require('../../js/actions/actionTypes'); const types = require('../../js/actions/actionTypes');
const moment = require('moment'); const moment = require('moment');
import { Table } from 'antd'; import { Table, Spin} from 'antd';
class Detail extends React.Component{ class Detail extends React.Component{
constructor(props){ constructor(props){
...@@ -15,6 +15,7 @@ class Detail extends React.Component{ ...@@ -15,6 +15,7 @@ class Detail extends React.Component{
componentDidMount (){ componentDidMount (){
let limit = 30; let limit = 30;
let skip = 0; let skip = 0;
// await this.props.dispatch({status:'pending',type:types.DETAILDATA});
this.props.dispatch(actions.getDetailData({limit,skip})); this.props.dispatch(actions.getDetailData({limit,skip}));
} }
...@@ -29,29 +30,6 @@ class Detail extends React.Component{ ...@@ -29,29 +30,6 @@ class Detail extends React.Component{
} }
render(){ render(){
let users = this.props.data.detail.users;
let upstreams = this.props.data.detail.upstreams;
console.dir(users);
console.dir(upstreams);
let upMap = {};
let data = [];
for(let i = 0;i < upstreams.length; i++){
let id = upstreams[i]['_id']['creater'];
upMap[id] = upstreams[i]['count'];
}
for(let i = 0;i < users.length; i++){
let item = users[i];
data.push({
key : i,
name : item['username'] || '-',
phone : item['phone'] || '-',
ups : upMap[ item['_id'] ] || 0,
date : moment(item['createdAt']).format('YYYY/MM/DD hh:mm:ss')
})
}
console.dir(data);
let columns = [ let columns = [
{ {
title: '用户', title: '用户',
...@@ -82,6 +60,26 @@ class Detail extends React.Component{ ...@@ -82,6 +60,26 @@ class Detail extends React.Component{
render: text => <a href="#">{text}</a>, 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++){
let id = upstreams[i]['_id']['creater'];
upMap[id] = upstreams[i]['count'];
}
for(let i = 0;i < users.length; i++){
let item = users[i];
data.push({
key : i,
name : item['username'] || '-',
phone : item['phone'] || '-',
ups : upMap[ item['_id'] ] || 0,
date : moment(item['createdAt']).format('YYYY/MM/DD hh:mm:ss')
})
}
return ( 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'); module.exports = require('./config.default.js');
\ No newline at end of file
}
\ No newline at end of file
...@@ -2,10 +2,11 @@ const express = require('request-promise'); ...@@ -2,10 +2,11 @@ const express = require('request-promise');
const user = require('../db/mongo/user'); const user = require('../db/mongo/user');
const upstream = require('../db/mongo/upstream'); const upstream = require('../db/mongo/upstream');
const moment = require('moment'); const moment = require('moment');
const mongoose = require('mongoose');
exports.data = async (req,res,next) => { exports.data = async (req,res,next) => {
let {start,end} = req.body; 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()}}; const basicCondition = {'createdAt': {'$lt': moment(start, 'YYYYMMDD').startOf('day').toDate()}};
console.dir(condition['$and']); console.dir(condition['$and']);
console.dir(basicCondition); console.dir(basicCondition);
...@@ -29,7 +30,7 @@ exports.data = async (req,res,next) => { ...@@ -29,7 +30,7 @@ exports.data = async (req,res,next) => {
const userPromise = await user.aggregate(pipeline); const userPromise = await user.aggregate(pipeline);
const basicUserPromise = await user.count(basicCondition); const basicUserPromise = await user.count(basicCondition);
const upstreamPromise = await upstream.aggregate(pipeline); const upstreamPromise = await upstream.aggregate(pipeline);
const basicUpstreamPromise = await user.count(basicCondition); const basicUpstreamPromise = await upstream.count(basicCondition);
let userResult = []; let userResult = [];
let upstreamsResult = []; let upstreamsResult = [];
...@@ -48,22 +49,25 @@ exports.count = async(req,res,next) => { ...@@ -48,22 +49,25 @@ exports.count = async(req,res,next) => {
const userPromise = await user.count({}); const userPromise = await user.count({});
const upstreamPromise = await upstream.count({}); const upstreamPromise = await upstream.count({});
const adminPromise = await upstream.count({ creater:mongoose.Types.ObjectId('58afdd80aa96916a41598698') });
let userCount= 0; let userCount= 0;
let upstreamCount = 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; userCount = users;
upstreamCount = upstreams; 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) => { exports.detail = async(req,res,next) => {
let { limit = 3 , skip = 0} = req.body; let { limit = 30 , skip = 0} = req.body;
try{ 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); const total = await user.count({},null);
let creaters = []; let creaters = [];
users.forEach( item => { users.forEach( item => {
...@@ -79,7 +83,7 @@ exports.detail = async(req,res,next) => { ...@@ -79,7 +83,7 @@ exports.detail = async(req,res,next) => {
} }
]; ];
const upstreams = await upstream.aggregate(pipeline); 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 ) { } catch ( err ) {
console.dir(err); console.dir(err);
res.status(400); 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