美文网首页
Koa2 获取并存储用户操作日志

Koa2 获取并存储用户操作日志

作者: 大洪 | 来源:发表于2018-04-25 19:43 被阅读309次

  有时候我们需要记录用户进行了哪些操作,比如删除、更新和添加。这部分是要呈献给用户的,所以一定不能直接把系统日志的一大坨给他们。
  系统后台采用了Koa2,数据库是mongo,借助mongoose操作数据库。

Model设计

  设计Log结构

const mongoose = require('../tool/db-util').mongoose
const Schema = mongoose.Schema

const logSchema = new Schema({
  index: Number,
  nickname: String,
  userId: String,
  date: {type: Date, default: Date.now},

  // request
  method: String,
  host: String,
  url: String,

  // response
  status: Number,

  desc: String
})
const LogModel = mongoose.model('log', logSchema)

module.exports = {
  LogModel
}

中间件

  这里参考了土豆zmb写的中间件,我根据自己应用的实际情况作了点修改。因为用户请求时携带着token,所以我在中间件里面获取到了用户的基本信息。

const jwt = require('jsonwebtoken')
const config = require('../config')
const logController = require('../controllers/log')

module.exports = async (ctx, next) => {
  if (ctx.method === 'GET') {
    // 不记录get请求
    await next()
  } else {
    let token = ctx.request.header.authorization
    if (token) {
      const secret = config.System.token_secret
      let payload = null
      try {
        payload = await jwt.verify(token.split(' ')[1], secret, {expiresIn: '1h'})
      } catch (e) {
        payload = {}
      }
      global.log = {
        nickname: payload.nickname,
        userId: payload._id,
        method: ctx.request.method,
        host: ctx.request.header.host,
        url: ctx.request.url,
        status: null,
        desc: null
      }

      await next()

      // 保存
      if (global.log.desc) {
        global.log.status = ctx.response.status
        logController.add(global.log)
      }
    }
  }
}

控制层LogController

const logService = require('../services/log')

class LogController {
  static async add (content) {
    await logService.add(content)
  }

  static async all (ctx) {
    let opt = ctx.request.query
    let {page = 1, size = 10, ...condition} = opt

    let content = await logService.all(condition, Number(page), Number(size))
    ctx.success({content})
  }
}

module.exports = LogController

服务层LogService

  查询时将几个需要展示的字段查出来,这里用了分页查询和降序。

const LogModel = require('../models/log').LogModel

class LogService {
  static async add (content) {
    let log = new LogModel(content)
    await log.save()
  }

  static async all (condition, page, size) {
    let logs = await LogModel.find(condition, '_id nickname date host status desc').skip((page - 1) * size).sort({_id: -1}).limit(size)
    let count = await LogModel.count(condition)
    return {logs, page: {page, size, count}}
  }
}

module.exports = LogService

应用

  在需要记录的地方,设置global.log.desc的值就可以了。如果不设置的话,记录到数据库中的内容为空。用户操作记录,只需要在控制层记录就可以了。如果需要留下更详细的记录,那就再服务层设置了。
  这里以用户的一个登录操作为例:

class UserController {
  static async signIn (ctx) {
    let opt = ctx.request.body
    let user = await userService.signIn(opt)
    const secret = config.System.token_secret

    if (user) {
      const token = jwt.sign(user.toJSON(), secret, {expiresIn: '1h'}) // token签名 有效期为1小时

      ctx.success({content: {user, token}})
      global.log.desc = `${user.nickname}登录`
    } else {
      ctx.error({status: 200, error: '登录失败'})
    }
  }
mongo数据库中存放的记录 前台展示

相关文章

  • Koa2 获取并存储用户操作日志

      有时候我们需要记录用户进行了哪些操作,比如删除、更新和添加。这部分是要呈献给用户的,所以一定不能直接把系统日志...

  • mysql limit 性能优化

    ** 本文所使用 mysql 版本为 5.6.11 ** 起因 需求:获取某用户的所有操作记录日志 日志数量虽然不...

  • 在CentOS下搭建Hadoop集群及Hive

    hadoop用于存储网站的用户浏览轨迹数据及业务系统的用户操作日志数据,便于后期数据分析提取。由于机器有限,目前只...

  • Funboot开发:系统日志组件

    系统日志组件 目录 系统日志 使用MongoDb存储日志 系统日志 系统日志分为操作日志、错误日志、登录日志、数据...

  • 程序员面试的短短半小时内,通过500行代码震惊所有高层

    架构设计 整理架构设计 从支付系统、日志系统、用户系统从获取用户的离线数据,保存到Hadoop集群,并对Hadoo...

  • 记一次——用sql进行数据清洗实例

    数据库中有某段用户上报日志,记录着用户的一些操作行为。现要将其清洗后,并筛选出我们感兴趣的用户后,并整理为算法要求...

  • ios崩溃分析

    崩溃日志的获取 崩溃日志的获取:ios设备上的应用闪退之后会生成崩溃报告存储在设备上,可以通过这样几种途径获取设备...

  • 关于koa2的基础知识

    1、koa2 路由配置 2、koa2 中的 get 传值以及获取 get 传值 在 koa2 中,GET 传值通过...

  • SQL语句慢的原因

    刷脏页 这里要提到一个日志文件,那就是 redo log,位于存储引擎层,用来存储物理日志。在写操作的时候,存储引...

  • spring 自定义注解,实现日志

    采用自定义注解实现 用户操作日志记录 简介及说明: 记录登陆用户的操作日志,目前只针对(运营管理平台)itas系统...

网友评论

      本文标题:Koa2 获取并存储用户操作日志

      本文链接:https://www.haomeiwen.com/subject/kraylftx.html