log_model.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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.split(':');
  59. ip = ip[3] === undefined ? '' : ip[3];
  60. let ipInfo = '127.0.0.1';//await this.getIpInfoFromApi(ip);
  61. let userAgentObject = new UAParser(request.headers['user-agent']);
  62. let osInfo = userAgentObject.getOS();
  63. let cpuInfo = userAgentObject.getCPU();
  64. let browserInfo = userAgentObject.getBrowser();
  65. let message = {
  66. os: osInfo.name + ' ' + osInfo.version + ' ' + cpuInfo.architecture,
  67. browser: browserInfo.name + ' ' + browserInfo.version,
  68. ip: ip,
  69. ip_info: ipInfo
  70. };
  71. return this.addLog(userId, LogType.LOGIN_LOG, message);
  72. }
  73. /**
  74. * 获取log列表
  75. *
  76. * @param {String} userId
  77. * @param {Number} type
  78. * @param {Number} page
  79. * @param {Number} pageSize
  80. * @return {Promise}
  81. */
  82. async getLog(userId, type, page = 1, pageSize = 3) {
  83. let condition = {
  84. user_id: userId,
  85. type: type
  86. };
  87. page = parseInt(page);
  88. page = page <= 1 ? 1 : page;
  89. let option = {pageSize: pageSize, offset: parseInt((page - 1) * pageSize), sort: {create_time:-1}};
  90. let logList = await this.db.find(condition, null, option);
  91. logList = logList.length > 0 ? logList : [];
  92. return logList
  93. }
  94. /**
  95. * 获取ip信息
  96. *
  97. * @param {String} ip
  98. * @return {Promise}
  99. */
  100. async getIpInfoFromApi(ip) {
  101. let result = '';
  102. if (ip === '') {
  103. return result;
  104. }
  105. if (ip === '127.0.0.1') {
  106. return '服务器本机访问';
  107. }
  108. let getData = {
  109. url: 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip,
  110. encoding: 'utf8'
  111. };
  112. return new Promise(function (resolve, reject) {
  113. try {
  114. // 请求接口
  115. Request.get(getData, function (err, getResponse, body) {
  116. if (err) {
  117. //throw '请求错误';
  118. resolve("请求错误");
  119. return;
  120. }
  121. if (getResponse.statusCode !== 200) {
  122. resolve("获取数据失败!");
  123. return;
  124. //throw '获取数据失败!';
  125. }
  126. let responseData = JSON.parse(body);
  127. let ipData = responseData.data !== undefined ? responseData.data : [];
  128. if (ipData.ip === undefined) {
  129. resolve("接口数据有误,ip数据为空!");
  130. console.log(ipData);
  131. return;
  132. //throw '接口数据有误';
  133. }
  134. resolve(ipData.region + ipData.city + ' ' + ipData.isp);
  135. });
  136. } catch (error) {
  137. reject([]);
  138. }
  139. });
  140. }
  141. }
  142. export default LogModel;