根据企业需求,为人员或团队自定义属性标签,可根据属性标签决定WPS业务表现,如根据人员安全等级判断能否访问某文档

如何给企业团队/人员标记属性?

本定制方案仅适用于私有化WPS365版本

1. 方案概述

出于安全、效率的目的,有些企业需要给团队/人员标记属性:

  • 有些企业希望“根据人员安全等级,来判断该人员是否能访问某文档”
  • 有些企业希望“针对岗位定向推送通知”

文档中心里,可以在团队空间、通讯录的团队/人员名称这两个位置,标记属性。

团队空间属性标记通讯录属性标记

我们可以通过文档中心服务端、Web端(PC端)的开放能力,为企业团队/人员标记属性:

效果定制后,企业团队/人员名称旁会出现属性名称。QCUK4MJAACQHII6R22MJAAAQHE红框为定制后的团队属性红框为定制后的人员属性
涉及接口新增自定义用户属性获取自定义用户属性列表批量更新用户的自定义属性值批量获取用户的自定义属性值
依赖版本版本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',
      })
    })
})

演示效果

C7M74PY4ACACS

👉人员属性字段扩展

支持对人员属性扩展,如标记为“核心人员”等

📌 注意

注意:下方接口调用示例统一使用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

使用方法

服务端

📌 使用

  1. 首先注册用户自定义属性 — 第一步接口
  2. 给用户自定义属性添加值 — 第二步 + 第三步接口
  3. 为前端提供接口可查询相关用户自定义属性信息 — 服务端封装第四步接口

添加成员自定义属性

// 批量新增用户自定义属性
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>
   );
 });

演示效果

演示效果

相关新闻

  • 文档中心与第三方IM集成,促进高效协同办公

    文档中心与第三方IM集成,促进高效协同办公

    随着企业数字化转型的深入,企业在自研IM基础上需要补齐文档协作能力。文档中心通过集成第三方IM,为企业提供高效、安全的文档协作体验。 一、方案简介 金山办公文档中心V7集成第三方IM旨在为企业自研IM(即时通讯)系统提供文档能力的集成支持,通过文档中心V7与第三方IM的深度整合。 金山办公文档中心V7通过标准化接口与定制化开发相结合,实现IM与文档中心的无缝衔接,帮助企业构建”沟通-协作-管理”一体化平台。金山文档中心V7通过提供在线编辑、多人协同、版本管理,帮助客户减少…

    最佳实践 2025年12月11日
  • 双因子认证

    双因子认证

    企业出于安全考虑,需要在修改功能或登录密级较高的页面时,对成员进行二次身份校验 企业需要双因子认证时,可以怎么操作? 该组件仅适用于私有化WPS365版本 1. 方案概述 一般来讲,用户登录的安全认证分为两种: 文档中心使用的是单因子认证的方式。 出于安全考虑,企业需要在修改定制应用功能前,比如修改消息审计、全局配置前。 或登录密级较高的页面时,对成员进行二次身份校验。 针对这种情况,我们可以使用文档中心管理后台的开放能力,定制双因子认证 实现效果 用户登录管理后台时,页面会跳出窗口,提醒用户绑…

    最佳实践 2025年12月11日
  • WPS协作产品消息审计能力助力客户应对信息安全、合规及消息追溯的挑战

    WPS协作产品消息审计能力助力客户应对信息安全、合规及消息追溯的挑战

    为了满足数字化办公时代组织对于企业内风险消息监控的需求,WPS提供了审计授权、消息搜索、审计操作、审计设置及审计日志等几大能力,助力企业提升内部消息的安全性和合规性。 能力简介 在数字化办公时代,即时通讯(IM)工具在组织的作用越发重要,随之要面对的就是风险消息监控、敏感词过滤、日志全量留存及多维分析等诸多问题来确保企业通讯的合规性。WPS协作产品为客户提供了消息审计的相关接口和基础能力,基于相关接口和能力,客户可以通过开发实现内容识别拦截违规信息、完整记录消息内容、时间、参与方等元数据,支持分…

    最佳实践 2025年12月11日
  • 限制企业用户上传特定文件

    限制企业用户上传特定文件

    有些企业出于文档安全、带宽分配等原因,需要限制或全面杜绝文件上传。文档中心开放能力支持企业定制上传功能。 如何限制企业用户上传特定文件? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 有些企业出于文档安全、带宽分配等原因,需要限制文件上传: 有些企业希望完全杜绝以上风险,全面禁止企业用户上传文件。 针对这两种情况,我们可以使用文档中心服务端、Web端(PC端)、H5端(移动端)的开放能力,定制上传功能: 实现方式&效果 方案一需禁止特定文件类型 通过修改文件上传接口的策略并进行校验,…

    最佳实践 2025年12月11日
  • 文档中心定制功能多语言适配

    文档中心定制功能多语言适配

    满足企业的多语言需求,为文档中心的定制功能提供多语言适配方案。

    最佳实践 2025年12月11日
  • 文档中心欢迎页定制

    文档中心欢迎页定制

    在文档中心登录前进行品牌展示,为满足企业或组织的的个性化需求 如何为文档中心定制欢迎页? 该组件仅适用于私有化WPS365版本 1. 方案概述 欢迎页是由客户自己设计和定义的独立页面,可以在文档中心登录前进行品牌展示。 总的来说,欢迎页的内容客户可以根据自己的需求自行设计,通常比较高频的使用方式有: 如果没有定制欢迎页,客户在登录文档中心时,会直接进入文档中心登录页,输入账号和密码进行登录。 客户定制了文档中心欢迎页之后,遇到需要登录的场景,会先跳转进入企业欢迎页,在欢迎页进行相关操作(例如:点…

    最佳实践 2025年12月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

立即咨询 立即试用 上门服务

请您留言

感谢您的关注,你可留下联系方式,我们将第一时间与您联系。