Commit deabd65c authored by yaobeibei's avatar yaobeibei

add

parent 087612eb
### Health check 'curl /ping'
FROM hub.c.163.com/library/node:latest
WORKDIR /app
ADD ./package.json /app/
#front end
ADD ./dist /app/dist
#server
ADD ./server.js /app/
#api
ADD ./api /app/api
RUN \
rm /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN npm i --only=production --registry https://registry.npm.taobao.org
ENV SERVICE_PORT=8082
ENV PROJECT_LEVEL=production
ENV MONGO='mongodb://mongo-adpro-ssp-v2-rs-1.localhost:1301/remarketing?replicaSet=adpro_ssp_v2_rs'
ENV NODE_ENV='production'
EXPOSE 8082
CMD node server.js
...@@ -2,11 +2,12 @@ const mongodb = require('mongodb') ...@@ -2,11 +2,12 @@ const mongodb = require('mongodb')
const mongoClient = mongodb.MongoClient const mongoClient = mongodb.MongoClient
const app = require('express').Router() const app = require('express').Router()
const _ = require('lodash') const _ = require('lodash')
const axios = require('axios')
const moment = require('moment') const moment = require('moment')
var db = {} var db = {}
var reg = /@test.com$|@123.com$|@goyoo.com$|@xiaoyun.com$|^@|^test|@dis.com$|time-stone.cn$|^tangyong|^875652541|@1.com$|@xioayun.com$/i
const dbpath = 'mongodb://localhost:27017/remarketing' const dbpath = process.env.MONGO || 'mongodb://10.11.3.123:1301/remarketing'
// const dbpath = 'mongodb://localhost:27017/remarketing'
mongoClient.connect(dbpath, function (err, res) { mongoClient.connect(dbpath, function (err, res) {
if (err) return console.log(err) if (err) return console.log(err)
...@@ -16,14 +17,34 @@ mongoClient.connect(dbpath, function (err, res) { ...@@ -16,14 +17,34 @@ mongoClient.connect(dbpath, function (err, res) {
}) })
}) })
// 登陆接口
app.post('/login', async function (req, res) {
console.log('进入登陆')
let body = req.body
console.log(body)
if (body.userName === 'admin') {
if (body.password === 'goyooyunying') {
res.send({status: 230, message: '登陆成功'})
} else {
res.send({ status: 200, message: '密码错误' })
}
} else {
res.send({ status: 200, message: '账号错误' })
}
})
// 获取首页数据
app.post('/dataList', async function (req, res) { app.post('/dataList', async function (req, res) {
console.log('进入了dataList') console.log('进入了统计')
let body = req.body let body = req.body
let { startTime, endTime, total, pageSize, currentPage } = req.body let { startTime, endTime, total, pageSize, currentPage } = req.body
console.log(body) console.log(body)
console.log(startTime, endTime) console.log(startTime, endTime)
let dateQs = getTimeRange({start: startTime, end: endTime, type: 'direct', key: 'date'})
console.log(dateQs) let dateQs = getTimeRange({start: startTime, end: endTime, key: 'date'})
// console.log(dateQs)
let results = await db.collection('dailyStats').aggregate([ let results = await db.collection('dailyStats').aggregate([
{ {
...@@ -35,7 +56,8 @@ app.post('/dataList', async function (req, res) { ...@@ -35,7 +56,8 @@ app.post('/dataList', async function (req, res) {
pv: {$sum: '$pv'}, pv: {$sum: '$pv'},
uid: {$sum: '$uid'} uid: {$sum: '$uid'}
} }
}]).sort({'date': -1}).toArray() }
]).sort({'date': -1}).toArray()
// console.log(results) // console.log(results)
let touchCount = await db.collection('recognition').aggregate([ let touchCount = await db.collection('recognition').aggregate([
...@@ -47,14 +69,16 @@ app.post('/dataList', async function (req, res) { ...@@ -47,14 +69,16 @@ app.post('/dataList', async function (req, res) {
_id: '$pubID', _id: '$pubID',
touchCount: {$sum: 1} touchCount: {$sum: 1}
} }
}]).sort({'date': -1}).toArray() }
]).sort({'date': -1}).toArray()
// console.log(touchCount) // console.log(touchCount)
let creatQs = getTimeRange({start: startTime, end: endTime, key: 'createdAt'})
console.log(creatQs)
let msgTask = await db.collection('task').aggregate([ let msgTask = await db.collection('task').aggregate([
{ {
$match: dateQs $match: creatQs
}, },
{ {
$group: { $group: {
...@@ -62,6 +86,7 @@ app.post('/dataList', async function (req, res) { ...@@ -62,6 +86,7 @@ app.post('/dataList', async function (req, res) {
msgCount: {$sum: 1} msgCount: {$sum: 1}
} }
}]).sort({'date': -1}).toArray() }]).sort({'date': -1}).toArray()
// console.log(msgTask)
let callTask = await db.collection('callTask').aggregate([ let callTask = await db.collection('callTask').aggregate([
{ {
...@@ -73,7 +98,7 @@ app.post('/dataList', async function (req, res) { ...@@ -73,7 +98,7 @@ app.post('/dataList', async function (req, res) {
callCount: {$sum: 1} callCount: {$sum: 1}
} }
}]).sort({'date': -1}).toArray() }]).sort({'date': -1}).toArray()
console.log(callTask) // console.log(callTask)
let companyName = await db.collection('account').aggregate([ let companyName = await db.collection('account').aggregate([
{ {
...@@ -83,11 +108,13 @@ app.post('/dataList', async function (req, res) { ...@@ -83,11 +108,13 @@ app.post('/dataList', async function (req, res) {
email: '$email' email: '$email'
} }
}]).sort({'date': -1}).toArray() }]).sort({'date': -1}).toArray()
console.log(companyName) // console.log(companyName)
let auditDate = getTimeRange({start: startTime, end: endTime, key: 'auditAt'})
console.log(auditDate)
let getCount = await db.collection('recognition').aggregate([ let getCount = await db.collection('recognition').aggregate([
{ {
$match: _.merge(dateQs, {auditStatus: {$eq: 2}}) $match: auditDate
}, },
{ {
$group: { $group: {
...@@ -96,26 +123,70 @@ app.post('/dataList', async function (req, res) { ...@@ -96,26 +123,70 @@ app.post('/dataList', async function (req, res) {
} }
}]).sort({'date': -1}).toArray() }]).sort({'date': -1}).toArray()
let data = _.merge(results, companyName, touchCount, getCount, msgTask, callTask) let dataArr = []
let item = {}
let datas = data.slice((currentPage - 1) * pageSize, currentPage * pageSize)
companyName.forEach(x => {
datas = _.enhance(datas, {time: endTime}) item.time = startTime + ' 至 ' + endTime
item.company = x.company
item.email = x.email
results.forEach(y => {
if (y._id + '' === x._id + '') {
item.pv = y.pv
item.uid = y.uid
}
})
touchCount.forEach(z => {
if (z._id + '' === x._id + '') {
item.touchCount = z.touchCount
}
})
getCount.forEach(m => {
if (m._id + '' === x._id + '') {
item.getCount = m.getCount
}
})
msgTask.forEach(n => {
if (n._id + '' === x._id + '') {
item.msgCount = n.msgCount
}
})
callTask.forEach(o => {
if (o._id + '' === x._id + '') {
item.callCount = o.callCount
}
})
// if (item.pv || item.touchCount || item.getCount || item.msgCount || item.callCount) {
// dataArr.push(item)
// }
if (!reg.test(item.email)) {
dataArr.push(item)
}
item = {}
})
let arrTotal = dataArr.length
res.send({status: 200, total: data.length, time: startTime, data: datas}) // dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
// console.log(dataArr)
res.send({status: 200, total: arrTotal, data: dataArr})
}) })
// 消费数据
app.post('/consume', async function (req, res) { app.post('/consume', async function (req, res) {
console.log('进入了consume') console.log('进入了消费')
let { startTime, endTime, total, pageSize, currentPage } = req.body let { startTime, endTime, total, pageSize, currentPage } = req.body
let dateQs = getTimeRange({start: startTime, end: endTime, type: 'direct', key: 'date'}) startTime = moment(startTime).startOf('day').toDate()
endTime = moment(endTime).endOf('day').toDate()
console.log(startTime)
console.log(endTime)
let counsume = await db.collection('bills').aggregate([ let counsume = await db.collection('bills').aggregate([
{ {
$match: dateQs $match: {createdAt: {$gt: startTime, $lte: endTime}}
}, },
{ {
$group: { $group: {
...@@ -124,55 +195,80 @@ app.post('/consume', async function (req, res) { ...@@ -124,55 +195,80 @@ app.post('/consume', async function (req, res) {
} }
}]).toArray() }]).toArray()
let companyName = await db.collection('account').aggregate([ console.log(counsume)
{
$project: {
_id: '$_id',
company: '$company',
email: '$email'
}
}]).sort({'date': -1}).toArray()
let data = []; let companyName = await db.collection('account').find({}).sort({'date': -1}).toArray()
let preData = [];
for (let i = 0; i < counsume.length; i++){ let data = []
if (counsume[i]._id.pre === true){ let preData = []
data.push({_id: counsume[i]._id.accountID, number: counsume[i].number}) for (let i = 0; i < counsume.length; i++) {
} else { if (counsume[i]._id.pre === true) {
preData.push({_id: counsume[i]._id.accountID, preNumber: counsume[i].number}) preData.push({_id: counsume[i]._id.accountID, preNumber: counsume[i].number})
} else {
data.push({_id: counsume[i]._id.accountID, number: counsume[i].number})
} }
} }
// console.log(data)
// console.log(preData)
let consumeTotalNumber = 0
for (let i = 0; i < data.length; i++) {
consumeTotalNumber += data[i].number
}
console.log(consumeTotalNumber)
let preTotalNumber = 0
for (let i = 0; i < data.length; i++) {
preTotalNumber += data[i].number
}
console.log(preTotalNumber)
let datas = _.merge(data, preData, companyName)
datas = datas.slice((currentPage - 1) * pageSize, currentPage * pageSize)
datas = _.enhance(datas, {time: endTime}) startTime = moment(startTime).startOf('day').format('YYYY-MM-DD')
endTime = moment(endTime).endOf('day').format('YYYY-MM-DD')
let dataArr = []
let item = {}
companyName.forEach(x => {
item.time = startTime + ' 至 ' + endTime
item.company = x.company
item.email = x.email
data.forEach(y => {
if (x._id + '' === y._id + '' || x._id === y._id) {
item.number = y.number
}
})
preData.forEach(z => {
if (z._id + '' === x._id + '' || z._id === x._id) {
item.preNumber = z.preNumber
}
})
// if (item.number || item.preNumber) {
// dataArr.push(item)
// }
if (!reg.test(item.email)) {
dataArr.push(item)
}
item = {}
})
let dataTotal = dataArr.length
console.log(dataArr)
res.send({status: 200, consumeTotalNumber: consumeTotalNumber, preTotalNumber: preTotalNumber, total: data.length, data: datas}) let preTotalNumber = 0
let consumeTotalNumber = 0
dataArr.forEach(x => {
if (typeof (x.number) === 'number') {
consumeTotalNumber += x.number
}
if (typeof (x.preNumber) === 'number') {
preTotalNumber += x.preNumber
}
})
console.log(consumeTotalNumber)
console.log(preTotalNumber)
// dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
res.send({status: 200, consumeTotalNumber: consumeTotalNumber, preTotalNumber: preTotalNumber, total: dataTotal, data: dataArr})
}) })
// 充值数据
app.post('/finance', async function (req, res) { app.post('/finance', async function (req, res) {
console.log('进入了finance') console.log('进入充值')
console.log(req.body) console.log(req.body)
let { startTime, endTime, total, pageSize, currentPage } = req.body let { startTime, endTime, total, pageSize, currentPage } = req.body
startTime = moment(startTime).toDate() startTime = moment('2018-01-01').startOf('day').toDate()
endTime = moment(endTime).toDate() endTime = moment(endTime).endOf('day').toDate()
console.log(startTime) console.log(startTime)
console.log(endTime) console.log(endTime)
...@@ -187,7 +283,6 @@ app.post('/finance', async function (req, res) { ...@@ -187,7 +283,6 @@ app.post('/finance', async function (req, res) {
} }
}]).toArray() }]).toArray()
console.log(finance)
let companyName = await db.collection('account').aggregate([ let companyName = await db.collection('account').aggregate([
{ {
$project: { $project: {
...@@ -196,77 +291,443 @@ app.post('/finance', async function (req, res) { ...@@ -196,77 +291,443 @@ app.post('/finance', async function (req, res) {
email: '$email' email: '$email'
} }
}]).sort({'date': -1}).toArray() }]).sort({'date': -1}).toArray()
let datas = _.merge(finance, companyName)
console.log(datas) startTime = moment(startTime).startOf('day').format('YYYY-MM-DD')
endTime = moment(endTime).startOf('day').format('YYYY-MM-DD')
let dataArr = []
let item = {}
companyName.forEach(x => {
item.time = startTime + ' 至 ' + endTime
item.company = x.company
item.email = x.email
finance.forEach(y => {
if (x._id + '' === y._id + '') {
item.number = y.number
}
})
// if (item.number) {
// dataArr.push(item)
// }
startTime = moment(startTime).format('YYYY-MM-DD') if (!reg.test(item.email)) {
endTime = moment(endTime).format('YYYY-MM-DD') dataArr.push(item)
}
item = {}
})
let dataTolal = dataArr.length
let financeNumber = 0 let financeNumber = 0
console.log(financeNumber) console.log(financeNumber)
for (let i = 0; i < datas.length; i++) { for (let i = 0; i < dataArr.length; i++) {
if (datas[i].number) { if (dataArr[i].number) {
financeNumber += datas[i].number financeNumber += dataArr[i].number
} }
} }
financeNumber = Math.floor(financeNumber) financeNumber = financeNumber.toFixed(2)
// dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
datas = _.enhance(datas, {time: endTime}) res.send({status: 200, financeNumber: financeNumber, total: dataTolal, data: dataArr})
})
datas = datas.slice((currentPage - 1) * pageSize, currentPage * pageSize)
res.send({status: 200, total: datas.length, financeNumber: financeNumber, data: datas}) // 余额数据
}) app.post('/surplus', async function (req, res) {
console.log('进入了余额')
let { startTime, endTime, total, pageSize, currentPage } = req.body
startTime = moment('2018-01-01').startOf('day').toDate()
endTime = moment(endTime).endOf('day').toDate()
console.log(startTime)
console.log(endTime)
let consume = await db.collection('bills').aggregate([
{
$match: {createdAt: {$gt: startTime, $lte: endTime}}
},
{
$group: {
_id: '$accountID',
number: {$sum: '$number'}
}
}]).toArray()
let add = await db.collection('recharge').aggregate([
{
$group: {
_id: '$accountID',
number: {$sum: '$number'}
}
}]).toArray()
let companyName = await db.collection('account').find({}).sort({'date': -1}).toArray()
let dataArr = []
startTime = moment(startTime).startOf('day').format('YYYY-MM-DD')
endTime = moment(endTime).startOf('day').format('YYYY-MM-DD')
companyName.forEach(x => {
let item = {}
item.time = '截至' + endTime
item.createdAt = moment(x.createdAt).format('YYYY-MM-DD')
item.company = x.company
item.email = x.email
item.consumeNum = 0
item.addNum = 0
consume.forEach(y => {
if (x._id + '' === y._id + '' || x._id === y._id) {
if (typeof (y.number) === 'number') {
item.consumeNum = y.number
} else {
item.consumeNum = 0
}
}
})
add.forEach(z => {
if (x._id + '' === z._id + '' || x._id === z._id) {
if (typeof (z.number) === 'number') {
item.addNum = z.number
} else {
item.consumeNum = 0
}
}
})
item.surplus = item.addNum - item.consumeNum
if (!reg.test(item.email)) {
dataArr.push(item)
}
})
let surPlusTotal = 0
dataArr.forEach(x => {
surPlusTotal += x.surplus
})
surPlusTotal = surPlusTotal.toFixed(2)
let dataTotal = dataArr.length
console.log(dataArr)
// dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
res.send({status: 200, total: dataTotal, data: dataArr, surplusTotal: surPlusTotal})
})
_.enhance = function (list, source) { _.enhance = function (list, source) {
return _.map(list, function (element) { return _.map(list, function (element) {
return _.extend({}, element, source) return _.extend({}, element, source)
}) })
} }
function getTimeRange ({start, end, type, key}) { function getTimeRange ({start, end, key}) {
if (/^[0-9]{8}$/.test(start) && /^[0-9]{8}$/.test(end)) { if (key === 'date') {
if (type === 'millisecond') { start = moment(start).startOf('day').format('YYYYMMDD')
return { end = moment(end).endOf('day').format('YYYYMMDD')
[key]: { return { [key]: {'$gte': start, '$lte': end}
'$gt': parseInt(moment(start, 'YYYYMMDD').startOf('day').format('x')), }
'$lte': parseInt(moment(end, 'YYYYMMDD').endOf('day').format('x')) }
} if (key === 'createdAt') {
}; start = moment(start).startOf('day').valueOf()
} else if (type === 'direct') { end = moment(end).endOf('day').valueOf()
return {[key]: {'$gte': start, '$lte': end}}; return {[key]: {'$gte': start, '$lte': end}}
}
if (key === 'auditAt') {
start = moment(start).startOf('day').valueOf()
end = moment(end).endOf('day').valueOf()
return {'auditAt': {'$gte': start, '$lte': end}, 'auditStatus': {'$eq': 2}}
}
}
// 发布公告
app.post('/releaseInfo', async function (req, res) {
console.log('进入更新公告')
let body = req.body
body.time = new Date()
console.log(body)
await db.collection('inform').insertOne(body, function (err, rep) {
if (!err) {
db.collection('account').update({}, {$set: {inform: true}}, {multi: true})
res.send({status: 200, message: '更新成功'})
}
})
})
// 公告数据
app.post('/getInfo', async function (req, res) {
console.log('进入公告')
console.log(req.body)
let {currentPage, pageSize} = req.body
let info = await db.collection('inform').find().sort({'createdAt': -1}).toArray()
let dataArr = []
info.forEach(x => {
let item = {}
item.title = x.title
item.content = x.content
item.releaseMen = x.releaseMen
item.time = moment(x.time).format('YYYY-MM-DD HH:mm:ss')
dataArr.push(item)
})
let dataArrTotal = dataArr.length
dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
res.send({status: 200, data: dataArr, dataTotal: dataArrTotal})
})
// 运营审核数据
app.post('/checkCall', async function (req, res) {
console.log('进入了审核')
let { startTime, endTime, total, pageSize, currentPage, choose} = req.body
console.log(req.body)
console.log(choose)
startTime = moment(startTime).startOf('day').toDate()
endTime = moment(endTime).endOf('day').toDate()
console.log(startTime)
console.log(endTime)
let comapnyName = await db.collection('account').find({}).sort({'date': -1}).toArray()
let callName = await db.collection('bills').find({'type': 'dspbuynumber', 'groupID': {$exists: 1}, 'createdAt': {$gt: startTime, $lte: endTime}}).toArray()
let dspCallGroupsName = await db.collection('dspCallGroups').find().toArray()
let dataArr = []
let item = {}
callName.forEach(x => {
item.preNum = x.preNum / 3
if (x.pre === false) {
item.sendNum = x.number / 3
} else { } else {
return { item.sendNum = 0
[key]: {
'$gt': moment(start, 'YYYYMMDD').startOf('day').toDate(),
'$lte': moment(end, 'YYYYMMDD').endOf('day').toDate()
}
};
} }
} else { item.time = moment(x.createdAt).format('YYYY-MM-DD HH:mm')
if (type === 'millisecond') { console.log(item.time)
return { comapnyName.forEach(y => {
[key]: { if (x.accountID + '' === y._id + '' || x.accountID === y._id) {
'$gt': parseInt(moment().add(-7, 'days').startOf('day').format('x')), item.companyName = y.company
'$lte': parseInt(moment().endOf('day').format('x')) }
})
dspCallGroupsName.forEach(z => {
if (x.groupID + '' === z._id + '' || x.groupID === z._id) {
console.log(z.dspgroup)
item.name = x._id
item.groupID = z._id
item.popover = {}
if (z.sexlist.length === 1) {
item.popover.sexlist = z.sexlist
} else {
item.popover.sexlist = '不限'
}
item.popover.citylist = z.citylist
item.popover.agelist = z.agelist
if (z.businesstypelist.length === 3) {
item.popover.businesstypelist = '不限'
} else {
item.popover.businesstypelist = z.businesstypelist
}
item.popover.phonelist = z.phonelist
item.popover.opsystemlist = z.opsystemlist
item.popover.consumelist = z.consumelist
item.popover.flowlist = z.flowlist
item.popover.hobbylist = z.hobbylist
item.popover.interestlist = z.interestlist
item.popover.hostlist = z.hostlist
}
})
if (item.popover) {
if (choose === 'zero' && x.checkStatus === undefined) {
console.log(choose)
item.status = '未审核'
dataArr.push(item)
item = {}
}
if (choose === 'one' && x.checkStatus === 0) {
console.log(choose)
item.status = '审核未通过'
item.disable = true
dataArr.push(item)
item = {}
}
if (choose === 'two' && (x.checkStatus === 1)) {
console.log(choose)
item.status = '审核通过'
item.disable = true
dataArr.push(item)
item = {}
}
if (choose === 'all') {
console.log(choose)
if (x.checkStatus === undefined) {
item.status = '未审核'
item.disable = false
}
if (x.checkStatus === 0) {
item.status = '审核未通过'
item.disable = true
} }
}; if (x.checkStatus === 1) {
} else if (type === 'direct') { item.status = '审核通过'
console.log(start) item.disable = true
console.log(end)
return {
[key]: {
'$gt': moment(start).format('YYYYMMDD'),
'$lte': moment(end).format('YYYYMMDD')
} }
}; // console.log(item)
dataArr.push(item)
item = {}
}
}
})
let dataTotal = dataArr.length
dataArr = dataArr.reverse()
dataArr = dataArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)
res.send({state: 200, data: dataArr, total: dataTotal})
})
// 审核接口
app.post('/send', async function (req, res) {
console.log('进入send')
console.log(req.body)
let {taskId, groupId, interestlist, hostlist, status} = req.body
if (status === 0) {
await db.collection('bills').update({'_id': mongodb.ObjectId(taskId)}, {$set: {'checkStatus': 0}})
res.send({status: 200, message: '审核未通过'})
}
if (status === 1) {
await db.collection('bills').update({'_id': mongodb.ObjectId(taskId)}, {$set: {'checkStatus': 1}})
await db.collection('dspCallGroups').update({'_id': mongodb.ObjectId(groupId)}, {$set: {'interestlist': interestlist, 'hostlist': hostlist}})
res.send({status: 200, message: '审核通过'})
}
})
// 账户数据
app.post('/getAccount', async function (req, res) {
console.log('进入用户控制')
console.log(req.body)
let {currentPage, pageSize} = req.body
let accounts = await db.collection('account').find().toArray()
let dataArr = []
accounts.forEach(x => {
let item = {}
if (x.isDelete) {
item.isAccountDelete = true
} else { } else {
return {[key]: {'$gt': moment().add(-7, 'days').startOf('day').toDate(), '$lte': moment().endOf('day').toDate()}}; item.isAccountDelete = false
} }
if (x.isCloseAuto) {
item.isCloseAuto = true
} else {
item.isCloseAuto = false
}
item._id = x._id
item.company = x.company
item.phone = x.phone
item.email = x.email
dataArr.push(item)
})
let dataArrTotal = dataArr.length
dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
res.send({status: 200, data: dataArr, dataTotal: dataArrTotal})
})
// 注销接口
app.post('/deleteAccount', async function (req, res) {
console.log('进入用户控制')
console.log(req.body)
let {accountId, status} = req.body
if (status === 0 || status === '0') {
await db.collection('account').update({'_id': mongodb.ObjectId(accountId)}, {$set: {'isDelete': true}})
res.send({status: 200, data: '用户注销成功'})
} }
} if (status === 1 || status === '1') {
await db.collection('account').update({'_id': mongodb.ObjectId(accountId)}, {$set: {'isDelete': false}})
res.send({status: 200, data: '用户恢复成功'})
}
})
// 自动备案接口
app.post('/closeBtn', async function (req, res) {
console.log('进入自动备案')
console.log(req.body)
let {accountId, status} = req.body
if (status === 0 || status === '0') {
await db.collection('account').update({'_id': mongodb.ObjectId(accountId)}, {$set: {'isCloseAuto': true}})
res.send({status: 200, data: '自动备案关闭成功'})
}
if (status === 1 || status === '1') {
await db.collection('account').update({'_id': mongodb.ObjectId(accountId)}, {$set: {'isCloseAuto': false}})
res.send({status: 200, data: '自动备案开启成功'})
}
})
app.post('/getSlot', async function (req, res) {
console.log('进入获取代码位')
console.log(req.body)
let {currentPage, pageSize, choose} = req.body
let company = await db.collection('account').find({}).toArray()
let slot = await db.collection('slotTemps').find().toArray()
let dataArr = []
let emailArr = []
company.forEach(x => {
emailArr.push(x.email)
})
slot.forEach(x => {
let item = {}
item.slotId = x._id
item.slot = x.durl
item.slotName = x.slotName
item.time = moment(x.createdAt).format('YYYY-MM-DD')
if (x.isSlotDelete) {
item.isDelete = true
} else {
item.isDelete = false
}
company.forEach(y => {
if (x.accountID === y._id || x.accountID + '' === y._id + '') {
item.company = y.company
item.email = y.email
}
})
if (choose) {
if (item.email === choose || item.email + '' === choose + '') {
dataArr.push(item)
}
} else {
dataArr.push(item)
}
})
let dataTotal = dataArr.length
dataArr = dataArr.slice((currentPage - 1) * pageSize, pageSize * currentPage)
res.send({status: 200, data: dataArr, dataTotal: dataTotal, emailArr: emailArr})
})
app.post('/deleteSlot', async function (req, res) {
console.log('进入代码位控制')
console.log(req.body)
let {slotId, status} = req.body
if (status === 0 || status === '0') {
await db.collection('slotTemps').update({'_id': mongodb.ObjectId(slotId)}, {$set: {'isSlotDelete': true}})
res.send({status: 200, data: '代码位注销成功'})
}
if (status === 1 || status === '1') {
await db.collection('slotTemps').update({'_id': mongodb.ObjectId(slotId)}, {$set: {'isSlotDelete': false}})
res.send({status: 200, data: '代码位恢复成功'})
}
})
module.exports = app module.exports = app
...@@ -37,6 +37,6 @@ app.get('/file/:fileName', function(req, res, next) { ...@@ -37,6 +37,6 @@ app.get('/file/:fileName', function(req, res, next) {
} }
}); });
server.listen(8080, function() { server.listen(8082, function() {
console.log('server started'); console.log('server started');
}); });
<template>
<el-container>
<el-header>
<h4>账户权限控制</h4>
</el-header>
<el-main>
<el-table :data='datas' border width=100%>
<el-table-column label='序号' width=50>
<template slot-scope='scope'>
{{scope.$index + (currentPage - 1) * pageSize + 1}}
</template>
</el-table-column>
<el-table-column label='ID' prop='_id'></el-table-column>
<el-table-column label='公司名称' prop='company'></el-table-column>
<el-table-column label='账户名称' prop='email'></el-table-column>
<el-table-column label='电话' prop='phone'></el-table-column>
<el-table-column label='自动备案'>
<template slot-scope='scope'>
<el-switch
style="display: block"
v-model="scope.row.isCloseAuto"
active-color="#ff4949"
inactive-color="#13ce66"
active-text="关闭"
@change='AutoChange(scope.row)'
inactive-text="开启">
</el-switch>
</template>
</el-table-column>
<el-table-column label='账户操作'>
<template slot-scope='scope'>
<el-switch
style="display: block"
v-model="scope.row.isAccountDelete"
active-color="#ff4949"
inactive-color="#13ce66"
active-text="注销"
@change='accountChange(scope.row)'
inactive-text="启用">
</el-switch>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100, 1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="float: right;margin-top: 15px">
</el-pagination>
</el-main>
</el-container>
</template>
<script>
export default {
name: 'account',
data () {
return {
datas: null,
isCloseAuto: false,
isAccountDelete: false,
currentPage: 1,
pageSize: 10,
total: 100
}
},
mounted () {
this.getData(this.currentPage, this.pageSize)
},
methods: {
AutoChange (row) {
console.log(row.isCloseAuto)
console.log(row)
if (row.isCloseAuto) {
this.closeAuto(row, 0)
} else {
this.closeAuto(row, 1)
}
},
accountChange (row) {
console.log(row.isAccountDelete)
console.log(row)
if (row.isAccountDelete) {
this.deleteAccount(row, 0)
} else {
this.deleteAccount(row, 1)
}
},
getData (currentPage, pageSize) {
let self = this
fetch('/api/getAccount', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({currentPage: currentPage, pageSize: pageSize})
}).then(res => { return res.json() }).then(data => {
console.log(data)
self.datas = data.data
self.total = data.dataTotal
})
},
handleSizeChange (val) {
this.pageSize = val
this.getData(this.currentPage, this.pageSize)
},
handleCurrentChange (val) {
this.currentPage = val
this.getData(this.currentPage, this.pageSize)
},
deleteAccount (row, status) {
let accountId = row._id
fetch('/api/deleteAccount', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({accountId: accountId, status: status})
}).then(res => { return res.json() }).then(data => {
console.log(data)
if (status === 0) {
this.$message({
message: data.data,
type: 'error'
})
}
if (status === 1) {
this.$message({
message: data.data,
type: 'success'
})
}
})
},
closeAuto (row, status) {
let accountId = row._id
fetch('/api/closeBtn', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({accountId: accountId, status: status})
}).then(res => { return res.json() }).then(data => {
console.log(data)
if (status === 0) {
this.$message({
message: data.data,
type: 'error'
})
}
if (status === 1) {
this.$message({
message: data.data,
type: 'success'
})
}
})
}
}
}
</script>
<style scoped>
</style>
<template>
<el-container>
<el-header>
<h4>云呼审核</h4>
</el-header>
<el-main>
<el-row>
<el-date-picker
v-model="valueRange"
type="daterange"
unlink-panelss
@change="timeChange"
range-separator="至"
:start-placeholder="startTime"
:end-placeholder="endTime"
value-format='yyyy-MM-dd'
format='yyyy-MM-dd'
:picker-options="pickerOptions"
style='margin-bottom: 10px'>
</el-date-picker>
<el-button type='primary' icon='el-icon-download' @click='down()' style='margin-left: 30px'>
<span>文件下载</span>
</el-button>
<el-dropdown style='float: right' @command='handleCommand'>
<el-button class="el-dropdown-link">
{{choose}}<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command='all'>全部状态</el-dropdown-item>
<el-dropdown-item command='zero'>未审核</el-dropdown-item>
<el-dropdown-item command='one'>审核未通过</el-dropdown-item>
<el-dropdown-item command='two'>审核通过</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-row>
<el-table
:data="datas"
border
style="width: 100%">
<el-table-column label='序号' type='index' width=50></el-table-column>
<el-table-column label='任务名称' prop='name'></el-table-column>
<el-table-column label='公司名称' prop='companyName'></el-table-column>
<el-table-column label='时间' prop='time' ></el-table-column>
<el-table-column label='筛选标签' width=200>
<template slot-scope="scope">
<el-popover trigger="hover" placement="left">
<div>
<h4>基础条件:</h4>
<p>帐期:<span>最近一个月</span></p>
<p>年龄: <span style='padding: 4px' v-for='item in scope.row.popover.agelist'>{{item}}</span></p>
<p>性别: <span style='padding: 4px' v-for='item in scope.row.popover.sexlist'>{{item}}</span></p>
<p>地域: <span style='padding: 4px' v-for='item in scope.row.popover.citylist'>{{item}}</span></p>
<p>业务类型: <span style='padding: 4px' v-for='item in scope.row.popover.businesstypelist'>{{item}}</span></p>
<p>操作系统: <span style='padding: 4px' v-for='item in scope.row.popover.opsystemlist'>{{item}}</span></p>
<p>月出帐: <span style='padding: 4px' v-for='item in scope.row.popover.consumelist'>{{item}}</span></p>
<p>平均流量: <span style='padding: 4px' v-for='item in scope.row.popover.flowlist'>{{item}}</span></p>
<p>终端品牌: <span style='padding: 4px' v-for='item in scope.row.popover.phonelist'>{{item}}</span></p>
</div>
<div>
<h4>筛选条件:</h4>
<p><sapn>访问过以下标签:</sapn> <span style='padding: 4px' v-for='item in scope.row.popover.hobbylist'>{{mapHobby[item]}}({{item}}) |</span></p>
</div>
<span slot="reference">
查看详情
</span>
</el-popover>
</template>
</el-table-column>
<el-table-column label='预计筛选用户数' prop='preNum' width=130></el-table-column>
<el-table-column label='状态' prop='status' :filters="[{ text: '审核未通过', value: '审核未通过' }, { text: '审核通过', value: '审核通过'}]" :filter-method='filterTag' filter-placement="bottom-end"></el-table-column>
<el-table-column label='操作' width=180>
<template slot-scope="scope">
<el-popover
placement="top"
width='200'
v-model='scope.row.visible1'>
<p>您确定要拒绝吗?</p>
<div style="text-align: right; margin: 2px">
<el-button size="mini" type="text" @click="scope.row.visible1 = false" >取消</el-button>
<el-button type="primary" size="mini" @click="suerSend(0, scope.row)">确定</el-button>
</div>
<el-button slot="reference" type='text' size='mini' :disabled='scope.row.disable'>拒绝</el-button>
</el-popover>
<el-button type='text' size='small' @click="openForm(scope.row, scope.$index)" :disabled='scope.row.disable'>筛选后通过</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100, 1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="float: right;margin-top: 15px">
</el-pagination>
<el-dialog title="请添加筛选条件" :visible.sync="dialogFormVisible">
<div>
<el-tag
:key="tag"
v-for="tag in interestlist"
closable
:disable-transitions="false"
@close="handleClose(tag)">
{{tag}}
</el-tag>
<el-input
class="input-new-tag"
v-if="inputVisible"
ref="saveTagInput"
v-model="inputValue"
size="small"
@keyup.enter.native="handleInputConfirm"
@blur="handleInputConfirm"
>
</el-input>
<el-button v-else class="button-new-tag" size="small" @click="showInput">添加关键词</el-button>
</div>
<br>
<div>
<el-tag
:key="tag"
v-for="tag in hostlist"
closable
:disable-transitions="false"
@close="handleClose2(tag)">
{{tag}}
</el-tag>
<el-input
class="input-new-tag"
v-if="inputVisible2"
v-model="inputValue2"
size="small"
ref="saveTagInput2"
@keyup.enter.native="handleInputConfirm"
@blur="handleInputConfirm"
>
</el-input>
<el-button v-else class="button-new-tag" size="small" @click="showInput2">添加新域名</el-button>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeFrom()">取 消</el-button>
<el-button type="primary" @click="suerSend(1)">确 定</el-button>
</div>
</el-dialog>
</el-main>
</el-container>
</template>
<script>
import moment from 'moment'
export default {
name: 'checkCall',
data () {
return {
url: '/api/checkCall',
datas: [],
statue: '未审核',
choose: '状态筛选',
chooseId: 'zero',
total: 0,
pageSize: 100,
currentPage: 1,
visible1: false,
visibleInput: false,
interestlist: [],
hostlist: [],
inputVisible: false,
inputVisible2: false,
inputValue: '',
inputValue2: '',
dialogFormVisible: false,
valueRange: [],
startTime: '',
endTime: '',
currentdata:null,
currentIndex:null,
pickerOptions: {
shortcuts: [{
text: '昨天',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
mapHobby: {'H001002': '时政要闻', 'H001006': '科技资讯', 'H001011': '社会资源', 'H004011': '旅游出行', 'H001008': '财经资讯', 'H001005': '军事资讯', 'H007012': '电子邮件', 'H002008': '专业协会', 'H002009': '社交网络', 'H004020': '团购打折', 'H001012': '综合资讯', 'H002999': '通信交流', 'H003006': '娱乐搞笑', 'H001003': '女性时尚', "H007009":"网络存储", "H004015":"非法网站", "H007004":"系统工具", "H003005":"手机动漫", "H004018":"打车软件", "H004019":"查询服务", "H005010":"营销平台", "H001999":"新闻资讯", "H004009":"医疗健康","H004003":"搜索引擎", "H004005":"生活综合", "H003008":"网络电台", "H004023":"时尚美妆", "H002001":"即时通信", "H004999":"生活服务", "H004021":"福利彩票", "H007008":"应用商店", "H005002":"电子支付", "H004004":"导航网站", "H004012":"物流快递", "H004006":"家居服务", "H007999":"工具软件", "H001010":"企业门户", "H007002":"下载工具","H007006":"词典翻译", "H007007":"主题桌面", "H005009":"求职招聘", "H002002":"婚恋交友", "H004008":"母婴资讯","H004022":"教育学习", "H003009":"影院票务", "H004007":"汽车信息", "H001004":"体育资讯", "H003002":"手机阅读", "H003003":"手机音频", "H004014":"宠物资讯", "H001009":"文化教育", "H004013":"餐饮美食", "H005013":"金融理财", "H004002":"时间天气", "H005008":"商务办公", "H003004":"手机游戏", "H001007":"娱乐资讯", "H004016":"外卖送餐", "H002006":"博客空间", "H003001":"手机视频", "H003007":"摄影图片", "H005001":"网上购物", "H002005":"社区论坛", "H007001":"安全杀毒", "H005012":"手机银行", "H003999":"娱乐休闲", "H004017":"地图导航", "H007011":"无线管理","H007005":"输入法 ","H007003":"浏览器 ","H005011":"云服务 "}
}
},
mounted () {
this.getTime()
this.change('POST', this.startTime, this.endTime, this.total, this.pageSize, this.currentPage, this.chooseId)
this.valueRange[0] = this.startTime
this.valueRange[1] = this.endTime
},
methods: {
openForm (data, index) {
this.dialogFormVisible = true
console.log(data)
this.currentdata = data
this.currentIndex = index
// scope.row.status = '审核通过'
// scope.row.disable = true
},
closeFrom () {
this.dialogFormVisible = false
this.interestlist = []
this.hostlist = []
},
handleClose (tag) {
this.interestlist.splice(this.interestlist.indexOf(tag), 1)
},
handleClose2 (tag) {
this.hostlist.splice(this.hostlist.indexOf(tag), 1)
},
showInput () {
this.inputVisible = true
this.$nextTick(_ => {
this.$refs.saveTagInput.$refs.input.focus()
})
},
showInput2 () {
this.inputVisible2 = true
console.log(this.$refs)
this.$nextTick(_ => {
this.$refs.saveTagInput2.$refs.input.focus()
})
},
handleInputConfirm () {
let inputValue = this.inputValue
let inputValue2 = this.inputValue2
if (inputValue) {
this.interestlist.push(inputValue)
}
if (inputValue2) {
this.hostlist.push(inputValue2)
}
this.inputVisible = false
this.inputVisible2 = false
this.inputValue = ''
this.inputValue2 = ''
},
handleCommand (command) {
console.log(command)
let self = this
if (command === 'zero') {
this.choose = '未审核'
self.chooseId = 'zero'
self.datas = []
}
if (command === 'one') {
this.choose = '审核未通过'
self.chooseId = 'one'
self.datas = []
}
if (command === 'two') {
this.choose = '审核通过'
self.chooseId = 'two'
self.datas = []
}
if (command === 'all') {
this.choose = '全部状态'
self.chooseId = 'all'
self.datas = []
}
this.change('POST', this.valueRange[0], this.valueRange[1], this.total, this.pageSize, this.currentPage, self.chooseId)
},
// down () {
// let self = this
// let list = []
// let tHeader = ['序号', '任务名称', '公司名称', '时间', '基础标签', '筛选标签', '预计筛选用户', '实际筛选用户', '状态']
// list.push(tHeader)
// self.datas.forEach(x => {
// let n = 1
// console.log(self.datas)
// let item = '标签:'
// x.popover.hobbylist.forEach(y => {
// item += self.mapHobby[y] + '(' + y + ')'
// })
// item = item + ' | 关键词:' + x.popover.interestlist + ' | 搜索引擎:' + x.popover.hostlist
// list.push([n, x.name, x.companyName, x.time, '年龄:' + x.popover.agelist + ' | 性别:' + x.popover.sexlist + ' | 地域:' + x.popover.citylist + ' | 业务类型:' + x.popover.businesstypelist + ' | 操作系统:' + x.popover.opsystemlist + ' | 月出帐:' + x.popover.consumelist + ' | 平均流量:' + x.popover.flowlist + ' | 终端品牌:' + x.popover.phonelist, item, x.preNum, x.sendNum, x.status])
// n += 1
// })
// json2xlsx.default(list, {sheetName: '数据详情', filename: '数据下载.xlsx'})
// },
getTime () {
this.endTime = moment().format('YYYY-MM-DD')
this.startTime = moment().subtract(7, 'days').format('YYYY-MM-DD')
},
filterTag (value, row) {
return row.status === value
},
timeChange () {
console.log('时间改变')
console.log(this.valueRange)
this.change('POST', this.valueRange[0], this.valueRange[1], this.total, this.pageSize, this.currentPage, this.chooseId)
},
handleSizeChange (val) {
console.log('页容量改变')
console.log(val)
this.pageSize = val
this.change('POST', this.valueRange[0], this.valueRange[1], this.total, this.pageSize, this.currentPage, this.chooseId)
},
handleCurrentChange (val) {
console.log('当前页码改变')
this.currentPage = val
console.log(val)
this.change('POST', this.valueRange[0], this.valueRange[1], this.total, this.pageSize, this.currentPage, this.chooseId)
},
suerSend (status, row) {
let self = this
let interestlist = this.interestlist
let hostlist = this.hostlist
let currentdata = this.currentdata
let taskId = currentdata ? currentdata.name : row.name
let groupId = currentdata ? currentdata.groupID : row.groupID
this.dialogFormVisible = false
fetch('/api/send', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({taskId, groupId, interestlist, hostlist, status})
}).then(res => {
return res.json()
}).then(data => {
console.log(data)
self.interestlist = []
self.hostlist = []
if (status === 1) {
console.log('通过')
console.log(currentdata)
currentdata.status = '审核通过'
currentdata.disable = true
this.$set(this.datas, this.currentIndex, this.currentdata)
}
if (status === 0) {
console.log('拒绝')
row.visible1 = false
row.status = '审核未通过'
row.disable = true
}
self.currentdata = null
self.currentIndex = null
}).catch(err => {
console.log(err)
})
},
change (type = 'POST', startTime, endTime, total = total, pageSize = this.pageSize, currentPage = this.currentPage, choose) {
let self = this
console.log(self.url, type, startTime, endTime, total, pageSize, currentPage, choose)
fetch(self.url, {
method: type,
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({startTime, endTime, total, pageSize, currentPage, choose})
}).then(res => { return res.json() }).then(data => {
self.datas = []
console.log(data)
self.datas = data.data
self.total = data.total
if (data.data.status === '已完成') {
}
}).catch(err => {
console.log(err)
})
}
}
}
</script>
<style scoped>
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
</style>
<template> <template>
<el-container> <el-container>
<el-header>消费记录</el-header> <el-header><h2>消费记录</h2></el-header>
<el-main> <el-main>
<TableTmp :header="dataHeader" ref='TableTmp' consume='ok' :url='url'></TableTmp> <TableTmp :header="dataHeader" ref='TableTmp' consume='ok' :url='url'></TableTmp>
</el-main> </el-main>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<el-container> <el-container>
<el-header><h2>数据统计</h2></el-header> <el-header><h2>数据统计</h2></el-header>
<el-main> <el-main>
<TableTmp :header="dataHeader" ref='TableTmp' :url='url'> <TableTmp :header="dataHeader" ref='TableTmp' :url='url' :datalist='datalist'>
</TableTmp> </TableTmp>
</el-main> </el-main>
</el-container> </el-container>
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
getCount: '备案用户', getCount: '备案用户',
msgCount: '短信营销', msgCount: '短信营销',
callCount: '云呼营销' callCount: '云呼营销'
} },
datalist: 'ok'
} }
}, },
mounted () { mounted () {
......
<template> <template>
<el-container> <el-container>
<el-header>充值记录</el-header> <el-header><h2>充值记录</h2></el-header>
<el-main> <el-main>
<TableTmp :header="dataHeader" ref='TableTmp' :url='url' finance='ok'> <TableTmp :header="dataHeader" ref='TableTmp' :url='url' finance='ok'>
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
dataHeader: { dataHeader: {
time: '日期', time: '日期',
email: '邮箱', email: '邮箱',
company: '渠道', company: '公司',
number: '金额' number: '金额'
} }
} }
......
...@@ -36,20 +36,48 @@ ...@@ -36,20 +36,48 @@
</el-menu-item> </el-menu-item>
<el-menu-item index="/consume" @click="routeTo">消费记录 <el-menu-item index="/consume" @click="routeTo">消费记录
</el-menu-item> </el-menu-item>
<el-menu-item index="/surplus" @click="routeTo">余额记录
</el-menu-item>
</el-menu-item-group> </el-menu-item-group>
</el-submenu> </el-submenu>
<!--<el-submenu index="3">--> <el-submenu index=3>
<!--<template slot="title">--> <template slot='title'>
<!--<i class="el-icon-tickets"></i>--> <i class='el-icon-info'></i>
<!--<span>分销管理</span>--> <span>公告信息</span>
<!--</template>--> </template>
<!--<el-menu-item-group>--> <el-menu-item index='/releaseInfo' @click="routeTo">
<!--<el-menu-item index="/check" @click="routeTo">审核管理--> 发布信息
<!--</el-menu-item>--> </el-menu-item>
<!--</el-menu-item-group>--> <el-menu-item index='/info' @click="routeTo">
<!--</el-submenu>--> 过往信息
<a class="btn-toggle" @click="toggle"><i </el-menu-item>
</el-submenu>
<el-submenu index=4>
<template slot='title'>
<i class='el-icon-success'></i>
<span>业务审核</span>
</template>
<el-menu-item index='/checkCall' @click="routeTo">
云呼审核
</el-menu-item>
</el-submenu>
<el-submenu index=5>
<template slot='title'>
<i class='el-icon-setting'></i>
<span>权限控制</span>
</template>
<el-menu-item index='/account' @click="routeTo">
账户控制
</el-menu-item>
<el-menu-item index='/slot' @click="routeTo">
代码位控制
</el-menu-item>
</el-submenu>
<a class="btn-toggle" @click="toggle"><i
:class="[isCollapse? 'el-icon-d-arrow-right' : 'el-icon-d-arrow-left']"></i></a> :class="[isCollapse? 'el-icon-d-arrow-right' : 'el-icon-d-arrow-left']"></i></a>
</el-menu> </el-menu>
</el-aside> </el-aside>
......
<template>
<el-container>
<el-header>
公告历史
</el-header>
<div style='margin: 10px 50px'>
<el-table
:data='datas'
border>
<el-table-column label='发布时间' prop='time' width=260></el-table-column>
<el-table-column label='标题' prop='title' width=260></el-table-column>
<el-table-column label='发布者' prop='releaseMen' width=120></el-table-column>
<el-table-column label='内容' prop='content' min-width=800></el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100, 1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="float: right;margin-top: 15px">
</el-pagination>
</div>
</el-container>
</template>
<script>
export default {
name: 'info',
data () {
return {
datas: [],
currentPage: 1,
pageSize: 10,
total: 100
}
},
mounted () {
this.getData(this.currentPage, this.pageSize)
},
methods: {
handleSizeChange (val) {
this.pageSize = val
this.getData(this.currentPage, this.pageSize)
},
handleCurrentChange (val) {
this.currentPage = val
this.getData(this.currentPage, this.pageSize)
},
getData (currentPage, pageSize) {
let self = this
fetch('/api/getInfo', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({currentPage: currentPage, pageSize: pageSize})
}).then(res => { return res.json() }).then(data => {
console.log(data)
self.datas = data.data
self.total = data.dataTotal
})
}
}
}
</script>
<style scoped>
</style>
<template>
<el-container>
<el-main>
<div style='margin: 100px auto'>
<el-row type="flex" justify="center" style="width: 100%;height: 100%">
<el-col :span="12">
<el-form label-position="top" :model="from" ref="from">
<el-form-item label="账号" prop="name">
<el-input v-model="from.userName"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model.trim="from.password" type="password" auto-complete="off"></el-input>
</el-form-item>
<el-button type="primary" @click="onSubmit" style="margin: 0 auto">确定登陆</el-button>
</el-form>
</el-col>
</el-row>
</div>
</el-main>
</el-container>
</template>
<script>
export default {
name: 'login',
data () {
return {
from: {
userName: '',
password: ''
}
}
},
computed: {
},
mounted () {
const self = this
if (localStorage.getItem('sureLogin')) {
self.onSubmit()
}
},
methods: {
onSubmit () {
let self = this
if (self.from.userName && self.from.password) {
fetch('/api/login', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify(self.from)
}).then(res => { return res.json() }).then(data => {
console.log(data)
if (data.status === 230) {
sessionStorage.setItem('sureLogin', 'admin')
this.$router.push({path: '/'})
} else {
this.$message({
showClose: true,
message: data.message,
type: 'error'
})
}
})
} else {
this.$message({
showClose: true,
message: '请输入账号密码',
type: 'error'
})
}
}
}
}
</script>
<style scoped>
</style>
<template>
<el-container>
<el-header>
<h3>信息发布</h3>
</el-header>
<el-main style='width: 80%; margin: 20px auto'>
<div class='input'>
<p>标题:</p>
<el-input label='标题' placeholder='请输入标题名称' v-model='title'></el-input>
</div>
<div class='input'>
<p>发布人:</p>
<el-input label='发布人' placeholder='请输入发布者名称' v-model='releaseMen' ></el-input>
</div>
<div class='input'>
<p>内容:</p>
<el-input label='内容' placeholder='请输入要发布的信息内容' type='textarea' v-model='content' :autosize="{ minRows: 4, maxRows: 8}" style='vertical-align: top'></el-input>
</div>
<el-button type='primary' @click='sure()' style='width: 100px;margin: 10px auto'>确认发布</el-button>
</el-main>
</el-container>
</template>
<script>
export default {
name: 'releaseInfo',
data () {
return {
centerDialogVisible: false,
title: '',
content: '',
releaseMen: ''
}
},
methods: {
sure () {
let self = this
let data = {'title': this.title, 'content': this.content, 'releaseMen': this.releaseMen}
console.log(data)
if (this.title && this.content && this.releaseMen) {
fetch('/api/releaseInfo', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify(data)
}).then(res => { return res.json() }).then(data => {
console.log(data)
if (data.status === 200) {
self.title = ''
self.content = ''
self.releaseMen = ''
this.$alert('消息发送成功', '提示', {
confirmButtonText: '确定',
callback: action => {
this.$message({
showClose: true,
message: '信息发布成功',
type: 'success'
})
}
})
}
})
} else {
this.$message({
showClose: true,
message: '请输入全部所需的内容',
type: 'warning'
})
}
}
}
}
</script>
<style scoped>
.input {
margin: 15px 0;
}
.input:nth-child(1) , .input:nth-child(2){
width: 40%;
}
.input:nth-child(3) {
width: 60%;
}
</style>
<template>
<el-container>
<el-header>
<h4>代码位控制</h4>
</el-header>
<el-main>
<el-row>
<el-select v-model="inputValue" filterable placeholder="请选择" @change='change' clearable @clear='clear' style='width: 300px;margin-bottom: 10px'>
<el-option
v-for="item in emailOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-row>
<el-table :data='datas' border width=100%>
<el-table-column width=50 label='序号'>
<template slot-scope='scope'>
{{scope.$index + (currentPage - 1) * pageSize + 1}}
</template>
</el-table-column>
<el-table-column label='ID' prop='slotId'></el-table-column>
<el-table-column label='账户名称' prop='email'></el-table-column>
<el-table-column label='公司名称' prop='company'></el-table-column>
<el-table-column label='代码位名称' prop='slotName'></el-table-column>
<el-table-column label='代码位位置' prop='slot'></el-table-column>
<el-table-column label='代码位操作'>
<template slot-scope='scope'>
<el-switch
style="display: block"
v-model="scope.row.isDelete"
active-color="#ff4949"
inactive-color="#13ce66"
active-text="注销"
@change='slotChange(scope.row)'
inactive-text="启用">
</el-switch>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100, 1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="float: right;margin-top: 15px">
</el-pagination>
</el-main>
</el-container>
</template>
<script>
export default {
name: 'slot',
data () {
return {
datas: null,
isDelete: false,
inputValue: null,
currentPage: 1,
pageSize: 10,
total: 100,
emailOptions: []
}
},
mounted () {
this.getData(this.currentPage, this.pageSize, this.inputValue)
},
methods: {
change () {
console.log('进入筛选')
console.log(this.inputValue)
this.getData(this.currentPage, this.pageSize, this.inputValue)
},
clear () {
this.getData(this.currentPage, this.pageSize, null)
},
getData (currentPage, pageSize, choose) {
let self = this
fetch('/api/getSlot', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({currentPage: currentPage, pageSize: pageSize, choose: choose})
}).then(res => { return res.json() }).then(data => {
console.log(data)
self.datas = data.data
self.total = data.dataTotal
self.emailOptions = data.emailArr
})
},
handleSizeChange (val) {
this.pageSize = val
this.getData(this.currentPage, this.pageSize, this.inputValue)
},
handleCurrentChange (val) {
this.currentPage = val
this.getData(this.currentPage, this.pageSize, this.inputValue)
},
slotChange (row) {
console.log(row.isDelete)
console.log(row)
if (row.isDelete) {
this.deleteSlot(row, 0)
} else {
this.deleteSlot(row, 1)
}
},
deleteSlot (row, status) {
let slotId = row.slotId
fetch('/api/deleteSlot', {
method: 'POST',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({slotId: slotId, status: status})
}).then(res => { return res.json() }).then(data => {
console.log(data)
if (status === 0) {
this.$message({
message: data.data,
type: 'error'
})
}
if (status === 1) {
this.$message({
message: data.data,
type: 'success'
})
}
})
}
}
}
</script>
<style scoped>
</style>
<template>
<el-container>
<el-header><h2>余额记录</h2></el-header>
<el-main>
<TableTmp :header="dataHeader" ref='TableTmp' :url='url' surplus='ok'>
</TableTmp>
</el-main>
</el-container>
</template>
<style scoped>
</style>
<script>
import TableTmp from './tableTmp'
export default {
name: 'surplus',
components: {TableTmp},
data () {
return {
url: '/api/surplus',
dataHeader: {
time: '日期',
createdAt: '开户时间',
email: '邮箱',
company: '公司',
surplus: '余额'
}
}
},
mounted () {
this.$refs.TableTmp.change()
}
}
</script>
<template> <template>
<el-main> <el-main>
<el-row :gutter="40" type='flex' justify='end' align='middle' style="margin-bottom: 20px"> <el-row :gutter="40" type='flex' justify='end' align='middle' style="margin-bottom: 20px">
<el-col :span='4'> <el-col :span='5'>
<el-button type='primary' @click='dateToXlsx'>下载文件</el-button> <el-button type='primary' @click='dateToXlsx'>下载当前统计文件</el-button>
</el-col> </el-col>
<el-col v-if="consume === 'ok' || finance === 'ok'" :span='5' style='background-color: rgb(115,177,240);padding: 8px 10px;font-weight: 700;text-align:center;color:white;border-radius: 4px;margin-right: 20px'> <el-col v-if="consume === 'ok' || finance === 'ok' || surplus === 'ok'" :span='5' style='background-color: rgb(115,177,240);padding: 8px 10px;font-weight: 700;text-align:center;color:white;border-radius: 4px;margin-right: 20px'>
<span>总计:{{dataSum}}</span> <span>总计:{{dataSum}}{{financeNumber}}{{surplusTotal}}</span>
</el-col> </el-col>
<el-col v-if="consume === 'ok'" :span='4' style='background-color: rgb(115,177,240);padding: 8px 10px;font-weight: 700;text-align:center;color:white;border-radius: 4px'> <el-col v-if="consume === 'ok'" :span='5' style='background-color: rgb(115,177,240);padding: 8px 10px;font-weight: 700;text-align:center;color:white;border-radius: 4px'>
<span>预扣总计:{{dataPreSum}}</span> <span>预扣总计:{{dataPreSum}}</span>
</el-col> </el-col>
<el-col :span='9'> <el-col :span='9'>
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
:end-placeholder="endTime" :end-placeholder="endTime"
value-format='yyyy-MM-dd' value-format='yyyy-MM-dd'
format='yyyy-MM-dd' format='yyyy-MM-dd'
:picker-options="pickerOptions"> :picker-options="pickerOptions"
>
</el-date-picker> </el-date-picker>
</el-col> </el-col>
</el-row> </el-row>
...@@ -35,7 +36,7 @@ ...@@ -35,7 +36,7 @@
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="currentPage" :current-page="currentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100, 1000]"
:page-size="pageSize" :page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
:total="total" :total="total"
...@@ -47,51 +48,63 @@ ...@@ -47,51 +48,63 @@
<script> <script>
import moment from 'moment' import moment from 'moment'
const json2xlsx = require('../csv/csv') const json2xlsx = require('../csv/csv')
import _ from 'lodash'
export default { export default {
name: 'TableTmp', name: 'TableTmp',
props: [ props: [
'header', 'header',
'finance', 'finance',
'consume', 'consume',
'url' 'url',
'surplus',
'datalist'
], ],
data () { data () {
return { return {
datas: '', datas: [],
data: [], data: [],
allDate: [],
currentPage: 1, currentPage: 1,
pageSize: 100, pageSize: 10,
total: 1000, total: 1000,
dataSum: 0, dataSum: 0,
dataPreSum: 0, dataPreSum: 0,
financeNumber: 0,
surplusTotal: 0,
valueRange: [], valueRange: [],
startTime: '', startTime: '',
endTime: '2018-4-9', endTime: '2018-4-9',
pickerOptions: { pickerOptions: {
shortcuts: [{ shortcuts: [{
text: '昨天',
onClick (picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周', text: '最近一周',
onClick (picker) { onClick (picker) {
const end = new Date(); const end = new Date()
const start = new Date(); const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end]); picker.$emit('pick', [start, end])
} }
}, { }, {
text: '最近一个月', text: '最近一个月',
onClick (picker) { onClick (picker) {
const end = new Date(); const end = new Date()
const start = new Date(); const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end]); picker.$emit('pick', [start, end])
} }
}, { }, {
text: '最近三个月', text: '最近三个月',
onClick (picker) { onClick (picker) {
const end = new Date(); const end = new Date()
const start = new Date(); const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end]); picker.$emit('pick', [start, end])
} }
}] }]
} }
...@@ -105,10 +118,13 @@ ...@@ -105,10 +118,13 @@
getTime () { getTime () {
this.endTime = moment().format('YYYY-MM-DD') this.endTime = moment().format('YYYY-MM-DD')
this.startTime = moment().subtract(1, 'days').format('YYYY-MM-DD') this.startTime = moment().subtract(1, 'days').format('YYYY-MM-DD')
if (this.surplus) {
this.startTime = '2018-01-01'
}
}, },
dateToXlsx () { dateToXlsx () {
var self = this let self = this
var list = [] let list = []
let tHeader = [] let tHeader = []
console.log(self.header) console.log(self.header)
for (let x in self.header) { for (let x in self.header) {
...@@ -116,20 +132,26 @@ ...@@ -116,20 +132,26 @@
} }
list.push(tHeader) list.push(tHeader)
if (self.consume === 'ok') { if (self.consume === 'ok') {
for (let i = 0; i < self.datas.length; i++) { for (let i = 0; i < self.allDate.length; i++) {
list.push([self.datas[i].time, self.datas[i].email, self.datas[i].company, self.datas[i].number, self.datas[i].preNumber]) list.push([self.allDate[i].time, self.allDate[i].email, self.allDate[i].company, self.allDate[i].number, self.allDate[i].preNumber])
} }
list.push(['扣款合计', self.dataSum, '预扣合计', self.dataPreSum]) list.push(['扣款合计', self.dataSum, '预扣合计', self.dataPreSum])
console.log(list) console.log(list)
} else if (self.finance === 'ok') { } else if (self.finance === 'ok') {
for (let i = 0; i < self.datas.length; i++) { for (let i = 0; i < self.allDate.length; i++) {
list.push([self.datas[i].time, self.datas[i].email, self.datas[i].company, self.datas[i].number]) list.push([self.allDate[i].time, self.allDate[i].email, self.allDate[i].company, self.allDate[i].number])
} }
list.push(['充值合计', self.dataSum]) list.push(['充值合计', self.dataSum])
console.log(list) console.log(list)
} else if (self.surplus === 'ok') {
for (let i = 0; i < self.allDate.length; i++) {
list.push([self.allDate[i].time, self.allDate[i].createdAt, self.allDate[i].email, self.allDate[i].company, self.allDate[i].surplus])
}
list.push(['余额合计', self.surplusTotal])
console.log(list)
} else { } else {
for (let i = 0; i < self.datas.length; i++) { for (let i = 0; i < self.allDate.length; i++) {
list.push([self.datas[i].time, self.datas[i].email, self.datas[i].company, self.datas[i].pv, self.datas[i].uid, self.datas[i].touchCount, self.datas[i].getCount, self.datas[i].msgCount, self.datas[i].callCount]) list.push([self.allDate[i].time, self.allDate[i].email, self.allDate[i].company, self.allDate[i].pv, self.allDate[i].uid, self.allDate[i].touchCount, self.allDate[i].getCount, self.allDate[i].msgCount, self.allDate[i].callCount])
} }
} }
console.log(list) console.log(list)
...@@ -152,31 +174,21 @@ ...@@ -152,31 +174,21 @@
}, },
change (type = 'POST', startTime = this.startTime, endTime = this.endTime, total = this.total, pageSize = this.pageSize, currentPage = this.currentPage) { change (type = 'POST', startTime = this.startTime, endTime = this.endTime, total = this.total, pageSize = this.pageSize, currentPage = this.currentPage) {
let self = this let self = this
let skip = currentPage console.log(self.url, type, startTime, endTime, total, pageSize, currentPage)
console.log(self.url, type, startTime, endTime, total, pageSize, skip)
fetch(self.url, { fetch(self.url, {
method: type, method: type,
headers: {'Content-Type': 'application/json;charset=UTF-8'}, headers: {'Content-Type': 'application/json;charset=UTF-8'},
body: JSON.stringify({startTime, endTime, total, pageSize, currentPage}) body: JSON.stringify({startTime, endTime, total, pageSize, currentPage})
}).then(res => { return res.json() }).then(data => { }).then(res => { return res.json() }).then(data => {
self.datas = []
console.log(data) console.log(data)
self.datas = data.data self.allDate = data.data
self.datas = data.data.slice((currentPage - 1) * pageSize, pageSize * currentPage)
self.total = data.total self.total = data.total
self.dataSum = data.consumeTotalNumber || data.financeNumber self.dataSum = data.consumeTotalNumber
self.dataPreSum = data.preTotalNumber self.dataPreSum = data.preTotalNumber
console.log(data.data) self.financeNumber = data.financeNumber
console.log(self.total) self.surplusTotal = data.surplusTotal
console.log(self.dataSum) }).catch(err => { console.log(err) })
console.log(self.dataPreSum)
for (let i = 0; i < self.datas.length; i++) {
if (self.datas[i].pv == 'undefined') {
self.datas[i].pv = 0
}
}
}).catch(err => {
console.log(err)
})
} }
} }
} }
......
...@@ -9,6 +9,30 @@ import 'element-ui/lib/theme-chalk/index.css' ...@@ -9,6 +9,30 @@ import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.use(ElemetnUI) Vue.use(ElemetnUI)
/* eslint-disable no-new */ /* eslint-disable no-new */
router.beforeEach((to, from, next) => {
let sureSession = sessionStorage.getItem('sureLogin')
console.log(sureSession)
if (to.matched.some(record => record.meta.requiresId)) {
if (sureSession !== 'admin') {
next({path: '/login'})
console.log(1)
} else {
next()
}
if (sureSession === 'admin') {
next()
} else {
next({path: '/login'})
console.log(2)
}
} else {
next()
}
})
new Vue({ new Vue({
el: '#app', el: '#app',
router, router,
......
...@@ -4,6 +4,13 @@ import home from '@/components/home' ...@@ -4,6 +4,13 @@ import home from '@/components/home'
import dataList from '@/components/dataList' import dataList from '@/components/dataList'
import finance from '@/components/finance' import finance from '@/components/finance'
import consume from '@/components/consume' import consume from '@/components/consume'
import surplus from '@/components/surplus'
import releaseInfo from '@/components/releaseInfo'
import info from '@/components/info'
import login from '@/components/login'
import checkCall from '@/components/checkCall'
import account from '@/components/account'
import slot from '@/components/slot'
Vue.use(Router) Vue.use(Router)
...@@ -13,12 +20,25 @@ export default new Router({ ...@@ -13,12 +20,25 @@ export default new Router({
path: '/', path: '/',
name: 'home', name: 'home',
component: home, component: home,
meta: {requiresId: true},
children: [ children: [
{name: 'data', path: '', component: dataList}, {name: 'data', path: '', meta: {requiresId: false}, component: dataList},
{name: 'dataList', path: '/dataList', component: dataList}, {name: 'dataList', path: '/dataList', meta: {requiresId: false}, component: dataList},
{name: 'finance', path: '/finance', component: finance}, {name: 'finance', path: '/finance', meta: {requiresId: false}, component: finance},
{name: 'consume', path: '/consume', component: consume} {name: 'consume', path: '/consume', meta: {requiresId: false}, component: consume},
{name: 'surplus', path: '/surplus', meta: {requiresId: false}, component: surplus},
{name: 'releaseInfo', path: '/releaseInfo', meta: {requiresId: false}, component: releaseInfo},
{name: 'info', path: '/info', meta: {requiresId: false}, component: info},
{name: 'checkCall', path: '/checkCall', meta: {requiresId: false}, component: checkCall},
{name: 'account', path: '/account', meta: {requiresId: false}, component: account},
{name: 'slot', path: '/slot', meta: {requiresId: false}, component: slot}
] ]
},
{
path: '/login',
name: 'login',
component: login,
meta: {requiresId: false}
} }
] ]
}) })
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