فهرست منبع

Merge branch 'master' of http://192.168.1.41:3000/maixinrong/Calculation

MaiXinRong 5 سال پیش
والد
کامیت
3d010109cb

+ 5 - 0
app/base/base_controller.js

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

+ 10 - 5
app/controller/dashboard_controller.js

@@ -10,6 +10,7 @@
 
 
 const auditConst = require('../const/audit');
 const auditConst = require('../const/audit');
 const officeList = require('../const/cld_office').list;
 const officeList = require('../const/cld_office').list;
+const maintainConst = require('../const/maintain');
 
 
 module.exports = app => {
 module.exports = app => {
 
 
@@ -44,6 +45,8 @@ module.exports = app => {
             const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
             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 sysMsgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, 2, 0, 2);
+            // 获取系统维护信息
+            const maintainData = await ctx.service.maintain.getDataById(1);
             const renderData = {
             const renderData = {
                 auditTenders,
                 auditTenders,
                 auditStages,
                 auditStages,
@@ -62,11 +65,13 @@ module.exports = app => {
                 projectData,
                 projectData,
                 salesmanData,
                 salesmanData,
                 officeName,
                 officeName,
-                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
-                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
-                sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
+                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
                 userMsgPermission,
                 userMsgPermission,
                 uid: ctx.session.sessionUser.accountId,
                 uid: ctx.session.sessionUser.accountId,
+                maintainData,
+                maintainConst,
             };
             };
             await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
             await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
             await ctx.service.projectAccount.defaultUpdate({
             await ctx.service.projectAccount.defaultUpdate({
@@ -105,14 +110,14 @@ module.exports = app => {
                 total: Math.ceil(total / limit),
                 total: Math.ceil(total / limit),
                 queryData: JSON.stringify(ctx.urlInfo.query),
                 queryData: JSON.stringify(ctx.urlInfo.query),
             };
             };
-
             const renderData = {
             const renderData = {
                 uid: ctx.session.sessionUser.accountId,
                 uid: ctx.session.sessionUser.accountId,
                 type,
                 type,
                 pageInfo,
                 pageInfo,
                 userMsgPermission,
                 userMsgPermission,
-                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
+                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
             };
             };
+            console.log(renderData.msgList);
             await this.layout('dashboard/msg.ejs', renderData);
             await this.layout('dashboard/msg.ejs', renderData);
         }
         }
 
 

+ 7 - 0
app/controller/login_controller.js

@@ -8,6 +8,7 @@
  * @version
  * @version
  */
  */
 const URL = require('url');
 const URL = require('url');
+const maintainConst = require('../const/maintain');
 
 
 module.exports = app => {
 module.exports = app => {
 
 
@@ -23,8 +24,14 @@ module.exports = app => {
             const errorMessage = ctx.session.loginError;
             const errorMessage = ctx.session.loginError;
             // 显示完删除
             // 显示完删除
             ctx.session.loginError = null;
             ctx.session.loginError = null;
+            // 获取系统维护信息
+            const maintainData = await ctx.service.maintain.getDataById(1);
+
+            await ctx.service.maintain.syncMaintainData();
 
 
             const renderData = {
             const renderData = {
+                maintainData,
+                maintainConst,
                 errorMessage,
                 errorMessage,
             };
             };
             await ctx.render('login/login.ejs', renderData);
             await ctx.render('login/login.ejs', renderData);

+ 20 - 0
app/extend/helper.js

@@ -7,6 +7,7 @@
  * @date 2017/9/28
  * @date 2017/9/28
  * @version
  * @version
  */
  */
+const moment = require('moment');
 const zeroRange = 0.0000000001;
 const zeroRange = 0.0000000001;
 const fs = require('fs');
 const fs = require('fs');
 const path = require('path');
 const path = require('path');
@@ -840,6 +841,25 @@ module.exports = {
         return overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(num);
         return overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(num);
     },
     },
 
 
+    dateTran(time) {
+        return moment(time).format('YYYY年MM月DD日 HH:mm');
+    },
+
+    timeAdd(duration) {
+        const d = parseInt(duration);
+        let time = 0;
+        if (d === 1) {
+            time = 60 * 15 * 1000;
+        } else if (d === 2) {
+            time = 60 * 30 * 1000;
+        } else if (d === 3) {
+            time = 3600 * 1000;
+        } else if (d === 4) {
+            time = 3600 * 2 * 1000;
+        }
+        return time;
+    },
+
     async sendUserSms(userId, type, judge, msg) {
     async sendUserSms(userId, type, judge, msg) {
         const mobiles = [];
         const mobiles = [];
         if (!userId || (userId instanceof Array && userId.length === 0)) return;
         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.notify.syncNotifyData();
+            // 同步系统维护信息
+            yield this.service.maintain.syncMaintainData();
         } catch (error) {
         } catch (error) {
             console.log(error);
             console.log(error);
             if (this.helper.isAjax(this.request)) {
             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",
         type:"POST",
         url: url,
         url: url,
         data: formData,
         data: formData,
-        dataType: 'json', 
+        dataType: 'json',
         cache: false,
         cache: false,
         // 告诉jQuery不要去设置Content-Type请求头
         // 告诉jQuery不要去设置Content-Type请求头
         contentType: false,
         contentType: false,
         // 告诉jQuery不要去处理发送的数据
         // 告诉jQuery不要去处理发送的数据
         processData: false,
         processData: false,
-        timeout: 5000,
+        timeout: 60000,
         beforeSend: function(xhr) {
         beforeSend: function(xhr) {
             let csrfToken = Cookies.get('csrfToken');
             let csrfToken = Cookies.get('csrfToken');
             xhr.setRequestHeader('x-csrf-token', csrfToken);
             xhr.setRequestHeader('x-csrf-token', csrfToken);
@@ -267,7 +267,7 @@ const postDataWithFileProgress = function (url, formData, successCallback, error
         type:"POST",
         type:"POST",
         url: url,
         url: url,
         data: formData,
         data: formData,
-        dataType: 'json', 
+        dataType: 'json',
         cache: false,
         cache: false,
         // 告诉jQuery不要去设置Content-Type请求头
         // 告诉jQuery不要去设置Content-Type请求头
         contentType: false,
         contentType: false,
@@ -565,7 +565,7 @@ function showUploadFileProgress() {
 function setUploadFileProgress(pos) {
 function setUploadFileProgress(pos) {
     const processObj = $('.progress-bar');
     const processObj = $('.progress-bar');
     processObj.attr('aria-valuenow', pos);
     processObj.attr('aria-valuenow', pos);
-    processObj.width(pos + '%');    
+    processObj.width(pos + '%');
 }
 }
 
 
 /**
 /**

+ 93 - 0
app/service/maintain.js

@@ -0,0 +1,93 @@
+'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';
+        }
+
+        /**
+         * 同步系统设置消息
+         * @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.notset && maintainData.maintain_time <= thisTime && maintainData.duration === maintainConst.duration.forever) {
+                        status = maintainConst.status.ongoing;
+                    } else if (maintainData.status !== maintainConst.status.notset) {
+                        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);
+
+                if (status === maintainConst.status.ongoing) {
+                    this.ctx.session = null;
+                    this.ctx.redirect('/');
+                }
+
+                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">
                 <div class="col-12">
                     <h3 class="mb-2"><%= ctx.session.sessionProject.name %></h3>
                     <h3 class="mb-2"><%= ctx.session.sessionProject.name %></h3>
                 </div>
                 </div>
-                <% if (!authMobile) { %>
                 <div class="col-12">
                 <div class="col-12">
+                    <% if (!authMobile) { %>
                     <div class="alert alert-danger" role="alert">
                     <div class="alert alert-danger" role="alert">
                         <strong>您的账号未认证手机。</strong> 设置认证手机后,可以用于「找回密码」及接收「短信通知」。<a class="btn btn-sm btn-light" href="/profile/sms">点击设置</a>
                         <strong>您的账号未认证手机。</strong> 设置认证手机后,可以用于「找回密码」及接收「短信通知」。<a class="btn btn-sm btn-light" href="/profile/sms">点击设置</a>
                     </div>
                     </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>
-                <% } %>
                 <div class="col-4">
                 <div class="col-4">
                     <div class="card">
                     <div class="card">
                         <div class="card-header">需要你处理</div>
                         <div class="card-header">需要你处理</div>

+ 2 - 2
app/view/dashboard/msg_add.ejs

@@ -17,8 +17,8 @@
                                 </div>
                                 </div>
                                 <div class="form-group">
                                 <div class="form-group">
                                     <label>内容</label>
                                     <label>内容</label>
-                                    <div style="height: calc(100vh - 320px);">
-                                        <textarea id="content" name="content" class="form-control form-control-sm"><%- msgInfo.content %></textarea>
+                                    <div>
+                                        <textarea id="content" rows="15" name="content" class="form-control form-control-sm"><%- msgInfo.content %></textarea>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
                             </div>
                             </div>

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

@@ -2,6 +2,13 @@
     <div class="logo"><img src="/public/css/logo.png"></div>
     <div class="logo"><img src="/public/css/logo.png"></div>
     <div class="nav-top">
     <div class="nav-top">
         <ul class="nav nav-pills nav-stacked bg-nav">
         <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) { %>
             <% for (const index in ctx.menuList) { %>
             <% if (ctx.menuList[index].display === undefined || !ctx.menuList[index].display) { continue } %>
             <% if (ctx.menuList[index].display === undefined || !ctx.menuList[index].display) { continue } %>
             <li <% if(ctx.controllerName === index || (ctx.controllerName === 'list' && index === 'tender')) { %>class="active"<% } %>>
             <li <% if(ctx.controllerName === index || (ctx.controllerName === 'list' && index === 'tender')) { %>class="active"<% } %>>

+ 8 - 0
app/view/login/login.ejs

@@ -12,6 +12,13 @@
 </head>
 </head>
 <body class="login-body">
 <body class="login-body">
 <div class="container">
 <div class="container">
+    <% if (maintainData.status === maintainConst.status.ongoing) { %>
+    <form class="form-signin">
+        <h4 class="text-center mb-3"><i class="fa fa-wrench"></i>系统正在维护</h4>
+        <h4>预计恢复时间<%- (maintainData.duration !== maintainConst.duration.forever ? '为 ' + ctx.helper.dateTran(parseFloat(maintainData.maintain_time) + ctx.helper.timeAdd(maintainData.duration)) : ' 暂未确定') %></h4>
+        <h4>造成不便敬请谅解。</h4>
+    </form>
+    <% } else { %>
     <!--演示版-->
     <!--演示版-->
     <form class="form-signin" method="post" action="/login">
     <form class="form-signin" method="post" action="/login">
         <h4 class="text-center mb-2">纵横云计量</h4>
         <h4 class="text-center mb-2">纵横云计量</h4>
@@ -55,6 +62,7 @@
             <a href="#fg-password" data-toggle="modal" data-target="#fg-password"  class="mr-3">忘记密码?</a>
             <a href="#fg-password" data-toggle="modal" data-target="#fg-password"  class="mr-3">忘记密码?</a>
         </div>
         </div>
     </form>
     </form>
+    <% } %>
     <!--项目版-->
     <!--项目版-->
     <div class="text-white fixed-bottom"><p class="text-center mb-1">Copyright © 2018 <a href="https://smartcost.com.cn" target="_blank" class="text-white">珠海纵横创新软件有限公司</a>.All Rights Reserved.<a class="text-white ml-2" href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备14032472号</a></p></div>
     <div class="text-white fixed-bottom"><p class="text-center mb-1">Copyright © 2018 <a href="https://smartcost.com.cn" target="_blank" class="text-white">珠海纵横创新软件有限公司</a>.All Rights Reserved.<a class="text-white ml-2" href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备14032472号</a></p></div>
 </div>
 </div>

+ 3 - 1
app/view/setting/user_permission.ejs

@@ -49,7 +49,9 @@
                                                         <% } %>
                                                         <% } %>
                                                     <% } %>
                                                     <% } %>
                                                 <% } else if (permission[ap].type === 'radio') { %>
                                                 <% } else if (permission[ap].type === 'radio') { %>
-                                                    <%= permission[ap].title %>
+                                                    <% if (parseInt(accountPermission[ap]) === permission[ap].children[0].value) { %>
+                                                        <%= permission[ap].title %>
+                                                    <% } %>
                                                 <% } %>
                                                 <% } %>
                                             <% } %>
                                             <% } %>
                                         <% } %>
                                         <% } %>