Procházet zdrojové kódy

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

zhangyin před 8 roky
rodič
revize
98875dfc20
36 změnil soubory, kde provedl 1383 přidání a 1447 odebrání
  1. 3 0
      .babelrc
  2. 1 2
      modules/ration_repository/models/repository_map.js
  3. 31 0
      modules/users/controllers/boot_controller.js
  4. 75 0
      modules/users/controllers/login_controller.js
  5. 93 0
      modules/users/controllers/user_controller.js
  6. 0 85
      modules/users/controllers/users_controller.js
  7. 202 0
      modules/users/models/user_model.js
  8. 0 49
      modules/users/models/users.js
  9. 18 0
      modules/users/routes/boot_route.js
  10. 24 0
      modules/users/routes/login_route.js
  11. 19 0
      modules/users/routes/user_route.js
  12. 0 37
      modules/users/routes/users_route.js
  13. 6 2
      package.json
  14. 27 11
      server.js
  15. 6 0
      web/building_saas/fee_rates/fee_rate.js
  16. 3 195
      web/building_saas/main/html/main.html
  17. 3 14
      web/building_saas/main/js/main.js
  18. 35 14
      web/building_saas/main/js/models/bills.js
  19. 36 0
      web/building_saas/main/js/models/fee_rate.js
  20. 1 0
      web/building_saas/main/js/models/main_consts.js
  21. 1 0
      web/building_saas/main/js/models/project.js
  22. 27 0
      web/building_saas/main/js/views/project_info.js
  23. 198 0
      web/building_saas/main/js/views/project_view.js
  24. 1 0
      web/building_saas/main/js/views/side_tools.js
  25. 23 0
      web/building_saas/main/js/views/std_bills_lib.js
  26. 10 1
      web/building_saas/main/js/views/std_ration_lib.js
  27. 18 0
      web/common/html/header.html
  28. 79 0
      web/users/html/login-infoinput.html
  29. 10 64
      web/users/login.html
  30. 97 0
      web/users/html/user-info.html
  31. 157 0
      web/users/html/user-safe.html
  32. 101 0
      web/users/js/login.js
  33. 78 0
      web/users/js/user.js
  34. 0 88
      web/users/login-infoinput.html
  35. 0 296
      web/users/login-welcome.html
  36. 0 589
      web/users/project-management.html

+ 3 - 0
.babelrc

@@ -0,0 +1,3 @@
+{
+  "presets": ["es2015", "stage-2"]
+}

+ 1 - 2
modules/ration_repository/models/repository_map.js

@@ -28,8 +28,7 @@ function createNewLibModel(rationLibObj){
     rst.deleted = false;
     return rst;
 }
-
-rationRepositoryDao = function(){};
+var rationRepositoryDao = function(){};
 
 rationRepositoryDao.prototype.getRealLibName = function(dispName,callback){
     if (callback) {

+ 31 - 0
modules/users/controllers/boot_controller.js

@@ -0,0 +1,31 @@
+/**
+ * 引导页相关控制器
+ *
+ * @author CaiAoLin
+ * @date 2017/6/12
+ * @version
+ */
+let UserModel = require("../models/user_model");
+
+class BootController {
+
+    /**
+     * 引导页
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    boot(request, response) {
+        let userModel = new UserModel();
+        let renderData = {
+            provinceList: userModel.province,
+            companyTypeList: userModel.companyType,
+            companyScaleList: userModel.companyScale
+        };
+        response.render('users/html/login-infoinput', renderData);
+    }
+
+}
+
+module.exports = BootController;

+ 75 - 0
modules/users/controllers/login_controller.js

@@ -0,0 +1,75 @@
+/**
+ * 登录相关控制器
+ *
+ * @author CaiAoLin
+ * @date 2017/6/8
+ * @version
+ */
+let Request = require('request');
+let UserModel = require("../models/user_model");
+
+class LoginController {
+
+    /**
+     * 登录页面
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    index(request, response) {
+        response.render('users/html/login', {});
+    }
+
+    /**
+     * 登录操作
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {string}
+     */
+    async login(request, response) {
+        let account = request.body.account;
+        let password = request.body.pw;
+        let userExist = true;
+
+        try {
+            // 调用接口验证登录信息
+            let userModel = new UserModel();
+            let responseData = await userModel.getInfoFromSSO(account, password);
+            responseData = JSON.parse(responseData);
+            if (typeof responseData !== 'object') {
+                throw '邮箱/手机 或 密码错误';
+            }
+
+            if (responseData.length <= 0) {
+                throw '接口返回数据错误';
+            }
+
+            // 正确登录后 存入session
+            let userData = responseData[0];
+            let sessionUser = {
+                ssoId: userData.id,
+                username: userData.username,
+                email: userData.useremail,
+                mobile: userData.mobile
+            };
+            request.session.sessionUser = sessionUser;
+            // 记录用户数据到数据库
+            let [result, exist] = await userModel.markUser(sessionUser);
+            userExist = exist;
+
+            if (!result) {
+                throw '标记用户信息失败!';
+            }
+
+        } catch (error) {
+            return response.json({error: 1, msg: error});
+        }
+
+        response.json({error: 0, msg: '', exist: userExist ? 1 : 0});
+    }
+
+}
+
+module.exports = LoginController;

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

@@ -0,0 +1,93 @@
+/**
+ * 用户相关控制器
+ *
+ * @author CaiAoLin
+ * @date 2017/6/13
+ * @version
+ */
+import UserModel from "../models/user_model";
+
+class UserController {
+
+    /**
+     * 用户信息页面
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async info(request, response) {
+        // 获取当前用户数据
+        let sessionUser = request.session.sessionUser;
+        let userModel = new UserModel();
+        let userData = await userModel.findDataByName(sessionUser.username);
+        userData = userData.length <= 0 ? [] : userData[0];
+
+        let renderData = {
+            userData: userData,
+            provinceList: userModel.province,
+            companyTypeList: userModel.companyType,
+            companyScaleList: userModel.companyScale
+        };
+        response.render('users/html/user-info', renderData);
+    }
+
+    /**
+     * 保存个人数据
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return
+     */
+    async saveData(request, response) {
+        try {
+            if (request.body.real_name === undefined || request.body.real_name === '' ||
+                request.body.province === undefined || request.body.province === '' ||
+                request.body.company === undefined || request.body.company === '') {
+                throw '缺少数据';
+            }
+            let updateData = {
+                real_name: request.body.real_name,
+                province: request.body.province,
+                company: request.body.company,
+                company_type: request.body.company_type,
+                company_scale: request.body.company_scale
+            };
+            let sessionUser = request.session.sessionUser;
+
+            let userModel = new UserModel();
+            let condition = {email: sessionUser.email};
+            let result = await userModel.updateUser(condition, updateData);
+            if (result.ok !== 1) {
+                throw '用户数据保存失败';
+            }
+        } catch (error) {
+            return response.redirect(request.headers.referer);
+        }
+
+        response.redirect('/pm');
+    }
+
+    /**
+     * 账号安全页面
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async safe(request, response) {
+        // 获取当前用户信息
+        let sessionUser = request.session.sessionUser;
+        let userModel = new UserModel();
+        let userData = await userModel.findDataByName(sessionUser.username);
+        userData = userData.length <= 0 ? [] : userData[0];
+
+        let renderData = {
+            userData: userData,
+        };
+        response.render('users/html/user-safe', renderData);
+    }
+
+}
+
+export default UserController;

+ 0 - 85
modules/users/controllers/users_controller.js

@@ -1,85 +0,0 @@
-var ut = require('../models/users');
-var rq = require('request');
-var online = true;
-
-module.exports = {
-    userLogin: function (req, res) {
-        var account = req.body.account;
-        var pw = req.body.pw;
-
-        if (online) {
-            rq.post(
-                {
-                    url: 'http://sso.smartcost.com.cn/api/jzlogin',
-                    form: {username: account, userpasswd: pw},
-                    encoding: 'utf8'
-                },
-                function (err, response, userData) {
-                    if (response.statusCode !== 200) {
-                        res.json({state: false, error: '通行证验证失败!出错代号:' + response.statusCode});
-                    } else {
-                        switch (userData) {
-                            case '-2':
-                                res.json({state: false, error: '密码错误!'});
-                                break;
-                            case '-22':
-                                res.json({state: false, error: '输入的邮箱/手机无效!'});
-                                break;
-                            default:
-                                userData = JSON.parse(userData);
-                                req.session.userID = userData[0].id;
-                                req.session.userAccount = userData[0].username;
-                                req.session.userEmail = userData[0].useremail;
-                                req.session.userMobile = userData[0].mobile;
-                                res.json({state: true, data: userData});
-                        }
-
-                    }
-                }
-            );
-        }
-        else {
-            ut.findUser(account, pw, function (err, userData) {
-                if (err) {
-                    res.json({state: false, error: err});
-                }
-                else {
-                    req.session.userID = userData[0].profile.id;
-                    req.session.userName = userData[0].profile.userName;
-                    req.session.userAccount = userData[0].profile.userAccount;
-                    req.session.userEmail = userData[0].profile.useRemail;
-                    req.session.userMobile = userData[0].profile.Mobile;
-                    res.json({state: true, data: userData});
-                }
-                ;
-            })
-        }
-    },
-
-    userReg: function (req, res) {
-        var account = req.body.account;
-        var pw = req.body.pw;
-        var name = req.body.name;
-
-        ut.checkAccount(account, function (userData) {
-            if (!userData) {  // 找不到用户,则注册
-                ut.addUser(account, pw, name, function (err) {
-                    if (err) {
-                        res.json({state: false, error: '“注册失败,原因:' + err});
-                    }
-                    else {
-                        res.json({state: true});
-                    }
-                });
-            }
-            else {  // 找到用户,则提示
-                res.json({state: false, error: '“' + account + '”已存在!'});
-            }
-            ;
-        })
-    }
-
-}
-
-
-

+ 202 - 0
modules/users/models/user_model.js

@@ -0,0 +1,202 @@
+/**
+ * 用户数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/6/9
+ * @version
+ */
+let mongoose = require("mongoose");
+let dbm = require("../../../config/db/db_manager");
+let Request = require("request");
+
+class UserModel {
+
+    /**
+     * 模型
+     *
+     * @var {object}
+     */
+    model = null;
+
+    /**
+     * 构造函数
+     *
+     * @return {void}
+     */
+    constructor() {
+        let umDB = dbm.getCfgConnection("usersManages");
+        let usersSchema = new mongoose.Schema({
+            username: String,
+            email: String,
+            mobile: String,
+            real_name: String,
+            company: String,
+            province: Number,
+            company_type: Number,
+            company_scale: Number,
+            last_login: Number,
+            create_time: Number
+        });
+        this.model = umDB.model('users', usersSchema);
+    }
+
+    /**
+     * 企业所在地区
+     *
+     * @var {object}
+     */
+    province = ['广东省', '北京市'];
+
+    /**
+     * 企业类型
+     *
+     * @var
+     */
+    companyType = ['设计', '施工'];
+
+    /**
+     * 企业类型
+     *
+     * @var
+     */
+    companyScale = ['1-20', '20-50', '50-100', '100+'];
+
+    /**
+     * 根据用户名密码调用SSO接口获取信息
+     *
+     * @param {string} username
+     * @param {string} password
+     * @return {object}
+     */
+    async getInfoFromSSO(username, password) {
+        let postData = {
+            url: 'http://sso.smartcost.com.cn/api/jzlogin',
+            form: {username: username, userpasswd: password},
+            encoding: 'utf8'
+        };
+        return new Promise(function (resolve, reject) {
+            try {
+                // 请求接口
+                Request.post(postData, function (err, postResponse, body) {
+                    if (err) {
+                        throw '请求错误';
+                    }
+                    if (postResponse.statusCode !== 200) {
+                        throw '通行证验证失败!';
+                    }
+                    resolve(body);
+                });
+            } catch (error) {
+                reject([]);
+            }
+        });
+    }
+
+    /**
+     * 标记用户
+     *
+     * @param {object} userData
+     * @return {Promise}
+     */
+    async markUser(userData) {
+        let userDataFromDb = await this.findDataByName(userData.username);
+        let result = false;
+        // 信息是否补全
+        let info = false;
+        if (userDataFromDb.length <= 0) {
+            // 不存在用户则入库
+            result = await this.addUser(userData);
+        } else {
+            // 存在则更新用户信息
+            let updateData = {last_login: new Date().getTime()};
+            let condition = {email: userData.email};
+            result = await this.updateUser(condition, updateData);
+
+            userDataFromDb = userDataFromDb[0];
+            info = userDataFromDb.real_name !== undefined && userDataFromDb.real_name !== '';
+            result = result.ok === 1;
+        }
+
+        return [result, info];
+    }
+
+    /**
+     * 根据用户名查找数据
+     *
+     * @param {string} username
+     * @return {object}
+     */
+    findDataByName(username) {
+        let self = this;
+        return new Promise(function (resolve, reject) {
+            self.model.find({username: username}, function (error, data) {
+                if (error) {
+                    console.log(error);
+                    reject([]);
+                } else {
+                    resolve(data);
+                }
+            });
+        });
+    }
+
+    /**
+     * 新增用户
+     *
+     * @param {object} userData
+     * @return {Promise}
+     */
+    addUser(userData) {
+        let insertData = {
+            username: userData.username,
+            email: userData.email,
+            mobile: userData.mobile,
+            real_name: '',
+            company: '',
+            province: -1,
+            company_type: -1,
+            company_scale: -1,
+            last_login: 0,
+            create_time: new Date().getTime()
+        };
+        let userModel = new this.model(insertData);
+        return new Promise(function (resolve, reject) {
+            userModel.save(function (error) {
+                if (error) {
+                    console.log(error);
+                    reject(false);
+                } else {
+                    resolve(true);
+                }
+            });
+        });
+    }
+
+    /**
+     * 更新用户数据
+     *
+     * @param {object} updateData
+     * @return {Promise}
+     */
+    updateUser(condition, updateData) {
+        if (Object.keys(condition).length <= 0 || Object.keys(updateData).length <= 0) {
+            return null;
+        }
+        let self = this;
+        return new Promise(function(resolve, reject) {
+            self.model.update(condition, {$set: updateData}, function(error, result) {
+                if (error) {
+                    reject(false);
+                } else {
+                    resolve(result);
+                }
+            });
+        });
+
+
+
+    }
+
+}
+
+module.exports = UserModel;

+ 0 - 49
modules/users/models/users.js

@@ -1,49 +0,0 @@
-//*/
-var mongoose = require("mongoose");
-
-var dbm = require("../../../config/db/db_manager");
-var umDB = dbm.getCfgConnection("usersManages");
-var usersSchema = new mongoose.Schema({ account: String, pw: String, name: String });
-var usersModel = umDB.model('users', usersSchema);
-/*/
-var umDB = require('./umDB');
-var usersSchema = new umDB.mongoose.Schema({ account: String, pw: String, name: String });
-var usersModel = umDB.mongoose.model('users', usersSchema);
-//*/
-
-var usersData = function(){};
-
-usersData.prototype.findUser = function(account, pw, controllerFun){
-    usersModel.find({"account": account, "pw": pw}, function(err, data){
-        if(data.length){
-            controllerFun(0, data[0]);
-        }
-        else{
-            controllerFun('用户名或密码错误!', 0);
-        }
-    })
-};
-
-usersData.prototype.checkAccount = function(account, controllerFun){
-    usersModel.find({"account": account}, function(err, data){
-        if(data.length){
-            controllerFun(data[0]);
-        }
-        else{
-            controllerFun(0);
-        }
-    })
-};
-
-usersData.prototype.addUser = function(account, pw, name, controllerFun){
-    var user = new usersModel({account: account, pw: pw, name: name});
-    user.save(function (err) {
-        if (err) {
-            controllerFun(err);
-        } else {
-            controllerFun(0);
-        }
-    });
-};
-
-module.exports = new usersData();

+ 18 - 0
modules/users/routes/boot_route.js

@@ -0,0 +1,18 @@
+/**
+ * 控制面板相关路由分发
+ *
+ * @author CaiAoLin
+ * @date 2017/6/12
+ * @version
+ */
+
+let express = require('express');
+let router = express.Router();
+let BootController = require('../controllers/boot_controller');
+
+let bootController = new BootController();
+
+// 引导页面
+router.get('/:province', bootController.boot);
+
+module.exports = router;

+ 24 - 0
modules/users/routes/login_route.js

@@ -0,0 +1,24 @@
+/**
+ * 登录路由分发
+ *
+ * @author CaiAoLin
+ * @date 2017/6/1
+ * @version
+ */
+let express = require('express');
+let router = express.Router();
+let LoginController = require('../controllers/login_controller');
+let loginController = new LoginController();
+
+// 登录页面action
+router.get('/login', loginController.index);
+
+// 登录操作
+router.post('/login', loginController.login);
+
+router.get("/logout", function (req, res) {
+    delete req.session.sessionUser;
+    res.redirect("/");
+});
+
+module.exports = router;

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

@@ -0,0 +1,19 @@
+/**
+ * 用户相关路由
+ *
+ * @author CaiAoLin
+ * @date 2017/6/13
+ * @version
+ */
+import Express from "express";
+import UserController from "../controllers/user_controller";
+
+const router = Express.Router();
+const userController = new UserController();
+
+// action定义区域
+router.get('/info', userController.info);
+router.get('/safe', userController.safe);
+router.post('/info', userController.saveData);
+
+module.exports = router;

+ 0 - 37
modules/users/routes/users_route.js

@@ -1,37 +0,0 @@
-var express = require('express');
-var path = require('path');
-var router = express.Router();
-var uc = require('../controllers/users_controller');
-
-var htmlPath = path.join(__dirname,'../../../','web/users/');
-
-router.get('/', function(req, res) {
-    if(!req.session.userAccount){
-        res.redirect('/login');
-    }
-    else{
-        res.redirect('/pm');
-    }
-});
-
-router.get('/login', function(req, res) {
-  res.render('users/login', {});
-});
-
-router.post('/login', uc.userLogin);
-
-router.get('/reg', function(req, res, next) {
-  res.render('reg',{});
-});
-
-router.post('/reg', uc.userReg);
-
-router.get("/logout",function(req,res){
-    delete req.session.userID;
-    delete req.session.userAccount;
-    delete req.session.userEmail;
-    delete req.session.userMobile;
-    res.redirect("/");
-});
-
-module.exports = router;

+ 6 - 2
package.json

@@ -4,6 +4,9 @@
   "description": "Smart Soft - Construct Cost",
   "devDependencies": {
     "body-parser": "^1.13.2",
+    "babel-cli": "^6.24.1",
+    "babel-preset-es2015": "^6.24.1",
+    "babel-preset-stage-2": "^6.24.1",
     "express": "^4.13.1",
     "mongoose": "^4.8.5",
     "async": "^2.1.5",
@@ -14,13 +17,14 @@
     "express-session": "^1.15.1",
     "request": "^2.79.0",
     "tape": "^4.6.3",
-    "nodemon": "^1.11.0"
+    "nodemon": "^1.11.0",
+    "lodash": "^3.10.1"
   },
   "dependencies": {
     "bluebird": "^3.5.0",
     "jszip": "^3.1.3"
   },
-  "scripts" :{
+  "scripts": {
     "start": "nodemon server.js"
   }
 }

+ 27 - 11
server.js

@@ -38,20 +38,36 @@ app.use(session({
     //*/
 }));
 
+// 登录状态全局判断
 app.use(function (req, res, next) {
-    let url = req.originalUrl, referer;
-    if (!/^\/login/.test(req.originalUrl) && !req.session.userAccount) {
-        if (/\/api/.test(req.originalUrl)) {
-            referer = URL.parse(req.headers.referer);
-            return res.redirect('/login' + '?referer=' + referer.path);
-        } else {
-            return res.redirect("/login" + '?referer=' + req.originalUrl);
+    let url = req.originalUrl;
+    // @todo 上一个页面跳转
+    let referer = '';
+    if (/^\/login/.test(url)) {
+        // 如果是登录页面则忽略判断数据
+        next();
+    } else {
+        try {
+            // 判断session
+            let sessionUser = req.session.sessionUser;
+            if (!sessionUser) {
+                throw 'session error';
+            }
+
+            res.locals.sessionUser = sessionUser;
+        } catch (error) {
+            return res.redirect('/login');
         }
+
+        next();
     }
-    next();
 });
 
-app.use('/', require('./modules/users/routes/users_route'));
+// 用户相关路由区域
+app.use('/', require("./modules/users/routes/login_route"));
+app.use('/boot', require("./modules/users/routes/boot_route"));
+app.use('/user', require("./modules/users/routes/user_route"));
+
 app.use('/feeRates', require('./modules/fee_rates/routes/fee_rates_route'));
 
 app.get('/template/bills', function (req, res) {
@@ -71,7 +87,7 @@ app.use('/template/bills/api', function (req, res, next) {
     let checkAdmin = function (userAccount) {
         return true;
     }
-    if (checkAdmin(req.session.userAccount)) {
+    if (checkAdmin(req.session.sessionUser)) {
         next();
     } else {
         res.json({error: 1, message: '对不起,您无权限操作清单模板。', data: null});
@@ -118,7 +134,7 @@ app.use('/glj', GLJ_Router);
 //app.use("/rationLibEditor",rations_Router);
 
 app.get("/stdBillsmain", function(req, res){
-    if(!req.session.userAccount){
+    if(!req.session.sessionUser){
         res.redirect('/login');
     }
     else {

+ 6 - 0
web/building_saas/fee_rates/fee_rate.js

@@ -186,3 +186,9 @@ function createSpreadView(canEdit) {
 }
 
 
+var feeRateObj = {
+    getFeeRate: function (){
+
+
+    }
+}

+ 3 - 195
web/building_saas/main/html/main.html

@@ -508,6 +508,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/bills.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/ration.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/glj.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/fee_rate.js"></script>
 
     <script type="text/javascript" src="/public/web/id_tree.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
@@ -518,6 +519,8 @@
     <!-- Test Data -->
     <script type="text/javascript" src="/test/tmp_data/bills_grid_setting.js"></script>
     <!-- view -->
+    <script type="text/javascript" src="/web/building_saas/main/js/views/project_info.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/project_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/main_ajax.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/main.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/controllers/project_controller.js"></script>
@@ -592,199 +595,4 @@
   	</SCRIPT>
     <script type="text/javascript" src="/web/building_saas/main/js/views/gljView.js"></script>
 </body>
-<script>
-
-    var project;
-    var controller;
-    var billsSpread;
-
-    $(document).ready(function () {
-        GC.Spread.Common.CultureManager.culture("zh-cn");
-
-        billsSpread = new GC.Spread.Sheets.Workbook($('#billsSpread')[0], { sheetCount: 1 });
-        billsSpread.options.tabStripVisible = false;
-        billsSpread.options.scrollbarMaxAlign = true;
-        billsSpread.options.allowUserDragDrop = false;
-        billsSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.single);
-
-        // For Test
-        /*datas.forEach(function (data) {
-            data.fees = [];
-            data.fees.push({fieldName: 'labour', unitFee: '1', totalFee: '2', tenderUnitFee: '3', tenderTotalFee: '4'});
-            data.flags = [];
-            data.flags.push({fieldName: 'isPartGather', flag: true});
-        });
-        drawing_data.forEach(function (data) {
-            data.fees = [];
-            data.fees.push({fieldName: 'machine', unitFee: '5', totalFee: '6', tenderUnitFee: '7', tenderTotalFee: '8'});
-            data.flags = [];
-            data.flags.push({fieldName: 'isPartGather', flag: false});
-        });*/
-
-        project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), userID);
-        project.loadDatas(function (err) {
-            if (!err) {
-                controller = TREE_SHEET_CONTROLLER.createNew(project.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
-
-                controller.showTreeData();
-                controller.bind('refreshBaseActn', function (tree) {
-                    var setButtonValid = function (valid, btn) {
-                        if (valid) {
-                            btn.removeClass('disabled');
-                        } else {
-                            btn.addClass('disabled');
-                        }
-                    };
-                    setButtonValid(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
-                    setButtonValid(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
-                    setButtonValid(tree.selected && tree.selected.canUpMove(), $('#upMove'));
-                    setButtonValid(tree.selected && tree.selected.canDownMove(), $('#downMove'));
-                    setButtonValid(tree.selected ? true : false, $('#delete'));
-                });
-
-                gljView.showDatas(project.GLJ.datas);
-//                alert('GLJDatas1:' + objTest(project.GLJ.datas[0]));
-            }
-            else {
-
-            }
-        });
-
-        $.contextMenu({
-            selector: '#billsSpread',
-            build: function ($trigger, e) {
-                var target = SheetDataHelper.safeRightClickSelection($trigger, e, billsSpread);
-                controller.setTreeSelected(controller.tree.items[target.row]);
-                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
-            },
-            items: {
-                "insertBills": {
-                    name: "插入清单",
-                    icon: 'fa-sign-in',
-                    disabled: function () {
-                        return project.mainTree.selected ? project.mainTree.selected.sourceType !== project.Bills.getSourceType() : false;
-                    },
-                    callback: function (key, opt) {
-                        ProjectController.addBills(project, controller);
-                    }
-                },
-                "insertRation": {
-                    name: "插入定额",
-                    icon: 'fa-sign-in',
-                    disabled: function () {
-                        var selected = project.mainTree.selected;
-                        if (selected) {
-                            if (selected.sourceType === project.Ration.getSourceType()) {
-                                return false;
-                            } else if (selected.sourceType === project.Bills.getSourceType()) {
-                                return selected.source.children.length !== 0;
-                            };
-                        } else {
-                            return true;
-                        }
-                    },
-                    callback: function (key, opt) {
-                        ProjectController.addRation(project, controller);
-                    }
-                },
-                "insertLJ": {
-                    name: "插入量价",
-                    icon: 'fa-sign-in',
-                    disabled: function () {
-                        var selected = project.mainTree.selected;
-                        if (selected) {
-                            if (selected.sourceType === project.Ration.getSourceType()) {
-                                return false;
-                            } else if (selected.sourceType === project.Bills.getSourceType()) {
-                                return selected.source.children.length !== 0;
-                            };
-                        } else {
-                            return true;
-                        }
-                    }
-                },
-                "spr1": '--------',
-                "delete": {
-                    name: '删除',
-                    icon: 'fa-remove',
-                    disabled: function () {
-                        var selected = project.mainTree.selected;
-                        return !selected;
-                    },
-                    callback: function () {
-                        var selected = controller.tree.selected;
-                        if (selected) {
-                            if (selected.sourceType === project.Bills.getSourceType()) {
-                                project.Bills.deleteBills(selected.source);
-                                controller.delete();
-                            };
-                        }
-
-                    }
-                }
-            }
-        });
-
-        $('#insert').click(function () {
-            var selected = controller.tree.selected;
-
-            if (!selected || selected.sourceType === project.Bills.getSourceType()) {
-                ProjectController.addBills(project, controller);
-            } else if (selected.sourceType === project.Ration.getSourceType()) {
-                ProjectController.addRation(project, controller);
-            }
-        });
-        $('#delete').click(function () {
-            var selected = controller.tree.selected;
-            if (selected) {
-                if (selected.sourceType === project.Bills.getSourceType()) {
-                    project.Bills.deleteBills(selected.source);
-                    controller.delete();
-                } else if (selected.sourceType === project.Ration.getSourceType()) {
-                    project.Ration.delete(selected.source);
-                    controller.delete();
-                };
-            }
-        });
-        $('#upLevel').click(function () {
-            console.log(project.Bills.tree.getInsertData(project.Bills.tree.selected.getParentID(), project.Bills.tree.selected.getNextSiblingID()));
-            var selected = controller.tree.selected;
-            if (selected && selected.sourceType === project.Bills.getSourceType()) {
-                selected.source.upLevel();
-                controller.upLevel();
-            }
-        });
-        $('#downLevel').click(function () {
-            var selected = controller.tree.selected;
-            if (selected && selected.sourceType === project.Bills.getSourceType()) {
-                selected.source.upLevel();
-                controller.downLevel();
-            }
-        });
-        $('#upMove').click(function () {
-            var selected = controller.tree.selected, pre, preSerialNo;
-            if (selected) {
-                if (selected.sourceType === project.Bills.getSourceType()) {
-                    selected.source.upLevel();
-                    controller.upMove();
-                } else if (selected.sourceType === project.Ration.getSourceType()) {
-                    project.Ration.changePos(selected.source, selected.preSibling.source);
-                    controller.upMove();
-                }
-            }
-        });
-        $('#downMove').click(function () {
-            var selected = controller.tree.selected, next, nextSerialNo;
-            if (selected) {
-                if (selected.sourceType === project.Bills.getSourceType()) {
-                    selected.source.downLevel();
-                    controller.downMove();
-                } else if (selected.sourceType === project.Ration.getSourceType()) {
-                    project.Ration.changePos(selected.source, selected.nextSibling.source);
-                    controller.downMove();
-                }
-            }
-        });
-    });
-</script>
 </html>

+ 3 - 14
web/building_saas/main/js/main.js

@@ -3,18 +3,7 @@
  */
 
 $(function () {
-    var getFullPathHtml = function (proj) {
-        var fullPath = [], i, pm = '<a href="/pm">项目管理</a>', angleRight = '<i class="fa fa-angle-right fa-fw"></i>';
-        fullPath.push(pm);
-        for (i = 0; i < proj.fullFolder.length; i++) {
-            fullPath.push(angleRight, proj.fullFolder[i]);
-        }
-        fullPath.push(angleRight, proj.name);
-        return fullPath.join('');
-    };
-    CommonAjax.post('/pm/api/getProject', {"user_id": userID, "proj_id": scUrlUtil.GetQueryString('project')}, function (data) {
-        if (data) {
-            $('#fullpath').html(getFullPathHtml(data));
-        }
-    });
+    projectInfoObj.showProjectInfo();
+    projectObj.checkMainSpread();
+    projectObj.loadProjectData();
 });

+ 35 - 14
web/building_saas/main/js/models/bills.js

@@ -9,15 +9,16 @@ var Bills = {
             pid: 'ParentID',
             nid: 'NextSiblingID',
             rootId: -1,
-            autoUpdate: false
+            autoUpdate: true
         };
 
         // 用户定义private方法
         var tools = {
-            coverseTreeUpdateData: function (datas) {
+            coverseTreeUpdateData: function (datas, projectID) {
                 var updateDatas = [];
                 datas.forEach(function (data) {
                     var updateData = {};
+                    data.data.projectID = projectID;
                     if (data.type === idTree.updateType.new) {
                         updateData.updateType = 'ut_create';
                         updateData.updateData = data.data;
@@ -108,47 +109,67 @@ var Bills = {
 
         bills.prototype.insertBills = function (parentId, nextSiblingId) {
             var insertData = this.tree.getInsertData(parentId, nextSiblingId);
-            var that = this;
+            var that = this, newData = null;
             insertData.forEach(function (data) {
-                data.data.projectID = that.project.ID();
                 if (data.type === idTree.updateType.new) {
-                    that.datas.push(data.data);
+                    newData = data.data;
                 }
             });
             this.project.pushNow('insertBills', [this.getSourceType(), this.project.projCounter()],
-                [ tools.coverseTreeUpdateData(insertData), this.getCounterData()]);
+                [ tools.coverseTreeUpdateData(insertData, this.project.ID()), this.getCounterData()]);
             //project.pushNow('insertBills', ModuleNames.bills, tools.coverseTreeUpdateData(insertData));
 
+            this.datas.push(newData);
             return this.tree.insert(parentId, nextSiblingId);
         };
-
         bills.prototype.insertStdBills = function (parentId, nextSiblingId, stdBillsData) {
             var insertData = this.tree.getInsertData(parentId, nextSiblingId);
             var newData = null, that = this;
             insertData.forEach(function (data) {
-                data.data.projectID = that.project.ID();
                 if (data.type === idTree.updateType.new) {
                     data.data.code = stdBillsData.code;
                     data.data.name = stdBillsData.name;
                     data.data.unit = stdBillsData.unit;
-                    that.datas.push(data.data);
                     newData = data.data;
                 }
             });
             this.project.pushNow('insertStdBills', [this.getSourceType(), this.project.projCounter()],
-                [ tools.coverseTreeUpdateData(insertData), this.getCounterData()]);
-            //project.pushNow('insertStdBills', ModuleNames.bills, tools.coverseTreeUpdateData(insertData));
+                [ tools.coverseTreeUpdateData(insertData, this.project.ID()), this.getCounterData()]);
 
+            this.datas.push(newData);
             return this.tree.insertByData(newData, parentId, nextSiblingId);
-        }
-
+        };
         bills.prototype.deleteBills = function (node) {
             var deleteData = this.tree.getDeleteData(node);
             project.beginUpdate('deleteBills');
-            project.push(ModuleNames.bills, tools.coverseTreeUpdateData(deleteData, project.ID()));
+            project.push(ModuleNames.bills, tools.coverseTreeUpdateData(deleteData, this.project.ID()));
             project.endUpdate();
 
             return this.tree.delete(node);
+        };
+        bills.prototype.upMoveBills = function (node) {
+            var upMoveData = node.getUpMoveData();
+            project.pushNow('upMoveBills', this.getSourceType(), tools.coverseTreeUpdateData(upMoveData, this.project.ID()));
+
+            return node.upMove();
+        };
+        bills.prototype.downMoveBills = function (node) {
+            var downMoveData = node.getDownMoveData();
+            project.pushNow('downMoveBills', this.getSourceType(), tools.coverseTreeUpdateData(downMoveData, this.project.ID()));
+
+            return node.downMove();
+        };
+        bills.prototype.upLevelBills = function (node) {
+            var upLevelData = node.getUpLevelData();
+            project.pushNow('upLevelBills', this.getSourceType(), tools.coverseTreeUpdateData(upLevelData, this.project.ID()));
+
+            return node.upLevel();
+        };
+        bills.prototype.downLevelBills = function (node) {
+            var downLevelData = node.getDownLevelData();
+            project.pushNow('downLevelBills', [this.getSourceType()], [tools.coverseTreeUpdateData(downLevelData, this.project.ID())]);
+
+            return node.downLevel();
         }
 
         return new bills(project);

+ 36 - 0
web/building_saas/main/js/models/fee_rate.js

@@ -0,0 +1,36 @@
+/**
+ * Created by CSL on 2017-06-20.
+ */
+//var ModuleNames = require('./main_consts.js');
+
+var FeeRate = {
+    createNew: function (project) {
+
+        function FeeRate(proj){
+            this.project = proj;
+            this.datas = null;
+            this.sourceType = ModuleNames.feeRate;
+            proj.registerModule(ModuleNames.feeRate, this);
+        };
+
+        FeeRate.prototype.loadData = function (datas) {
+            this.datas = datas;
+        };
+
+        FeeRate.prototype.getRate = function (fileID, rateID){
+
+            return 1.25;
+        }
+
+        var feeRate = new FeeRate(project);
+        return feeRate;
+    }
+};
+
+// for test
+/*
+var f = -1;
+var fr = FeeRate.createNew(null);
+f = fr.getRate();
+console.log(fr.sourceType);
+console.log(f);*/

+ 1 - 0
web/building_saas/main/js/models/main_consts.js

@@ -5,5 +5,6 @@ const ModuleNames = {
     bills: 'bills',
     ration: 'ration',
     GLJ: 'GLJ',
+    feeRate: 'feeRate',
     projectGLJ: 'projectGLJ'
 };

+ 1 - 0
web/building_saas/main/js/models/project.js

@@ -58,6 +58,7 @@ var PROJECT = {
             this.Bills = Bills.createNew(this);
             this.Ration = Ration.createNew(this);
             this.GLJ = GLJ.createNew(this);
+            this.FeeRate = FeeRate.createNew(this);
 
             this.masterField = {ration: 'billsItemID'};
         };

+ 27 - 0
web/building_saas/main/js/views/project_info.js

@@ -0,0 +1,27 @@
+/**
+ * Created by Mai on 2017/6/21.
+ */
+
+var projectInfoObj = {
+    projectInfo: null,
+    getFullPathHtml: function (proj) {
+        var fullPath = [], i, pm = '<a href="/pm">项目管理</a>', angleRight = '<i class="fa fa-angle-right fa-fw"></i>';
+        if (proj && proj.fullFolder) {
+            for (i = 0; i < proj.fullFolder.length; i++) {
+                fullPath.push(angleRight, proj.fullFolder[i]);
+            }
+            fullPath.push(angleRight, proj.name);
+        }
+        fullPath.push(pm);
+        return fullPath.join('');
+    },
+    showProjectInfo: function (proj) {
+        var that = this;
+        CommonAjax.post('/pm/api/getProject', {"user_id": userID, "proj_id": scUrlUtil.GetQueryString('project')}, function (data) {
+            if (data) {
+                that.projectInfo = data;
+                $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
+            }
+        });
+    }
+};

+ 198 - 0
web/building_saas/main/js/views/project_view.js

@@ -0,0 +1,198 @@
+/**
+ * Created by Mai on 2017/6/21.
+ */
+
+var projectObj = {
+    project: null,
+    mainSpread: null,
+    mainController: null,
+    checkMainSpread: function () {
+        if (!this.mainSpread) {
+            this.mainSpread = SheetDataHelper.createNewSpread($('#billsSpread')[0]);
+            this.mainSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.single);
+        }
+    },
+    refreshMainSpread: function () {
+        if (this.mainSpread) {
+            this.mainSpread.refresh();
+        }
+    },
+    loadProjectData: function () {
+        var that = this;
+        this.project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), userID);
+        this.project.loadDatas(function (err) {
+            if (!err) {
+                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), BillsGridSetting);
+
+                that.mainController.showTreeData();
+                that.mainController.bind('refreshBaseActn', function (tree) {
+                    var setButtonValid = function (valid, btn) {
+                        if (valid) {
+                            btn.removeClass('disabled');
+                        } else {
+                            btn.addClass('disabled');
+                        }
+                    };
+                    setButtonValid(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
+                    setButtonValid(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
+                    setButtonValid(tree.selected && tree.selected.canUpMove(), $('#upMove'));
+                    setButtonValid(tree.selected && tree.selected.canDownMove(), $('#downMove'));
+                    setButtonValid(tree.selected ? true : false, $('#delete'));
+                });
+
+                that.loadMainSpreadContextMenu();
+            }
+            else {
+
+            }
+        });
+    },
+    loadMainSpreadContextMenu: function () {
+        var project = this.project, spread = this.mainSpread, controller = this.mainController;
+        $.contextMenu({
+            selector: '#billsSpread',
+            build: function ($trigger, e) {
+                var target = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
+                controller.setTreeSelected(controller.tree.items[target.row]);
+                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+            },
+            items: {
+                "insertBills": {
+                    name: "插入清单",
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        return project.mainTree.selected ? project.mainTree.selected.sourceType !== project.Bills.getSourceType() : false;
+                    },
+                    callback: function (key, opt) {
+                        ProjectController.addBills(project, controller);
+                    }
+                },
+                "insertRation": {
+                    name: "插入定额",
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var selected = project.mainTree.selected;
+                        if (selected) {
+                            if (selected.sourceType === project.Ration.getSourceType()) {
+                                return false;
+                            } else if (selected.sourceType === project.Bills.getSourceType()) {
+                                return selected.source.children.length !== 0;
+                            };
+                        } else {
+                            return true;
+                        }
+                    },
+                    callback: function (key, opt) {
+                        ProjectController.addRation(project, controller);
+                    }
+                },
+                "insertLJ": {
+                    name: "插入量价",
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var selected = project.mainTree.selected;
+                        if (selected) {
+                            if (selected.sourceType === project.Ration.getSourceType()) {
+                                return false;
+                            } else if (selected.sourceType === project.Bills.getSourceType()) {
+                                return selected.source.children.length !== 0;
+                            };
+                        } else {
+                            return true;
+                        }
+                    }
+                },
+                "spr1": '--------',
+                "delete": {
+                    name: '删除',
+                    icon: 'fa-remove',
+                    disabled: function () {
+                        var selected = project.mainTree.selected;
+                        return !selected;
+                    },
+                    callback: function () {
+                        var selected = controller.tree.selected;
+                        if (selected) {
+                            if (selected.sourceType === project.Bills.getSourceType()) {
+                                project.Bills.deleteBills(selected.source);
+                                controller.delete();
+                            };
+                        }
+
+                    }
+                }
+            }
+        });
+    }
+};
+
+$('#insert').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected;
+
+    if (!selected || selected.sourceType === project.Bills.getSourceType()) {
+        ProjectController.addBills(project, controller);
+    } else if (selected.sourceType === project.Ration.getSourceType()) {
+        ProjectController.addRation(project, controller);
+    }
+});
+$('#delete').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected;
+
+    if (selected) {
+        if (selected.sourceType === project.Bills.getSourceType()) {
+            project.Bills.deleteBills(selected.source);
+            controller.delete();
+        } else if (selected.sourceType === project.Ration.getSourceType()) {
+            project.Ration.delete(selected.source);
+            controller.delete();
+        };
+    }
+});
+$('#upLevel').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected;
+
+    if (selected && selected.sourceType === project.Bills.getSourceType()) {
+        project.Bills.upLevelBills(selected.source);
+        controller.upLevel();
+    }
+});
+$('#downLevel').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected;
+    if (selected && selected.sourceType === project.Bills.getSourceType()) {
+        project.Bills.downLevelBills(selected.source);
+        controller.downLevel();
+    }
+});
+$('#upMove').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected, pre, preSerialNo;
+
+    if (selected) {
+        if (selected.sourceType === project.Bills.getSourceType()) {
+            project.Bills.upMoveBills(selected.source);
+            controller.upMove();
+        } else if (selected.sourceType === project.Ration.getSourceType()) {
+            project.Ration.changePos(selected.source, selected.preSibling.source);
+            controller.upMove();
+        }
+    }
+});
+$('#downMove').click(function () {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected, next, nextSerialNo;
+
+    if (selected) {
+        if (selected.sourceType === project.Bills.getSourceType()) {
+            project.Bills.downMoveBills(selected.source);
+            controller.downMove();
+        } else if (selected.sourceType === project.Ration.getSourceType()) {
+            project.Ration.changePos(selected.source, selected.nextSibling.source);
+            controller.downMove();
+        }
+    }
+});
+

+ 1 - 0
web/building_saas/main/js/views/side_tools.js

@@ -32,4 +32,5 @@ $('.side-tabs ul li a').bind('click', function () {
         sideToolsObj.showSideTools(tab.hasClass('active'));
         tabPanel.hide();
     }
+    projectObj.refreshMainSpread();
 });

+ 23 - 0
web/building_saas/main/js/views/std_bills_lib.js

@@ -12,6 +12,11 @@ var billsLibObj = {
             this.stdBillsSpread = SheetDataHelper.createNewSpread($('#stdBillsSpread')[0]);
         }
     },
+    refreshBillsSpread: function () {
+        if (this.stdBillsSpread) {
+            this.stdBillsSpread.refresh();
+        }
+    },
     checkBillsRelaSpread: function () {
         if (!this.stdBillsJobSpread) {
             this.stdBillsJobSpread = SheetDataHelper.createNewSpread($('#stdBillsJobs')[0]);
@@ -20,6 +25,14 @@ var billsLibObj = {
             this.stdBillsFeatureSpread = SheetDataHelper.createNewSpread($('#stdBillsFeatures')[0]);
         }
     },
+    refreshBillsRelaSpread: function () {
+        if (this.stdBillsJobSpread) {
+            this.stdBillsJobSpread.refresh();
+        }
+        if (this.stdBillsFeatureSpread) {
+            this.stdBillsFeatureSpread.refresh();
+        }
+    },
     loadStdBillsLib: function () {
         CommonAjax.post('/stdBillsEditor/getStdBillsLib', {userId: userID}, function (datas) {
             var i, select = $('#stdBillsLibSelect');
@@ -34,6 +47,7 @@ var billsLibObj = {
         });
     },
     loadStdBills: function (stdBillsLibID) {
+        var that = this;
         var stdBillsJobData, stdBillsFeatureData, stdBills;
         var stdBillsTree  = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true});
         var stdBillsTreeController = TREE_SHEET_CONTROLLER.createNew(stdBillsTree, billsLibObj.stdBillsSpread.getActiveSheet(), billsLibObj.stdBillsTreeSetting);
@@ -115,6 +129,13 @@ var billsLibObj = {
             showBillsRela(stdBillsTree.firstNode());
 
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
+            that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
+                if (stdBillsTree.items[args.row].children.length === 0) {
+                    ProjectController.addBills(projectObj.project, projectObj.mainController, stdBillsTree.items[args.row]);
+                }
+            });
+        }, function () {
+            that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
         });
 
         $('#stdBillsSearch>span>button').click(function () {
@@ -285,6 +306,8 @@ var billsLibObj = {
 $('#stdBillsTab').bind('click', function () {
     $(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-q").height() - 202);
     var select = $('#stdBillsLibSelect');
+    billsLibObj.refreshBillsSpread();
+    billsLibObj.refreshBillsRelaSpread();
     billsLibObj.checkBillsSpread();
     if (select[0].options.length === 0) {
         billsLibObj.loadStdBillsLib();

+ 10 - 1
web/building_saas/main/js/views/std_ration_lib.js

@@ -18,6 +18,14 @@ var rationLibObj = {
             this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
         }
     },
+    refreshSpread: function () {
+        if (this.rationChapterSpread) {
+            this.rationChapterSpread.refresh();
+        }
+        if (this.sectionRationsSpread) {
+            this.sectionRationsSpread.refresh();
+        }
+    },
     loadStdRationLibs: function () {
         CommonAjax.postRationLib('/rationRepository/api/getRationDisplayNames', {user_id: userID}, function (datas) {
             var select = $('#stdRationLibSelect');
@@ -76,7 +84,7 @@ var rationLibObj = {
         var select = $('#stdRationLibSelect'), rationCode = args.sheet.getText(args.row, 0);
         if (rationCode !== '') {
             CommonAjax.postRationLib('/rationRepository/api/getRationItem', {user_id: userID, rationLibId: select.val(), code: rationCode}, function (data) {
-                ProjectController.addRation(project, controller, data);
+                ProjectController.addRation(projectObj.project, projectObj.mainController, data);
             });
         }
     },
@@ -184,6 +192,7 @@ var rationLibObj = {
 $('#stdRationTab').bind('click', function () {
     var select = $('#stdRationLibSelect');
     $(".main-data-side-d").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-d").height() - 202);
+    rationLibObj.refreshSpread();
     rationLibObj.checkSpread();
     if (select[0].options.length === 0) {
         rationLibObj.loadStdRationLibs();

+ 18 - 0
web/common/html/header.html

@@ -0,0 +1,18 @@
+<nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
+    <span class="header-logo px-2">Smartcost</span>
+    <div class="navbar-text"><a href="project-management.html">项目管理</a></div>
+    <div class="float-lg-right navbar-text pt-0">
+        <div class="dropdown d-inline-block">
+            <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%= sessionUser.email %></button>
+            <div class="dropdown-menu dropdown-menu-right">
+                <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
+                <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
+                <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
+            </div>
+        </div>
+        <span class="btn btn-link btn-sm new-msg">
+                  <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
+                </span>
+        <a class="btn btn-link btn-sm" href="/logout">注销</a>
+    </div>
+</nav>

+ 79 - 0
web/users/html/login-infoinput.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>用户信息填写-Smartcost</title>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/building_saas/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+</head>
+
+<body>
+<div class="header">
+    <%include ../../common/html/header.html %>
+</div>
+<div class="container mt-3">
+    <form class="row" method="post" action="/user/info" id="info-form">
+        <div class="col-lg-8 offset-lg-2">
+            <div class="card newuser-input">
+                <div class="card-block">
+                    <h4 class="card-title">在开始使用前,请填写以下信息。</h4>
+                    <h6 class="card-subtitle text-muted">详细填写这些信息,可以让我们更好的服务您。</h6>
+                </div>
+                <div class="card-block">
+                    <div class="form-group">
+                        <input class="form-control" placeholder="你的姓名" name="real_name" id="name">
+                    </div>
+                    <div class="form-group">
+                        <input class="form-control" placeholder="企业名称" name="company" id="company">
+                    </div>
+                    <div class="form-group">
+                        <select class="form-control" name="province" id="province">
+                            <option value="">请选择企业所在地区</option>
+                            <% provinceList.forEach(function(province, index) {%>
+                            <option value="<%= index %>"><%= province %></option>
+                            <% })%>
+                        </select>
+                    </div>
+                    <div class="form-group">
+                        <a class="btn btn-link" data-toggle="collapse" href="#moreinfo" aria-expanded="false"
+                           aria-controls="moreinfo">更多选项</a>
+                    </div>
+                    <div class="collapse" id="moreinfo">
+                        <div class="form-group">
+                            <select class="form-control" name="company_type">
+                                <option value="">请选择企业类型</option>
+                                <% companyTypeList.forEach(function(companyType, index) {%>
+                                <option value="<%= index %>"><%= companyType %></option>
+                                <% })%>
+                            </select>
+                        </div>
+                        <div class="form-group">
+                            <select class="form-control" name="company_scale">
+                                <option value="">请选择企业规模</option>
+                                <% companyScaleList.forEach(function(companyScale, index) {%>
+                                <option value="<%= index %>"><%= companyScale %></option>
+                                <% })%>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <button class="btn btn-primary btn-block" type="submit">下一步</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</div>
+<!-- JS. -->
+<script src="/lib/jquery/jquery.min.js"></script>
+<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/bootstrap/bootstrap.min.js"></script>
+<script src="/web/building_saas/js/global.js"></script>
+<script src="/web/users/js/user.js"></script>
+</body>
+
+</html>

+ 10 - 64
web/users/login.html

@@ -17,16 +17,18 @@
             <h1 class="d-flex justify-content-center">Smartcost</h1>
             <h4 class="d-flex justify-content-center mb-2">用户登录</h4>
             <div class="form-group">
-                <input id="inputEmail" class="form-control " placeholder="通行账号 邮箱/手机" required="" autofocus="" value="laiku123@qq.com">
+                <input id="inputEmail" class="form-control " name="inputEmail" placeholder="通行账号 邮箱/手机" autofocus="" value="laiku123@qq.com
+" />
             </div>
             <div class="form-group">
-                <input id="inputPassword" class="form-control " placeholder="输入密码" required="" type="password" value="19930523">
+                <input id="inputPassword" class="form-control " name="inputPassword" placeholder="输入密码" type="password" value="19930523" />
             </div>
-            <div class="form-group has-danger">
-                <div id="hint" class="form-control-feedback">&nbsp;</div>
+            <div class="form-group" id="error-tips" style="display: none;">
+                <div class="alert alert-danger" role="alert">
+                    <strong>登录失败</strong> <span id="message"</span>
+                </div>
             </div>
             <div class="form-group">
-                <!--<button id="login" class="btn btn-primary btn-block" data-toggle="modal" data-target="#ver">登录</button>-->
                 <button id="login" class="btn btn-primary btn-block">登录</button>
             </div>
             <div class="pt-1 d-flex justify-content-center">
@@ -35,63 +37,7 @@
             </div>
         </form>
 
-        <script>
-            $(document).ready(function () {
-                var referer = scUrlUtil.GetQueryString('referer');
-
-                $("#login").click(function () {
-                    var account = $("#inputEmail").val();
-                    var pw = $("#inputPassword").val();
-
-                    $.ajax({
-                        url: '/login',
-                        type: 'post',
-                        data: {"account": account, "pw": pw},
-                        success: function (result) {
-                            if (result.data) {
-//                                $('#ver').modal('show');
-                                if (referer) {
-                                    location.href = referer;
-                                } else {
-                                    location.href = '/';
-                                }
-                            }
-                            else {
-                                $('#hint').html(result.error);
-                            }
-                        },
-                        error: function (result) {
-                            $('#hint').html('内部程序错误!');
-                        }
-                    });
-                });
-
-                $(".form-control").on('input', function () {
-                    $('#hint').html('&nbsp;');
-                });
-            });
-        </script>
-
-        <!--登录错误-->
-        <!--<form class="form-signin login-error">
-            <h1 class="d-flex justify-content-center">Smartcost</h1>
-            <h4 class="d-flex justify-content-center mb-2">用户登录</h4>
-            <div class="form-group has-danger">
-                <input class="form-control form-control-danger" value="1212@qq.com" placeholder="通行账号 邮箱/手机" required="" autofocus="">
-                <div class="form-control-feedback">输入的邮箱/手机无效</div>
-            </div>
-            <div class="form-group has-danger">
-                <input class="form-control gform-control-danger" value="12313" placeholder="输入密码" required="" type="password">
-                <div class="form-control-feedback">密码错误</div>
-            </div>
-            <div class="form-group">
-                <button class="btn btn-primary btn-block">登录</button>
-            </div>
-            <div class="pt-1 d-flex justify-content-center">
-                <a href="http://sso.smartcost.com.cn/getpasswd" target="_blank" class="mr-3">忘记密码</a>
-                <a href="http://sso.smartcost.com.cn/reg" target="_blank">免费注册</a>
-            </div>
-        </form>-->
+        <script type="text/javascript" src="/web/users/js/login.js"></script>
     </div>
     <!--弹出信息-->
     <div class="modal fade" id="ver" data-backdrop="static">
@@ -107,14 +53,14 @@
                             <div class="card card-block">
                                 <h3 class="card-title">重庆版免费版</h3>
                                 <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
-                                <a class="btn btn-primary" href="login-infoinput.html">开始使用</a>
+                                <a class="btn btn-primary" href="/boot/cq">开始使用</a>
                             </div>
                         </div>
                         <div class="col-sm-6">
                             <div class="card card-block">
                                 <h3 class="card-title">广东版免费版</h3>
                                 <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
-                                <a class="btn btn-primary" href="login-infoinput.html">开始使用</a>
+                                <a class="btn btn-primary" href="/boot/gd">开始使用</a>
                             </div>
                         </div>
                     </div>

+ 97 - 0
web/users/html/user-info.html

@@ -0,0 +1,97 @@
+    <!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>账号资料-Smartcost</title>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/building_saas/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+</head>
+
+<body>
+<div class="header">
+    <%include ../../common/html/header.html %>
+</div>
+<div class="main">
+    <div class="poj-manage container-fluid">
+        <div class="row">
+            <div class="col-lg-2">
+                <div class="poj-cate mt-3">
+                    <ul class="nav nav-pills flex-column">
+                        <li class="nav-item">
+                            <a class="nav-link active" href="user-info.html">账号资料</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="/user/safe">账号安全</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="user-buy.html">产品购买</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="user-set.html">偏好设置</a>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-lg-10">
+                <div class="col-lg-4">
+                    <legend class="my-3">账号资料</legend>
+                    <form id="info-form" method="post" action="/user/info">
+                        <div class="form-group">
+                            <label class="form-control-label">您的姓名</label>
+                            <input class="form-control" value="<%= userData.real_name %>" placeholder="输入您的姓名" id="name" name="real_name"/>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">企业名称</label>
+                            <input class="form-control" value="<%= userData.company %>" placeholder="输入您的企业名称" id="company" name="company"/>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">企业所在地区</label>
+                            <select class="form-control" name="province" id="province">
+                                <% provinceList.forEach(function(province, index) {%>
+                                <option value="<%= index %>" <% if(index === userData.province) {%>selected="selected"<% } %>><%= province %></option>
+                                <% })%>
+                            </select>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">企业类型</label>
+                            <select class="form-control" name="company_type">
+                                <option value="">请选择企业类型</option>
+                                <% companyTypeList.forEach(function(companyType, index) {%>
+                                <option value="<%= index %>" <% if(index === userData.company_type) {%>selected="selected"<% } %>><%= companyType %></option>
+                                <% })%>
+                            </select>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">企业规模</label>
+                            <select class="form-control" name="company_scale">
+                                <option value="">请选择企业规模</option>
+                                <% companyScaleList.forEach(function(companyScale, index) {%>
+                                <option value="<%= index %>" <% if(index === userData.company_scale) {%>selected="selected"<% } %>><%= companyScale %></option>
+                                <% })%>
+                            </select>
+                        </div>
+                        <div class="form-group mt-3">
+                            <button class="btn btn-primary" type="submit">确认</button>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- JS. -->
+<script src="/lib/jquery/jquery.min.js"></script>
+<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/bootstrap/bootstrap.min.js"></script>
+<script src="/web/building_saas/js/global.js"></script>
+<script src="/web/users/js/user.js"></script>
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

+ 157 - 0
web/users/html/user-safe.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <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>账号资料-Smartcost</title>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/building_saas/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+</head>
+
+<body>
+<div class="header">
+    <%include ../../common/html/header.html %>
+</div>
+<div class="main">
+    <div class="poj-manage container-fluid">
+        <div class="row">
+            <div class="col-lg-2">
+                <div class="poj-cate mt-3">
+                    <ul class="nav nav-pills flex-column">
+                        <li class="nav-item">
+                            <a class="nav-link" href="/user/info">账号资料</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link active" href="/user/safe">账号安全</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="user-buy.html">产品购买</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="user-set.html">偏好设置</a>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-lg-10">
+                <div class="col-lg-4">
+                    <legend class="my-3">账号安全</legend>
+                    <from>
+                        <div class="form-group">
+                            <label class="form-control-label">登录密码</label>
+                            <div class="form-control-static">
+                                <button class="btn btn-secondary btn-sm">修改密码</button>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">邮箱地址</label>
+                            <p class="form-control-static mb-0"><%= userData.email %><span
+                                    class="badge badge-default">未验证</span></p>
+                            <button class="btn btn-secondary btn-sm">验证邮箱</button>
+                            <button class="btn btn-secondary btn-sm">更换邮箱</button>
+                            <p class="form-control-static mb-0"><%= userData.email %><span
+                                    class="badge badge-success">已验证</span></p>
+                            <button class="btn btn-secondary btn-sm">更换邮箱</button>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">手机号码</label>
+                            <p class="form-control-static mb-0"><%= userData.mobile %></p>
+                            <button class="btn btn-secondary btn-sm">更换手机</button>
+                            <div class="form-control-static">
+                                <button class="btn btn-secondary btn-sm">添加手机</button>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="form-control-label">异常登录提醒</label>
+                            <div class="form-control-static">
+                                <label class="custom-control custom-checkbox" data-toggle="modal"
+                                       data-target="#phoneTips">
+                                    <input type="checkbox" class="custom-control-input">
+                                    <span class="custom-control-indicator"></span>
+                                    <span class="custom-control-description">开启</span>
+                                </label>
+                                <p class="text-muted">
+                                    账号出现异常登录时将给你的手机号码发送通知。
+                                </p>
+                            </div>
+                        </div>
+                    </from>
+                </div>
+                <!--<div class="mt-5">-->
+                    <!--<legend>访问日志</legend>-->
+                    <!--<table class="table table-hover">-->
+                        <!--<thead>-->
+                        <!--<tr>-->
+                            <!--<th>系统</th>-->
+                            <!--<th>浏览器</th>-->
+                            <!--<th>访问日期</th>-->
+                            <!--<th>地址</th>-->
+                        <!--</tr>-->
+                        <!--</thead>-->
+                        <!--<tbody>-->
+                        <!--<tr>-->
+                            <!--<td>Windows NT 10.0 64-bit</td>-->
+                            <!--<td>Chrome 55.0.2883.87 m (64-bit)</td>-->
+                            <!--<td>2017-01-12 09:09</td>-->
+                            <!--<td>广东省珠海市 电信(116.19.86.133)</td>-->
+                        <!--</tr>-->
+                        <!--<tr>-->
+                            <!--<td>Windows NT 10.0 64-bit</td>-->
+                            <!--<td>Chrome 55.0.2883.87 m (64-bit)</td>-->
+                            <!--<td>2017-01-12 09:09</td>-->
+                            <!--<td>广东省珠海市 电信(116.19.86.133)</td>-->
+                        <!--</tr>-->
+                        <!--<tr>-->
+                            <!--<td>Windows NT 10.0 64-bit</td>-->
+                            <!--<td>Chrome 55.0.2883.87 m (64-bit)</td>-->
+                            <!--<td>2017-01-12 09:09</td>-->
+                            <!--<td>广东省珠海市 电信(116.19.86.133)</td>-->
+                        <!--</tr>-->
+                        <!--</tbody>-->
+                    <!--</table>-->
+                    <!--<nav aria-label="...">-->
+                        <!--<ul class="pagination">-->
+                            <!--<li class="page-item disabled">-->
+                                <!--<a class="page-link" href="#" tabindex="-1">上一页</a>-->
+                            <!--</li>-->
+                            <!--<li class="page-item active"><a class="page-link" href="#">1</a></li>-->
+                            <!--<li class="page-item"><a class="page-link" href="#">2</a></li>-->
+                            <!--<li class="page-item"><a class="page-link" href="#">3</a></li>-->
+                            <!--<li class="page-item">-->
+                                <!--<a class="page-link" href="#">下一页</a>-->
+                            <!--</li>-->
+                        <!--</ul>-->
+                    <!--</nav>-->
+                <!--</div>-->
+            </div>
+        </div>
+    </div>
+</div>
+<!--弹出异常登录提醒-->
+<div class="modal fade" id="phoneTips" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-body">
+                <p>开启异常登录提醒,需要先为您的通行账号添加手机号码。</p>
+                <p><a class="btn btn-primary btn-sm" href="#">去添加手机</a></p>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- JS. -->
+<script src="/lib/jquery/jquery.min.js"></script>
+<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/bootstrap/bootstrap.min.js"></script>
+<script src="/web/building_saas/js/global.js"></script>
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

+ 101 - 0
web/users/js/login.js

@@ -0,0 +1,101 @@
+/**
+ * 登录相关js
+ *
+ * @author CaiAoLin
+ * @date 2017/6/8
+ * @version
+ */
+$(document).ready(function () {
+    let referer = scUrlUtil.GetQueryString('referer');
+
+    $("#login").click(function () {
+        if (!valid()) {
+            return false;
+        }
+        let account = $("#inputEmail").val();
+        let pw = $("#inputPassword").val();
+
+        $.ajax({
+            url: '/login',
+            type: 'post',
+            data: {"account": account, "pw": pw},
+            success: function (response) {
+                if (response.error === 0) {
+                    if (response.exist == 1) {
+                        location.href = '/pm';
+                    } else {
+                        $('#ver').modal('show');
+                    }
+                    // if (referer) {
+                    //     location.href = referer;
+                    // } else {
+                    //     location.href = '/';
+                    // }
+                } else {
+                    let msg = response.msg !== undefined ? response.msg : '未知错误';
+                    showError(msg, $("input"));
+                }
+            },
+            error: function (result) {
+                showError('内部程序错误', null);
+            }
+        });
+    });
+
+    $("input").blur(function () {
+        cleanError();
+    });
+
+    $(".form-control").on('input', function () {
+        $('#hint').html('&nbsp;');
+    });
+
+});
+
+/**
+ * 验证数据
+ *
+ * @return {boolean}
+ */
+function valid() {
+    let result = true;
+    let account = $("#inputEmail").val();
+    if (account === undefined || account === '') {
+        showError('用户名不能为空!', $("#inputEmail"));
+        return false;
+    }
+
+    let password = $("#inputPassword").val();
+    if (password === undefined || password === '') {
+        showError('密码不能为空!', $("#inputPassword"));
+        return false;
+    }
+
+    return result;
+}
+
+/**
+ * 提示错误
+ *
+ * @param {string} msg
+ * @param {object} element
+ * @return {void}
+ */
+function showError(msg, element) {
+    if (element !== null) {
+        element.parent().addClass('has-danger');
+    }
+    $("#message").text(msg);
+    $("#error-tips").show("fast");
+}
+
+/**
+ * 清除错误提示
+ *
+ * @return {void}
+ */
+function cleanError() {
+    $("input").parent().removeClass('has-danger');
+    $("#message").text('');
+    $("#error-tips").hide("fast");
+}

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

@@ -0,0 +1,78 @@
+/**
+ * 用户相关js
+ *
+ * @author CaiAoLin
+ * @date 2017/6/13
+ * @version
+ */
+$(document).ready(function() {
+
+    $("#info-form").submit(function() {
+        if (!valid()) {
+            return false;
+        }
+    });
+
+    $("input").blur(function () {
+        cleanError();
+    });
+});
+
+/**
+ * 验证数据
+ *
+ * @return {boolean}
+ */
+function valid() {
+    let result = true;
+    let name = $("#name").val();
+    if (name === undefined || name === '') {
+        showError('您得填上姓名!', $("#name"));
+        return false;
+    }
+
+    let company = $("#company").val();
+    if (company === undefined || company === '') {
+        showError('您得填上公司名称!', $("#company"));
+        return false;
+    }
+
+    let province = $("#province").val();
+    if (province === undefined || province === '') {
+        showError('您得选择企业所在地区!', $("#province"));
+        return false;
+    }
+
+    return result;
+}
+
+/**
+ * 提示错误
+ *
+ * @param {string} msg
+ * @param {object} element
+ * @return {void}
+ */
+function showError(msg, element) {
+    element.addClass('orm-control-danger');
+    if (element !== null) {
+        element.parent().addClass('has-danger');
+    }
+    let html = '<div class="form-control-feedback">' + msg + '</div>';
+    if (element.siblings('.form-control-feedback').length > 0) {
+        element.siblings('.form-control-feedback').text(msg);
+    } else {
+        element.after(html);
+    }
+}
+
+/**
+ * 清除错误提示
+ *
+ * @return {void}
+ */
+function cleanError() {
+    $("input").removeClass('orm-control-danger');
+    $("input").parent().removeClass('has-danger');
+    $(".form-control-feedback").remove();
+}

+ 0 - 88
web/users/login-infoinput.html

@@ -1,88 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <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>用户信息填写-Smartcost</title>
-    <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css">
-    <link rel="stylesheet" href="css/bootstrap/themes.css">
-    <link rel="stylesheet" href="css/main.css">
-    <link rel="stylesheet" href="css/font-awesome/font-awesome.min.css">
-</head>
-
-<body>
-    <div class="header">
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
-            <span class="header-logo px-2">Smartcost</span>
-            <div class="float-lg-right navbar-text pt-0">
-                <div class=" d-inline-block">
-                    <button class="btn btn-link btn-sm " type="button">15812644017</button>
-                </div>
-                <span class="btn btn-link btn-sm new-msg">
-                  <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
-                </span>
-                <button class="btn btn-link btn-sm">注销</button>
-            </div>
-        </nav>
-    </div>
-    <div class="container mt-3">
-        <div class="row">
-            <div class="col-lg-8 offset-lg-2">
-                <div class="card newuser-input">
-                    <div class="card-block">
-                        <h4 class="card-title">在开始使用前,请填写以下信息。</h4>
-                        <h6 class="card-subtitle text-muted">详细填写这些信息,可以让我们更好的服务您。</h6>
-                    </div>
-                    <div class="card-block">
-                            <div class="form-group">
-                                <input class="form-control" placeholder="你的姓名" required="" autofocus="">
-                            </div>
-                            <div class="form-group">
-                                <input class="form-control" placeholder="企业名称" required="" autofocus="">
-                            </div>
-                            <div class="form-group">
-                                <select class="form-control">
-                                  <option>请选择企业所在地区</option>
-                                  <option>广东省</option>
-                                  <option>北京市</option>
-                                </select>
-                            </div>
-                        <div class="form-group">
-                            <a class="btn btn-link" data-toggle="collapse" href="#moreinfo" aria-expanded="false" aria-controls="moreinfo">更多选项</a>
-                        </div>
-                        <div class="collapse" id="moreinfo">
-                                <div class="form-group">
-                                    <select class="form-control">
-                                     <option>请选择企业类型</option>
-                                     <option>设计</option>
-                                     <option>施工</option>
-                                   </select>
-                                </div>
-                                <div class="form-group">
-                                    <select class="form-control">
-                                     <option>请选择企业规模</option>
-                                     <option>1-20</option>
-                                     <option>20-50</option>
-                                     <option>50-100</option>
-                                     <option>100+</option>
-                                   </select>
-                                </div>
-                        </div>
-                        <div class="form-group">
-                            <a class="btn btn-primary btn-block" href="login-welcome.html">下一步</a>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!-- JS. -->
-    <script src="js/jquery/jquery.min.js"></script>
-    <script src="js/tether/tether.min.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/global.js"></script>
-</body>
-
-</html>

+ 0 - 296
web/users/login-welcome.html

@@ -1,296 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <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>项目管理-Smartcost</title>
-    <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css">
-    <link rel="stylesheet" href="css/bootstrap/themes.css">
-    <link rel="stylesheet" href="css/main.css">
-    <link rel="stylesheet" href="css/font-awesome/font-awesome.min.css">
-</head>
-
-<body>
-    <div class="header">
-      <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
-      <span class="header-logo px-2">Smartcost</span>
-      <div class="navbar-text pt-0">
-          <div class="dropdown d-inline-block">
-              <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown">陈特</button>
-              <div class="dropdown-menu dropdown-menu-right">
-                  <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
-                  <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                  <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
-              </div>
-          </div>
-          <span class="btn btn-link btn-sm new-msg">
-            <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
-          </span>
-          <button class="btn btn-link btn-sm">注销</button>
-      </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 dropdown">
-                <a class="nav-link dropdown-toggle" href="http://example.com" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">文件</a>
-                <div class="dropdown-menu" aria-labelledby="supportedContentDropdown">
-                    <a class="dropdown-item" href="#">Action</a>
-                    <a class="dropdown-item" href="#">Another action</a>
-                    <a class="dropdown-item" href="#">Something else here</a>
-                </div>
-            </li>
-            <li class="nav-item dropdown">
-                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">编辑</a>
-                <div class="dropdown-menu">
-                    <a class="dropdown-item" href="#">Action</a>
-                    <a class="dropdown-item" href="#">Another action</a>
-                    <a class="dropdown-item" href="#">Something else here</a>
-                </div>
-            </li>
-            <li class="nav-item dropdown">
-                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">工具</a>
-                <div class="dropdown-menu">
-                    <a class="dropdown-item" href="#">Action</a>
-                    <a class="dropdown-item" href="#">Another action</a>
-                    <a class="dropdown-item" href="#">Something else here</a>
-                </div>
-            </li>
-            <li class="nav-item">
-                <a class="nav-link" href="#" aria-haspopup="true" aria-expanded="false">帮助</a>
-            </li>
-        </ul>
-        <form class="form-inline">
-            <input class="form-control form-control-sm mr-1" type="text" placeholder="告诉我你想做什么">
-        </form>
-    </nav>
-    </div>
-    <div class="main">
-        <div class="poj-manage container-fluid">
-            <div class="row">
-                <div class="col-lg-2">
-                    <div class="poj-cate">
-                        <input type="text" class="mt-1 mb-1 form-control form-control-sm" placeholder="搜索所有工程">
-                        <ul class="nav nav-pills flex-column">
-                            <li class="nav-item">
-                                <a class="nav-link active" href="#">全部</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">最近使用</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">共享</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">协同工作</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">归档</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">回收站</a>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-                <div class="col-lg-10">
-                    <div class="toolsbar">
-                        <div class="tools-btn btn-group align-top">
-                            <a href="" class="btn btn-sm">新建工程</a>
-                            <a href="" class="btn btn-sm"><i class="fa fa-folder-o"></i>&nbsp;新建文件夹</a>
-                            <a href="" class="btn btn-sm">重命名</a>
-                            <a href="" class="btn btn-sm">删除</a>
-                            <a href="" class="btn btn-sm">移动到...</a>
-                            <a href="" class="btn btn-sm">复制到...</a>
-                            <a href="" class="btn btn-sm">共享</a>
-                            <a href="" class="btn btn-sm">协同</a>
-                        </div>
-                    </div>
-                    <div class="poj-list">
-                        <legend>全部</legend>
-                        <table class="table table-hover table-sm">
-                            <thead>
-                                <tr>
-                                    <th width="40"></th>
-                                    <th width="38%"></th>
-                                    <th width="40%">工程名称</th>
-                                    <th width="10%">最近使用</th>
-                                    <th width="10%">创建日期</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <tr>
-                                    <td></td>
-                                    <td><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;XX项目文件夹</td>
-                                    <td></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="pl-1"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;XX项目文件夹</td>
-                                    <td></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="pl-2"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;<a href="#">某某某某工厂工厂某某工厂建设某某工厂建设</a></td>
-                                    <td></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="pl-3"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;<a href="#" class="open-sidebar">1号生产车间(click)</a></td>
-                                    <td></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td><i class="fa fa-sort" data-toggle="tooltip" data-placement="top" title="长安拖动"></i></td>
-                                    <td></td>
-                                    <td><a href="zaojiashu.html">建筑工程(click)</a></td>
-                                    <td>2016-01-01</td>
-                                    <td>2016-01-01</td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td></td>
-                                    <td><a href="#">机械设备安装工程</a></td>
-                                    <td>2016-01-01</td>
-                                    <td>2016-01-01</td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="pl-2"><a href="#" class="tree-close" title="展开"><i class="fa fa-plus-square-o  mr-1"></i></a><i class="fa fa-folder-o"></i>&nbsp;<a href="#">2号生产车间</a></td>
-                                    <td>......</td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="slide-sidebar">
-            <div class="side-content">
-                <div class="p-1">
-                    <legend>1号生产车间 汇总</legend>
-                    <table class="table table-bordered table-hover table-sm">
-                        <thead>
-                            <tr>
-                                <th rowspan="2"></th>
-                                <th rowspan="2">序号</th>
-                                <th rowspan="2">名称</th>
-                                <th rowspan="2">金额</th>
-                                <th colspan="6">其中</th>
-                                <th rowspan="2">占造价比例(%)</th>
-                                <th rowspan="2">建筑面积</th>
-                                <th rowspan="2">单方造价</th>
-                            </tr>
-                            <tr>
-                                <th>分部分项合计</th>
-                                <th>措施项目合计</th>
-                                <th>其他项目合计</th>
-                                <th>安全文明施工费</th>
-                                <th>规费</th>
-                                <th>税金</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr>
-                                <td>1</td>
-                                <td>一</td>
-                                <td>建筑工程</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                            </tr>
-                            <tr>
-                                <td>2</td>
-                                <td>二</td>
-                                <td>建筑工程</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                            </tr>
-                            <tr>
-                                <td>3</td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                            </tr>
-                            <tr>
-                                <td>4</td>
-                                <td>一</td>
-                                <td>合计</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                            </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出信息-->
-    <div class="modal fade" id="myModal" data-backdrop="static">
-        <div class="modal-dialog modal-lg" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h5 class="modal-title">欢迎使用Smartcost</h5>
-                </div>
-                <div class="modal-body">
-                    <p>推送内容在这</p>
-                </div>
-                <div class="modal-footer text-xs-center">
-                    <a href="project-management.html" class="btn btn-primary btn-lg">开始使用Smartcost</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!-- JS. -->
-    <script src="js/jquery/jquery.min.js"></script>
-    <script src="js/tether/tether.min.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/global.js"></script>
-</body>
-<script type="text/javascript">
-    $('#myModal').modal('show')
-</script>
-
-</html>

+ 0 - 589
web/users/project-management.html

@@ -1,589 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <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>项目管理-Smartcost</title>
-    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
-    <!--<link rel="stylesheet" href="/web/css/bootstrap/themes.css">-->
-    <link rel="stylesheet" href="/web/building_saas/css/main.css">
-    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <!--zTree-->
-  	<link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
-
-    <script>
-        // 这里的变量供页面调用
-        var userAccount = '<%- userAccount %>';
-        var userID = '<%- userID %>';
-    </script>
-</head>
-
-<body>
-    <div class="header">
-<!--        <div class="top-msg clearfix">
-            <div class="alert alert-warning mb-0 py-0" role="alert">
-                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-                  <span aria-hidden="true">&times;</span>
-                </button>
-                <strong>注意!</strong> 这是一条消息通知 <a href="#">链接</a>
-            </div>
-        </div>-->
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
-          <span class="header-logo px-2">Smartcost</span>
-          <div class="navbar-text pt-0">
-              <div class="dropdown d-inline-block">
-                  <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%- userAccount %></button>
-                  <div class="dropdown-menu dropdown-menu-right">
-                      <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
-                      <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                      <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
-                  </div>
-              </div>
-              <span class="btn btn-link btn-sm new-msg">
-                <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
-              </span>
-              <button id="logout" class="btn btn-link btn-sm">注销</button>
-          </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 dropdown">
-                    <a class="nav-link dropdown-toggle" href="http://example.com" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">文件</a>
-                    <div class="dropdown-menu" aria-labelledby="supportedContentDropdown">
-                        <a class="dropdown-item" href="#">Action</a>
-                        <a class="dropdown-item" href="#">Another action</a>
-                        <a class="dropdown-item" href="#">Something else here</a>
-                    </div>
-                </li>
-                <li class="nav-item dropdown">
-                    <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">编辑</a>
-                    <div class="dropdown-menu">
-                        <a class="dropdown-item" href="#">Action</a>
-                        <a class="dropdown-item" href="#">Another action</a>
-                        <a class="dropdown-item" href="#">Something else here</a>
-                    </div>
-                </li>
-                <li class="nav-item dropdown">
-                    <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">工具</a>
-                    <div class="dropdown-menu">
-                        <a class="dropdown-item" href="#">Action</a>
-                        <a class="dropdown-item" href="#">Another action</a>
-                        <a class="dropdown-item" href="#">Something else here</a>
-                    </div>
-                </li>
-                <li class="nav-item">
-                    <a class="nav-link" href="#" aria-haspopup="true" aria-expanded="false">帮助</a>
-                </li>
-            </ul>
-            <form class="form-inline">
-                <input class="form-control form-control-sm mr-1" type="text" placeholder="告诉我你想做什么">
-            </form>
-        </nav>
-    </div>
-    <div class="main">
-        <div class="poj-manage container-fluid">
-            <div class="row">
-                <div class="col-lg-2">
-                    <div class="poj-cate">
-                        <input type="text" class="my-2 form-control form-control-sm" placeholder="搜索所有工程">
-                        <ul class="nav nav-pills flex-column">
-                            <li class="nav-item">
-                                <a class="nav-link active" href="#">全部</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">最近使用</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">共享</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">协同工作</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">归档</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="#">回收站</a>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-                <div class="col-lg-10">
-                    <div class="toolsbar">
-                        <div class="tools-btn btn-group align-top">
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#addPoj" class="btn btn-sm">新建工程</a>
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#addFolder" class="btn btn-sm"><i class="fa fa-folder-o"></i>&nbsp;新建文件夹</a>
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#rename" class="btn btn-sm">重命名</a>
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#del" class="btn btn-sm">删除</a>
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#moveto" class="btn btn-sm">移动到...</a>
-                            <a href="javacript:void(0);" data-toggle="modal" data-target="#copyto" class="btn btn-sm">复制到...</a>
-                            <a href="" class="btn btn-sm">共享</a>
-                            <a href="" class="btn btn-sm">协同</a>
-                        </div>
-                    </div>
-                    <div class="poj-list">
-                        <legend>全部</legend>
-                        <table class="table table-hover table-sm">
-                            <thead>
-                                <tr>
-                                    <th width="40"></th>
-                                    <th width="78%">工程列表</th>
-                                    <th width="10%">最近使用</th>
-                                    <th width="10%">创建日期</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-1"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;XX项目文件夹</td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                  <tr>
-                                      <td></td>
-                                      <td class="in-2"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;XX项目文件夹</td>
-                                      <td></td>
-                                      <td></td>
-                                  </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-3"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;XX项目文件夹</td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-4"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;<a href="#">某某某某工厂工厂某某工厂建设某某工厂建设</a></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-5"><a href="#" class="tree-open" title="收起"><i class="fa fa-minus-square-o mr-1"></i></a><i class="fa fa-folder-open-o"></i>&nbsp;<a href="#" class="open-sidebar">左1号生产车间(click)</a></td>
-                                    <td></td>
-                                    <td></td>
-                                </tr>
-                                <tr>
-                                    <td><i class="fa fa-sort" data-toggle="tooltip" data-placement="top" title="长安拖动"></i></td>
-                                    <td class="in-6"><span class="in-3 poj-icon">└</span><a href="zaojiashu.html">建筑工程(click)</a></td>
-                                    <td>2016-01-01</td>
-                                    <td>2016-01-01</td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-6"><span class="in-3 poj-icon">└</span><a href="#">机械设备安装工程</a></td>
-                                    <td>2016-01-01</td>
-                                    <td>2016-01-01</td>
-                                </tr>
-                                <tr>
-                                    <td></td>
-                                    <td class="in-5"><a href="#" class="tree-close" title="展开"><i class="fa fa-plus-square-o  mr-1"></i></a><i class="fa fa-folder-o"></i>&nbsp;<a href="#">2号生产车间</a></td>
-                                    <td>......</td>
-                                    <td>......</td>
-                                </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="slide-sidebar">
-            <div class="side-content">
-                <div class="p-3">
-                    <legend>1号生产车间 汇总</legend>
-                    <table class="table table-bordered table-hover table-sm">
-                        <thead>
-                            <tr>
-                                <th rowspan="2"></th>
-                                <th rowspan="2">序号</th>
-                                <th rowspan="2">名称</th>
-                                <th rowspan="2">金额</th>
-                                <th colspan="6">其中</th>
-                                <th rowspan="2">占造价比例(%)</th>
-                                <th rowspan="2">建筑面积</th>
-                                <th rowspan="2">单方造价</th>
-                            </tr>
-                            <tr>
-                                <th>分部分项合计</th>
-                                <th>措施项目合计</th>
-                                <th>其他项目合计</th>
-                                <th>安全文明施工费</th>
-                                <th>规费</th>
-                                <th>税金</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr>
-                                <td>1</td>
-                                <td>一</td>
-                                <td>建筑工程</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                            </tr>
-                            <tr>
-                                <td>2</td>
-                                <td>二</td>
-                                <td>建筑工程</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                            </tr>
-                            <tr>
-                                <td>3</td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                            </tr>
-                            <tr>
-                                <td>4</td>
-                                <td>一</td>
-                                <td>合计</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td>0</td>
-                                <td> </td>
-                                <td> </td>
-                                <td> </td>
-                            </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出新建工程-->
-    <div class="modal fade" id="addPoj" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">新建工程</h5>
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                      <span aria-hidden="true">&times;</span>
-                    </button>
-                </div>
-                <div class="modal-body">
-                    <form>
-                    <div class="collapse" id="moreinfo">
-                        <div class="form-group">
-                            <label>建设项目</label>
-                            <input type="text" class="form-control" placeholder="输入建设项目名称">
-                        </div>
-                        <div class="form-group">
-                            <label>单项工程</label>
-                            <input type="text" class="form-control" placeholder="输入单项工程名称">
-                        </div>
-                      </div>
-                        <div class="form-group">
-                            <label>单位工程</label>
-                            <input type="text" class="form-control" placeholder="输入单位工程名称">
-                        </div>
-                        <div class="form-group" >
-                            <label class="custom-control custom-checkbox">
-                              <input type="checkbox" class="custom-control-input" href="#moreinfo" data-toggle="collapse" data-parent="#moreinfo" aria-expanded="false" aria-controls="moreinfo">
-                              <span class="custom-control-indicator" ></span>
-                              <span class="custom-control-description">建立 <b>建设项目</b> 和 <b>单项工程</b> 文件夹</span>
-                            </label>
-                        </div>
-                        <div class="form-group">
-                            <label>计价方式</label>
-                            <div>
-                                <label class="custom-control custom-radio">
-                                  <input id="radio1" name="radio" type="radio" class="custom-control-input">
-                                  <span class="custom-control-indicator"></span>
-                                  <span class="custom-control-description">清单计价</span>
-                                </label>
-                                <label class="custom-control custom-radio">
-                                  <input id="radio2" name="radio" type="radio" class="custom-control-input">
-                                  <span class="custom-control-indicator"></span>
-                                  <span class="custom-control-description">定额计价</span>
-                                </label>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="project-management.html" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出新建文件夹-->
-    <div class="modal fade" id="addFolder" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">新建文件夹</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                    <form>
-                        <div class="form-group">
-                            <label>文件夹</label>
-                            <input type="text" class="form-control" placeholder="输入文件夹名称">
-                            <span class="form-text text-muted">Smartcost为你提供了灵活的工程管理功能,如:</span>
-                            <span class="form-text text-muted">当你想汇总多个 <b>单位工程</b> 时,只需把它们都放在一个文件夹即可。</span>
-                        </div>
-                    </form>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="project-management.html" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出重命名-->
-    <div class="modal fade" id="rename" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">重命名</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                    <form>
-                        <div class="form-group">
-                            <input type="text" class="form-control" placeholder="输入名称">
-                        </div>
-                    </form>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="project-management.html" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出删除-->
-    <div class="modal fade" id="del" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">删除确认</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                    <h5 class="text-danger">删除 "建筑工程" ?</h5>
-                    <h5 class="text-danger">删除 "XX项目文件夹" 以及它包含的子项?</h5>
-                    <p class="">删除后,你可以在回收站找到它。</p>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="" class="btn btn-danger">删除</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出移动到-->
-    <div class="modal fade" id="moveto" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">移动到...</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                  <ul id="treeDemo" class="ztree"></ul>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!--弹出复制到-->
-    <div class="modal fade" id="copyto" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">复制到...</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                  <ul id="treeDemo2" class="ztree"></ul>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
-    <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
-    <script src="/lib/bootstrap/bootstrap.min.js"></script>
-    <script src="/web/building_saas/js/global.js"></script>
-    <!-- zTree -->
-  	<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
-  	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
-    <SCRIPT type="text/javascript">
-  		<!--
-  		var setting = {	};
-
-  		var zNodes =[
-  			{ name:"父节点1 - 展开", open:true,
-  				children: [
-  					{ name:"父节点11 - 折叠",
-  						children: [
-  							{ name:"叶子节点111"},
-  							{ name:"叶子节点112"},
-  							{ name:"叶子节点113"},
-  							{ name:"叶子节点114"}
-  						]},
-  					{ name:"父节点12 - 折叠",
-  						children: [
-  							{ name:"叶子节点121"},
-  							{ name:"叶子节点122"},
-  							{ name:"叶子节点123"},
-  							{ name:"叶子节点124"}
-  						]},
-  					{ name:"父节点13 - 没有子节点", isParent:true}
-  				]},
-  			{ name:"父节点2 - 折叠",
-  				children: [
-  					{ name:"父节点21 - 展开", open:true,
-  						children: [
-  							{ name:"叶子节点211"},
-  							{ name:"叶子节点212"},
-  							{ name:"叶子节点213"},
-  							{ name:"叶子节点214"}
-  						]},
-  					{ name:"父节点22 - 折叠",
-  						children: [
-  							{ name:"叶子节点221"},
-  							{ name:"叶子节点222"},
-  							{ name:"叶子节点223"},
-  							{ name:"叶子节点224"}
-  						]},
-  					{ name:"父节点23 - 折叠",
-  						children: [
-  							{ name:"叶子节点231"},
-  							{ name:"叶子节点232"},
-  							{ name:"叶子节点233"},
-  							{ name:"叶子节点234"}
-  						]}
-  				]},
-  			{ name:"父节点3 - 没有子节点", isParent:true}
-
-  		];
-
-  		$(document).ready(function(){
-  			$.fn.zTree.init($("#treeDemo"), setting, zNodes);
-  		});
-  		//-->
-  	</SCRIPT>
-    <SCRIPT type="text/javascript">
-  		<!--
-  		var setting = {	};
-
-  		var zNodes =[
-  			{ name:"父节点1 - 展开", open:true,
-  				children: [
-  					{ name:"父节点11 - 折叠",
-  						children: [
-  							{ name:"叶子节点111"},
-  							{ name:"叶子节点112"},
-  							{ name:"叶子节点113"},
-  							{ name:"叶子节点114"}
-  						]},
-  					{ name:"父节点12 - 折叠",
-  						children: [
-  							{ name:"叶子节点121"},
-  							{ name:"叶子节点122"},
-  							{ name:"叶子节点123"},
-  							{ name:"叶子节点124"}
-  						]},
-  					{ name:"父节点13 - 没有子节点", isParent:true}
-  				]},
-  			{ name:"父节点2 - 折叠",
-  				children: [
-  					{ name:"父节点21 - 展开", open:true,
-  						children: [
-  							{ name:"叶子节点211"},
-  							{ name:"叶子节点212"},
-  							{ name:"叶子节点213"},
-  							{ name:"叶子节点214"}
-  						]},
-  					{ name:"父节点22 - 折叠",
-  						children: [
-  							{ name:"叶子节点221"},
-  							{ name:"叶子节点222"},
-  							{ name:"叶子节点223"},
-  							{ name:"叶子节点224"}
-  						]},
-  					{ name:"父节点23 - 折叠",
-  						children: [
-  							{ name:"叶子节点231"},
-  							{ name:"叶子节点232"},
-  							{ name:"叶子节点233"},
-  							{ name:"叶子节点234"}
-  						]}
-  				]},
-  			{ name:"父节点3 - 没有子节点", isParent:true}
-
-  		];
-
-  		$(document).ready(function(){
-  			$.fn.zTree.init($("#treeDemo2"), setting, zNodes);
-  		});
-  		//-->
-  	</SCRIPT>
-</body>
-<script type="text/javascript">
-    autoFlashHeight();
-</script>
-
-<script>
-    $(document).ready(function () {
-        $("#logout").click(function () {
-            location.href = '/logout';
-        });
-    });
-</script>
-
-
-
-</html>