Browse Source

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/YangHuOperation

TonyKang 6 years ago
parent
commit
3b8979288e

+ 17 - 0
modules/all_models/online_logs.js

@@ -0,0 +1,17 @@
+/**
+ * Created by zhang on 2019/4/12.
+ */
+//用户在线时长统计
+
+let mongoose = require("mongoose");
+let Schema = mongoose.Schema;
+
+// 表结构
+let schema = {
+    userID: String,
+    compilationID: String,
+    dateString: String,
+    dateTime:Number,//dateString转换回毫秒数对应的数值,方便查询
+    online_times: Number
+};
+mongoose.model("online_logs", new Schema(schema, {versionKey: false}),"online_logs");

+ 23 - 0
modules/users/controllers/user_controller.js

@@ -11,6 +11,7 @@ import Config from "../../../config/config";
 import CompilationModel from "../models/compilation_model";
 let config = require("../../../config/config.js");
 let _ = require("lodash");
+let online_facade = require('../facade/online_facade')
 
 class UserController extends BaseController {
 
@@ -66,6 +67,8 @@ class UserController extends BaseController {
             // console.log(condition);
             // 获取用户列表
             userList = await userModel.getList(condition, page, Config.pageSize);
+
+            await online_facade.setOnlineTimes(userList,condition);
             // console.log(userList)
         } catch (error) {
             console.log(error);
@@ -225,6 +228,26 @@ class UserController extends BaseController {
         response.json(responseData);
     }
 
+    async getOnlineInfo(request, response){
+        let filter = JSON.parse(request.body.data);
+        let responseData = {
+            error: 0,
+            msg: '',
+            data: null
+        };
+        try{
+            let info = await online_facade.getOnlineInfo(filter);
+            responseData.data = info;
+        } catch (error) {
+            console.log(error);
+            responseData.error = error.code;
+            responseData.msg = error.err;
+        }
+        response.json(responseData);
+
+
+
+    }
 
     async updateUser(request, response) {
         let data = JSON.parse(request.body.data);

+ 60 - 0
modules/users/facade/online_facade.js

@@ -0,0 +1,60 @@
+/**
+ * Created by zhang on 2019/4/16.
+ */
+
+module.exports = {
+    setOnlineTimes:setOnlineTimes,
+    getOnlineInfo:getOnlineInfo
+};
+
+let mongoose = require("mongoose");
+let logs_model = mongoose.model("online_logs");
+
+async function getOnlineInfo(filter) {
+    let datas = [];
+    let logs = await logs_model.find(filter);
+    let less = 0;
+    for(let l of logs){
+        let d = getTimeString(l.online_times);
+        let online_times = d.s;
+        less += d.less;
+        if(online_times!=""){
+            datas.push({dateString:l.dateString,dateTime:l.online_times,online_times:online_times})
+        }
+    }
+    if(datas.length>1){//大于2个才把不够1分钟的累积到最后一条记录
+        let last =  datas[datas.length - 1];
+        last.online_times = getTimeString(last.dateTime + less).s;
+    }
+
+    return datas;
+}
+
+
+async function setOnlineTimes(userList,condition){
+    for(let u of userList){
+        let filter = {'userID':u._id.toString()};
+        if(u.latest_used) filter["compilationID"] = u.latest_used;
+        if(condition.latest_login && condition.latest_login == ""){
+            let startTime = condition.latest_login['$gte']; //- 24*60*60*1000 //往前推一天  {'$gte': startTime, '$lt': endTime}latest_login
+            filter['dateTime'] = {'$gte': startTime, '$lt':  condition.latest_login['$lt']}
+        }
+        let result =  await logs_model.aggregate([
+            {$match: filter},
+            {$group: {_id: "$userID", total: {$sum: "$online_times"}}}
+        ]);
+        u._doc.filter = JSON.stringify(filter);
+        if(result.length > 0)  u._doc.online_times = getTimeString(result[0].total).s;
+    }
+}
+
+
+function getTimeString(times) {
+    let s = "",perHour = 1000 * 60 * 60,perMin = 1000 * 60;
+    let hour = parseInt(times/perHour);
+    let min = parseInt((times % perHour)/perMin);
+    let less =  (times % perHour)%perMin;//不够一分钟的时间
+    if(hour > 0) s = s+`${hour}小时`;
+    if(min > 0)  s= s+`${min}分钟`;
+    return {s:s,less:less}
+}

+ 1 - 0
modules/users/routes/user_route.js

@@ -17,6 +17,7 @@ module.exports =function (app) {
     router.get('/testUser', userController.auth, userController.init, userController.testUsers);
     router.get('/search', userController.auth, userController.init, userController.search);
     router.post('/findByID', userController.auth, userController.init, userController.findByID);
+    router.post('/getOnlineInfo', userController.auth, userController.init, userController.getOnlineInfo);
     router.post('/getUserList', userController.auth, userController.init, userController.getUserList);
     router.post('/updateUser', userController.auth, userController.init, userController.updateUser);
     router.post('/deleteUser', userController.auth, userController.init, userController.deleteUser);

+ 16 - 0
web/users/js/user.js

@@ -43,6 +43,22 @@ $(document).ready(function() {
 });
 let cacheUser = null;
 
+
+async function getOnlineInfo(filter) {
+    try {
+        let htmlString = `<tbody><tr><th>日期/时间</th><th>在线时长</th></tr>`;
+        let info = await ajaxPost("/user/getOnlineInfo",JSON.parse(filter));
+        for(let i of info){
+            htmlString += `<tr><td>${i.dateString}</td><td>${i.online_times}</td></tr>`
+        }
+        htmlString +="<tbody>";
+        $("#time-detail-table").html(htmlString);
+    }catch (e){
+        console.log(e)
+    }
+
+}
+
 async function getUserInfo(ID) {
     let user = await ajaxPost("/user/findByID",{ID:ID});
     let infoString = `<tr><th>注册时间</th><td>${user.create_time}</td><th>最近登录</th><td>${user.last_login}</td></tr>

+ 26 - 0
web/users/views/user/index.html

@@ -98,6 +98,7 @@
                     <th>企业名称</th>
                     <th>企业地区</th>
                     <th>最近使用版本</th>
+                    <th>在线时长(<%= filter.loginMsg === undefined ? '所有' : filter.loginMsg %>)</th>
                     <th width="180">注册时间 / 最近登录</th>
                     <% if (manager.superAdmin == 1) { %>
                     <th>操作</th>
@@ -113,6 +114,7 @@
                     <td><%= user.company %></td>
                     <td><%= model.province[user.province] %></td>
                     <td><%= compilationMap[user.latest_used]?compilationMap[user.latest_used].name:""%></td>
+                    <td><a onclick="getOnlineInfo('<%= user._doc.filter%>')" href="#time-detail" data-toggle="modal" data-target="#time-detail"><%= user._doc.online_times %></a></td>
                     <td><%= moment(user.create_time).format('YYYY-MM-DD HH:mm:ss') %><br><%= user.latest_login?moment(user.latest_login).format('YYYY-MM-DD HH:mm:ss'):"" %></td>
                     <% if (manager.superAdmin == 1) { %>
                     <td><a onclick='deleteUser("<%= user._id.toString()%>")' data-toggle="modal" data-target="#delUser" class="btn btn-link btn-sm" style="padding: 0px">删除</a></td>
@@ -196,6 +198,30 @@
     </div>
 </div>
 
+<!-- 弹窗在线时长-->
+<div class="modal fade" id="time-detail" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" >在线时长详情</h4>
+            </div>
+            <div class="modal-body">
+                <table class="table table-bordered" id = 'time-detail-table'>
+                    <tr><th>日期/时间</th><th>在线时长</th></tr>
+                    <!--<tr><th>日期/时间</th><th>在线时长</th></tr>
+                    <tr><td>04-10</td><td>2小时10分钟</td></tr>
+                    <tr><td>04-09</td><td>1小时7分钟</td></tr>
+                    <tr><td>04-08</td><td>2小时35分钟</td></tr>-->
+                </table>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 <script type="text/javascript">
     let compilationList = JSON.parse('<%- compilationString %>');
     let adminName = '<%- adminName %>';