[Registro 7] Vue + node + koa2 + mysql + nginx + redis, desarrollo de pila completa de pequeños programas y registros de solicitudes de generación de proyectos del sistema de gestión del administrador

Prefacio: El registro es algo muy importante en el sistema. Si hay un error repentino o una excepción en el entorno de producción, la forma más rápida de saber rápidamente dónde ha ocurrido el problema es ver el registro del sistema. El registro no solo se usa para ayudar a localizar el error después de que el sistema es anormal, sino también para comprender qué solicitud realizó el usuario. Se pueden conocer la dirección y la IP del cliente, y la información de operación del usuario se guarda para que el administrador del sistema la vea. Echemos un vistazo a cómo el nodo guarda la información de registro y proporciona una API para la visualización de front-end.

Estructura de la tabla de registro

Inserte la descripción de la imagen aquí
Esta es una de las tablas de datos de la base de datos, aquí guardaré la información del registro de solicitudes para que el administrador pueda verla.

Cree middleware que genere registros

//app.js
// 日志
app.use(async (ctx, next) => {
    
    
  let data = ''
  let params = {
    
    }
  if (ctx.method == 'GET' || ctx.method == 'get') {
    
    
    data = ctx.request.query
  } else if (ctx.method == 'POST' || ctx.method == 'post') {
    
     
    data=ctx.request.body
  }
  //拦截入参做安全防护
  await common.safety((ctx.method == 'GET' || ctx.method == 'get') ? 	  ctx.request.query : (ctx.method == 'POST' || ctx.method == 'post') ? ctx.request.body : {
    
    })
  const start = new Date()
  await next()
  const ms = new Date() - start
  params.ms = ms
  params.ip = await common.getClientIP(ctx.req)
  let address = (await common.getClientAddress(params.ip)).body
  params.address='局域网'
  if (address.status == 1&&(address.province.length||address.city.length)) {
    
     
    params.address=address.province+address.city
  }
  params.url = ctx.url
  params.method = ctx.method
  params.params = JSON.stringify(data)
  let flag = false
  whiteList.noLogger.map(res => {
    
     
    if (ctx.url.indexOf(res) !== -1) {
    
    
      flag = true
    }
  })
  if (!flag) {
    
     
    await api.loggerData(params)
  }
  console.log(`${
     
     ctx.method} ${
     
     ctx.url} - ${
     
     ms}ms`)
})

Los problemas de seguridad se utilizan aquí para verificar los datos de los parámetros de entrada; como palabras clave, inyección de anti-script, anti-scrf, etc.

//getClientIP方法
  //获取用户的真实地址
  async getClientIP(req) {
    
    
    return (req.headers['x-forwarded-for'] || // 判断是否有反向代理 IP
      req.connection.remoteAddress || // 判断 connection 的远程 IP
      req.socket.remoteAddress || // 判断后端的 socket 的 IP
      req.connection.socket.remoteAddress).replace(/::ffff:/, '')
  }

Esto se usa para obtener la dirección IP de la API del cliente. ⚠️: La LAN es 127.0.0.1

Obtenga la ubicación geográfica basada en la dirección IP

//getClientAddress方法
//根据ip地址获取用户的地理位置
  async getClientAddress(ip) {
    
     
    let option = {
    
    
      method: 'get',
      // &key 不能写成?key
      url: `https://restapi.amap.com/v3/ip?parameters&key="您的key值"&ip=${
     
     ip}`
    }
    return await koa2Req(option)
  }

Inserte la descripción de la imagen aquí

Obtener la ubicación geográfica del cliente en función de la dirección IP es un servicio de terceros proporcionado por Tencent. Si no lo entiende, puede mirar => Posicionamiento de IP

Después de completar lo anterior, puede insertar los datos adquiridos en la tabla de registro.

//api.js
//生成请求日志
  loggerData: async (params) => {
    
    
    let id = common.formatDateTime(new Date(),'orderId')+Math.ceil((Math.random() + 1) * 1000)
    let nowtime = await common.formatDateTime(new Date())
    let add_sql = `insert into logger (id,ip,address,method,params,url,ms,createtime) values(${
     
     id},'${params.ip}','${params.address}','${params.method}','${params.params}','${params.url}','${params.ms}','${nowtime}')`
    await allServices.query(add_sql)
  }

En este punto, se completan todas las operaciones del registro del sistema. Cuando el front-end necesita ver, proporciona una API para obtener los datos de la tabla y devolverlos. La siguiente sección presentará las tareas de cronometraje que pueden realizar las personas de interfaz.

Previous: Carga y descarga de imágenes del lado del servidor
Siguiente: Use tareas programadas para ejecutar scripts

Supongo que te gusta

Origin blog.csdn.net/Smell_rookie/article/details/108965115
Recomendado
Clasificación