From 625d15c0c9c3828a77299ea151ff89ca6c561905 Mon Sep 17 00:00:00 2001 From: zhl Date: Tue, 10 Mar 2020 19:11:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=88=86=E4=BA=AB=E5=9B=BE?= =?UTF-8?q?=E6=97=B6,=20=E5=86=99=E5=88=B0redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/games/share.js | 86 ++++++++++++----------------- src/models/snoopy/GameShareImage.js | 37 +++++++++++++ src/redis/redis.dao.js | 30 +++++++--- src/redis/redis_client.js | 18 ++++-- 4 files changed, 109 insertions(+), 62 deletions(-) diff --git a/src/controllers/games/share.js b/src/controllers/games/share.js index a61b1b0..e3cdcef 100644 --- a/src/controllers/games/share.js +++ b/src/controllers/games/share.js @@ -4,12 +4,19 @@ import SystemDic from '../../models/admin/SystemDic' import ChinaArea from '../../models/snoopy/ChinaArea' import {Router} from 'express' import logger from '../../utils/logger' +import RedisDao from '../../redis/redis.dao' + + const router = new Router() const GameInfo = getGameInfoModel() const GameInfoTest = getGameInfoModel('test') const GameShareImage = getGameShareImage() const GameShareImageTest = getGameShareImage('test') +const PREFIX = 'game_share_img'; + +const redisDao = new RedisDao(true); + // 获取分享型列表 router.get('/sys_dics', async (req, res, next) => { const query = req.query @@ -204,69 +211,40 @@ router.post('/save_share', async (req, res, next) => { delete body.isDev try { - const _id = body._id + let _id = body._id; const search = await GameShareImageModel.findById(_id) + let result, gameId; if (search) { + gameId = search.game_id; // 更新 - const result = await GameShareImageModel.updateOne({_id: _id}, body) - res.send({ - errcode: 0, - result: result, - }) + result = await GameShareImageModel.updateOne({_id: _id}, body) } else { // 新建 - const newShare = GameShareImageModel(body) - const result = await newShare.save() - res.send({ - errcode: 0, - result: result, + const newShare = GameShareImageModel(body); + _id = newShare.id; + gameId = newShare.game_id; + result = await newShare.save() + } + if (!isDev) { + process.nextTick(async function () { + try { + let redisStr = await GameShareImageModel.toRedisStr(_id); + redisDao.hset(`${PREFIX}:${gameId}`, _id, redisStr); + } catch (err) { + logger.error(err); + } }) } - } catch (err) { - next(err) - } -}) - -// 更新一个分享图 -router.post('/update_share', async (req, res, next) => { - logger.db(req, '游戏管理', '分享图', '更新分享图') - // 权限判断 - const hasPerm = - req.user.permissions.includes(`${req.body.uid}-readable`) || - req.user.permissions.includes(`${req.body.uid}-edit`) || - req.user.permissions.includes(`${req.body.uid}-publish`) || - req.user.permissions.includes(`games-writeable`) - if (!hasPerm) { - res.status(403).send({ - errcode: 1, - errmsg: '用户无此游戏分享图编辑权限!', + res.send({ + errcode: 0, + result: result, }) - return - } - const body = req.body - - const id = body._id - delete body._id - delete body.uid - - try { - const search = await GameShareImage.findOne({deleted: false, _id: id}) - if (search) { - const result = await GameShareImage.updateOne({_id: id}, body) - res.send({ - errcode: 0, - }) - } else { - res.send({ - errcode: 1, - errmsg: '分享图不存在或已被删除!', - }) - } } catch (err) { next(err) } }) + // 删除分享图 router.post('/del_share', async (req, res, next) => { // 权限判断 @@ -284,7 +262,8 @@ router.post('/del_share', async (req, res, next) => { logger.db(req, '游戏管理', '分享图', '删除分享图') const user = req.user const body = req.body - const isDev = body.isDev + const isDev = body.isDev; + const gameId = body.gameId; const GameShareImageModel = isDev ? GameShareImageTest : GameShareImage delete body.isDev @@ -300,6 +279,11 @@ router.post('/del_share', async (req, res, next) => { deletedBy: user.username, }) .exec() + if (!isDev && ids.length > 0) { + process.nextTick(function () { + redisDao.hdel(`${PREFIX}:${gameId}`, ids); + }) + } res.json({errcode: 0, errmsg: '', count: record.n}) } catch (err) { next(err) diff --git a/src/models/snoopy/GameShareImage.js b/src/models/snoopy/GameShareImage.js index a6312fa..9f90b2d 100644 --- a/src/models/snoopy/GameShareImage.js +++ b/src/models/snoopy/GameShareImage.js @@ -97,6 +97,43 @@ function getGameShareImageModel(type) { return record } + GameShareImageModel.toRedisStr = function (id) { + return new Promise((resolve, reject) => { + GameShareImageModel.findById(id).populate('area', 'locations') + .then(obj =>{ + if (!obj) { + reject('no record'); + } else { + let result = { + game_id: obj.game_id, + platform_id: obj.platform_id, + default_share: obj.default_share, + area: obj.area && obj.area.locations ? obj.area.locations : [], + type: obj.share_type, + str: obj.share_word, + image: obj.share_image, + images: obj.share_images, + strs: obj.share_words, + ad_first: obj.type, + share_count: obj.share_count, + ad_count: obj.ad_count, + ad_cd: obj.ad_cd, + ad_id: obj.ad_id + }; + try { + let resultStr = JSON.stringify(result); + resolve(resultStr); + } catch (err) { + reject(err); + } + } + }) + .catch(err => { + reject(err); + }) + }); + } + GameShareImageModel.edit_validate = () => { return { form: '#edit_form', diff --git a/src/redis/redis.dao.js b/src/redis/redis.dao.js index 69bc3db..889e920 100644 --- a/src/redis/redis.dao.js +++ b/src/redis/redis.dao.js @@ -1,18 +1,18 @@ 'use strict'; import RedisClient from './redis_client'; -const redis_client = new RedisClient().client; /* * 操作redis的常用方法 * */ export default class RedisDao { - constructor() { - + constructor(isPublish) { + isPublish = isPublish || false; + this.redisClient = RedisClient.getInstance(isPublish).client; } async scanAsync(cursor, pattern, results) { const that = this; - const reply = await redis_client.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '1000'); + const reply = await this.redisClient.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '1000'); cursor = reply[0]; results = results.concat(reply[1]); if (cursor === '0') { @@ -23,14 +23,30 @@ export default class RedisDao { } getByKey(key) { - return redis_client.getAsync(key); + return this.redisClient.getAsync(key); } updateOneKey(key, value) { - return redis_client.setAsync(key, value); + return this.redisClient.setAsync(key, value); } deleteKeys(key) { - return redis_client.delAsync(key); + return this.redisClient.delAsync(key); + } + + hset(key, field, value) { + return this.redisClient.hsetAsync(key, field, value); + } + + hget(key, field) { + return this.redisClient.hgetAsync(key, field); + } + + hgetall(key) { + return this.redisClient.hgetallAsync(key); + } + + hdel(key, fields) { + return this.redisClient.hdelAsync(key, fields); } } diff --git a/src/redis/redis_client.js b/src/redis/redis_client.js index 05ba4e1..413353a 100644 --- a/src/redis/redis_client.js +++ b/src/redis/redis_client.js @@ -9,10 +9,13 @@ Promise.promisifyAll(redis.RedisClient.prototype); Promise.promisifyAll(redis.Multi.prototype); export default class RedisClient { - constructor() { - this.client = redis.createClient({port: config.redis.port, - host: config.redis.host, - password: config.redis.password, + constructor(isPublish) { + let port = isPublish ? config.redisPublish.port : config.redis.host; + let host = isPublish ? config.redisPublish.host : config.redis.host; + let psssword = isPublish ? config.redisPublish.password : config.redis.password; + this.client = redis.createClient({port: port, + host: host, + password: psssword, retry_strategy: function(options) { if (options.error && options.error.code === 'ECONNREFUSED') { // End reconnecting on a specific error and flush all commands with a individual error @@ -50,4 +53,11 @@ export default class RedisClient { set client(client) { this._client = client; } + // 20200310 改成单例, 保持一个连接 + static getInstance(isPublish) { + if (!this[`instance_${isPublish}`]) { + this[`instance_${isPublish}`] = new RedisClient(isPublish); + } + return this[`instance_${isPublish}`] + } }