Структура модели базы данных

Система изначально имеет определенную структуру базы данных. Эта структура может быть получена из 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"…}

Last updated