diff --git a/src/controllers/mps/maker.js b/src/controllers/mps/maker.js index 51182ea..45fccd9 100644 --- a/src/controllers/mps/maker.js +++ b/src/controllers/mps/maker.js @@ -1,6 +1,9 @@ import { Router } from 'express' import Maker from '../../models/maker/Maker' +import RedisDao from '../../redis/redis.dao' +import logger from '../../utils/logger'; +const redisDao = new RedisDao() const router = new Router() router.get('/', async (req, res, next) => { @@ -19,9 +22,21 @@ router.get('/', async (req, res, next) => { const pageSize = query.pageSize || 0 const start = (currentPage - 1) * pageSize const limit = Number(pageSize) - const result = await Maker.find({}).skip(start).limit(limit).sort({ createdAt: 'desc' }).select('_id title desc') + const order = query.order + const opt = {} + const sortObj = {} + if(order === 'ascending') { + sortObj.view = 'asc' + } else if(order === 'descending') { + sortObj.view = 'desc' + } else { + sortObj.createdAt = 'desc' + } + + if(query.isRecommand) opt.isRecommand = query.isRecommand + const result = await Maker.find(opt).skip(start).limit(limit).sort(sortObj).select('_id title desc tags isRecommand view') - const total = await Maker.find({}).countDocuments() + const total = await Maker.find(opt).countDocuments() res.send({ errcode: 0, result, @@ -36,19 +51,28 @@ router.get('/', async (req, res, next) => { router.post('/', async (req, res, next) => { try { + logger.db(req, '游戏管理', '生成器', '添加模板') const body = req.body const title = body.title const desc = body.desc const template = body.template const list = body.list + const tags = body.tags + const view = body.view + const isRecommand = body.isRecommand + const newMaker = new Maker({ title, desc, template, list, + tags, + view, + isRecommand }) const result = await newMaker.save() + updateTags(tags) res.send({ errcode: 0, result @@ -61,12 +85,16 @@ router.post('/', async (req, res, next) => { router.put('/', async (req, res, next) => { try { + logger.db(req, '游戏管理', '生成器', '更新模板') const body = req.body const _id = body._id const title = body.title const desc = body.desc const template = body.template const list = body.list + const tags = body.tags + const view = body.view + const isRecommand = body.isRecommand const result = await Maker.updateOne( { @@ -77,9 +105,12 @@ router.put('/', async (req, res, next) => { desc, template, list, + tags, + view, + isRecommand } ) - + updateTags(tags) res.send({ errcode: 0, }) @@ -90,6 +121,7 @@ router.put('/', async (req, res, next) => { router.delete('/', async (req, res, next) => { try { + logger.db(req, '游戏管理', '生成器', '删除模板') const body = req.body const _id = body._id const result = await Maker.deleteOne({ _id }) @@ -103,4 +135,42 @@ router.delete('/', async (req, res, next) => { }) +router.get('/tags', async (req, res, next) => { + try { + const result = await redisDao.getByKey('maker_tags') || '' + res.send({ + errcode: 0, + result + }) + } catch (err) { + next(err) + } +}) + +router.put('/tags', async (req, res, next) => { + try { + logger.db(req, '游戏管理', '生成器', '更新标签') + const body = req.body + const tags = body.tags + let result = await redisDao.updateOneKey('maker_tags', tags) + + res.send({ + errcode: 0, + }) + } catch (err) { + next(err) + } +}) + +async function updateTags(tags) { + let result = await redisDao.getByKey('maker_tags') + result = result ? result + ',' + tags : tags + result = result.split(',') + const map = new Set(result) + result = [...map] + result = result.join(',') + redisDao.updateOneKey('maker_tags', result) +} + + export default router diff --git a/src/controllers/open/index.js b/src/controllers/open/index.js index 757cbcb..c395eb8 100644 --- a/src/controllers/open/index.js +++ b/src/controllers/open/index.js @@ -10,6 +10,7 @@ import gameListRouter from './game-list' import cfgRouter from './cfg' import zpRouter from './zp' import testRouter from './test' +import makerRouter from './maker' const router = new Router() @@ -22,6 +23,7 @@ router.use('/game-list', gameListRouter) router.use('/cfg',cfgRouter) router.use('/zp',zpRouter) router.use('/test',testRouter) +router.use('/maker',makerRouter) export default router diff --git a/src/controllers/open/maker.js b/src/controllers/open/maker.js new file mode 100644 index 0000000..561a837 --- /dev/null +++ b/src/controllers/open/maker.js @@ -0,0 +1,191 @@ +// 小程序-心里测试专用 + +import { Router } from 'express' +import Maker from '../../models/maker/Maker' + +const router = new Router() + +// 获取生成器列表:最新、最热、页数、推荐 +router.get('/list', async (req, res, next) => { + + try { + const query = req.query + const type = query.type + const select = '_id title desc tags view' + let result = [] + if (type === 'new') { + result = await Maker.find({}).skip(0).limit(10).sort({ createdAt: 'desc' }).select(select) + + } else if (type === 'hot') { + result = await Maker.find({}).skip(0).limit(10).sort({ view: 'desc' }).select(select) + } else if (type === 'recommand') { + result = await Maker.find({ isRecommand: true }).skip(0).limit(10).sort({ view: 'desc' }).select(select) + } else { + const currentPage = query.currentPage || 0 + const pageSize = query.pageSize || 0 + const start = (currentPage - 1) * pageSize + const limit = Number(pageSize) + result = await Maker.find({}).skip(start).limit(limit).sort({ view: 'desc' }).select(select) + } + + res.send({ + errcode: 0, + result + }) + + } catch (err) { + next(err) + } +}) + +// 查询生成器:关键词、标签 +router.get('/search', async (req, res, next) => { + try { + const query = req.query + const key = query.key + const regTag = /^tag:.*/ + const select = '_id title desc tags view' + let result = [] + if (regTag.test(key)) { + const reg = new RegExp(key.slice(4)) + result = await Maker.find({ tags: { $regex: reg } }).select(select) + } else { + const reg = new RegExp(key) + result = await Maker.find({ title: { $regex: reg } }).select(select) + } + res.send({ + errcode: 0, + result + }) + + } catch (err) { + next(err) + } +}) + +// 获取单条详情 +router.get('/details', async (req, res, next) => { + try { + const query = req.query + const _id = query._id + const result = await Maker.findOne({ _id }).select('_id title desc') + const regUser = /\[n(\d+)\]/g + let count = 0 //计算输入个数 + let text = result.template + // 己算输入个数 + while (regUser.test(text)) { + text = text.replace(regUser, (match, p1) => { + count++ + return '天外来客' + }) + } + res.send({ + errcode: 0, + result, + count + }) + } catch (err) { + next(err) + } +}) + +// 生成结果 +router.get('/result', async (req, res, next) => { + try { + const query = req.query + const _id = query._id + let users = query.users + const search = await Maker.findOne({ _id }) + let text = search.template + users = users.split(',') + + const regUser = /\[n(\d+)\]/g + const regList = /\[i(\d+)\]/g + const regPer1 = /\[%\]/g + const regPer2 = /\[∞\]/g + const regNum = /\[(0+)\]/g + + // 替换用户输入 + while (regUser.test(text)) { + text = text.replace(regUser, (match, p1) => { + return users[p1] || '天外来客' + }) + } + + // 替换清单 + while (regList.test(text)) { + text = text.replace(regList, (match, p1) => { + const list = search.list[p1].text.split(',') + const idx = Math.floor(Math.random() * list.length) + return list[idx] || '天外来客' + }) + } + + //替换百分比 + let countP = 0 + while (regPer1.test(text)) { + text = text.replace(regPer1, (match, p1) => { + countP++ + return '[∞]' + }) + } + const nums = randomNum(countP, 100) + let idx = 0 + while (regPer2.test(text)) { + text = text.replace(regPer2, (match, p1) => { + return nums[idx++] + '%' + }) + } + + // 替换随机数字 + while (regNum.test(text)) { + text = text.replace(regNum, (match, p1) => { + return Math.floor(Math.random() * Math.pow(10, p1.length)) + }) + } + const result = text.split('\n') + res.send({ + errcode: 0, + result + }) + } catch (err) { + next(err) + } +}) + +// 增加浏览数 +router.post('/view', async (req, res, next) => { + try { + const body = query.body + const _id = body._id + const search = await Maker.findOne({ _id }) + const view = search.view || 0 + const result = await Maker.updateOne({ _id }, { + view: view + 1 + }) + res.send({ + errcode: 0, + result + }) + } catch (err) { + next(err) + } +}) + +// 生成随机数 +function randomNum(n, v) { + var i, + s = 0, + r = [], + x = v + for (i = 1; i < n; i++) { + x = Math.random() * x + r.push(x.toFixed(0)) + s += x + x = v - s + } + r.push(x.toFixed(0)) + return r +} + +export default router diff --git a/src/models/maker/Maker.js b/src/models/maker/Maker.js index c9dbc57..53ce9d5 100644 --- a/src/models/maker/Maker.js +++ b/src/models/maker/Maker.js @@ -5,10 +5,13 @@ import mongoose from 'mongoose'; * 生成器 */ const Maker = new mongoose.Schema({ - title: {type: String}, - desc: {type: String}, - template: {type: String}, - list: {type: Object}, + title: { type: String, default: '' }, + desc: { type: String, default: '' }, + template: { type: String, default: '' }, + list: { type: Object, default: {} }, + tags: { type: String, default: '' }, + view: { type: String, default: 0 }, + isRecommand: { type: Boolean, default: false } }, { collection: 'maker', timestamps: true,