log_model.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /**
  2. * 日志业务逻辑模型
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/7/27
  6. * @version
  7. */
  8. import BaseModel from "../../common/base/base_model";
  9. import LogType from "../../common/const/log_type_const";
  10. import mongoose from "mongoose";
  11. import UAParser from "ua-parser-js";
  12. import Request from "request";
  13. class LogModel extends BaseModel {
  14. /**
  15. * 构造函数
  16. *
  17. * @return {void}
  18. */
  19. constructor() {
  20. let parent = super();
  21. parent.model = mongoose.model('log');
  22. parent.init();
  23. }
  24. /**
  25. * 新增日志
  26. *
  27. * @param {String} userId
  28. * @param {Number} type
  29. * @param {String|Object} message
  30. * @return {Promise}
  31. */
  32. addLog(userId, type, message) {
  33. let result = null;
  34. if (typeof message === 'string' && message === '') {
  35. return result;
  36. }
  37. if (typeof message === 'object' && Object.keys(message).length <= 0) {
  38. return result;
  39. }
  40. let addData = {
  41. user_id: userId,
  42. type: type,
  43. message: message,
  44. create_time: new Date().getTime()
  45. };
  46. result = this.db.create(addData);
  47. return result;
  48. }
  49. /**
  50. * 新增登录日志
  51. *
  52. * @param {String} userId
  53. * @param {Object} request
  54. * @return {Promise}
  55. */
  56. async addLoginLog(userId, request) {
  57. let ip = request.connection.remoteAddress;
  58. ip = ip?ip.split(':'):[];
  59. ip = ip[3] === undefined ? '' : ip[3];
  60. // let ipInfo = '127.0.0.1';//await this.getIpInfoFromApi(ip);
  61. let ipInfo = await this.getIpInfoFromApi(ip);
  62. let userAgentObject = new UAParser(request.headers['user-agent']);
  63. let osInfo = userAgentObject.getOS();
  64. let cpuInfo = userAgentObject.getCPU();
  65. let browserInfo = userAgentObject.getBrowser();
  66. let message = {
  67. os: osInfo.name + ' ' + osInfo.version + ' ' + cpuInfo.architecture,
  68. browser: browserInfo.name + ' ' + browserInfo.version,
  69. ip: ip,
  70. ip_info:ipInfo
  71. };
  72. return this.addLog(userId, LogType.LOGIN_LOG, message);
  73. }
  74. /**
  75. * 获取log列表
  76. *
  77. * @param {String} userId
  78. * @param {Number} type
  79. * @param {Number} page
  80. * @param {Number} pageSize
  81. * @return {Promise}
  82. */
  83. async getLog(userId, type, page = 1, pageSize = 3) {
  84. let condition = {
  85. user_id: userId,
  86. type: type
  87. };
  88. page = parseInt(page);
  89. page = page <= 1 ? 1 : page;
  90. let option = {pageSize: pageSize, offset: parseInt((page - 1) * pageSize), sort: {create_time:-1}};
  91. let logList = await this.db.find(condition, null, option);
  92. logList = logList.length > 0 ? logList : [];
  93. return logList
  94. }
  95. /**
  96. * 获取ip信息
  97. *
  98. * @param {String} ip
  99. * @return {Promise}
  100. */
  101. async getIpInfoFromApi(ip) {
  102. let result = '';
  103. if (ip === '') {
  104. return result;
  105. }
  106. if (ip === '127.0.0.1') {
  107. return '服务器本机访问';
  108. }
  109. let getData = {
  110. url: 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip,
  111. encoding: 'utf8',
  112. timeout:2000
  113. };
  114. return new Promise(function (resolve, reject) {
  115. try {
  116. // 请求接口
  117. Request.get(getData, function (err, getResponse, body) {
  118. if (err) {
  119. //throw '请求错误';
  120. resolve("请求错误");
  121. return;
  122. }
  123. if (getResponse.statusCode !== 200) {
  124. resolve("获取数据失败!");
  125. return;
  126. //throw '获取数据失败!';
  127. }
  128. let responseData = JSON.parse(body);
  129. let ipData = responseData.data !== undefined ? responseData.data : [];
  130. if (ipData.ip === undefined) {
  131. resolve("接口数据有误,ip数据为空!");
  132. console.log(ipData);
  133. return;
  134. //throw '接口数据有误';
  135. }
  136. resolve(ipData.region + ipData.city + ' ' + ipData.isp);
  137. });
  138. } catch (error) {
  139. reject([]);
  140. }
  141. });
  142. }
  143. }
  144. export default LogModel;