log_model.js 4.6 KB

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