浏览代码

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

zhongzewei 6 年之前
父节点
当前提交
4ba8b8d58e

+ 35 - 0
modules/all_models/block_lib_model.js

@@ -0,0 +1,35 @@
+/**
+ * Created by CSL on 2018-12-17.
+ */
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let dataSchema = new Schema({
+    ID: String,
+    NextSiblingID: String,
+    ParentID: String,
+    children: [],
+    code: String,
+    compilationID: String,
+    copyTime: Number,
+    firstNodeType: Number,
+    isFBFX: {type: Boolean, default: true},
+    itemCharacterText: String,
+    name: String,
+    nodeName: String,
+    type: Number,
+    unit: String,
+    unitFee: String,
+    _id: false
+},{versionKey:false});
+
+let blockLibsSchema = new Schema({
+    userID: String,
+    compilationID: String,
+    libID: String,
+    libName: String,
+    datas: [dataSchema],
+    share: {}
+},{versionKey:false});
+
+mongoose.model('blockLibsModel', blockLibsSchema, 'block_libs');

+ 1 - 1
modules/all_models/compleGlj_glj.js

@@ -16,7 +16,7 @@ const comple_gljComponent = new Schema(
 );
 //补充工料机跟用户和编办绑定
 const comple_glj = new Schema({
-    userId: Number,
+    userId: String,
     compilationId: String,
     ID: Number,
     code: String,

+ 1 - 1
modules/all_models/compleRation_ration.js

@@ -35,7 +35,7 @@ const rationInstSchema = new Schema({
 
 //补充定额
 const compleRationSchema = new Schema({
-    userId: Number,
+    userId: String,
     compilationId: String,
     rationRepId: Number,
     ID:Number,

+ 32 - 0
modules/all_models/log.js

@@ -0,0 +1,32 @@
+/**
+ * 日志数据结构
+ *
+ * @author CaiAoLin
+ * @date 2017/7/27
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'log';
+let messageSchema = new Schema({
+    ip: String,
+    ip_info: String,
+    browser: String,
+    os: String
+}, {_id: false});
+let modelSchema = {
+    // 日志类型
+    type: {
+        type: Number
+    },
+    // 日志内容
+    message: messageSchema,
+    // 关联用户id
+    user_id: {
+        type: String
+    },
+    // 创建时间
+    create_time: Number
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 16 - 0
modules/all_models/options.js

@@ -0,0 +1,16 @@
+/**
+ * Created by Zhong on 2018/3/22.
+ */
+/*选项*/
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const optionSchema = new Schema({
+    user_id: String,
+    compilation_id: String,
+    options: {
+        type: Schema.Types.Mixed,
+        default: {}
+    }
+}, {versionKey: false});
+
+mongoose.model('options', optionSchema, 'options');

+ 30 - 0
modules/all_models/setting.js

@@ -0,0 +1,30 @@
+/**
+ * 个人设置数据结构
+ *
+ * @author CaiAoLin
+ * @date 2017/7/27
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'setting';
+let modelSchema = {
+    // 设置类型
+    type: {
+        type: Number,
+        index: true
+    },
+    // 设置内容
+    data: {
+        type: Schema.Types.Mixed,
+    },
+    // 关联用户id
+    user_id: {
+        type: String,
+        index: true
+    },
+    // 创建时间
+    create_time: Number
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 39 - 0
modules/all_models/user_message.js

@@ -0,0 +1,39 @@
+/**
+ * 用户消息数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/9/22
+ * @version
+ */
+let mongoose = require("mongoose");
+let Schema = mongoose.Schema;
+
+// 表名
+let collectionName = 'user_message';
+
+// 表结构
+let schema = {
+    // 用户id
+    user_id: {
+        type: String,
+    },
+    // 是否已读
+    is_read: {
+        type: Number,
+        default: 0
+    },
+    // 是否删除
+    is_delete: {
+        type: Number,
+        default: 0
+    },
+    // 消息关联数据
+    message: {
+        type: Schema.Types.ObjectId,
+        ref: 'message'
+    },
+    // 创建时间
+    create_time: Number,
+};
+
+mongoose.model(collectionName, new Schema(schema, {versionKey: false}));

+ 2 - 4
modules/sys_tools/models/sys_model.js

@@ -126,13 +126,11 @@ async function clearJunkData(callback){
                 //清除费率文件
                 await feeRateFileModel.remove({feeRateID: {$in: junkFFIds}});
             }
-            if(callback){
-                callback(err);
-            }
+            if(callback) callback(err);
         });
     }
     else {
-        callback(0);
+       if(callback) callback(0);
     }
 
 }

+ 21 - 1
modules/users/controllers/user_controller.js

@@ -247,7 +247,27 @@ class UserController extends BaseController {
         }
         response.json(responseData);
     }
-
+    async deleteUser(request, response) {
+        let data = JSON.parse(request.body.data);
+        let userModel = new UserModel();
+        let responseData = {
+            error: 0,
+            message: '',
+            data: null
+        };
+        try{
+            let manager = request.session.managerData;
+            if(manager.superAdmin !=1 ){
+                throw { code: 1, message: '没有删除用户权限'};
+            }
+            responseData.data =  await userModel.deleteUser(data.userID,manager.userID);
+        } catch (error) {
+            console.log(error);
+            responseData.error = error.code;
+            responseData.message = error.message;
+        }
+        response.json(responseData);
+    }
 
     /**
      * 根据用户id列表获取用户信息列表 json

+ 56 - 2
modules/users/models/user_model.js

@@ -8,7 +8,25 @@
 import mongoose from "mongoose";
 import Moment from "moment";
 import BaseModel from "../../common/base/base_model";
-
+const projectModel = mongoose.model('projects');
+const unitPriceFileModel = mongoose.model('unit_price_file');
+const feeRateFileModel = mongoose.model('fee_rate_file');
+const optionsModel = mongoose.model('options');
+const settingModel = mongoose.model('setting');
+const messageModel = mongoose.model('user_message');
+const logModel = mongoose.model('log');
+const rptCfgModel =  mongoose.model("rpt_cfg");
+const rptCusCfgModel = mongoose.model("rpt_customize_cfg");
+const comRationSecTreeModel  = mongoose.model('complementary_ration_section_tree');
+const blockLibModel =  mongoose.model('blockLibsModel');
+const comGLJLibMode =  mongoose.model('complementary_glj_lib');
+const comGLJSectionModel = mongoose.model('complementary_glj_section');
+const comRationItemsModel = mongoose.model('complementary_ration_items');
+const comRationCoeModel = mongoose.model('complementary_ration_coe_list');
+const comRationInstalModel = mongoose.model('complementary_ration_installation');
+const comRationInstalSectionModel = mongoose.model('complementary_ration_installationSection');
+const rptTplTreeMode =  mongoose.model("rpt_tpl_tree");
+let sysSchedule = require('../../sys_tools/models/sys_model');
 class UserModel extends BaseModel {
 
     /**
@@ -171,7 +189,43 @@ class UserModel extends BaseModel {
     getDayMsg(index){
         return this.dayMsg[index];
     }
-
+    async deleteUser(userID,managerID){
+        //把用户的项目,单价文件,费率文件标记为真删除状态,然后统一调用清除项目数据的方法
+        let deleteInfo = {
+            deleted:true,
+            deleteDateTime : new Date(),
+            deleteBy:managerID,
+            completeDeleted:true
+        };
+        //标记删除
+        await unitPriceFileModel.updateMany({"user_id":userID},{"deleteInfo":deleteInfo});
+        await feeRateFileModel.updateMany({"userID":userID},{"deleteInfo":deleteInfo});
+        await projectModel.updateMany({"userID":userID},{"deleteInfo":deleteInfo});
+        //删除项目相关数据
+        await sysSchedule.clearJunkData();
+
+        //删除用户私有数据
+        await optionsModel.deleteMany({"user_id":userID});
+        await settingModel.deleteMany({"user_id":userID});
+        await messageModel.deleteMany({"user_id":userID});
+        await logModel.deleteMany({"user_id":userID});
+
+        await rptCfgModel.deleteMany({"userId":userID});
+        await rptCusCfgModel.deleteMany({"userId":userID});
+        await comRationSecTreeModel.deleteMany({"userId":userID});
+        await comGLJLibMode.deleteMany({"userId":userID});
+        await rptTplTreeMode.deleteMany({"userId":userID});
+        await comGLJSectionModel.deleteMany({"userId":userID});
+        await comRationItemsModel.deleteMany({"userId":userID});
+        await comRationCoeModel.deleteMany({"userId":userID});
+        await comRationInstalModel.deleteMany({"userId":userID});
+        await comRationInstalSectionModel.deleteMany({"userId":userID});
+        await blockLibModel.deleteMany({"userID":userID});
+
+        //最后删除用户信息:
+        await this.db.model.deleteOne({_id:mongoose.Types.ObjectId(userID)});
+        return "success";
+    }
 }
 
 export default UserModel;

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

@@ -19,5 +19,6 @@ module.exports =function (app) {
     router.post('/findByID', userController.auth, userController.init, userController.findByID);
     router.post('/getUserList', userController.auth, userController.init, userController.getUserList);
     router.post('/updateUser', userController.auth, userController.init, userController.updateUser);
+    router.post('/deleteUser', userController.auth, userController.init, userController.deleteUser);
     app.use("/user", router);
 };

+ 29 - 1
web/users/js/user.js

@@ -15,11 +15,34 @@ $(document).ready(function() {
         selector.prev("button").children("lable").text(string);
         //selector.prev("button").html(string + ' <span class="caret"></span>');
     });
+    $("#deleteConfirm").click(async function () {
+        let userID = $("#userID").val();
+        let delCount = parseInt($("#delCount").val());
+        delCount = delCount+1;
+        $("#delCount").val(delCount);
+        if(delCount == 3){//连续点3次才做真删除
+            if(userID!=""){
+                try {
+                    $.bootstrapLoading.start();
+                    let  result  = await ajaxPost("/user/deleteUser",{userID:userID});
+                    $.bootstrapLoading.end();
+                    if(result == "success"){
+                        window.location.reload();
+                    }else {
+                        alert("删除失败!");
+                        $("#delCount").val(0);
+                    }
+                }catch (err){
+                    $.bootstrapLoading.end();
+                    $("#delCount").val(0);
+                }
+            }
+        }
+    });
 });
 let cacheUser = null;
 
 async function getUserInfo(ID) {
-    console.log(ID);
     let user = await ajaxPost("/user/findByID",{ID:ID});
     let infoString = `<tr><th>注册时间</th><td>${user.create_time}</td><th>最近登录</th><td>${user.last_login}</td></tr>
                       <tr><th>手机</th><td >${user.mobile}</td><th>邮箱</th><td>${user.email}</td></tr>
@@ -30,6 +53,11 @@ async function getUserInfo(ID) {
     $('#userInfoTable').html(infoString);
 }
 
+function deleteUser(userID) {
+    $("#delCount").val(0);
+    $("#userID").val(userID);
+}
+
 async function getUserUpgradeInfo(ID){
     try {
         cacheUser  = await ajaxPost("/user/findByID",{ID:ID});

+ 1 - 0
web/users/views/layout/layout.html

@@ -21,6 +21,7 @@
     <script src="/web/users/js/lib/bootstrap-paginator.js"></script>
     <script src="/lib/lodash/lodash.js"></script>
     <script type="text/javascript" src="/public/web/common_ajax.js"></script>
+    <script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
     <script type="text/javascript" src="/node_modules/moment/min/moment.min.js"></script>
     <!-- spreadJs -->
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>

+ 29 - 0
web/users/views/user/index.html

@@ -99,6 +99,9 @@
                     <th>企业地区</th>
                     <th>最近使用版本</th>
                     <th width="180">注册时间 / 最近登录</th>
+                    <% if (manager.superAdmin == 1) { %>
+                    <th>操作</th>
+                    <% }%>
                     <!--<th>详细</th>-->
                 </tr>
                 </thead>
@@ -111,6 +114,9 @@
                     <td><%= model.province[user.province] %></td>
                     <td><%= compilationMap[user.latest_used]?compilationMap[user.latest_used].name:""%></td>
                     <td><%= moment(user.create_time).format('YYYY-MM-DD HH:mm:ss') %><br><%= user.latest_login?moment(user.latest_login).format('YYYY-MM-DD HH:mm:ss'):"" %></td>
+                    <% if (manager.superAdmin == 1) { %>
+                    <td><a onclick='deleteUser("<%= user._id.toString()%>")' data-toggle="modal" data-target="#delUser" class="btn btn-link btn-sm" style="padding: 0px">删除</a></td>
+                    <% }%>
                     <!--<td><a role="button" data-toggle="modal" data-target="#view" onclick='getUserInfo("<%= user._id.toString()%>")'>详细</a></td>-->
                     <!--<td><a href="#update" data-toggle="modal" data-target="#update" onclick='getUserUpgradeInfo("<%= user._id.toString()%>")'>升级</a></td>-->
                 </tr>
@@ -167,6 +173,29 @@
     </div>
 </div>
 
+<!--弹出删除-->
+<div class="modal fade" id="delUser" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <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">×</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <h5 class="text-danger">删除用户的同时会删除项目数据和用户补充人材库、定额库等数据,且无法恢复,确认是否删除?</h5>
+                <input type="hidden" id="userID">
+                <input type="hidden" id="delCount">
+            </div>
+            <div class="modal-footer">
+                <a id="deleteConfirm" href="javascript:void(0);" class="btn btn-danger" >确认</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 <script type="text/javascript">
     let compilationList = JSON.parse('<%- compilationString %>');
     let adminName = '<%- adminName %>';