game-data game-info

This commit is contained in:
yulixing 2019-07-29 16:25:19 +08:00
parent de05274bdc
commit b9c94823d7
4 changed files with 294 additions and 108 deletions

View File

@ -1,37 +1,37 @@
import express from 'express'; import express from 'express'
import expressValidator from 'express-validator'; import expressValidator from 'express-validator'
import flash from 'express-flash'; import flash from 'express-flash'
import session from 'express-session'; import session from 'express-session'
import bodyParser from 'body-parser'; import bodyParser from 'body-parser'
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser'
import compress from 'compression'; import compress from 'compression'
import methodOverride from 'method-override'; import methodOverride from 'method-override'
import helmet from 'helmet'; import helmet from 'helmet'
// import favicon from 'serve-favicon'; // import favicon from 'serve-favicon';
import FileStreamRotator from 'file-stream-rotator'; import FileStreamRotator from 'file-stream-rotator'
import morgan from 'morgan'; import morgan from 'morgan'
import fs from 'fs'; import fs from 'fs'
import path from 'path'; import path from 'path'
import logger from './../utils/logger'; import logger from './../utils/logger'
import expressUtils from './../utils/express-utils'; import expressUtils from './../utils/express-utils'
import config from './../../config/config'; import config from './../../config/config'
import connectMongo from 'connect-mongo'; import connectMongo from 'connect-mongo'
import routes from './../router/index'; import routes from './../router/index'
const app = express(); const app = express()
const MongoStore = connectMongo(session); const MongoStore = connectMongo(session)
const env = process.env.NODE_ENV || 'development'; const env = process.env.NODE_ENV || 'development'
const isDev = env === 'development'; const isDev = env === 'development'
app.locals.ENV = env; app.locals.ENV = env
app.locals.ENV_DEVELOPMENT = isDev; app.locals.ENV_DEVELOPMENT = isDev
app.use(helmet()); app.use(helmet())
app.disable('x-powered-by'); app.disable('x-powered-by')
// app.use(favicon(config.root + '/public/img/favicon/favicon.ico')); // app.use(favicon(config.root + '/public/img/favicon/favicon.ico'));
const logDir = config.logs_path; const logDir = config.logs_path
fs.existsSync(logDir) || fs.mkdirSync(logDir); fs.existsSync(logDir) || fs.mkdirSync(logDir)
/** /**
* 记录除favicon之外的所有请求 * 记录除favicon之外的所有请求
@ -40,8 +40,8 @@ const accessLogStream = FileStreamRotator.getStream({
date_format: 'YYYYMMDD', date_format: 'YYYYMMDD',
filename: logDir + '/' + config.app.name + '-access-%DATE%.log', filename: logDir + '/' + config.app.name + '-access-%DATE%.log',
frequency: 'daily', frequency: 'daily',
verbose: false verbose: false,
}); })
/** /**
* 仅记录失败的请求 * 仅记录失败的请求
*/ */
@ -49,8 +49,8 @@ const errorLogStream = FileStreamRotator.getStream({
date_format: 'YYYYMMDD', date_format: 'YYYYMMDD',
filename: logDir + '/' + config.app.name + '-error-%DATE%.log', filename: logDir + '/' + config.app.name + '-error-%DATE%.log',
frequency: 'daily', frequency: 'daily',
verbose: false verbose: false,
}); })
/** /**
* 记录非静态文件请求 * 记录非静态文件请求
*/ */
@ -58,8 +58,8 @@ const requestLogStream = FileStreamRotator.getStream({
date_format: 'YYYYMMDD', date_format: 'YYYYMMDD',
filename: logDir + '/' + config.app.name + '-request-%DATE%.log', filename: logDir + '/' + config.app.name + '-request-%DATE%.log',
frequency: 'daily', frequency: 'daily',
verbose: false verbose: false,
}); })
morgan.token('remote-addr', function(req, res) { morgan.token('remote-addr', function(req, res) {
const ip = const ip =
@ -67,10 +67,10 @@ morgan.token('remote-addr', function(req, res) {
req.ip || req.ip ||
req._remoteAddress || req._remoteAddress ||
(req.connection && req.connection.remoteAddress) || (req.connection && req.connection.remoteAddress) ||
undefined; undefined
req._remoteAddress = ip; req._remoteAddress = ip
return ip; return ip
}); })
if (isDev) { if (isDev) {
// app.use(morgan('dev' )); // app.use(morgan('dev' ));
@ -79,50 +79,47 @@ app.use(
morgan('combined', { morgan('combined', {
stream: accessLogStream, stream: accessLogStream,
skip: function(req, res) { skip: function(req, res) {
return req.method === 'HEAD'; return req.method === 'HEAD'
} },
}) })
); )
app.use( app.use(
morgan('combined', { morgan('combined', {
stream: errorLogStream, stream: errorLogStream,
skip: function(req, res) { skip: function(req, res) {
return res.statusCode < 400; return res.statusCode < 400
} },
}) })
); )
app.get('/robots.txt', function(req, res) { app.get('/robots.txt', function(req, res) {
res.type('text/plain'); res.type('text/plain')
res.send('User-agent: *\nDisallow: /agent/'); res.send('User-agent: *\nDisallow: /agent/')
}); })
// -- We don't want to serve sessions for static resources // -- We don't want to serve sessions for static resources
// -- Save database write on every resources // -- Save database write on every resources
app.use(compress()); app.use(compress())
app.use(express.static(config.root + '/public')); app.use(express.static(config.root + '/public'))
app.use( app.use(
morgan('combined', { morgan('combined', {
stream: requestLogStream, stream: requestLogStream,
skip: function(req, res) { skip: function(req, res) {
return req.method === 'HEAD'; return req.method === 'HEAD'
} },
}) })
); )
app.use(bodyParser.json({ limit: '5mb' })); app.use(bodyParser.json({limit: '5mb'}))
app.use( app.use(
bodyParser.urlencoded({ bodyParser.urlencoded({
limit: '5mb', limit: '5mb',
parameterLimit: 50000, parameterLimit: 50000,
extended: true extended: true,
}) })
); )
app.use(expressValidator()); app.use(expressValidator())
app.use(cookieParser(config.secret)); app.use(cookieParser(config.secret))
// app.use( // app.use(
// session({ // session({
// secret: config.secret, // secret: config.secret,
@ -136,41 +133,47 @@ app.use(cookieParser(config.secret));
// }) // })
// }) // })
// ); // );
app.use(flash()); app.use(flash())
app.use(expressUtils()); app.use(expressUtils())
app.use(methodOverride()); app.use(methodOverride())
app.use(function(req, res, next) { app.use(function(req, res, next) {
res.locals.user = req.user; res.locals.user = req.user
next(); next()
}); })
app.all('/uploads', function(req, res, next) { app.all('/uploads', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS')
res.header('Access-Control-Allow-Headers', 'X-Requested-With'); res.header('Access-Control-Allow-Headers', 'X-Requested-With')
res.header('Access-Control-Allow-Headers', 'Content-Type'); res.header('Access-Control-Allow-Headers', 'Content-Type')
next(); next()
}); })
app.use('/api', routes); app.use('/api', routes)
app.use(function(req, res, next) { app.use(function(req, res, next) {
const err = new Error('未找到您要访问的页面 (´・_・`)'); const err = new Error('未找到您要访问的页面 (´・_・`)')
err.status = 404; err.status = 404
// next(err); // next(err);
err.status = err.status || 500; err.status = err.status || 500
if (err.status !== 404) { if (err.status !== 404) {
logger.error(err); logger.error(err)
} }
next(err); next(err)
}); })
app.use(function(err, req, res, next) { app.use(function(err, req, res, next) {
logger.error({ logger.error({
method: req.method, method: req.method,
path: req.path, path: req.path,
err_status: err.status, err_status: err.status,
err_message: err.message err_message: err.message,
}); })
res.json({ errcode: 10, errmsg: err.message });
if (err.errmsg) {
res.json({errcode: 10, errmsg: err.errmsg})
} else {
res.json({errcode: 10, errmsg: err.message})
}
// if (req.path.startsWith('/api')) { // if (req.path.startsWith('/api')) {
// } else { // } else {
@ -182,6 +185,6 @@ app.use(function(err, req, res, next) {
// title: err.status // title: err.status
// }); // });
// } // }
}); })
export default app; export default app

View File

@ -0,0 +1,156 @@
// 获取单个游戏广告位
import {Router} from 'express'
import axios from 'axios'
import config from '../../../config/config'
const router = new Router()
const gameReportApiUrl = config.game_report
// 获取游戏日报
router.get('/report', async (req, res, next) => {
// 权限判断
const hasPerm =
req.user.permissions.includes(`${req.query.uid}-readable`) ||
req.user.permissions.includes(`${req.query.uid}-edit`) ||
req.user.permissions.includes(`${req.query.uid}-publish`) ||
req.user.permissions.includes(`games-writeable`)
if (!hasPerm) {
res.status(403).send({
errcode: 1,
errmsg: '用户无此游戏数据查看权限!',
})
return
}
const query = req.query
const game_id = parseInt(query.game_id)
const platform_id = parseInt(query.platform_id)
const date = query.date
const isNew = parseInt(query.isNew)
console.log(query)
try {
const categoryRes = await axios({
url: gameReportApiUrl,
method: 'get',
params: {
c: 'Ops',
a: 'descField',
body: JSON.stringify({
gameid: game_id,
channel: platform_id,
}),
},
})
console.log(categoryRes.data)
if (categoryRes.data.errcode === 0) {
const categoryInfo = categoryRes.data.result
const category = []
for (const key in categoryInfo) {
if (categoryInfo.hasOwnProperty(key)) {
category.push(key)
}
}
console.log('category', category)
console.log('categoryInfo', categoryInfo)
if (category.length === 0) {
res.send({
errcode: 404,
errmsg: '暂无数据!',
})
return
}
const getDataArr = []
category.map(item => {
getDataArr.push(
getCategoryData(item, date, isNew, game_id, platform_id)
)
})
console.log(getDataArr)
const dataArr = await Promise.all(getDataArr)
const allData = Object.assign(...dataArr)
const result = {}
for (const key in categoryInfo) {
if (categoryInfo.hasOwnProperty(key)) {
const cate = categoryInfo[key]
result[key] = []
for (let i = 0; i < cate.length; i++) {
const field = cate[i]
const fieldName = field.name
field.value = allData[fieldName]
if (field.value) {
result[key].push(field)
}
}
}
}
res.send({
errcode: 0,
result: result,
})
} else {
res.send({
errcode: categoryRes.errcode,
errmsg: categoryRes.errmsg,
})
return
}
} catch (err) {
console.log(err)
next(err)
}
})
function getCategoryData(cateName, date, is_new, game_id, platform_id) {
console.log(
JSON.stringify({
gameid: game_id,
channel: platform_id,
times: date,
is_new: is_new,
category: cateName,
})
)
return new Promise(async (resolve, reject) => {
const dataRes = await axios({
url: gameReportApiUrl,
method: 'get',
params: {
c: 'Ops',
a: 'gameReport',
body: JSON.stringify({
gameid: game_id,
channel: platform_id,
times: date,
is_new: is_new,
category: cateName,
}),
},
})
if (dataRes.data.errcode === 0) {
const data = dataRes.data.result
resolve(data)
} else {
reject({
errcode: 404,
errmsg: '数据获取失败,暂无数据!',
})
}
})
}
export default router

View File

@ -146,6 +146,8 @@ router.post('/update', async (req, res, next) => {
} }
const body = req.body const body = req.body
const method = body.method
const platformIndex = body.platformIndex
try { try {
const search = await GameInfo.findOne({ const search = await GameInfo.findOne({
@ -153,16 +155,15 @@ router.post('/update', async (req, res, next) => {
deleted: false, deleted: false,
}) })
if (search) { if (search) {
if (body.info) { const platforms = search.platforms
const info = body.info
const platformInfo = search.platforms[info.platformIndex]
const curStatus = platformInfo ? platformInfo.status : ''
delete body.platforms[info.platformIndex].newPlatform
delete body.info
// 状态变更会新增平台 发送通知 if (method === 'savePlatform') {
if (curStatus !== info.status || !platformInfo) { const curPlatform = body.platform
const prePlatform = platforms[platformIndex] || {}
if (curPlatform.status !== prePlatform.status) {
const token = await getOpsToken() const token = await getOpsToken()
const statusRes = await axios({ const statusRes = await axios({
url: config.minigame.api + 'minigame/', url: config.minigame.api + 'minigame/',
method: 'post', method: 'post',
@ -172,11 +173,10 @@ router.post('/update', async (req, res, next) => {
game: search.game_name, game: search.game_name,
game_name: search.game_name_en, game_name: search.game_name_en,
game_id: search.game_id, game_id: search.game_id,
platform: body.platforms[info.platformIndex].platform.name_en, platform: curPlatform.platform.name_en,
platform_name: body.platforms[info.platformIndex].platform.name, platform_name: curPlatform.platform.name,
platform_id: platform_id: curPlatform.platform.platform_id,
body.platforms[info.platformIndex].platform.platform_id, status_id: curPlatform.status,
status_id: info.status,
}, },
}, },
headers: { headers: {
@ -192,18 +192,43 @@ router.post('/update', async (req, res, next) => {
return return
} }
} }
}
const result = await GameInfo.updateOne( platforms[platformIndex] = curPlatform
{
_id: body._id, const result = await GameInfo.updateOne(
deleted: false, {
}, _id: body._id,
body deleted: false,
) },
res.send({ {platforms, platforms}
errcode: 0, )
}) res.send({
errcode: 0,
})
} else if (method === 'delPlatform') {
platforms.splice(platformIndex, 1)
const result = await GameInfo.updateOne(
{
_id: body._id,
deleted: false,
},
{platforms, platforms}
)
res.send({
errcode: 0,
})
} else {
const result = await GameInfo.updateOne(
{
_id: body._id,
deleted: false,
},
body
)
res.send({
errcode: 0,
})
}
} else { } else {
res.send({ res.send({
errcode: 1, errcode: 1,

View File

@ -6,6 +6,7 @@ import shareRouter from './share';
import rewardRouter from './reward'; import rewardRouter from './reward';
import libRouter from './lib'; import libRouter from './lib';
import adRouter from './ad'; import adRouter from './ad';
import dataRouter from './data';
@ -21,6 +22,7 @@ router.use('/mp_share', mpShareRouter);
router.use('/reward', rewardRouter); router.use('/reward', rewardRouter);
router.use('/lib', libRouter); router.use('/lib', libRouter);
router.use('/ad', adRouter); router.use('/ad', adRouter);
router.use('/data', dataRouter);
router.use('/', gamesRouter); router.use('/', gamesRouter);
export default router; export default router;