Структура модели базы данных
Система изначально имеет определенную структуру базы данных. Эта структура может быть получена из sql - базы данных с помощью процедуры синхронизации данных, или просто использоваться текущая из git.
Файл со структурой базы данных хранится в modules/models/serverconfig.js
Любой модуль может расширить любую модель дополнительными полями. Все изменения в базе данных, которые делает модуль находятся в его папке в файле db.js
Рассмотрим расширение модели пользователя в модуле login:
var crypto = require('crypto');
module.exports = {
models:{
user:{
UserPhoto : {type : String , default : null, extended:true, ignoresave:true, template:"form_image"},
MailCode : {type : String, default : '', trim : true, select:false},
MobilePhone: {type : String, default : '', trim : true, mask:"+7 (999) 999-9999"},
PassHash : {select:false},
PassSalt : {select:false}
}
},
schema: {
user: function(schema){
schema.path('LoginUser').set(function(val){ return (val+'').toLowerCase().trim(); });
schema.path('Mail').set(function(val){ return (val+'').toLowerCase().trim(); });
schema.statics.SearchableFields = function(){
return ["NameUser","CodeUser","LoginUser","JobTitle","Phone","Mail","Comment","CodeObj"];
}
schema.virtual('password')
.set(function(password) {
if (password) {
this._plainPassword = password;
this.PassSalt = Math.random() + '';
this.PassHash = this.encryptPassword(password);
this.DoResetPass = false;
}
})
.get(function() { return this._plainPassword; });
schema.method({
encryptPassword : function(password) {
return crypto.createHmac('sha512', this.PassSalt).update(password).digest('hex');
},
checkPassword : function(password) {
if ((this.PassHash)&&(password))
return this.encryptPassword(password+'') === this.PassHash;
else return false;
}
});
return schema;
}
}
}
В данном примере модель расширяется 2 полями: UserPhoto и MailCode. Остальным полям просто добавляются расширенные свойства. Например для поля MobilePhone указывается маска редактирования, а для полей с паролем и солью указывается, что эти поля по умолчанию запрашивать из базу ненужно.
Кроме объявления или изменения полей, мы так же можем написать логику работы схемы: объявить новые методы или написать новые обработчики.
В нашем примере, мы написали, что при установке адреса электронной почты или логина пользователя мы переводим значения в нижний регистр. Также мы написали логику хранения паролей, объявив виртуальное поле password.
В дальнейшем в коде присвоение пароля будет выглядеть как:
mongoose.model('user').findOne({_id: req.user._id}).isactive().exec(function (err,U){
U.password = req.body.password;
U.save(req.user.CodeUser,function(err){
;
})
})
Хотя на самом деле пароль в базе данных присутствовать не будет, вместо поля password сохранятся PassHash и PassSalt
При работе с моделями можно указывать любой тип данных поддерживаемый MongoDb и надстройкой над ней Mongoose
На стороне клиента вся информация о структуре моделей тоже присутствует
Вы можете создать любую модель с помощью вызова функции MModels.Create. В качестве аргументов передаются 2 параметра: название модели и объект со значением полей. Недостающие поля будут инициализированы значениями по умолчанию.
Пример создания и работы с моделью (код выполнен в консоли разработчика):
> MModels.Create("doc",{}).ModelName
< "doc"
> MModels.Create("doc",{})
< Object {EditFields: Array(39), Code: "CodeDoc", Name: "NameDoc", Types: Object, Default: Object…}
> MModels.Create("doc",{}).toJS()
< Object {CodeDoc: "", NameDoc: "", SNameDoc: "", PrintNameDoc: "", PrintNumDoc: ""…}
> MModels.Create("doc",{}).EditFields
< (39) ["CodeDoc", "NameDoc", "SNameDoc", "PrintNameDoc", "PrintNumDoc", "FirstYear", "IsDesigner", "IsTester", "IsOverPeriodBlock", "HasChildObjs", "IndexDoc", "IsShowRoots", "IsActiveCondition", "IsPrimary", "IsAnalytic", "IsOlap", "IsInput", "IsChart", "IsPresent", "IsDivObj", "IsObjToRow", "IsShowParentObj", "IsBiztranDoc", "UseProd", "UseOrg", "UseDogovor", "UseDogovorArt", "IsShowMeasure", "UseOrgGroup", "UseSelfOrg", "IsInnerOrg", "IsVirtual", "IsObjTree", "IsRelBiztranDoc", "CodeDocType", "CodeRole", "CodeGrp", "CodeModel", "CodeMeasure"]
> MModels.Create("doc",{}).Code
< "CodeDoc"
> MModels.Create("doc",{}).Name
< "NameDoc"
> MModels.Create("doc",{}).Links
< (19) ["virtualdocbase", "virtualdocbase", "docrelation", "docrelation", "docbill", "docfolderdoc", "userfavorite", "docpacket", "docpacket", "docrow", "orggroup", "docheader", "rowchartline", "usertask", "routefiletype", "doctag", "doclabel", "docparamkey", "docobjtype"]
> MModels.Create("doc",{}).EditTemplate
< Object {IdDoc: "form_number", CodeDoc: "form_text", NameDoc: "form_text", SNameDoc: "form_text", IdDocType: "form_ref"…}