diff --git a/package.json b/package.json index 2b63f5e..e6c486b 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "yargs": "^13.2.4" }, "devDependencies": { + "@types/express": "^4.17.8", "babel-cli": "^6.26.0", "babel-preset-node8": "1.2.0", "cross-env": "^5.2.0", diff --git a/src/controllers/common/loc.js b/src/controllers/common/loc.js index 1ffc987..b3f0176 100644 --- a/src/controllers/common/loc.js +++ b/src/controllers/common/loc.js @@ -49,6 +49,51 @@ router.get('/china_region', async (req, res, next) => { } }) +/* 获取省市列表, id为_id*/ +router.get('/china_region_id', async (req, res, next) => { + try { + const provinces = await ChinaRegion.find({level: 1}) + const citys = await ChinaRegion.find({level: 2, pinyin: {$ne: null}}) + const result = [] + const map = new Map() + const pIdx = {} + for (let i = 0; i < provinces.length; i++) { + result.push({ + id: provinces[i]._id+'', + pid: '0', + name: provinces[i].short_name, + children: [], + }) + map.set(provinces[i]._id, provinces[i]) + + if (!pIdx[provinces[i]._id]) { + pIdx[provinces[i]._id] = i + } + } + for (const c of citys) { + if (map.has(c.parent_id)) { + const pIndex = pIdx[c.parent_id] + result[pIndex].children.push({ + id: c._id+'', + pid: map.get(c.parent_id)._id+'', + name: c.short_name, + }) + } + } + // for (let data of result) { + // if (data.children.length <= 1) { + // data.children = []; + // } + // } + res.json({ + errcode: 0, + records: result, + }) + } catch (err) { + next(err) + } +}) + /* 获取所有定义好的地域列表*/ router.get('/china_area', async (req, res, next) => { try { diff --git a/src/controllers/games/games.js b/src/controllers/games/games.js index 15a479e..e4a267b 100644 --- a/src/controllers/games/games.js +++ b/src/controllers/games/games.js @@ -216,7 +216,7 @@ router.post('/update', async (req, res, next) => { _id: body._id, deleted: false, }, - {platforms, platforms} + {platforms} ) res.send({ errcode: 0, @@ -228,7 +228,7 @@ router.post('/update', async (req, res, next) => { _id: body._id, deleted: false, }, - {platforms, platforms} + {platforms} ) res.send({ errcode: 0, diff --git a/src/controllers/games/index.js b/src/controllers/games/index.js index 106cdbd..26f3048 100644 --- a/src/controllers/games/index.js +++ b/src/controllers/games/index.js @@ -11,6 +11,7 @@ import dataRouter from './data'; import giftRouter from './gift'; import orderRouter from './order'; import mailRouter from './mail'; +import ipRouter from './ip'; @@ -31,6 +32,7 @@ router.use('/data', dataRouter); router.use('/gift', giftRouter); router.use('/order', orderRouter); router.use('/mail', mailRouter); +router.use('/ip', ipRouter); router.use('/', gamesRouter); export default router; diff --git a/src/controllers/games/ip.js b/src/controllers/games/ip.js new file mode 100644 index 0000000..3de2de5 --- /dev/null +++ b/src/controllers/games/ip.js @@ -0,0 +1,59 @@ +import {Router} from 'express' +import logger from '../../utils/logger' + +import GameIpBlock from '../../models/snoopy/GameIpBlock'; + +const router = new Router(); + + +router.get('/:gid/:pid', async (req, res, next) => { + let {gid, pid} = req.params; + if (!gid) { + return res.json({errcode: 101, errmsg: '参数不足'}); + } + if (!pid) pid = 'all'; + let data = await GameIpBlock.findInfo(gid, pid); + if (data) { + for (let obj of data.areas) { + obj._doc.pid = '0'; + for (let subObj of obj.children) { + subObj._doc.pid = obj.id; + } + } + } + res.json({errcode: 0, errmsg: '', data}); +}); + +router.post('/update', async (req, res, next) => { + logger.db(req, '游戏管理', 'IPBlock', '更新游戏IP屏蔽信息'); + let data = req.body.data; + // 权限判断 + const hasPerm = + req.user.permissions.includes(`${data.game_id}-edit`) || + req.user.permissions.includes(`${data.game_id}-publish`) || + req.user.permissions.includes(`games-writeable`) + if (!hasPerm) { + return res.status(403).send({ + errcode: 1, + errmsg: '用户无游戏编辑权限!', + }) + } + try { + await GameIpBlock.updateOne({ + game_id: data.game_id, + platform_id: data.platform_id, + }, + {$set: data}, + {upsert: true} + ) + res.json({ + errcode: 0, + }) + } catch (err) { + res.json({errcode: 102, + errmsg: '保存出错!',}); + } + +}) + +export default router; diff --git a/src/models/snoopy/ChinaRegion.js b/src/models/snoopy/ChinaRegion.js index cee6735..e729a39 100644 --- a/src/models/snoopy/ChinaRegion.js +++ b/src/models/snoopy/ChinaRegion.js @@ -41,5 +41,30 @@ const ChinaRegion = new mongoose.Schema({ const conn = dbUtil.getConnSnoopy(); -export default conn.model('ChinaRegion', ChinaRegion); +const ChinaRegionModel = conn.model('ChinaRegion', ChinaRegion); + +ChinaRegionModel.fetchDataMap = async function (level) { + let map = new Map(); + if (level >= 1) { + let datas = await ChinaRegion.find({level: 1}); + for (let data of datas) { + map.set(data._id, data); + } + } + if (level >= 2) { + let datas = await ChinaRegion.find({level: 2}); + for (let data of datas) { + map.set(data._id, data); + } + } + if (level >= 3) { + let datas = await ChinaRegion.find({level: 3}); + for (let data of datas) { + map.set(data._id, data); + } + } + return map; +} + +export default ChinaRegionModel; diff --git a/src/models/snoopy/GameIpBlock.js b/src/models/snoopy/GameIpBlock.js new file mode 100644 index 0000000..687934a --- /dev/null +++ b/src/models/snoopy/GameIpBlock.js @@ -0,0 +1,35 @@ +import mongoose from 'mongoose' +import dbUtil from '../../utils/db.util' + +const GameIpBlock = new mongoose.Schema({ + // 游戏id + game_id: {type: String}, + // 平台id + platform_id: {type: String}, + // 启动参数白名单 + more_params: {type: String}, + // 屏蔽地区列表 + areas: [{ + _id: false, + id: {type: String}, + name: {type: String}, + all: {type: Boolean, default: false}, + children: [{_id: false, id: {type: String}, name: {type: String}}]}], + // 屏蔽时间段列表 + times: [{_id: false, start: {type: String}, end: {type: String}}], + +}, { + collection: 'game_ip_block', + timestamps: true, +}) + +GameIpBlock.index({game_id: 1, platform_id: 1}, {unique: true}); + +const conn = dbUtil.getConnSnoopy(); + +let GameIpBlockModel = conn.model('GameIpBlock', GameIpBlock); + +GameIpBlockModel.findInfo = function (gid, pid) { + return GameIpBlockModel.findOne({game_id: gid, platform_id: pid}); +} +export default GameIpBlockModel;