根据企业需求,为人员或团队自定义属性标签,可根据属性标签决定WPS业务表现,如根据人员安全等级判断能否访问某文档
如何给企业团队/人员标记属性?
本定制方案仅适用于私有化WPS365版本
1. 方案概述
出于安全、效率的目的,有些企业需要给团队/人员标记属性:
- 有些企业希望“根据人员安全等级,来判断该人员是否能访问某文档”
- 有些企业希望“针对岗位定向推送通知”
文档中心里,可以在团队空间、通讯录的团队/人员名称这两个位置,标记属性。
![]() | ![]() |
|---|
我们可以通过文档中心服务端、Web端(PC端)的开放能力,为企业团队/人员标记属性:
| 效果 | 定制后,企业团队/人员名称旁会出现属性名称。![]() 红框为定制后的团队属性红框为定制后的人员属性 |
| 涉及接口 | 新增自定义用户属性获取自定义用户属性列表批量更新用户的自定义属性值批量获取用户的自定义属性值 |
| 依赖版本 | 版本24-12a(含)以上可支持 |
| 依赖操作系统 | 皆支持X86、XC |
| 备注 | 定制属性仅在Web端(PC端)显示,H5端(移动端)不显示。 |
2. 使用指南
👉团队属性字段扩展
支持对团队属性扩展,如安全团队等
能力
sdk.kdrive.groupPage.fileList
使用方法
sdk.kdrive.groupPage.fileList.onUpdate((data)=>{
const dataList = data.list.items()
const fileList = sdk.kdrive.groupPage.fileList
const slotName = 'fileName'
dataList.length &&
dataList.forEach((item) => {
const slot = fileList.fileItem(item['id'])[slotName]
sdk.append(slot, <div style={{ color: 'red' }}>demo示例</div>, {
key: 'test-tag',
})
})
})
演示效果

👉人员属性字段扩展
支持对人员属性扩展,如标记为“核心人员”等
📌 注意
注意:下方接口调用示例统一使用i接口方式进行调用,不同接口方式的调用流程是保持一致的,故可参考下方示例了解接口调用流程,实际调用时可参考接口文档说明进行调用
- 第一步:新增用户自定义属性字段
post /v7/companies/user_custom_attrs/batch_create(接口文档)
- 第二步:获取自定义属性字段信息列表
get /v7/companies/user_custom_attrs/batch_read(接口文档)
- 第三步:用户自定义属性字段添加值
post /v7/users/custom_attrs/batch_update(接口文档)
- 第四步:查询用户自定义属性值
post /v7/users/custom_attrs/batch_read(接口文档)
能力
sdk.commonComponents.memberSelectorModal.memberItem
使用方法
服务端
📌 使用
- 首先注册用户自定义属性 — 第一步接口
- 给用户自定义属性添加值 — 第二步 + 第三步接口
- 为前端提供接口可查询相关用户自定义属性信息 — 服务端封装第四步接口
添加成员自定义属性
// 批量新增用户自定义属性
func (m *ExtarMemberApi) BatchAddUserAttrs() (*BatchAddUserAttrsRespData, error) {
// 数据举例
attrInfo := &BatchAddUserAttrsReq{
CustomAttrs: []BatchAddUserAttr{
{
Name: "userCustomAttrTest",
Options: []BatchAddUserAttrOption{},
ValueType: "text",
},
},
}
h, _ := json.Marshal(attrInfo)
uri := "/open/v7/companies/user_custom_attrs/batch_create"
// i接口,wps4签名
wps4Header, err := wps4DocSign.Wps4DocsSign(m.ak, m.sk, uri, http.MethodPost, h)
if err != nil {
return nil, fmt.Errorf("BatchAddUserAttrs wps4DocSign.Wps4DocsSign error: %s", err)
}
// 发送请求
url := fmt.Sprintf("%s/i/docmini%s", m.domain, uri)
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(h))
if err != nil {
return nil, fmt.Errorf("BatchAddUserAttrs http.NewRequest error: %s", err)
}
request.Header.Set("Content-Type", wps4Header.ContentType)
request.Header.Set("Wps-Docs-Date", wps4Header.Date)
request.Header.Set("Wps-Docs-Authorization", wps4Header.Authorization)
// 多租户下需要携带companyId,建议使用平台租户id
request.Header.Set("x-cams-caller-company-id", config.GlobalConfig.PLATFORM_TENANT_ID)
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return nil, fmt.Errorf("BatchAddUserAttrs client.Do error: %s", err)
}
if resp != nil && resp.Body != nil {
defer resp.Body.Close()
}
var respBody []byte
if resp.StatusCode != http.StatusOK {
if resp.Body != nil {
respBody, _ = io.ReadAll(resp.Body)
}
log.Error("BatchAddUserAttrs error, statusCode ", resp.StatusCode, "body:", string(respBody))
return nil, fmt.Errorf("BatchAddUserAttrs error, statusCode: %d, body: %s", resp.StatusCode, string(respBody))
}
respBody, err = io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("BatchAddUserAttrs io.ReadAll error: %s", err)
}
respInfo := &BatchAddUserAttrsResp{}
err = json.Unmarshal(respBody, respInfo)
if err != nil {
return nil, fmt.Errorf("BatchAddUserAttrs json.Unmarshal error: %s", err)
}
log.Info("BatchAddUserAttrs success: ", respInfo)
return &respInfo.Data, nil
}
指定成员添加自定义属性值
📌 提示
需要为指定用户的指定自定义属性添加属性值,指定属性attr_id可通过 第二步接口 查询得到,此接口可参考其他接口方式实现
// 用户自定义属性批量添加值
func (m *ExtarMemberApi) BatchUpdateUserAttrs(userIds []string, attrId string) error {
// 数据举例
userCustomnAttrs := make([]BatchUpdateUserAttrs, 0)
for _, userId := range userIds {
userCustomnAttrs = append(userCustomnAttrs, BatchUpdateUserAttrs{
CustomAttrs: []UserCustomAttr{
{
AttrId: attrId,
Text: "自定义属性值test",
},
},
UserId: userId,
})
}
users := &BatchUpdateUserAttrsReq{
Users: userCustomnAttrs,
}
h, err := json.Marshal(users)
if err != nil {
return err
}
uri := "/open/v7/users/custom_attrs/batch_update"
// i接口,wps4签名
wps4Header, err := wps4DocSign.Wps4DocsSign(m.ak, m.sk, uri, http.MethodPost, h)
if err != nil {
return fmt.Errorf("BatchUpdateUserAttrs wps4DocSign.Wps4DocsSign error: %s", err)
}
// 发送请求
url := fmt.Sprintf("%s/i/docmini%s", m.domain, uri)
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(h))
if err != nil {
return fmt.Errorf("BatchUpdateUserAttrs http.NewRequest error: %s", err)
}
request.Header.Set("Content-Type", wps4Header.ContentType)
request.Header.Set("Wps-Docs-Date", wps4Header.Date)
request.Header.Set("Wps-Docs-Authorization", wps4Header.Authorization)
// 多租户下需要携带companyId
request.Header.Set("x-cams-caller-company-id", config.GlobalConfig.PLATFORM_TENANT_ID)
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return fmt.Errorf("BatchUpdateUserAttrs client.Do error: %s", err)
}
if resp != nil && resp.Body != nil {
defer resp.Body.Close()
}
var respBody []byte
if resp.StatusCode != http.StatusOK {
if resp.Body != nil {
respBody, _ = io.ReadAll(resp.Body)
}
log.Error("BatchUpdateUserAttrs error, statusCode ", resp.StatusCode, "body:", string(respBody))
return fmt.Errorf("BatchUpdateUserAttrs error, statusCode: %d, body: %s", resp.StatusCode, string(respBody))
}
respBody, err = io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("BatchUpdateUserAttrs io.ReadAll error: %s", err)
}
respInfo := &BatchUpdateUserAttrsResp{}
err = json.Unmarshal(respBody, respInfo)
if err != nil {
return fmt.Errorf("BatchUpdateUserAttrs json.Unmarshal error: %s", err)
}
log.Info("BatchBatchUpdateUserAttrsAttrs success: ", respInfo)
return nil
}
获取用户自定义属性值信息
📌 提示
此接口功能是服务端通过封装 第四步接口 来为前端提供查询用户属性值的能力,第四步接口调用流程与其他接口调用流程基本相同,可参考其他接口自行实现
前端
sdk.commonComponents.memberSelectorModal.memberItem.onMounted(async (data) => {
// 判断是否为用户,只有用户才会进行查询;只有目标自定义属性才会进行渲染
let targetExtraInfo: any
let extraName = "userCustomAttrTest"
try {
let isUser: boolean = data.type === 'user'
if (!isUser) {
return
}
let userId = data.id
let params = Utils.filterParams({
user_ids: [userId]
})
// 调用服务端接口查询用户自定义属性(第四步接口封装)
const { data: extarAttrsInfo} = await request.post('/c/ssenewdemo/api/user/query/attrs', params)
console.log('extarAttrsInfo', extarAttrsInfo)
const attrInfos = extarAttrsInfo.users[0].custom_attrs as any[]
if (!attrInfos || attrInfos.length <= 0) {
return
}
// 查找目标自定义属性
targetExtraInfo = attrInfos.find((item: any) => item.attr_name === extraName)
if (!targetExtraInfo) {
return
}
} catch (error) {
console.error('render member attr error:', error)
}
sdk.mount(
sdk.commonComponents.memberSelectorModal.memberItem.tagRender(`${data.key}`),
<div>--{targetExtraInfo.text}</div>
);
});
演示效果

