这里重点介绍三个重要的原子操作:read, select, count

read

- 前端

this.$api.post('/a/base/atom/read', {
  key: { atomId, itemId },
}).then(item => {
  console.log(item);
});

- 后端

const user = this.ctx.state.user.op;
const item = await this.ctx.bean.atom.read({
  key: { atomId, itemId },
  user,
});

select

- 前端

this.$api.post('/a/base/atom/select', {
  atomClass,
  options,
}).then(data => {
  console.log(data.list, data.index, data.finished);
});

- 后端

const user = this.ctx.state.user.op;
const items = await this.ctx.bean.atom.select({
  atomClass: {
    id,
    module,
    atomClassName,
  },
  options: { 
    where: {
      ['a.atomName']: { op: 'like', val: 'atomName' }
    },
    orders: [
      [ 'a.updatedAt', 'desc' ],
    ],
    page: { index: 0, size: 10 },
    mode: null,
    stage = 'formal',
    star = 0, 
    label = 0, 
    comment = 0, 
    file = 0,  
    language, 
    category = 0, 
    tag = 0, 
    mine = 0,
  },
  user,
});
  • 返回值
名称 说明
data.list 条目列表
data.index 下一页的分页索引
data.finished 数据是否已经获取完毕。如果获取完毕,就不会再获取下一页
  • 参数
名称 允许为空 说明
atomClass 原子类型
options 查询参数
  • 查询参数:options

原子的select操作实现原理是:根据用户提交的参数组合sql语句,其中会联合一些系统表,从而取得用户所希望的信息

名称 允许为空 缺省值 说明
where 查询条件
orders 排序
page.index 分页索引
page.size 20 分页大小
mode 联合业务表的模式,可选参数:default/full/search
stage formal 查询哪个原子阶段:draft/formal/history
star 0 联合查询用户星标
label 0 联合查询用户标签
comment 0 联合查询原子评论列表
file 0 联合查询原子附件列表
language 语言
category 0 目录
tag 0 标签
mine 0 我的原子

mode: 可通过模块meta文件中的tableNameModes添加更多模式的配置,一般是配置mysql的数据视图

stage: 原子生命周期的三个阶段,分开查询

  • 联合表清单:
表名称 表别名 说明
aAtom a 原子基础表
aAtomClass b 原子类型表
aAtomStar d 用户星标
aAtomLabelRef e 用户标签
如:testPartyView f 原子业务表
aUser g userIdCreated对应的用户信息
aUser g2 userIdUpdated对应的用户信息
aComment h 评论表
aFile i 附件表
aCategory j 目录表
aTagRef k 标签表
  • where条件

EggBornJS中的where条件类似于EggJS中的where条件,并进行了扩展,支持更多条件设置,参见:Model方法

  • orders排序

EggBornJS中的orders排序用法与EggJS中的orders排序一致,如

orders: [
  [ 'a.updatedAt', 'desc' ],
],
  • page分页

EggBornJS新增了page分页特性,通过indexsize的组合生成sql语句中的limitoffset

一般而言,前端不需传递page.size,而是由后端统一填充此值,可以在项目的config文件中覆盖page.size的默认值,如下:

src/backend/config/config.default.js

// modules
config.modules = {
  'a-base': {
    pageSize: 20,
  },
};

count

- 前端

this.$api.post('/a/base/atom/count', {
  atomClass,
  options,
}).then(count => {
  console.log(count);
});

- 后端

const user = this.ctx.state.user.op;
const count = await this.ctx.bean.atom.count({
  atomClass,
  options,
  user,
});
  • 返回值: count

  • 参数: 同select