Browse Source

1.系统维护同步和提醒
2.延长文件上传接口超时时间

laiguoran 5 years ago
parent
commit
8a06e137aa

+ 5 - 0
app/base/base_controller.js

@@ -11,6 +11,7 @@ const moment = require('moment');
 const messageType = require('../const/message_type');
 const Controller = require('egg').Controller;
 const menuList = require('../../config/menu').menu;
+const maintainConst = require('../const/maintain');
 class BaseController extends Controller {
 
     /**
@@ -71,6 +72,8 @@ class BaseController extends Controller {
             data.min = this.app.config.min;
             const viewString = await this.ctx.renderView(view, data);
             const modalString = modal === '' ? '' : await this.ctx.renderView(modal, data);
+            // 获取系统维护信息
+            const maintainData = await this.ctx.service.maintain.getDataById(1);
             const renderData = {
                 min: this.app.config.min,
                 content: viewString,
@@ -80,6 +83,8 @@ class BaseController extends Controller {
                 breadCrumb: data.breadCrumb === undefined ? '' : data.breadCrumb,
                 tenderList: data.tenderList === undefined ? [] : data.tenderList,
                 jsFiles: data.jsFiles ? data.jsFiles : this.app.jsFiles.common,
+                maintainData,
+                maintainConst,
             };
             await this.ctx.render('layout/layout.ejs', renderData);
         } catch(err) {

+ 32 - 0
app/const/maintain.js

@@ -0,0 +1,32 @@
+'use strict';
+/**
+ * 消息提示类型
+ *
+ * @author CaiAoLin
+ * @date 2017/9/29
+ * @version
+ */
+const duration = {
+    min15: 1,
+    min30: 2,
+    hour1: 3,
+    hour2: 4,
+    forever: 5,
+};
+const maintain_status = {
+    notset: 0,
+    unstart: 1,
+    ongoing: 2,
+};
+const durationString = [];
+durationString[duration.min15] = '15分钟';
+durationString[duration.min30] = '30分钟';
+durationString[duration.hour1] = '1小时';
+durationString[duration.hour2] = '2小时';
+durationString[duration.forever] = '永久';
+
+module.exports = {
+    duration,
+    status: maintain_status,
+    durationString,
+};

+ 5 - 0
app/controller/dashboard_controller.js

@@ -10,6 +10,7 @@
 
 const auditConst = require('../const/audit');
 const officeList = require('../const/cld_office').list;
+const maintainConst = require('../const/maintain');
 
 module.exports = app => {
 
@@ -44,6 +45,8 @@ module.exports = app => {
             const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
             // 获取系统通知
             const sysMsgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, 2, 0, 2);
+            // 获取系统维护信息
+            const maintainData = await ctx.service.maintain.getDataById(1);
             const renderData = {
                 auditTenders,
                 auditStages,
@@ -67,6 +70,8 @@ module.exports = app => {
                 sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
                 userMsgPermission,
                 uid: ctx.session.sessionUser.accountId,
+                maintainData,
+                maintainConst,
             };
             await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
             await ctx.service.projectAccount.defaultUpdate({

+ 5 - 0
app/extend/helper.js

@@ -7,6 +7,7 @@
  * @date 2017/9/28
  * @version
  */
+const moment = require('moment');
 const zeroRange = 0.0000000001;
 const fs = require('fs');
 const path = require('path');
@@ -840,6 +841,10 @@ module.exports = {
         return overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(num);
     },
 
+    dateTran(time) {
+        return moment(time).format('YYYY年MM月DD日 HH:mm');
+    },
+
     async sendUserSms(userId, type, judge, msg) {
         const mobiles = [];
         if (!userId || (userId instanceof Array && userId.length === 0)) return;

+ 2 - 0
app/middleware/session_auth.js

@@ -36,6 +36,8 @@ module.exports = options => {
 
             // 同步消息
             yield this.service.notify.syncNotifyData();
+            // 同步系统维护信息
+            yield this.service.maintain.syncMaintainData();
         } catch (error) {
             console.log(error);
             if (this.helper.isAjax(this.request)) {

+ 4 - 4
app/public/js/global.js

@@ -227,13 +227,13 @@ const postDataWithFile = function (url, formData, successCallback, errorCallBack
         type:"POST",
         url: url,
         data: formData,
-        dataType: 'json', 
+        dataType: 'json',
         cache: false,
         // 告诉jQuery不要去设置Content-Type请求头
         contentType: false,
         // 告诉jQuery不要去处理发送的数据
         processData: false,
-        timeout: 5000,
+        timeout: 60000,
         beforeSend: function(xhr) {
             let csrfToken = Cookies.get('csrfToken');
             xhr.setRequestHeader('x-csrf-token', csrfToken);
@@ -267,7 +267,7 @@ const postDataWithFileProgress = function (url, formData, successCallback, error
         type:"POST",
         url: url,
         data: formData,
-        dataType: 'json', 
+        dataType: 'json',
         cache: false,
         // 告诉jQuery不要去设置Content-Type请求头
         contentType: false,
@@ -565,7 +565,7 @@ function showUploadFileProgress() {
 function setUploadFileProgress(pos) {
     const processObj = $('.progress-bar');
     processObj.attr('aria-valuenow', pos);
-    processObj.width(pos + '%');    
+    processObj.width(pos + '%');
 }
 
 /**

+ 140 - 0
app/service/maintain.js

@@ -0,0 +1,140 @@
+'use strict';
+
+/**
+ * 系统维护数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/10/25
+ * @version
+ */
+const maintainConst = require('../const/maintain');
+module.exports = app => {
+
+    class Maintain extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'maintain';
+        }
+
+        /**
+         * 校验规则
+         *
+         * @return {Object} - 返回校验规则
+         */
+        rule() {
+            return {
+                maintain_time: { type: 'string', required: true, allowEmpty: false },
+                duration: { type: 'string', required: true, allowEmpty: false, min: 1 },
+                msg: { type: 'string', required: false, allowEmpty: true },
+            };
+        }
+
+        async stop(id = 1) {
+            const data = {};
+            data.id = id;
+            data.status = maintainConst.status.notset;
+            data.maintain_time = '';
+            const operate = await this.db.update(this.tableName, data);
+
+            return operate.affectedRows > 0;
+        }
+
+        /**
+         * 保存数据
+         *
+         * @param {Object} data - post过来的数据
+         * @param {Number} id - 用于判断修改还是新增的id
+         * @return {boolean} - 操作结果
+         */
+        async save(data = {}, id = 1) {
+            delete data._csrf;
+            data.maintain_time = Date.parse(data.maintain_time);
+            let status = maintainConst.status.notset;
+            const thisTime = new Date().getTime();
+            if (data.maintain_time) {
+                const endtime = data.maintain_time + await this.durationAddTime(data.duration);
+                if (endtime <= thisTime) {
+                    throw '维护时间必须大于或等于当前时间';
+                } else if (data.maintain_time > thisTime) {
+                    status = maintainConst.status.unstart;
+                } else if (data.maintain_time <= thisTime && endtime > thisTime) {
+                    status = maintainConst.status.ongoing;
+                }
+            }
+            data.id = id;
+            data.status = status;
+            const operate = await this.db.update(this.tableName, data);
+
+            return operate.affectedRows > 0;
+        }
+
+        /**
+         * 同步系统设置消息
+         * @param id
+         * @returns {Promise<boolean>}
+         */
+        async syncMaintainData(id = 1) {
+            let result = false;
+            try {
+                const maintainData = await this.getDataById(id);
+                let status = maintainConst.status.notset;
+                const thisTime = new Date().getTime();
+                if (maintainData.maintain_time !== '') {
+                    maintainData.maintain_time = parseFloat(maintainData.maintain_time);
+                    if (maintainData.status === maintainConst.status.unstart && maintainData.maintain_time <= thisTime && maintainData.duration === maintainConst.duration.forever) {
+                        status = maintainConst.status.ongoing;
+                    } else if (maintainData.status !== maintainConst.status.notset && maintainData.duration !== maintainConst.duration.forever) {
+                        const mttime = maintainData.maintain_time + await this.durationAddTime(maintainData.duration);
+                        if (maintainData.maintain_time > thisTime) {
+                            status = maintainConst.status.unstart;
+                        } else if (maintainData.maintain_time <= thisTime && mttime > thisTime) {
+                            status = maintainConst.status.ongoing;
+                        }
+                    }
+                }
+                if (maintainData.status === status) {
+                    return true;
+                }
+                const data = {};
+                data.id = id;
+                data.status = status;
+                if (status === maintainConst.status.notset) {
+                    data.maintain_time = '';
+                }
+                const operate = this.db.update(this.tableName, data);
+
+                result = operate.affectedRows > 0;
+            } catch (error) {
+                console.log(error);
+                result = false;
+            }
+
+            return result;
+        }
+
+        async durationAddTime(duration) {
+            const d = parseInt(duration);
+            let time = 0;
+            if (d === maintainConst.duration.min15) {
+                time = 60 * 15 * 1000;
+            } else if (d === maintainConst.duration.min30) {
+                time = 60 * 30 * 1000;
+            } else if (d === maintainConst.duration.hour1) {
+                time = 3600 * 1000;
+            } else if (d === maintainConst.duration.hour2) {
+                time = 3600 * 2 * 1000;
+            }
+            return time;
+        }
+
+    }
+
+    return Maintain;
+};

+ 11 - 2
app/view/dashboard/index.ejs

@@ -8,13 +8,22 @@
                 <div class="col-12">
                     <h3 class="mb-2"><%= ctx.session.sessionProject.name %></h3>
                 </div>
-                <% if (!authMobile) { %>
                 <div class="col-12">
+                    <% if (!authMobile) { %>
                     <div class="alert alert-danger" role="alert">
                         <strong>您的账号未认证手机。</strong> 设置认证手机后,可以用于「找回密码」及接收「短信通知」。<a class="btn btn-sm btn-light" href="/profile/sms">点击设置</a>
                     </div>
+                    <% } %>
+                    <% if (maintainData.status !== maintainConst.status.notset && new Date().getTime() + (86400*1000) > parseFloat(maintainData.maintain_time)) { %>
+                        <!--系统维护信息-->
+                        <div class="card mb-3 bg-danger text-white">
+                            <div class="card-body">
+                                <h4><i class="fa fa-wrench"></i> 系统将于 <%- moment(parseFloat(maintainData.maintain_time)).format('YYYY年MM月DD日 HH:mm') %> 开始停机维护,<%- (maintainData.duration !== maintainConst.duration.forever ? '持续'+ maintainConst.durationString[maintainData.duration] +'。' : '') %>造成不便敬请谅解。</h4>
+                                <h5><%- maintainData.msg %></h5>
+                            </div>
+                        </div>
+                    <% } %>
                 </div>
-                <% } %>
                 <div class="col-4">
                     <div class="card">
                         <div class="card-header">需要你处理</div>

+ 7 - 0
app/view/layout/menu.ejs

@@ -2,6 +2,13 @@
     <div class="logo"><img src="/public/css/logo.png"></div>
     <div class="nav-top">
         <ul class="nav nav-pills nav-stacked bg-nav">
+            <% if (maintainData.status !== maintainConst.status.notset && new Date().getTime() + (60*60*1000) > parseFloat(maintainData.maintain_time)) { %>
+            <!--系统维护信息-->
+            <li class="bg-danger">
+                <a class="text-white maintain-icon"><i class="fa fa-wrench "></i>
+                    <span class="bg-danger maintain-info">系统将于 <%- ctx.helper.dateTran(parseFloat(maintainData.maintain_time)) %> 开始停机维护<%- (maintainData.duration !== maintainConst.duration.forever ? ',持续'+ maintainConst.durationString[maintainData.duration] +'。' : '') %></span></a></li>
+            <!--系统维护信息 end-->
+            <% } %>
             <% for (const index in ctx.menuList) { %>
             <% if (ctx.menuList[index].display === undefined || !ctx.menuList[index].display) { continue } %>
             <li <% if(ctx.controllerName === index || (ctx.controllerName === 'list' && index === 'tender')) { %>class="active"<% } %>>