|  | @@ -0,0 +1,114 @@
 | 
	
		
			
				|  |  | +const fs = require('fs')
 | 
	
		
			
				|  |  | +const path = require('path')
 | 
	
		
			
				|  |  | +const Koa = require('koa')
 | 
	
		
			
				|  |  | +const Router = require('koa-router')
 | 
	
		
			
				|  |  | +const bodyParser = require('koa-bodyparser')
 | 
	
		
			
				|  |  | +const LRU = require('lru-cache')
 | 
	
		
			
				|  |  | +const WebSocket = require('ws')
 | 
	
		
			
				|  |  | +const koaStatic = require('koa-static')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const routerOptions = {
 | 
	
		
			
				|  |  | +  prefix: '/api'
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const lruOptions = {
 | 
	
		
			
				|  |  | +  max: 50,
 | 
	
		
			
				|  |  | +  maxAge: 1000 * 60 * 60 * 24
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const dataPath = './data/data.json'
 | 
	
		
			
				|  |  | +const staticPath = './dist'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const router = new Router(routerOptions)
 | 
	
		
			
				|  |  | +const cache = new LRU(lruOptions)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let STATIC_DATA = ''
 | 
	
		
			
				|  |  | +fs.readFile(dataPath, (err, buf) => {
 | 
	
		
			
				|  |  | +  if (err) {
 | 
	
		
			
				|  |  | +    console.error(err)
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  STATIC_DATA = buf.toString()
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const app = new Koa()
 | 
	
		
			
				|  |  | +const wss = new WebSocket.Server({ port: 5556 })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.use(koaStatic(path.join(__dirname, staticPath)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +wss.on('connection', ws => {
 | 
	
		
			
				|  |  | +  ws.on('message', msg => {
 | 
	
		
			
				|  |  | +    const res = JSON.parse(msg)
 | 
	
		
			
				|  |  | +    console.log('msg: ', res)
 | 
	
		
			
				|  |  | +    if (res.code && res.status === 'update') {
 | 
	
		
			
				|  |  | +      const list = cache.get(res.code)
 | 
	
		
			
				|  |  | +      const data = JSON.stringify({ data: list })
 | 
	
		
			
				|  |  | +      wss.clients.forEach(client => {
 | 
	
		
			
				|  |  | +        if (client.readyState === WebSocket.OPEN) {
 | 
	
		
			
				|  |  | +          client.send(data)
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.use(bodyParser())
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 判断是不是api
 | 
	
		
			
				|  |  | +// app.use((ctx, next) => {
 | 
	
		
			
				|  |  | +//   const url = ctx.url
 | 
	
		
			
				|  |  | +//   const isApi = /^\/api/.test(url)
 | 
	
		
			
				|  |  | +//   ctx.$isApi = isApi
 | 
	
		
			
				|  |  | +//   next()
 | 
	
		
			
				|  |  | +// })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +router.get('/list', (ctx, next) => {
 | 
	
		
			
				|  |  | +  const { code } = ctx.query
 | 
	
		
			
				|  |  | +  let data
 | 
	
		
			
				|  |  | +  if (cache.has(code)) {
 | 
	
		
			
				|  |  | +    data = cache.get(code)
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    const jsonData = JSON.parse(STATIC_DATA).data || []
 | 
	
		
			
				|  |  | +    const len = 25
 | 
	
		
			
				|  |  | +    const sum = jsonData.length - len
 | 
	
		
			
				|  |  | +    const arr = new Array(25).fill(1).map(el => Math.floor(Math.random() * sum))
 | 
	
		
			
				|  |  | +    const groupList = [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0]
 | 
	
		
			
				|  |  | +    data = new Array(25).fill(1).map((el, i) => {
 | 
	
		
			
				|  |  | +      const del = groupList.length ? Math.floor(Math.random() * groupList.length) : 0
 | 
	
		
			
				|  |  | +      const group = groupList.splice(del, 1)[0]
 | 
	
		
			
				|  |  | +      return {
 | 
	
		
			
				|  |  | +        text: jsonData.splice(arr[i], 1)[0],
 | 
	
		
			
				|  |  | +        status: 0,
 | 
	
		
			
				|  |  | +        group
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    cache.set(code, data)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  ctx.body = {
 | 
	
		
			
				|  |  | +    code,
 | 
	
		
			
				|  |  | +    data
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +router.put('/status/:code', ctx => {
 | 
	
		
			
				|  |  | +  const { params, request } = ctx
 | 
	
		
			
				|  |  | +  const { code } = params
 | 
	
		
			
				|  |  | +  const { index } = request.body
 | 
	
		
			
				|  |  | +  const list = cache.get(code) || []
 | 
	
		
			
				|  |  | +  if (!index) {
 | 
	
		
			
				|  |  | +    throw new Error('index is not find')
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  if (!list || !list.length) {
 | 
	
		
			
				|  |  | +    throw new Error('cache list is not find')
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  list[index].status = list[index].status ? 0 : 1
 | 
	
		
			
				|  |  | +  cache.set(code, list)
 | 
	
		
			
				|  |  | +  ctx.body = { success: true, msg: '更新成功', data: list[index] }
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.use(router.routes()).use(router.allowedMethods())
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.on('error', err => console.error(err))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.listen(5555)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +console.log('http://127.0.0.1:5555')
 |