标签:mongoose 修改 mongoose update mongoose 批量
最近美国又他妈的皮痒了,在南海找事,还说什么中国必须接受南海仲裁结果,我去你大爷的,你以为你是谁啊。说实话只要我们要决一死战的勇气,还管什么华盛顿航母,佛吉尼亚潜艇,大不了大家一起死,不,全世界一起死。怎么个死法,中国惹急了先给俄罗斯来几颗核弹,然后俄罗斯反击中国的同时,也会给欧洲扔几颗核弹,给美国扔很多核弹,然后欧洲英法会给其他国家扔核弹,美国给世界扔核弹,俄罗斯只给北冰洋扔就行了,中国给美国和太平洋扔就行了,这样世界就不复存在了。
今天我们来看一下文件权限管理,这个其实是对共享出去的文件的一个简单的权限管理demo。在上节我写过的界面中,可以查询自己共享出去的文件。
勾选Shared,我们查出自己共享出去的文件。或者我们可以通过点击ToolBar上面的SHARE按钮,实现共享文件。
$(".k-grid-share", "#file_list").bind("click", function (ev) {
var selIds = [];
$("#file_list table:eq(1)").find("tr").each(function () {
var chkElement = $(this).children("td:first").find("input[type=‘checkbox‘]").first();
if (chkElement.prop(‘checked‘)) {
selIds.push(chkElement.val());
}
});
if (selIds.length == 0) {
showMsg(‘info‘, ‘Please select at least one file to share!‘);
return;
}
sharedUpdate(selIds, true);
});首先是找到选中的文件的_id,然后调用shareUpdate方法去共享。
function sharedUpdate(selIds, shared) {
msg = Messenger().post({
message: "Do you want to " + (shared? ‘share‘:‘unshare‘) + " these file?",
actions: {
delete: {
label: ‘Yes‘,
delay: 10,
action: function () {
var postData = {
ids: selIds,
isShared: shared
};
$.ajax({
url: ‘/file/share‘,
type: ‘PUT‘,
dataType: ‘json‘,
data: { postData: JSON.stringify(postData) },
success: function (res) {
if (!res.isSuc) {
showMsg(‘error‘, res.msg);
return;
}
getFilelist(selGroupId);
}
});
msg.hide();
}
},
cancel: {
label: "No",
action: function () {
msg.hide();
}
}
}
});
}发送一个ajax请求,去修改传入文件的共享属性,看一下效果
先会弹出确认,点击Yes,调用api file/share去修改共享属性,看一下后台。
router.put(‘/file/share‘, fileRoutes.fileShare);
exports.fileShare = function (req, res) {
var data = JSON.parse(req.body.postData);
var idArray = data.ids;
if (!idArray || idArray == 0) {
res.status(403).json(commonMsgRes.buildJsonErrorRes(‘NoRecord‘));
return;
}
fileModel.update({ _id: { $in: idArray } }, { $set: { isshared: data.isShared } }, { multi: true }
, function (error, result) {
if (error) {
res.json({ isSuc: false, msg: error.message });
}
else {
res.json({ isSuc: true });
}
});
}在后台,先把json字符串转化成js对象,然后用mongoose提供的update方法去批量更新数据。注意这里的$in,其实是和sqlServer中的in一个意思,$set意思是需要修改的属性,你可以在这里写多个属性进行修改,并不一定只是一个isshared属性,然后最后的multi:true,意思是更新多个doc。所以整个修改的意思就是找到_id在idArray中的file docs,然后将其isshared属性全部修改为传入的值。当然在这里你也可以使用mongoose中的findAndUpdate方法去做批量更新。
文件share好之后,我们看一下共享文件权限设置界面。
查询出数据后,每个文件都可以设置权限,这里很简单的三个,要真做权限,还是买吉日嘎啦的走火入魔权限管理系统好了,自己不要瞎折腾。OK,那么这三个权限使我们mongodb数据库中配置的。
我们在界面可以选择一个或者多个。
选择完成后,点击Save,如果不想修改了,点击cancel,可以回到初始状态,我们来看一下js代码。
$("#file_list").kendoGrid({
scrollable: true,
allowCopy: true,
resizable: false,
sortable: true,
height: 800,
pageable: {
refresh: true,
pageSizes: [10, 20, 50, 100],
buttonCount: 5,
},
toolbar: [{ name: ‘authSet‘, text: "Batch Setup" , imageClass: ‘k-icon k-i-lock‘ }],
columns: [{
template: "<div class=‘center-align-text‘>" +
"<input id=‘chkId_#=_id#‘ type=‘checkbox‘ class=‘k-checkbox‘ value=‘#=_id#‘ onclick=‘chkHeader_cl
+ "<label class=‘k-checkbox-label‘ for=‘chkId_#=_id#‘></label></div>",
field: "",
title: "<div class=‘center-align-text‘>" +
"<input type=‘checkbox‘ class=‘k-checkbox‘ id=‘chk_all‘/>"
+ "<label class=‘k-checkbox-label‘ for=‘chk_all‘></label></div>",
width: 45,
sortable: false
},
{
field: "fullname",
title: "File Name"
},
{
field: "isshared",
title: "Shared" ,
template: ‘<select id="ddl_auth#=_id#" name="auth" multiple="multiple"></select>‘,
sortable: false
}, {
command: [
{
name: "authUpdate",
text: "Save",
imageClass: "k-icon k-i-tick",
click: updateFileAuth
}, {
name: "authCancel",
text: "Cancel",
imageClass: "k-icon k-i-undo",
click: cancelUpdateFileAuth
}
],
width: 230,
title: "Operation"
}], dataBound: function (rowBoundEvent) {
$("#file_list select[name=‘auth‘]").each(function (index, element) {
$(element).kendoMultiSelect({
valuePrimitive: true,
placeholder: "---Please Select---",
ignoreCase: true,
dataSource: authArray.length > 0? authArray:dataSource,
dataTextField: "name",
dataValueField: "_id",
headerTemplate: ‘<div class="multi-select-header">‘
+ ‘Choose File Auth Below:</div>‘,
dataBound: function (e) {
var dataItem = $("#file_list").data(‘kendoGrid‘).dataItem($(element).closest("tr"));
if (dataItem.auth && dataItem.auth.length > 0) {
var authArray = [];
dataItem.auth.forEach(function (v) {
authArray.push(v._id);
});
this.value(authArray);
}
}
});
});
}
});大家注意isShared这一列,是个下拉列表,支持多选,然后在数据绑定完成以后,循环里面的下拉列表,将其渲染成kendoMultiSelect,注意这里的dataSource参数,如果authArray已经取到了,则使用,否则调用后台api获取。
var dataSource = new kendo.data.DataSource({
transport: {
read: {
url: "/file/auth",
dataType: "json"
}
}
});如果在这里直接使用每次请求的话,会存在很多问题,性能问题,界面渲染也会出现一些重复渲染的问题。因为大家的auth都是一样的,所以我们先取到再说。
var authArray = [];
$.get(‘/file/auth‘, function (result) {
authArray = result;
});OK,接下来我们看一下Save功能,在grid的定义中,我们可以看到save调用的是updateFileAuth方法。
function updateFileAuth(e) {
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
var fileId = dataItem._id;
var authArray = $("#ddl_auth" + dataItem._id).data("kendoMultiSelect").value()
if (!authArray || authArray.length == 0) {
showMsg(‘info‘, ‘Please select at least one auth!‘);
return;
}
var postData = {
fileId: dataItem._id,
fileAuth: authArray
};
$.post(‘/file/auth‘, postData, function (res) {
if (!res.isSuc) {
showMsg(‘error‘, res.msg);
return;
}
showMsg(‘success‘, ‘Saved successfully!‘);
$("#btn_searchShared").click();
});
}根据当前行拿到id,再根据id拿到下拉选中的值,kendoMultiSelect的value方法返回的就是一个数组。
最后我们将得到的数组传递到api去修改权限,看一下后台。
router.post(‘/file/auth‘, fileAuthRoutes.updateFileAuth);
exports.updateFileAuth = function (req, res) {
var fileId = req.body.fileId;
var fileAuth = req.body.fileAuth;
var fileAuths = [];
fileAuth.forEach(function (v) {
fileAuths.push(mongoose.Types.ObjectId(v));
});
fileModel.findByIdAndUpdate(fileId, { ‘$set‘: { auth: fileAuths } }
, function (error, doc) {
console.log(error);
if (error) {
res.json({ isSuc: false, msg: error.message });
}
else {
res.json({ isSuc: true });
}
});
}在这里我们先将权限的id转化成ObjectId,再根据传入的文件id进行修改,ok,save就说完了。
再看一下cancel,其实就是将该行的权限id再赋给下拉列表。
function cancelUpdateFileAuth(e) {
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
var fileId = dataItem._id;
var authArray = [];
if (dataItem != null && dataItem.auth.length > 0) {
dataItem.auth.forEach(function (v) {
authArray.push(v._id);
});
}
$("#ddl_auth" + dataItem._id).data("kendoMultiSelect").value(authArray);
}ok,最后就是batch批量设置,勾选数据,点击ToolBar上的BATCH SETUP,我们先看页面的代码。
这里的fileAuth_Window就是批量设置界面,在这里大家发现了一个循环的写法,不错,这就是jade模板中的语法,类似于razor视图引擎一样。看到这样的循环,我们在后台必须有代码要给页面这些值,类似于asp.net mvc中页面绑定的Model。
fileAuthSchemas.authModel.find({}, function (error, doc) {
res.render(‘authorization/docauth‘, { authArray: doc });
});看到了吧,在向客户端输出页面时,同时传了一个对象,对象中的authArray的值为doc。这样的话,我们就可以在页面直接使用这个变量authArray。
我们选择三个,点击SETUP,AJAX调用后台api批量设置。
$("#btn_setup").click(function () {
var selAuthIdArray = getSelAuthId();
if (selAuthIdArray.length == 0) {
showMsg(‘info‘, ‘Please select at least one auth!‘);
return;
}
var selIds = getSelFileId();
if (selIds.length == 0) {
showMsg(‘info‘, ‘Please select at least one file to setup!‘);
return;
}
showConfirm(updateFileAuthBatch);
});
function updateFileAuthBatch() {
var selIds = getSelFileId();
if (selIds.length == 0) {
showMsg(‘info‘, ‘Please select at least one file to setup!‘);
return;
}
var postBody = {
fileIdArray: selIds,
fileAuth: getSelAuthId()
};
$.post(‘/file/auth/batch‘, postBody, function (result) {
if (!result.isSuc) {
showMsg(‘error‘, result.msg);
return;
}
fileAuthWindow.data("kendoWindow").close();
$("#btn_searchShared").click();
});
}
function showConfirm(action) {
msg = Messenger().post({
message: "Do you want to setup?",
actions: {
save: {
label: ‘Yes‘,
delay: 10,
action: function () {
action();
msg.hide();
}
},
cancel: {
label: "No",
action: function () {
msg.hide();
}
}
}
});
}上面这段代码有没有很像C#中的委托呢?有点。最后我们看一下后台的批量设置api代码。
exports.batchUpdateFileAuth = function (req, res) {
var fileIdArray = req.body.fileIdArray;
var fileAuth = req.body.fileAuth;
var fileAuths = [];
if (!fileIdArray || fileIdArray.length == 0) {
res.json(commonMsgRes.buildJsonErrorRes(‘NoRecord‘));
return;
}
fileAuth.forEach(function (v) {
fileAuths.push(mongoose.Types.ObjectId(v));
});
fileModel.update({ _id: { $in: fileIdArray } }, { $set: { auth: fileAuths } }, { multi: true }
, function (error, doc) {
if (error) {
res.json({ isSuc: false, msg: error.message });
}
else {
res.json({ isSuc: true });
}
});
}这样就设置成功了,我们来看一下效果。
好了,下节进入我们的关键点,Excel在线保存,编辑。
学习Telerik Kendo UI:http://demos.telerik.com/kendo-ui/grid/index
本文出自 “技术创造价值” 博客,请务必保留此出处http://leelei.blog.51cto.com/856755/1812777
Node.js 切近实战(八) 之Excel在线(文件权限)
标签:mongoose 修改 mongoose update mongoose 批量
原文地址:http://leelei.blog.51cto.com/856755/1812777