根据企业需求,为人员或团队自定义属性标签,可根据属性标签决定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>
   );
 });

演示效果

演示效果

相关新闻

  • 自定义云文档操作项

    自定义云文档操作项

    响应企业安全、效率需求,屏蔽、禁用、拦截、扩展云文档的导入导出等操作。 如何屏蔽\禁用\拦截\扩展文件操作项? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 文档中心里,这些“新建”“导入”“上传”“导出”“分享”等按钮,都是文件操作项,企业用户可以使用这些按钮操作文件。 有些企业可能出于安全、效率等需求,希望屏蔽\禁用、拦截、扩展部分文件操作项。 屏蔽\禁用 指的是企业担心文档泄漏,希望完全禁止企业用户下载文档,想屏蔽\禁用WPS文档中心的下载按钮。屏蔽:指“操作项完全不可见”禁用…

    最佳实践 2025年12月11日
  • 限制用户下载特定文件

    限制用户下载特定文件

    在员工离职或出于其它安全考虑,企业需要对员工创建或管理的文件进行管控,或对扫描出敏感信息的文件进行管控,限制文件下载。 如何限制企业用户下载特定文件 本定制方案仅适用于私有化WPS365版本 1. 方案概述 员工离职前,出于安全考虑,企业会对其创建或管理的文件进行管控。 管控会有两个实现方式: 有安全管控需求时,比如文件扫描出敏感信息,用户的网络环境(内网或外网)、文件大小不满足管理规定,都有可能需要限制下载。 针对这两种情况,我们可以使用文档中心Web端(PC端)的开放能力,定制下载功能: 实…

    最佳实践 2025年12月11日
  • 自定义文件列表右键菜单项

    自定义文件列表右键菜单项

    企业需要在文件列表的右键菜单栏中,新增其它定制菜单项 如何在文件列表新增右键菜单项? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 有时候,企业需要给不在组织通讯录中的成员共享文档,传统流程是把文档下载下来,通过邮件发送,易导致效率瓶颈。 现在,通过文档中心的扩展能力,可以直接在文件列表右键菜单新增自定义分享弹窗入口,简化协作流程。 这一功能不仅支持自定义分享弹窗,企业也可根据实际需要,在文件列表的右键菜单栏中,新增其它定制菜单项。 我们可以使用文档中心Web端(PC端)的开放能力,…

    最佳实践 2025年12月11日
  • 文档中心主题皮肤定制

    文档中心主题皮肤定制

    将企业主题色融入WPS365产品界面,使之与企业风格更为统一 如何为文档中心定制主题皮肤? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 主题皮肤就是文档中心提供的界面颜色,下图为文档中心标准产品的主题皮肤: 出于以下需求的考虑,客户可能会需要定制个性化的主题皮肤: 实现效果 深色模式浅色模式护眼模式跟随系统模式注:以上展示的【深色】【浅色】【护眼】模式的具体颜色效果由客户自己定义,上图仅作参考示例 依赖端 文档中心PC端 依赖版本 23.0907(含)以上 依赖操作系统 支持X86…

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

    文档中心欢迎页定制

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

    最佳实践 2025年12月11日
  • 告别Excel乱崩+电话催办!WPS 365,一键搭建任务预警平台,进度可视化、协作不内耗

    告别Excel乱崩+电话催办!WPS 365,一键搭建任务预警平台,进度可视化、协作不内耗

    🚨 任务太多没人交?3张表搞定进度监控!多维表格“动态预警平台”来了! “这个月的PPT谁还没交?”“预算表收齐了吗?我得一个个打电话问……”“又要手动统计,Excel一乱全崩了!” 你是不是也经历过这些? 作为管理者,最怕的就是: ✅ 任务安排下去,杳无音信 ✅ 每次催进度,都像“打地鼠” ✅ 手动汇总数据,一不小心就出错 别急!今天教你用 多维表格 搭建一个—— 👉 任务提交进度动态监管预警平台 无需代码、零成本,三张表打通闭环,实时看谁交了、谁没交、完成率多少! 🎯 为什么你需要这个系统?…

    企业数智化转型 2026年3月1日

发表回复

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

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

请您留言

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