通讯录同步

只有加入到钉钉通讯录中的用户才可以访问H5微应用钉钉小程序。因此,在系统初始化时,我们需要先进行通讯录同步操作

当第一次同步完部门和成员后,以后所有的变更(增、删、改)都会自动进行同步

依次进入:首页->设置->钉钉->通讯录管理

contacts-sync-zhcn

部门与角色

钉钉中的部门对应的是CabloyJS中的角色。当同步部门时,将部门信息保存在数据表aDingtalkDepartment中,同时创建一个角色

1. 根部门

钉钉中的根部门默认对应的是CabloyJS中的角色internal/dingtalk的子角色。此默认角色可以定制

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

  // sync
  config.sync = {
    department: {
      roleContainer: 'internal',
      roleTop: 'dingtalk',
    },
  };

2. 角色树

CabloyJS针对各类业务开发的需求,提炼了一套内置角色,并形成一个规范的角色树。实际开发中,可通过对角色树的扩充和调整,实现各类角色相关的需求

钉钉中的部门树同步到CabloyJS中的角色树,就是进行角色扩充的典型应用

在CabloyJS中,部门岗位本质上都是角色,因此都需要组织在角色树中。比如张三是软件部的开发经理,那么角色结构就应该是这样:XXX企业 -> 软件部 -> 开发经理,然后把用户张三加入到角色开发经理中,从而方便权限的授予和资源的分配

更多信息,请参见:角色基本概念

3. 角色与授权

CabloyJS提供了完备、而且灵活的角色与授权系统,请参见:角色授权

4. 获取角色

const role = await this.ctx.meta.role.parseRoleName({
  roleName, 
  roleIdParent, 
  force = false,
});
名称 说明
roleName 角色名称,可以是.级联模式
roleIdParent 父角色Id,可以为空
force 如果角色不存在,是否强制创建

5. 获取部门

模块a-dingtalk提供了一个model: department。我们可以在自己的业务模块中通过这个model来获取钉钉的部门信息。比如,我们可以通过roleId查找对应的departmentId

const modelDepartment = this.ctx.model.module('a-dingtalk').department;
const department = await modelDepartment.get(where);
  • where:可传入以下参数的组合进行部门的检索
名称 说明
roleId 角色Id
departmentId 部门Id
departmentParentId 父部门Id
departmentName 部门名称

成员与用户

钉钉中的成员对应的是CabloyJS中的用户。当同步成员时,将成员信息保存在数据表aDingtalkMember中,同时创建一个用户

- 获取当前登录用户

当用户登录成功后,我们可以直接通过this.ctx.state.user.op来获取当前用户信息

- 获取成员

模块a-dingtalk提供了一个model: member。我们可以在自己的业务模块中通过这个model来获取钉钉的成员信息。比如,我们可以通过userId查找对应的memberId

const modelMember = this.ctx.model.module('a-dingtalk').member;
const member = await modelMember.get(where);
  • where:可传入以下参数的组合进行成员的检索
名称 说明
userId 用户Id
memberId 成员Id

在钉钉中,也是用UserId来标识一个成员。为了避免两个系统中术语的冲突,钉钉中的UserId在CabloyJS中采用MemberId来表述