Browse Source

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/ConstructionCost

chenshilong 4 years ago
parent
commit
bb4a796a47

+ 10 - 10
gulpfile.js

@@ -98,8 +98,8 @@ let compleGljOptions = {
     htmlDest: 'web/building_saas/complementary_glj_lib/html',
     htmlName: 'tools-gongliaoji.html',
     injectList: [
-        'web/dest/scripts/compleGlj.all.min' + version + '.js',
-        'web/dest/css/compleGlj.all.min' + version + '.css',
+        'web/dest/scripts/compleGlj.all.min.' + version + '.js',
+        'web/dest/css/compleGlj.all.min.' + version + '.css',
         'web/dest/css/common.all.min.' + version + '.css'
     ]
 };
@@ -114,8 +114,8 @@ let compleRation_rationOptions = {
     htmlDest: 'web/building_saas/complementary_ration_lib/html',
     htmlName: 'dinge.html',
     injectList: [
-        'web/dest/scripts/compleRation_ration.all.min' + version + '.js',
-        'web/dest/css/compleRation_ration.all.min' + version + '.css',
+        'web/dest/scripts/compleRation_ration.all.min.' + version + '.js',
+        'web/dest/css/compleRation_ration.all.min.' + version + '.css',
         'web/dest/scripts/common.all.min.'+version+'.js',
         'web/dest/css/common.all.min.' + version + '.css'
     ]
@@ -131,8 +131,8 @@ let compleRation_gljOptions = {
     htmlDest: 'web/building_saas/complementary_ration_lib/html',
     htmlName: 'gongliao.html',
     injectList: [
-        'web/dest/scripts/compleRation_glj.all.min' + version + '.js',
-        'web/dest/scripts/compleRation_glj.all.min' + version + '.css',
+        'web/dest/scripts/compleRation_glj.all.min.' + version + '.js',
+        'web/dest/scripts/compleRation_glj.all.min.' + version + '.css',
         'web/dest/scripts/common.all.min.'+version+'.js',
         'web/dest/css/common.all.min.' + version + '.css'
     ]
@@ -148,8 +148,8 @@ let compleRation_coeOptions = {
     htmlDest: 'web/building_saas/complementary_ration_lib/html',
     htmlName: 'fuzhu.html',
     injectList: [
-        'web/dest/scripts/compleRation_coe.all.min' + version + '.js',
-        'web/dest/scripts/compleRation_coe.all.min' + version + '.css',
+        'web/dest/scripts/compleRation_coe.all.min.' + version + '.js',
+        'web/dest/scripts/compleRation_coe.all.min.' + version + '.css',
         'web/dest/scripts/common.all.min.'+version+'.js',
         'web/dest/css/common.all.min.' + version + '.css'
     ]
@@ -165,8 +165,8 @@ let compleRation_instOptions = {
     htmlDest: 'web/building_saas/complementary_ration_lib/html',
     htmlName: 'anzhuang.html',
     injectList: [
-        'web/dest/scripts/compleRation_inst.all.min' + version + '.js',
-        'web/dest/scripts/compleRation_inst.all.min' + version + '.css',
+        'web/dest/scripts/compleRation_inst.all.min.' + version + '.js',
+        'web/dest/scripts/compleRation_inst.all.min.' + version + '.css',
         'web/dest/scripts/common.all.min.'+version+'.js',
         'web/dest/css/common.all.min.' + version + '.css'
     ]

+ 4 - 0
modules/all_models/user.js

@@ -34,6 +34,10 @@ let upgrade = mongoose.Schema({
         type:String,
         default: '',
     },
+    lock: { // 锁信息 1:借出;2:销售;
+        type: Number,
+        default: 0
+    }
 }, { _id: false })
 
 const userdList = mongoose.Schema({

+ 2 - 1
modules/reports/rpt_component/jpc_flow_tab.js

@@ -690,7 +690,8 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             // 2018-08-04 其实之前的判断逻辑完全是自找麻烦,而且还不够正确。其实只需要判断已经处理了多少行纪录(所有的都算,包括空白行),
                             // 与总的seg纪录数想比较,就很容易得到结果,而且能处理极端边界的情况。
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
-                            pageStatus[JV.STATUS_REPORT_END] = true;
+                            // pageStatus[JV.STATUS_REPORT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = (segIdx === me.segments.length - 1);
                             private_resetBandArea();
                             let hasAdHocRow = ((adHocAutoHeightAmt > maxRowRec) || !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, handledRowAmt, maxRowRec, me.isEx));
                                               // !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt + adHocAutoHeightAmt, maxRowRec, me.isEx));

+ 53 - 4
modules/reports/util/rpt_excel_util.js

@@ -310,6 +310,23 @@ function writeSharedString(sharedStrList){
     }
     return rst;
 }
+function _setupPgBrks(pageData) {
+    pageData.pageBreaks = [];
+    let pgBrkIdx = 0;
+    const pgBrk = [];
+    for (const page of pageData.items) {
+        const maxBottomArr = [];
+        for (const cell of page.cells) {
+            if (maxBottomArr.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) < 0) {
+                maxBottomArr.push(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
+            }
+        }
+        pgBrkIdx += maxBottomArr.length;
+        pgBrk.push(pgBrkIdx);
+    }
+    pageData.pageBreaks.push(pgBrk);
+}
+
 function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands){
     let rst = [];
     let private_pushDftFont = function(){
@@ -352,19 +369,19 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     private_pushDftFont();
     private_buildFirstDftStyle();
     if (isSinglePage) {
-        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, true));
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, true, -1));
     } else {
         for (let i = 0; i < pageData.items.length; i++) {
             let appointedMergeBand = null;
             if (custSheetMergeBands && custSheetMergeBands.length > i) {
                 appointedMergeBand = custSheetMergeBands[i];
             }
-            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, i === 0));
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, i === 0, i));
         }
     }
     return rst;
 }
-function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, isFirstSheet){
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, isFirstSheet, pgBrkIdx){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], currentMergeBorder = null,
         headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
@@ -834,6 +851,23 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
     }
     rst.push('<pageSetup ' + pStr + ' fitToWidth="0" fitToHeight="0" orientation="' + orientationStr + '" />');
     rst.push('<headerFooter alignWithMargins="0"/>');
+    //插入分页符---------------------------
+    if (pageData.pageBreaks) {
+        let pgBrks = [];
+        if (sheetData !== null) {
+            pgBrks = pageData.pageBreaks[pgBrkIdx];
+        } else {
+            pgBrks = pageData.pageBreaks[0];
+        }
+        if (pgBrks.length > 1) {
+            rst.push('<rowBreaks count="' + pgBrks.length + '" manualBreakCount="' + pgBrks.length + '" >');
+            for (let pbi = 0; pbi < pgBrks.length; pbi++) {
+                rst.push('<brk id="' + pgBrks[pbi] + '" max="16383" man="1" />');
+            }
+            rst.push('</rowBreaks>');
+        }
+    }
+    //插入分页符结束---------------------------
     rst.push('</worksheet>');
     return rst;
 }
@@ -862,6 +896,9 @@ module.exports = {
         let isSinglePage = rptOptions.singlePage;
         let sheets = [];
         if (isSinglePage) {
+            //加分页符(分页符要在外部处理好)-------------------
+            _setupPgBrks(pageData);
+            //加分页符结束-------------------
             sheets.push({sheetName: '全部页'});
         } else {
             if (custSheetNames && custSheetNames.length === pageData.items.length) {
@@ -981,6 +1018,10 @@ module.exports = {
                 mergeBand[JV.PROP_RIGHT].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT]);
                 sheetNames.push(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
 
+                //加分页符(分页符要在外部处理好)-------------------
+                _setupPgBrks(pageDataArray[i]);
+                //加分页符结束-------------------
+
                 for (let j = 0; j < pageDataArray[i].items.length; j++) {
                     let maxY = 0, minY = 100000;
                     if (pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS]) {
@@ -1014,8 +1055,9 @@ module.exports = {
                     }
                 }
             }
-            //2. newPageData的items属性
+            //2. newPageData的items属性及相关分页符
             newPageData.items = [];
+            newPageData.pageBreaks = [];
             for (let i = 0; i < pageDataArray.length; i++) {
                 let pageItem = {};
                 pageItem[JV.PROP_PAGE_SEQ] = i + 1;
@@ -1028,6 +1070,13 @@ module.exports = {
                 newPagePos[i][JV.NODE_PAGE_SIZE] = pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE];
                 pageItem[JV.PAGE_SPECIAL_MERGE_POS] = newPagePos[i];
                 newPageData.items.push(pageItem);
+                //重新分配分页符()------------------
+                if (pageDataArray[i].pageBreaks.length === 1) {
+                    newPageData.pageBreaks.push(pageDataArray[i].pageBreaks[0]);
+                } else {
+                    newPageData.pageBreaks.push([]);
+                }
+                //重新分配分页符结束------------------
             }
             //3. everything is ok, then call me
             me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, custMergeBands, callback);

+ 1 - 1
modules/users/controllers/boot_controller.js

@@ -32,7 +32,7 @@ class BootController extends BaseController {
             // 判断当前用户的是使用免费版还是专业版
             compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, compilationId);
             request.session.compilationVersion = compilationVersion.version;
-            request.session.sessionUser.compilationDeadline = compilationVersion.deadline;
+            request.session.sessionUser.compilationLock = compilationVersion.lock;
             request.session.sessionCompilation = compilationData;
             if(sessionUser.latest_used !== compilationId) userModel.updateLatestUsed(sessionUser.id,compilationId);
         }

+ 2 - 0
modules/users/controllers/cld_controller.js

@@ -110,6 +110,7 @@ class CLDController {
         let deadline = request.body.deadline || '';
         let status = parseInt(request.body.status); // 1.升级、2.降级、3.续期
         let smssend = parseInt(request.body.smssend);
+        let lock = parseInt(request.body.lock);// 0.默认、1.借出(借用)、2.销售(购买)
         try {
 
             let userModel = new UserModel();
@@ -135,6 +136,7 @@ class CLDController {
                 isUpgrade: status !== 2,
                 remark: '',
                 deadline: deadline,
+                lock: lock,
             };
 
             if (upgradeIndex === -1) {

+ 2 - 2
modules/users/controllers/login_controller.js

@@ -108,7 +108,7 @@ class LoginController {
                     // 判断当前用户的是使用免费版还是专业版
                     let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
                     request.session.compilationVersion = compilationVersion.version;
-                    request.session.sessionUser.compilationDeadline = compilationVersion.deadline;
+                    request.session.sessionUser.compilationLock = compilationVersion.lock;
                     request.session.sessionCompilation = compilationData;
                     if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
                 }
@@ -297,7 +297,7 @@ class LoginController {
                 let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
                 console.log("当前用户的是使用免费版还是专业版 完成------------------");
                 request.session.compilationVersion = compilationVersion.version;
-                request.session.sessionUser.compilationDeadline = compilationVersion.deadline;
+                request.session.sessionUser.compilationLock = compilationVersion.lock;
                 request.session.sessionCompilation = compilationData;
                 if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
             }

+ 6 - 3
modules/users/controllers/user_controller.js

@@ -30,7 +30,7 @@ class UserController extends BaseController {
         let sessionUser = request.session.sessionUser;
 
         let userModel = new UserModel();
-        let userData = await userModel.findDataByName(sessionUser.username);
+        let userData = await userModel.findDataBySsoId(sessionUser.ssoId);
         userData = Object.keys(userData).length <= 0 ? [] : userData;
 
         let renderData = {
@@ -95,8 +95,10 @@ class UserController extends BaseController {
         try {
             // 获取当前用户信息
             let sessionUser = request.session.sessionUser;
+            console.log(sessionUser);
             let userModel = new UserModel();
-            userData = await userModel.findDataByName(sessionUser.username);
+            userData = await userModel.findDataBySsoId(sessionUser.ssoId);
+            console.log(userData);
 
             let page = request.query.page === undefined ? 1 : request.query.page;
 
@@ -155,6 +157,7 @@ class UserController extends BaseController {
                     if (oneCompilationIndex !== -1) {
                         compilationList[oneCompilationIndex].isUpgrade = userUpgradeList[index].isUpgrade;
                         compilationList[oneCompilationIndex].deadline = userUpgradeList[index].deadline;
+                        compilationList[oneCompilationIndex].lock = userUpgradeList[index].lock;
                     }
                 }
             }
@@ -237,7 +240,7 @@ class UserController extends BaseController {
                 let userModel = new UserModel();
                 let compilationVersion = await userModel.getVersionFromUpgrade(sessionUserData.ssoId, compilationData._id);
                 request.session.compilationVersion = compilationVersion.version;
-                request.session.sessionUser.compilationDeadline = compilationVersion.deadline;
+                request.session.sessionUser.compilationLock = compilationVersion.lock;
                 request.session.sessionCompilation = compilationData;
             }
         } catch (error) {

+ 4 - 4
modules/users/models/user_model.js

@@ -350,7 +350,7 @@ class UserModel extends BaseModel {
      */
     async getVersionFromUpgrade(ssoId, compilationId){
         let version = '大司空云计价(免费公用版)';
-        let deadline = '';
+        let lock = 0;
         let userData = await this.findDataBySsoId(ssoId);
         if (userData.upgrade_list !== undefined) {
             let compilationInfo = userData.upgrade_list.find(function (item) {
@@ -358,12 +358,12 @@ class UserModel extends BaseModel {
             });
             if (compilationInfo !== undefined && compilationInfo.isUpgrade === true) {
                 version = '大司空云计价(专业版)';
-                if (compilationInfo.deadline !== undefined && compilationInfo.deadline !== '') {
-                    deadline = compilationInfo.deadline;
+                if (compilationInfo.lock !== undefined && compilationInfo.lock !== 0) {
+                    lock = compilationInfo.lock;
                 }
             }
         }
-        return {version: version, deadline: deadline};
+        return {version: version, lock: lock};
     }
 
     /**

+ 1 - 1
web/building_saas/glj/html/project_glj.html

@@ -95,7 +95,7 @@
             <a class="nav-link " id="ration-nav" data-toggle="tab" href="#ph_div" role="tab"
               aria-selected="true">相关定额</a>
           </li>
-          <li class="nav-item">
+          <li class="nav-item" id="info-nav-li">
             <a class="nav-link" id="info-nav" data-toggle="tab" data-name="info" href="#info_price_div"
               role="tab">信息价</a>
           </li>

BIN
web/building_saas/img/vip.png


BIN
web/building_saas/img/vip2.png


+ 21 - 15
web/building_saas/main/js/views/glj_col.js

@@ -2,7 +2,8 @@
  * Created by zhang on 2018/7/3.
  */
 let gljCol = {
-    showTaxRate:false,
+    showTaxRate: false,
+    hideInfoPrice:true,
     ration_glj_setting: {
         header: [
             {headerName: "编码", headerWidth: 110, dataCode: "code", dataType: "String", formatter: "@"},
@@ -249,21 +250,26 @@ let gljCol = {
             setting.view.lockColumns = newArray;
         }
     },
-    initGljCol:function (showAdjustPrice, showTenderFields) {
-        let me = gljCol;
-        if(showAdjustPrice !== true){
-            me.removeCol('adjustPrice',me.ration_glj_setting);
-            me.removeCol('adjustPrice',me.project_glj_setting);
-            me.removeCol('adjustPrice',me.mixRatio_Setting);
-        };
-        if(me.showTaxRate == false)  me.removeCol('taxRate',me.project_glj_setting);
-        me.showTenderFields(showTenderFields, false);
+    initGljCol: function (showAdjustPrice, showTenderFields) {
+      let me = gljCol;
+      if (showAdjustPrice !== true) {
+        me.removeCol('adjustPrice', me.ration_glj_setting);
+        me.removeCol('adjustPrice', me.project_glj_setting);
+        me.removeCol('adjustPrice', me.mixRatio_Setting);
+      };
+      if (me.showTaxRate == false) me.removeCol('taxRate', me.project_glj_setting);
+      if (me.hideInfoPrice == true) { 
+        $("#info-nav-li").hide();
+        me.removeCol('priceFrom', me.project_glj_setting);
+      } 
+      
+      me.showTenderFields(showTenderFields, false);
 
-        gljOprObj.setting = me.ration_glj_setting;
-        projectGljObject.projectGljSetting = me.project_glj_setting;
-        projectGljObject.mixRatioSetting = me.mixRatio_Setting;
-        me.setScopeFormater();
-        gljOprObj.scopeSetting = me.scopeSetting;
+      gljOprObj.setting = me.ration_glj_setting;
+      projectGljObject.projectGljSetting = me.project_glj_setting;
+      projectGljObject.mixRatioSetting = me.mixRatio_Setting;
+      me.setScopeFormater();
+      gljOprObj.scopeSetting = me.scopeSetting;
     },
     showTenderFields: function (showFields = false, needRefresh = false){
         let me = gljCol;

+ 1 - 1
web/building_saas/pm/js/pm_tree.js

@@ -332,7 +332,7 @@ const pmTree = {
                     node.children = parentMap[node.data.ID] || [];
                     node.parent = IDMap[node.data.ParentID] || this._root;
                 });
-                const roots = parentMap['-1'];
+                const roots = parentMap['-1']||[];
                 // 将各节点的children进行排序,并设置nextSibling
                 this._root.children = sortChildren(roots);
                 // 生成tree.items

+ 4 - 4
web/common/html/header.html

@@ -54,10 +54,10 @@
             <% if (!versionName.includes('免费')) {%>
               <li class="nav-item">
                 <a href="/user/buy" target="_blank">
-                    <% if (sessionUser.compilationDeadline !== '') { %>
-                    <img src="/web/building_saas/img/vip2.png" data-toggle="tooltip" data-placement="bottom" data-original-title="年限版用户">
-                    <% } else { %>
-                    <img src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="专业版用户">
+                    <% if (sessionUser.compilationLock === 1) { %>
+                    <img width="38" src="/web/building_saas/img/vip2.png" data-toggle="tooltip" data-placement="bottom" data-original-title="借用">
+                    <% } else if (sessionUser.compilationLock === 2) { %>
+                    <img width="38" src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="购买">
                     <% } %>
                 </a>
               </li>

+ 4 - 0
web/over_write/js/chongqing_2018.js

@@ -321,6 +321,10 @@ if(typeof figureClassTemplate !== 'undefined'){
     figureClassTemplate['ADDED_VALUE_TAX'] = {flag: fixedFlag.ADDED_VALUE_TAX, filter: ['SJ', 'ZZS', 'SQGCZJ']}
 };
 
+if(typeof gljCol !== 'undefined'){
+  gljCol.hideInfoPrice = false;
+};
+
 //这个文档浏览器库和服务器端共用,所以这个文件中用到的变量都要记得做undefined判断,不然后端读取时会有问题
 //=================================================== 前后端分割线 ======================================================================
 if(typeof module !== 'undefined'){

+ 4 - 4
web/users/html/login-sms.html

@@ -36,10 +36,10 @@
                     <strong>登录失败</strong> <span id="message"></span>
                 </div>
             </div>
-            <div class="form-group">
-                <div id="captcha-box"></div>
-            </div>
-            <div class="form-group btn-area" style="display: none;">
+            <!--<div class="form-group">-->
+                <!--<div id="captcha-box"></div>-->
+            <!--</div>-->
+            <div class="form-group btn-area">
                 <button id="login" type="button" class="btn btn-primary btn-block">登录</button>
             </div>
         </form>

+ 1 - 1
web/users/html/login-ver.html

@@ -26,7 +26,7 @@
             <div class="">
             <div class="row  modal-auto-height">
                 <% for (const ver of versionData) { %>
-                        <div class="col-sm-6">
+                        <div class="col-sm-4 mb-3">
                             <div class="card card-block">
                                 <div class="card-body">
                                     <h3 class="card-title"><%= ver.name %></h3>

+ 4 - 4
web/users/html/login.html

@@ -47,10 +47,10 @@
                     <strong>登录失败</strong> <span id="message"></span>
                 </div>
             </div>
-            <div class="form-group">
-                <div id="captcha-box"></div>
-            </div>
-            <div class="form-group btn-area" style="display: none">
+            <!--<div class="form-group">-->
+                <!--<div id="captcha-box"></div>-->
+            <!--</div>-->
+            <div class="form-group btn-area">
                 <button id="login" type="button" class="btn btn-primary btn-block">登录</button>
             </div>
             <div class="pt-1 d-flex justify-content-between">

+ 16 - 15
web/users/html/user-buy.html

@@ -75,12 +75,16 @@
                             </div>
                             <div class="col-sm-5 mb-5">
                                 <div class="card pro-version">
-                                  <div class="card-body">
-                                    <h3 class="card-title">
-                                        专业版
-                                        <img src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="专业版用户">
-                                        <img src="/web/building_saas/img/vip2.png" data-toggle="tooltip" data-placement="bottom" data-original-title="年限版用户">
-                                    </h3>
+                                  <div class="card-body d-flex justify-content-between">
+                                      <h3 class="card-title">专业版</h3>
+                                      <div>
+                                          <div class="d-inline-block mr-3">
+                                            <img width="24" src="/web/building_saas/img/vip.png">购买
+                                          </div>
+                                          <div class="d-inline-block">
+                                              <img width="24" src="/web/building_saas/img/vip2.png">借用
+                                          </div>
+                                      </div>
                                       <!--<p class="card-text">-->
                                       <!--&lt;!&ndash;<ul class="pl-3">-->
                                           <!--<li>创建单位工程无限制</li>-->
@@ -94,27 +98,24 @@
                                         <li class="list-group-item d-flex justify-content-between">
                                             <div class="col-6">
                                                 <%= compilation.name %>
-                                                <% if (compilation.isUpgrade !== undefined && compilation.isUpgrade === true && compilation.deadline !== undefined && compilation.deadline !== '') { %>
-                                                <img src="/web/building_saas/img/vip2.png" data-toggle="tooltip" data-placement="bottom" data-original-title="年限版用户">
-                                                <% } else if (compilation.isUpgrade !== undefined && compilation.isUpgrade === true && (compilation.deadline === undefined || compilation.deadline === '')) { %>
-                                                <img src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="专业版用户">
+                                                <% if (compilation.lock !== undefined && compilation.lock === 1) { %>
+                                                <img width="38" src="/web/building_saas/img/vip2.png" data-toggle="tooltip" data-placement="bottom" data-original-title="借用">
+                                                <% } else if (compilation.lock !== undefined && compilation.lock === 2) { %>
+                                                <img width="38" src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="购买">
                                                 <% } %>
                                             </div>
                                             <div class="ml-auto text-right">
                                             <% if (compilation.isUpgrade === undefined || compilation.isUpgrade !== true) { %>
                                             <a href="javascript:void(0);" class="btn btn-primary btn-sm getcategory" data-upgrade="<%= compilation.isUpgrade %>" data-category="<%= compilation.categoryID %>">立即激活</a>
+                                            <% if (compilation.deadline !== undefined && compilation.deadline !== '') { %><span class="d-block text-danger">已到期:<%= compilation.deadline %></span><% } %>
                                             <% } else { %>
                                             <a href="javascript:void(0);" class="btn btn-outline-secondary btn-sm getcategory" data-title="<%= compilation.name %>" data-upgrade="<%= compilation.isUpgrade %>" data-category="<%= compilation.categoryID %>"><i class="fa fa-check"></i> 已激活</a>
-                                            <% if (compilation.deadline !== undefined && compilation.deadline !== '') { %><span class="d-block text-muted">期:<%= compilation.deadline %></span><% } %>
+                                            <% if (compilation.deadline !== undefined && compilation.deadline !== '') { %><span class="d-block text-muted">期:<%= compilation.deadline %></span><% } %>
                                             <% } %>
                                             </div>
                                         </li>
                                         <% }) %>
                                         <% } %>
-                                        <!--<li class="list-group-item d-flex justify-content-between">-->
-                                        <!--重庆(2015)-->
-                                        <!--<a class="btn btn-outline-secondary btn-sm" href="activ2" data-toggle="modal" data-target="#activ2"><i class="fa fa-check"></i> 已激活</a>-->
-                                        <!--</li>-->
                                     </ul>
                                 </div>
                             </div>

+ 146 - 102
web/users/js/login.js

@@ -9,42 +9,42 @@ $(document).ready(function () {
     let referer = scUrlUtil.GetQueryString('referer');
 
     // 载入时先获取相关参数
-    $.ajax({
-        url: '/captcha',
-        type: 'get',
-        data: '',
-        timeout: 5000,
-        error: function() {
-            $("#captcha-box").html('验证码加载失败');
-        },
-        beforeSend: function() {
-            $("#captcha-box").html('正在加载验证码');
-        },
-        success: function(response) {
-            $("#captcha-box").html('');
-            if (response.success === 0) {
-                alert('验证码初始化失败!');
-                return false;
-            }
+    // $.ajax({
+    //     url: '/captcha',
+    //     type: 'get',
+    //     data: '',
+    //     timeout: 5000,
+    //     error: function() {
+    //         $("#captcha-box").html('验证码加载失败');
+    //     },
+    //     beforeSend: function() {
+    //         $("#captcha-box").html('正在加载验证码');
+    //     },
+    //     success: function(response) {
+    //         $("#captcha-box").html('');
+    //         if (response.success === 0) {
+    //             alert('验证码初始化失败!');
+    //             return false;
+    //         }
+    //
+    //         initGeetest({
+    //             // 以下配置参数来自服务端 SDK
+    //             gt: response.gt,
+    //             challenge: response.challenge,
+    //             offline: !response.success,
+    //             new_captcha: response.new_captcha,
+    //             width: '100%'
+    //         }, handler);
+    //     }
+    // });
 
-            initGeetest({
-                // 以下配置参数来自服务端 SDK
-                gt: response.gt,
-                challenge: response.challenge,
-                offline: !response.success,
-                new_captcha: response.new_captcha,
-                width: '100%'
-            }, handler);
-        }
-    });
-
-    const handler = function(captchaObj) {
-        captchaObj.appendTo('#captcha-box');
-        captchaObj.onSuccess(function () {
-            $(".btn-area").slideDown("fast");
-            // $('#login').click();
-            // captchaObj.getValidate();
-        });
+    // const handler = function(captchaObj) {
+    //     captchaObj.appendTo('#captcha-box');
+    //     captchaObj.onSuccess(function () {
+    //         $(".btn-area").slideDown("fast");
+    //         // $('#login').click();
+    //         // captchaObj.getValidate();
+    //     });
 
         $("#login").click(function () {
             if (!valid()) {
@@ -53,14 +53,14 @@ $(document).ready(function () {
             if ($('#changeLogin').attr('data-status') === 'user') {
                 let account = $("#inputEmail").val();
                 if(/^1[3456789]\d{9}$/.test(account) || /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(account)) {
-                    login(captchaObj);
+                    login();
                 } else {
                     $('#emailHelp').text('您输入的 邮箱/手机 格式不对');
                 }
             } else {
                 let account = $("#mobileLogin").val();
                 if(/^1[3456789]\d{9}$/.test(account)) {
-                    login(captchaObj);
+                    login();
                 } else {
                     $('#phoneHelp').text('您输入的 手机 格式不对');
                 }
@@ -142,7 +142,7 @@ $(document).ready(function () {
                 }
             })
         });
-    };
+    // };
 
     $("input").blur(function () {
         cleanError();
@@ -265,73 +265,117 @@ $(document).ready(function () {
     });
 });
 
-function login(captchaObj) {
-    $('#login').attr('disabled', true);
-    let geetest_challenge = $('input[name="geetest_challenge"]').val();
-    let geetest_validate = $('input[name="geetest_validate"]').val();
-    let geetest_seccode = $('input[name="geetest_seccode"]').val();
+function login() {
+    $.ajax({
+        url: '/captcha?t='+ (new Date()).getTime(),
+        type: 'get',
+        dataType: 'json',
+        timeout: 5000,
+        error: function() {
+            // $("#captcha-box").html('验证码加载失败');
+        },
+        beforeSend: function() {
+            // $("#captcha-box").html('正在加载验证码');
+        },
+        success: function(response) {
+            // $("#captcha-box").html('');
+            if (response.success === 0) {
+                alert('验证码初始化失败!');
+                return false;
+            }
 
-    const postData = {
-        geetest_challenge: geetest_challenge,
-        geetest_validate: geetest_validate,
-        geetest_seccode: geetest_seccode,
-    };
-    if ($('#changeLogin').attr('data-status') === 'user') {
-        let account = $("#inputEmail").val();
-        let pw = $("#inputPassword").val();
-        postData.account = account;
-        postData.pw = pw;
-    } else {
-        let mobile = $('#mobileLogin').val();
-        let code = $("#codeLogin").val();
-        postData.mobile = mobile;
-        postData.code = code;
-    }
+            initGeetest({
+                // 以下配置参数来自服务端 SDK
+                gt: response.gt,
+                challenge: response.challenge,
+                offline: !response.success,
+                new_captcha: response.new_captcha,
+                // width: '100%',
+                product: "bind"
+            }, function (catpchaObj) {
+                catpchaObj.onReady(function () {
+                    catpchaObj.verify();
+                }).onClose(function () {
+                }).onSuccess(function () {
+                    /* 延迟到动画结束后再alert */
+                    var lastUTC = new Date(), duration = 1100;
+                    function _alert(msg) {
+                        var elapsed = new Date() - lastUTC;
+                        if (elapsed >= duration) { return alert(msg) }
+                        setTimeout(function () { alert(msg) }, duration - elapsed);
+                    }
+                    var result = catpchaObj.getValidate();
+                    if (!result) {return alert('请完成验证');}
+                    $('#login').attr('disabled', true);
+                    // let geetest_challenge = $('input[name="geetest_challenge"]').val();
+                    // let geetest_validate = $('input[name="geetest_validate"]').val();
+                    // let geetest_seccode = $('input[name="geetest_seccode"]').val();
 
-    $.ajax({
-        url: '/login',
-        type: 'post',
-        data: postData,
-        success: function (response) {
-            if (response.error === 0) {
-                // $('#phonepass').modal('hide');
-                const url = response.last_page !== null && response.last_page !== undefined && response.last_page !== '' ?
-                    response.last_page : '/pm';
-                if (response.login_ask === 0) {
-                    location.href = url;
-                } else {
-                    response.compilation_list = response.compilation_list === undefined || response.compilation_list === '' ?
-                        null : JSON.parse(response.compilation_list);
-                    if (response.compilation_list === null || response.compilation_list.length <= 0) {
-                        location.href = url;
-                        return false;
+                    const postData = {
+                        geetest_challenge: result.geetest_challenge,
+                        geetest_validate: result.geetest_validate,
+                        geetest_seccode: result.geetest_seccode,
+                    };
+                    if ($('#changeLogin').attr('data-status') === 'user') {
+                        let account = $("#inputEmail").val();
+                        let pw = $("#inputPassword").val();
+                        postData.account = account;
+                        postData.pw = pw;
+                    } else {
+                        let mobile = $('#mobileLogin').val();
+                        let code = $("#codeLogin").val();
+                        postData.mobile = mobile;
+                        postData.code = code;
                     }
-                    console.log(response.compilation_list);
-                    setVersion(response.compilation_list);
-                    $('#ver').modal('show');
-                }
-            } else if(response.error === 2) {
-                // $('#phonepass').modal('hide');
-                // captchaObj.reset();
-                $('#check_ssoId').val(response.ssoId);
-                $('#phone').modal('show');
-                $('#login').removeAttr('disabled');
-            } else if(response.error === 3) {
-                // captchaObj.reset();
-                $('#phonepass').modal('show');
-                $('#mobileLogin').val(response.data);
-                $('#login').removeAttr('disabled');
-            } else {
-                // $('#phonepass').modal('hide');
-                let msg = response.msg !== undefined ? response.msg : '未知错误';
-                showError(msg, $("input"));
-                $('#login').removeAttr('disabled');
-                // captchaObj.reset();
-            }
-        },
-        error: function (result) {
-            showError('内部程序错误', null);
-            $('#login').removeAttr('disabled');
+
+                    $.ajax({
+                        url: '/login',
+                        type: 'post',
+                        data: postData,
+                        success: function (response) {
+                            if (response.error === 0) {
+                                // $('#phonepass').modal('hide');
+                                const url = response.last_page !== null && response.last_page !== undefined && response.last_page !== '' ?
+                                    response.last_page : '/pm';
+                                if (response.login_ask === 0) {
+                                    location.href = url;
+                                } else {
+                                    response.compilation_list = response.compilation_list === undefined || response.compilation_list === '' ?
+                                        null : JSON.parse(response.compilation_list);
+                                    if (response.compilation_list === null || response.compilation_list.length <= 0) {
+                                        location.href = url;
+                                        return false;
+                                    }
+                                    console.log(response.compilation_list);
+                                    setVersion(response.compilation_list);
+                                    $('#ver').modal('show');
+                                }
+                            } else if(response.error === 2) {
+                                // $('#phonepass').modal('hide');
+                                // captchaObj.reset();
+                                $('#check_ssoId').val(response.ssoId);
+                                $('#phone').modal('show');
+                                $('#login').removeAttr('disabled');
+                            } else if(response.error === 3) {
+                                // captchaObj.reset();
+                                $('#phonepass').modal('show');
+                                $('#mobileLogin').val(response.data);
+                                $('#login').removeAttr('disabled');
+                            } else {
+                                // $('#phonepass').modal('hide');
+                                let msg = response.msg !== undefined ? response.msg : '未知错误';
+                                showError(msg, $("input"));
+                                $('#login').removeAttr('disabled');
+                                // captchaObj.reset();
+                            }
+                        },
+                        error: function (result) {
+                            showError('内部程序错误', null);
+                            $('#login').removeAttr('disabled');
+                        }
+                    });
+                })
+            });
         }
     });
 }