Структура модели базы данных
Система изначально имеет определенную структуру базы данных. Эта структура может быть получена из 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.
В дальнейшем в коде присвоение пароля будет выглядеть как:
Хотя на самом деле пароль в базе данных присутствовать не будет, вместо поля password сохранятся PassHash и PassSalt
При работе с моделями можно указывать любой тип данных поддерживаемый MongoDb и надстройкой над ней Mongoose
На стороне клиента вся информация о структуре моделей тоже присутствует
Вы можете создать любую модель с помощью вызова функции MModels.Create. В качестве аргументов передаются 2 параметра: название модели и объект со значением полей. Недостающие поля будут инициализированы значениями по умолчанию.
Пример создания и работы с моделью (код выполнен в консоли разработчика):
Last updated
Was this helpful?