设置

2018-11-30 06:42:04

设置是什么

模块a-settings提供了设置特性,可以在前端集中显示每个模块的设置管理页面,便于用户统一管理

由于设置底层采用的是Form验证特性,所以只需提供与设置相关的JSON Schema配置信息即可

设置分类

每个模块可以提供两种设置

  1. 用户设置:与用户相关的设置
  2. 实例设置:与当前实例相关的设置

定义设置

在模块的meta中,分别为用户设置实例设置指定validator

a-settings/backend/src/meta.js

const require3 = require('require3');
const extend = require3('extend2');

module.exports = app => {
  const meta = {
  };
  // only support in test
  if (app.meta.isTest) {
    // schemas
    const schemas = require('./config/validation/schemas.js')(app);
    // keywords
    const keywords = require('./config/validation/keywords.js')(app);
    // meta
    extend(true, meta, {
      settings: {
        user: {
          validator: 'userTest',
        },
        instance: {
          validator: 'instanceTest',
        },
      },
      validation: {
        validators: {
          userTest: {
            schemas: 'user,userExtra',
          },
          instanceTest: {
            schemas: 'instance',
          },
        },
        keywords: {
          'x-languages': keywords.languages,
        },
        schemas: {
          user: schemas.user,
          userExtra: schemas.userExtra,
          instance: schemas.instance,
        },
      },
    });
  }
  return meta;
};
名称 说明
settings.user 用户设置
settings.user.validator 与用户设置相关的validator
settings.instance 实例设置
settings.instance.validator 与实例设置相关的validator

定义缺省值

在模块的Config中,分别为用户设置实例设置指定缺省值

a-settings/backend/src/config/config.js

// settings
config.settings = {
  instance: {
    info: {
      title: 'title1',
    },
  },
  user: {
    info: {
      username: 'zhennann',
    },
    extra: {
      extra: {
        info: {
          mobile: '1',
          sex: 1,
          language: 'en-us',
        },
      },
    },
  },
};

使用设置

在前端,可以直接通过设置菜单来管理每个模块的设置页面

在后端,模块a-settings通过中间件机制向ctx.meta注入来对象settings

a-settings/backend/src/controller/test.js

用户设置

getUser

获取某个属性的值

let value = await this.ctx.meta.settings.getUser({ 
  name: '/info/username'
});
名称 说明
name 属性名称,采用JSON Pointer格式

loadSettingsUser

获取完整的设置对象

let data = await this.ctx.meta.settings.loadSettingsUser();
let value = data.info.username;

saveSettingsUser

保持完整的设置对象

data.info.username = 'zhennann';
await this.ctx.meta.settings.saveSettingsUser({ data });

实例设置

getInstance

获取某个属性的值

let value = await this.ctx.meta.settings.getInstance({ 
  name: '/info/title'
});
名称 说明
name 属性名称,采用JSON Pointer格式

loadSettingsInstance

获取完整的设置对象

let data = await this.ctx.meta.settings.loadSettingsInstance();
let value = data.info.title;

saveSettingsInstance

保持完整的设置对象

data.info.title = 'title2';
await this.ctx.meta.settings.saveSettingsInstance({ data });


评论: