Quellcode durchsuchen

接入第三方ip库

olym vor 8 Jahren
Ursprung
Commit
c42a5ba10b

+ 48 - 2
modules/users/models/log_model.js

@@ -9,6 +9,7 @@ import BaseModel from "../../common/base/base_model";
 import LogType from "../../common/const/log_type_const";
 import LogSchema from "./schema/log";
 import UAParser from "ua-parser-js";
+import Request from "request";
 
 class LogModel extends BaseModel {
 
@@ -57,11 +58,13 @@ class LogModel extends BaseModel {
      * @param {Object} request
      * @return {Promise}
      */
-    addLoginLog(userId, request) {
+    async addLoginLog(userId, request) {
         let ip = request.connection.remoteAddress;
         ip = ip.split(':');
         ip = ip[3] === undefined ? '' : ip[3];
 
+        let ipInfo = await this.getIpInfoFromApi(ip);
+
         let userAgentObject = new UAParser(request.headers['user-agent']);
         let osInfo = userAgentObject.getOS();
         let cpuInfo = userAgentObject.getCPU();
@@ -69,7 +72,8 @@ class LogModel extends BaseModel {
         let message = {
             os: osInfo.name + ' ' + osInfo.version + ' ' + cpuInfo.architecture,
             browser: browserInfo.name + ' ' + browserInfo.version,
-            ip: ip
+            ip: ip,
+            ip_info: ipInfo
         };
 
         return this.addLog(userId, LogType.LOGIN_LOG, message);
@@ -99,6 +103,48 @@ class LogModel extends BaseModel {
         return logList
     }
 
+    /**
+     * 获取ip信息
+     *
+     * @param {String} ip
+     * @return {Promise}
+     */
+    async getIpInfoFromApi(ip) {
+        let result = '';
+        if (ip === '') {
+            return result;
+        }
+
+        if (ip === '127.0.0.1') {
+            return '服务器本机访问';
+        }
+
+        let getData = {
+            url: 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip,
+            encoding: 'utf8'
+        };
+        return new Promise(function (resolve, reject) {
+            try {
+                // 请求接口
+                Request.get(getData, function (err, getResponse, body) {
+                    if (err) {
+                        throw '请求错误';
+                    }
+                    if (getResponse.statusCode !== 200) {
+                        throw '获取数据失败!';
+                    }
+                    let responseData = JSON.parse(body);
+                    let ipData = responseData.data !== undefined ? responseData.data : [];
+                    if (ipData.ip === undefined) {
+                        throw '接口数据有误';
+                    }
+                    resolve(ipData.region + ipData.city + ' ' + ipData.isp);
+                });
+            } catch (error) {
+                reject([]);
+            }
+        });
+    }
 }
 
 export default LogModel;

+ 9 - 5
modules/users/models/schema/log.js

@@ -9,18 +9,22 @@ import mongoose from "mongoose";
 
 let Schema = mongoose.Schema;
 let collectionName = 'log';
+let messageSchema = new Schema({
+    ip: String,
+    ip_info: String,
+    browser: String,
+    os: String
+}, {_id: false});
 let modelSchema = {
     // 日志类型
     type: {
-        type: Number,
-        index: true
+        type: Number
     },
     // 日志内容
-    message: Schema.Types.Mixed,
+    message: messageSchema,
     // 关联用户id
     user_id: {
-        type: String,
-        index: true
+        type: String
     },
     // 创建时间
     create_time: Number

+ 1 - 1
web/users/html/user-safe.html

@@ -103,7 +103,7 @@
                             <td><%= log.message.os %></td>
                             <td><%= log.message.browser %></td>
                             <td><%= moment(log.create_time).format('YYYY-MM-DD HH:mm:ss') %></td>
-                            <td>(<%= log.message.ip %>)</td>
+                            <td><%= log.message.ip_info %>(<%= log.message.ip %>)</td>
                         </tr>
                         <% }) %>
                         </tbody>