Просмотр исходного кода

feat: 财审账号清单精灵临时权限

vian 3 лет назад
Родитель
Сommit
1d3a1e46f9

+ 6 - 5
modules/common/base/base_controller.js

@@ -42,6 +42,7 @@ class BaseController {
      * @return {void}
      */
     init(request, response, next) {
+        const referer = request.headers.referer;
         // 获取当前控制器和动作名称
         let urlInfo = Url.parse(request.originalUrl, true);
         let url = urlInfo.pathname.substr(1);
@@ -61,10 +62,9 @@ class BaseController {
                 break;
         }
 
+        let sessionManager = request.session.managerData;
         try {
-            console.log('enterINit');
             // 如果不适超级管理员则判断权限
-            let sessionManager = request.session.managerData;
             let MenuPermission = sessionManager.menuData;
             if (sessionManager.superAdmin !== 1) {
                 let currentPermission = sessionManager.toolPermission;
@@ -126,10 +126,11 @@ class BaseController {
             // moment工具
             response.locals.moment = Moment;
         } catch (error) {
-            console.log('enterAURE');
             console.log(error);
-            response.redirect('/dashboard');
-            return;
+            if (!(sessionManager.isTemporary && /\/billsGuidance\/guidance\//.test(referer))) {
+                response.redirect('/dashboard');
+                return;
+            }
         }
 
         next();

+ 13 - 2
modules/std_billsGuidance_lib/controllers/libController.js

@@ -15,7 +15,10 @@ let callback = function (req, res, err, msg, data) {
     res.json({error: err, message: msg, data: data});
 };
 
+const zhLibID = 'cf851660-3534-11ec-9641-2da8021b8e4e';
+
 class BillsGuideLibController extends BaseController{
+
     //获取编办及编办清单库信息
     async getComBillsLibInfo(req, res){
         try{
@@ -29,7 +32,7 @@ class BillsGuideLibController extends BaseController{
 
     async getBillsGuideLibs(req, res){
         try{
-            let libs = await billsGuidanceFacade.getBillsGuideLibs({deleted: false});
+            let libs = await billsGuidanceFacade.getBillsGuideLibs({deleted: false}, req.session.managerData.isTemporary);
             callback(req, res, 0, '', libs);
         }
         catch(err){
@@ -82,9 +85,17 @@ class BillsGuideLibController extends BaseController{
 
     async updateItems(req, res){
         try{
+
+            if (req.session.managerData.isTemporary) {
+                const match = req.headers.referer.match(/libID=([\d,a-z,A-Z,-]{36})/);
+                if (match && match[1] && match[1] !== zhLibID) {
+                    throw '无此清单精灵库权限';
+                }
+            }
+
             let data = JSON.parse(req.body.data);
             let updateDatas = data.updateDatas;
-            await billsGuidanceFacade.updateItems(updateDatas);
+            await billsGuidanceFacade.updateItems(updateDatas, req.session.managerData.isTemporary);
             callback(req, res, 0, '', null);
         }
         catch(err){

+ 5 - 2
modules/std_billsGuidance_lib/controllers/viewController.js

@@ -13,14 +13,17 @@ class ViewsController extends BaseController{
     redirectMain(req, res){
         res.render('maintain/billsGuidance_lib/html/main.html',
             {
-                userAccount: req.session.managerData.username
+                userAccount: req.session.managerData.username,
+                manager: req.session.managerData,
             });
     }
     redirectGuidance(req, res){
+        let sessionManager = req.session.managerData;
         res.render('maintain/billsGuidance_lib/html/zhiyin.html',
             {
                 userAccount: req.session.managerData.username,
-                LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
+                LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
+                manager: req.session.managerData,
             });
     }
 }

+ 6 - 2
modules/std_billsGuidance_lib/facade/facades.js

@@ -21,7 +21,7 @@ const stdRationModel = mongoose.model('std_ration_lib_ration_items');
 const engLibModel = mongoose.model('engineering_lib');
 const compilationModel = mongoose.model('compilation');
 const _ = require('lodash');
-
+const zhLibID = 'cf851660-3534-11ec-9641-2da8021b8e4e';
 module.exports = {
     handleCopyItems,
     getComBillsLibInfo,
@@ -174,7 +174,11 @@ async function getComBillsLibInfo() {
     }
 }
 
-async function getBillsGuideLibs(findData) {
+async function getBillsGuideLibs(findData, isTemporary) {
+    if (isTemporary) {
+        const zhLib = await billsGuideLibModel.findOne({ ID: zhLibID }).lean();
+        return zhLib ? [zhLib] : [];
+    }
     return await billsGuideLibModel.find(findData);
 }
 

+ 5 - 1
modules/users/controllers/dashboard_controller.js

@@ -37,7 +37,11 @@ class DashboardController extends BaseController {
         // 获取已发布的通知
         let messageModel = new MessageModel();
         let messageList = await messageModel.getList({status: 1}, 1, 5, {release_time: -1});
-
+        let sessionManager = request.session.managerData;
+        if (sessionManager && sessionManager.isTemporary) {
+            return response.redirect('/billsGuidance/main');
+            
+        }
         let renderData = {
             parentTitle: DashboardController.parentTitle,
             parentIndex: DashboardController.parentIndex,

+ 13 - 3
modules/users/controllers/login_controller.js

@@ -33,7 +33,11 @@ class LoginController extends BaseController {
         };
         let managerSessionData = request.session.managerData;
         if (managerSessionData !== undefined) {
-            return response.redirect("/dashboard");
+            if (managerSessionData.isTemporary) {
+                return response.redirect("/billsGuidance/main");
+            } else {
+                return response.redirect("/dashboard");
+            }
         }
         response.render('users/views/login/index', renderData);
     }
@@ -53,11 +57,15 @@ class LoginController extends BaseController {
         let permissionGroupModel = new PermissionGroupModel();
 
         let responseData = {
+            isTemporary: false,
             error: 0,
             msg: ''
         };
         try {
             let managerData = await managerModel.validLogin(username, password);
+            if (managerData.isTemporary) {
+                responseData.isTemporary = true;
+            }
 
             // 成功后写入session
             let currentTime = new Date().getTime();
@@ -208,13 +216,15 @@ class LoginController extends BaseController {
                 loginTime: currentTime,
                 sessionToken: sessionToken,
                 userID: managerData.id,
-                toolPermission: toolPermissionController.join(','),
+                toolPermission: managerData.isTemporary ? 'billsGuidance' : toolPermissionController.join(','),
                 toolMenuData: toolMenuData,
                 toolAllPermission: toolAllPermission.join(','),
                 menuData: menuData,
-                superAdmin: managerData.super_admin
+                superAdmin: managerData.super_admin,
+                isTemporary: managerData.isTemporary,
             };
             request.session.managerData = managerSession;
+            console.log(managerSession);
 
             // 更新登录信息
             let ip = request.connection.remoteAddress;

+ 37 - 0
modules/users/models/manager_model.js

@@ -143,6 +143,39 @@ class ManagerModel extends BaseModel {
     }
 
     /**
+     * 财审平台需要临时登录,只能看某个清单精灵库
+     */
+    temporaryLogin(username, password) {
+        const users = [
+            { name: '中洲一', pwd: '123456' },
+            { name: '中洲二', pwd: '123456' },
+            { name: '中洲三', pwd: '123456' },
+            { name: '中洲四', pwd: '123456' },
+            { name: '中洲五', pwd: '123456' },
+            { name: '财审一', pwd: '123456' },
+            { name: '财审二', pwd: '123456' },
+            { name: '财审三', pwd: '123456' },
+            { name: '财审四', pwd: '123456' },
+            { name: '财审五', pwd: '123456' },
+        ];
+        const user = users.find(item => item.name === username && item.pwd === password);
+        if (!user) {
+            return null;
+        }
+        return {
+            can_login: 1,
+            create_time: Date.now(),
+            id: `tempUser${user.name}`,
+            isNew: false,
+            last_login: Date.now(),
+            login_info: '',
+            login_ip: '',
+            username: user.name,
+            isTemporary: true,
+        }
+    }
+
+    /**
      * 登录信息校验
      *
      * @param {String} username
@@ -150,6 +183,10 @@ class ManagerModel extends BaseModel {
      * @return {Promise}
      */
     async validLogin(username, password) {
+        const tempUser = this.temporaryLogin(username, password);
+        if (tempUser) {
+            return tempUser;
+        }
         let managerData = await this.findDataByCondition({username: username});
 
         // 没有找到对应数据

+ 48 - 13
web/maintain/billsGuidance_lib/html/main.html

@@ -5,26 +5,61 @@
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   <meta http-equiv="x-ua-compatible" content="ie=edge">
-  <title>清单指引编辑器</title>
+  <title><%= manager.isTemporary ? '清单精灵编辑器' : '清单指引编辑器' %></title>
   <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
   <link rel="stylesheet" href="/web/maintain/billsGuidance_lib/css/main.css">
   <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+  <style>
+    .avatar {
+      display: flex;
+      align-items: center;
+      height: 38px;
+      cursor: pointer;
+      padding: 0 20px;
+    }
+    .avatar:hover {
+      text-decoration: none;
+      box-shadow: inset 0 3px 5px rgb(0 0 0 / 13%);
+    }
+    .avatar .dropdown-menu a {
+      display: block;
+      padding: 3px 20px;
+      clear: both;
+      font-weight: 400;
+      line-height: 1.42857143;
+      color: #333;
+      white-space: nowrap;
+    }
+  </style>
+    <script>
+      const isTemporary = '<%- manager.isTemporary %>';
+    </script>
 </head>
 
 <body>
   <div class="header">
-    <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
-      <span class="header-logo px-2">清单指引编辑器</span>
-      <div class="navbar-text"></div>
-    </nav>
-    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
-      <ul class="nav navbar-nav px-1">
-        <li class="nav-item">
-          <a class="nav-link" href="javacript:void(0);" aria-haspopup="true" aria-expanded="false" data-toggle="modal"
-            data-target="#add">新建清单指引库</a>
-        </li>
-      </ul>
+    <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 " style="display: flex; justify-content: space-between;">
+      <span class="header-logo px-2"><%= manager.isTemporary ? '清单精灵编辑器' : '清单指引编辑器' %></span>
+      <% if (manager.isTemporary)  { %>
+              <div class="avatar btn-group">
+                  <a class="dropdown-toggle" data-toggle="dropdown">
+                      <span><%= manager.username %></span>
+                  </a>
+                  <ul class="dropdown-menu dropdown-menu-right">
+                      <li><a href="/login/logout">退出登录</a></li>
+                  </ul>
+      <% } %>
     </nav>
+    <% if (!manager.isTemporary)  { %>
+      <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <ul class="nav navbar-nav px-1">
+          <li class="nav-item">
+            <a class="nav-link" href="javacript:void(0);" aria-haspopup="true" aria-expanded="false" data-toggle="modal"
+              data-target="#add">新建清单指引库</a>
+          </li>
+        </ul>
+      </nav>
+    <% } %>
   </div>
   <div class="main">
     <div class="content">
@@ -35,7 +70,7 @@
               <table class="table table-hover table-bordered">
                 <thead>
                   <tr>
-                    <th>清单指引名称</th>
+                    <th><%= manager.isTemporary ? '清单精灵名称' : '清单指引名称' %></th>
                     <th width="160">编办</th>
                     <th width="300">清单规则</th>
                     <th width="100">类型</th>

+ 3 - 3
web/maintain/billsGuidance_lib/html/zhiyin.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>清单指引编辑器</title>
+    <title><%= manager.isTemporary ? '清单精灵编辑器' : '清单指引编辑器' %></title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.sc.css"></link>
     <link rel="stylesheet" href="/web/maintain/billsGuidance_lib/css/main.css">
@@ -19,8 +19,8 @@
 <body>
     <div class="header">
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
-            <span class="header-logo px-2">清单指引编辑器</span>
-            <div class="navbar-text" id="libName"><a href="/billsGuidance/main">清单指引库</a><i class="fa fa-angle-right fa-fw"></i>XXX清单指引</div>
+            <span class="header-logo px-2"><%= manager.isTemporary ? '清单精灵编辑器' : '清单指引编辑器' %></span>
+            <div class="navbar-text" id="libName"><a href="/billsGuidance/main"><%= manager.isTemporary ? '清单精灵库' : '清单指引库' %></a><i class="fa fa-angle-right fa-fw"></i>XXX清单指引</div>
         </nav>
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
               <ul class="nav nav-tabs" role="tablist">

+ 9 - 4
web/maintain/billsGuidance_lib/js/billsGuidance.js

@@ -985,11 +985,16 @@ const billsGuidance = (function () {
     }
     //更新项目指引
     //@param {Array}updateDatas {Function}callback @return {void}
-    function updateGuideItems(updateDatas, callback){
+    function updateGuideItems(updateDatas, callback, errCB){
         CommonAjax.post('/billsGuidance/api/updateItems', {updateDatas: updateDatas}, function (rstData) {
             if(callback){
                 callback(rstData);
             }
+        }, function () {
+            if(errCB) {
+                errCB();
+            }
+            $.bootstrapLoading.end();
         });
     }
     //编辑后自动去除换行符回车符
@@ -1009,13 +1014,13 @@ const billsGuidance = (function () {
                 text = text.replace(deESC, '');
                 sheet.setValue(cell.row, cell.col, text);
                 if(node.data.name != text){
-                    syncDatas.push({node: node, text: text, field});
+                    syncDatas.push({node: node, text: text, field, cell});
                     updateDatas.push({updateType: updateType.update, findData: {ID: node.getID()}, updateData: {name: text}});
                 }
             } else if (field === 'outputItemCharacter' || field === 'required') {
                 const val = !sheet.getValue(cell.row, cell.col);
                 sheet.setValue(cell.row, cell.col, val);
-                syncDatas.push({node: node, text: val, field});
+                syncDatas.push({node: node, text: val, field, cell });
                 updateDatas.push({updateType: updateType.update, findData: {ID: node.getID()}, updateData: {[field]: val}});
             }
         }
@@ -1028,7 +1033,7 @@ const billsGuidance = (function () {
                 //失败恢复
                 renderSheetFunc(sheet, function () {
                     for(let syncData of syncDatas){
-                        sheet.setValue(syncData.node.serialNo(), 0, syncData.node.data[syncData.field] ? syncData.node.data[syncData.field] : '');
+                        sheet.setValue(syncData.node.serialNo(), syncData.cell.col, syncData.node.data[syncData.field] ? syncData.node.data[syncData.field] : '');
                     }
                 });
             });

+ 3 - 1
web/maintain/billsGuidance_lib/js/main.js

@@ -50,9 +50,11 @@ const billsGuidanceMain = (function () {
             <td>${lib.billsLibName}</td>
             <td>${type}</td>
             <td>${lib.createDate.split(' ')[0]}</td>
-            <td>
+            <td style="text-align: center;">
+            ${ isTemporary !== 'true' ? `
             <a class="lock-btn-control disabled" href="javascript:void(0);" data-toggle="modal" data-target="#edit" title="编辑"><i class="fa fa-pencil-square-o"></i></a>
             <a class="lock-btn-control disabled text-danger" href="javascript:void(0);" data-toggle="modal" data-target="#del" title="删除"><i class="fa fa-remove"></i></a>
+            ` : '' }
             <a class="lock" data-locked="true" href="javascript:void(0);" title="解锁"><i class="fa fa-unlock-alt"></i></a>
             </td></tr>`;
         tbody.append(tr);

+ 6 - 2
web/users/js/login.js

@@ -58,8 +58,12 @@ $(document).ready(function() {
             success: function(response) {
                 isLogin = false;
                 if (response.error === 0) {
-                    // 正确则跳转
-                    window.location.href = '/dashboard';
+                    if (response.isTemporary) {
+                        window.location.href = '/billsGuidance/main';
+                    } else {
+                        // 正确则跳转
+                        window.location.href = '/dashboard';
+                    }
                 } else {
                     // 错误则提示
                     show_error(response.msg);