1. 应用
1.1. 应用说明
应用针对某一场景创建,它由多个仪表盘组成。 应用包含了用户一次探索所需要的全部数据、图表以及关系模型,非常适合作为日常工作的一个封装概念。
1.1.1. 应用的定义
应用结构说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| id | LONG | 应用的 id | 
| title | STRING | 应用的标题 | 
| options | OBJECT | 应用的配置信息 | 
| options.dashboards | NUMBER 数组 | 此应用下的仪表盘 id 列表 | 
| options.charts | NUMBER 数组 | 此应用下的图表 id 列表 | 
| options.datasets | NUMBER 数组 | 此应用下的数据集 id 列表 | 
| options.dashboardsOrder | NUMBER 数组 | 此应用下的仪表盘的显示顺序 | 
| options.enableAppRule | BOOL | 是否启用行权限控制 | 
| options.publishConfig | OBJECT | 此应用的发布设置,只在发布的应用中启用 | 
| options.publishConfig.publishTitle | STRING | 发布的应用标题 | 
| options.publishConfig.publisher | STRING | 发布的用户名 | 
| options.publishConfig.coverImageId | NUMBER | 发布的应用的封面图片 id | 
| options.publishConfig.watermarkImageId | NUMBER | 发布的应用的水印图片 id | 
| options.publishConfig.duplicatedPermitted | BOOL | 发布的应用是否允许复制数据集 | 
| options.publishConfig.showDetailPermitted | BOOL | 只读模式下访问应用是否允许显示详情 | 
| options.publishConfig.downloadPermitted | BOOL | 只读模式下访问应用是否允许下载数据 | 
| options.publishConfig.zoomInPermitted | BOOL | 只读模式下访问应用是否下钻 | 
| options.publishConfig.targetFolderId | LONG | 发布的目录 id | 
| options.publishConfig.description | STRING | 发布应用描述 | 
| options.publishConfig.foldersTitle | STRING 数组 | 发布的目录路径名称 | 
| options.publishConfig.publisherDisplayConfig | OBJECT | 此应用的发布者显示配置 | 
| options.publishConfig.publisherDisplayConfig.id | LONG | 发布者 id | 
| options.publishConfig.publisherDisplayConfig.type | STRING | 发布者类型 | 
| options.publishConfig.publisherDisplayConfig.name | STRING | 发布者名称 | 
| options.appTemplateUUID | STRING | 应用模版的 uuid,只在导入、导出模版用到,不存库 | 
| options.filters | OBJECT数组 | 全局过滤器列表 | 
| isPublish | BOOL | 应用是不是发布区的应用 | 
| publishHash | STRING | 应用发布的哈希值 | 
| publishedBy | NUMBER | 发布区应用的源应用 id | 
| folderId | LONG | 应用所在的文件夹 id | 
| area | STRING | 应用所在的区域,可选值参照area值说明 | 
| shareHash | STRING | 分享应用的哈希值 | 
| dataMode | STRING | 应用的数据权限,可选值参照dataMode 值说明 | 
| emailOptions | OBJECT | 邮件自动推送的设置 | 
| emailOptions.receiverList | OBJECT 数组 | 邮件自动推送的系统内收件人列表 | 
| emailOptions.receiverList[].id | INTEGER | 用户或者用户组或者组织机构id | 
| emailOptions.receiverList[].name | STRING | 对应的名称 | 
| emailOptions.receiverList[].receiverType | STRING | 收件人类型,见收件人类型 | 
| emailOptions.emailAddressList | STRING 数组 | 邮件自动推送的系统外收件人的邮件地址列表 | 
| emailOptions.dashboardList | OBJECT 数组 | 邮件自动推送的仪表盘列表 | 
| emailOptions.dashboardList[].id | INTEGER | 仪表盘id | 
| emailOptions.dashboardList[].appId | INTEGER | 仪表盘所属的应用Id | 
| emailOptions.dashboardList[].title | STRING | 仪表盘的标题 | 
| emailOptions.bodyWithImage | BOOLEAN | 邮件自动推送是否包含图片在邮件正文 | 
| emailOptions.attachmentType | STRING | 邮件自动推送附件类型,见邮件附件类型 | 
| emailOptions.compressAttachment | BOOL | 邮件自动推送附件是否打包压缩,默认是压缩,不压缩填false | 
| entityGroup | STRING | 邮件自动推送的执行计划类别,用于管理执行计划,固定为APP_EMAIL | 
| entityKey | STRING | 邮件自动推送的执行计划关键字,用于管理执行计划 | 
| execDetail | OBJECT | 创建邮件推送执行计划需要用到的任务描述信息,详见执行计划 | 
| refreshEntityGroup | STRING | 应用数据集刷新的执行计划类别,用于管理执行计划,固定为APP_REFRESH | 
| refreshExecDetail | OBJECT | 创建数据集刷新执行计划需要用到的任务描述信息,详见执行计划 | 
| hsVersion | INTEGER | 可选,本次编辑的版本号,从0开始,修改前先GET待修改资源获取当前版本号,修改时带上刚刚获取的版本号,服务端会检查并发冲突。不带版本号不检查并发冲突。 | 
| tenantId | LONG | 可选, 租户id | 
| type | STRING | 应用类型, 可选值参照appType值说明 | 
| defaultDataset | LONG | 可选,应用中用于做图的默认数据集 | 
| publishState | BOOL | 创作区的应用是否发布 | 
| latestAuthorizedBy | LONG | 应用最近一次的授权者 | 
| latestAuthorizedAt | DATE | 应用最近一次授权时间 | 
| latestPublishedBy | LONG | 应用最近一次的发布者 | 
| latestPublishedAt | DATE | 应用最近一次发布时间 | 
收件人类型
| 字段值 | 描述 | 
|---|---|
| USER | 用户 | 
| ORGANIZATION | 用户组 | 
| DEPARTMENT | 组织机构 | 
邮件附件类型
| 字段值 | 描述 | 
|---|---|
| PNG | png文件 | 
| pdf文件 | |
| EXCEL | excel文件 | 
area 值说明
| 字段值 | 描述 | 
|---|---|
| PERSONAL_AREA | 应用创作区的个人区 | 
| PUBLIC_AREA | 应用创作区的共享区 | 
| DATA_MART | 数据集市 | 
| APP_MART | 应用集市 | 
dataMode 值说明
| 字段值 | 描述 | 
|---|---|
| APP_MODE | 应用作者 | 
| DATASET_MODE | 数据集作者 | 
| VIEWER_MODE | 使用者 | 
appType 值说明
| 字段值 | 描述 | 
|---|---|
| ANALYTIC_APP | 常用应用,用于分析场景 | 
| QUERY_APP | 查询应用,用于自助查询场景 | 
| DATA_APP | 数据包,用于数据集市区处理数据集 | 
1.2. 接口说明
1.2.1. 创建应用
请求URL
POST /api/v1/apps
请求参数
request body 请求体
应用结构说明 | 字段 | 类型 | 描述 | |------------------------------------------|----------|-------------------------| | title | STRING | 应用的标题 | | folderId | LONG | 应用所在的文件夹 id, 应用创作共享空间的根目录 id 为 1, 数据集市的根目录 id 为 2 | | area | STRING | 应用所在区域,需与folderId对应的目录所在区域一致,默认为PERSONAL_AREA |
返回对象的格式说明
接口示例1 在应用创作区新建应用
- 请求
POST /api/v1/apps 
{
  "title": "应用名称",
  "options": {
    "dashboardsOrder": [],
    "themes": {}
  }
}
- 响应结果
 
{
  "version": "3.2-SNAPSHOT@6929f52#8f8108f",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 46176,
    "title": "应用名称",
    "options": {
      "dashboardsOrder": []
    },
    "createdBy": 6,
    "createdAt": "2020-06-03 17:30:27",
    "updatedBy": 6,
    "updatedAt": "2020-06-03 17:30:27",
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "publish": false,
    "type": "ANALYTIC_APP"
  }
}
接口示例2 在应用创作共享空间根目录下创建应用
- 请求
POST /api/v1/apps 
{
  "folderId": 1,
  "title": "应用名称",
  "area": "PULIC_AREA",
  "options": {
    "dashboardsOrder": [],
    "themes": {}
  }
}
接口示例3 在应用集市团队空间根目录下创建应用
- 请求
POST /api/v1/apps 
{
  "folderId": 2,
  "title": "应用名称",
  "area": "SYSTEM_PORTAL",
  "options": {
    "dashboardsOrder": [],
    "themes": {}
  }
}
接口示例4 在应用创作下创建自助查询应用
- 请求
POST /api/v1/apps 
{
  "title": "应用名称",
  "options": {
    "dashboardsOrder": [],
    "themes": {}
  },
  "type": "QUERY_APP"
}
1.2.2. 查询应用
查询用户能看到的应用列表,在应用集市和应用创作区使用。
请求URL
GET /api/v1/apps
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| publish | BOOLEAN | 是 | 获取应用集市区应用时设置为 true,获取应用协作区应用时设置为 false | 
| orderBy | String | 否 | 排序字段 | 
| pOrCByCurrent | BOOLEAN | 否 | 应用集市区,查询 "我发布的" 应用时设置为 true, "发布给我的" 应用时设置为 false;应用协作区,查询"我协作的" 应用时设置为 true, "协作给我的" 应用时设置为 false | 
| createdByCurrent | BOOLEAN | 否 | 查询 "我创建的" 应用时设置为 true,"协作给我的" 应用时设置为false,用于应用创作区 | 
| showHide | BOOLEAN | 是 | 是否显示隐藏的应用,用于应用集市区 | 
| queryAll | BOOLEAN | 是 | 是否显示全部应用 | 
| ids | String | 否 | 要查询的应用id列表,用逗号隔开如:1,2,3,4 | 
返回对象的格式说明
接口示例1
请求
GET /api/v1/apps?pOrCByCurrent=false&offset=0&limit=20&orderBy=updatedAt&orderType=desc响应结果
{
  "version": "3.2-SNAPSHOT@b7c5a93#f76c1b6",
  "code": 0,
  "msg": "success",
  "data": [
    {
      "id": 45806,
      "title": "口罩专题分析",
      "cover": "",
      "options": {
        "dashboards": [
          1,
          2,
          3,
          5
        ],
        "datasets": [
          1
        ],
        "dashboardsOrder": [
          1,
          2,
          3,
          5
        ],
        "appTemplateUUID": "c05b0590-4685-4d3e-ac32-6cace767360f"
      },
      "createdBy": 187,
      "createdAt": "2020-05-09 10:48:59",
      "updatedBy": 187,
      "updatedAt": "2020-05-09 10:48:59",
      "visible": true,
      "hsVersion": 0,
      "area": "PERSONAL_AREA",
      "dataMode": "APP_MODE",
      "accessCount": 6,
      "creator": {
        "id": 187,
        "name": "qq420188456",
        "email": "zhaojunli@hengshi.com"
      },
      "updater": {
        "id": 187,
        "name": "qq420188456",
        "email": "zhaojunli@hengshi.com"
      },
      "collaborated": false,
      "datasets": [
        1
      ]
    },
    {
      "id": 45648,
      "title": "jlscreenshot",
      "cover": "",
      "options": {
        "dashboards": [
          1,
          3,
          2
        ],
        "datasets": [
          3,
          2,
          1
        ],
        "dashboardsOrder": [
          1,
          2,
          3
        ],
        "enableAppRule": false
      },
      "createdBy": 187,
      "createdAt": "2020-04-15 16:16:19",
      "updatedBy": 187,
      "updatedAt": "2020-04-24 14:15:44",
      "visible": true,
      "hsVersion": 4,
      "area": "PERSONAL_AREA",
      "dataMode": "APP_MODE",
      "accessCount": 33,
      "publishState": true,
      "type": "ANALYTIC_APP",
      "creator": {
        "id": 187,
        "name": "qq420188456",
        "email": "zhaojunli@hengshi.com"
      },
      "updater": {
        "id": 187,
        "name": "qq420188456",
        "email": "zhaojunli@hengshi.com"
      },
      "collaborated": false,
      "datasets": [
        3,
        2,
        1
      ]
    }
  ],
  "totalHits": 9,
  "offset": 0
}
1.2.3. 根据ID查询应用
请求URL
GET /api/v1/apps/{appId}
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 指定应用的 id | 
| checkStatus | BOOLEAN | 否 | 是否检查发布态应用的状态,若为true且发布态应用处于暂停服务状态,则报错 | 
返回对象的格式说明
接口示例1 查询 id 为 1 的应用
请求
GET /api/v1/apps/1响应结果
{
  "version": "3.2-SNAPSHOT@6929f52#8f8108f",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 46176,
    "title": "lala",
    "cover": "",
    "options": {
      "dashboards": [
        1
      ],
      "datasets": [
        1
      ],
      "dashboardsOrder": [
        1
      ],
      "enableAppRule": false
    },
    "createdBy": 6,
    "createdAt": "2020-06-03 17:30:27",
    "updatedBy": 6,
    "updatedAt": "2020-06-03 17:36:38",
    "visible": true,
    "isDelete": false,
    "isPublish": false,
    "hsVersion": 1,
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "publishState": false,
    "type": "ANALYTIC_APP",
    "creator": {
      "id": 6,
      "name": "***",
      "email": "***",
      "mobile": "***"
    },
    "action": "admin|read|write",
    "datasets": [
      1
    ],
    "publish": false
  }
}
1.2.4. 更新应用
请求URL
PUT /api/v1/apps/{appId}
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 指定应用的 id | 
request body 请求体
应用结构说明, 可以被修改的内容见下表:
| 字段 | 类型 | 描述 | 
|---|---|---|
| title | STRING | 应用的标题 | 
| options.enableAppRule | BOOL | 是否启用行权限控制 | 
| options.publishConfig.showDetailPermitted | BOOL | 只读模式下访问应用是否允许显示详情 | 
| options.publishConfig.downloadPermitted | BOOL | 只读模式下访问应用是否允许下载数据 | 
| options.publishConfig.zoomInPermitted | BOOL | 只读模式下访问应用是否下钻 | 
| dataMode | STRING | 应用的数据权限,可选值参照dataMode 值说明 | 
| folderId | LONG | 应用目录id,若与当前不一致,则视为移动应用操作,会检查是否可移动与权限 | 
返回对象的格式说明
接口示例1 更新 id 为 1 的应用标题
- 请求
PUT /api/v1/apps/1 
{
  "title": "wewe",
  "hsVersion": 1
}
接口示例2 启用 id 为 1 的应用行权限规则
- 请求
PUT /api/v1/apps/1 
{
  "dataMode": "APP_MODE",
  "options": {
    "dashboards": [
      1,
      2
    ],
    "datasets": [
      7
    ],
    "dashboardsOrder": [
      1,
      2
    ],
    "enableAppRule": true,
    "publishConfig": {
      "zoomInPermitted": true,
      "showDetailPermitted": true,
      "downloadPermitted": true,
      "totalPages": {},
      "duplicatedPermitted": false
    }
  },
  "hsVersion": 1
}
1.2.5. 删除应用
请求URL
DELETE /api/v1/apps/{appId}
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 指定应用的 id | 
返回对象的格式说明
| 字段 | 类型 | 说明 | 
|---|---|---|
| version | STRING | 当前系统版本哈希值 | 
| msg | STRING | 成功返回 success | 
1.2.6. 运行图表获取数据
根据图表配置信息获取图表数据。
请求URL
POST /api/v1/apps/{appId}/chart-data
请求参数
URL 参数
| 字段 | 类型 | 说明 | 
|---|---|---|
| appId | NUMBER | 必填 | 
Request Body 参数
图表的配置信息,详见图表结构说明
返回对象的格式说明
接口示例1
- 请求
POST /api/v1/apps/1/chart-data 
{
   "datasetId": 3,
   "options": {
      "axes": [
         {
            "op": "group",
            "uid": "u_edbee8adba68e26a_0",
            "kind": "function",
            "args": [
               {
                  "kind": "field",
                  "op": "region_name",
                  "dataset": 3
               }
            ]
         },
         {
            "op": "sum",
            "uid": "u_9f886f9cb7bdf1d2_1",
            "kind": "function",
            "args": [
               {
                  "kind": "field",
            "op": "region_id",
            "dataset": 3
          }
        ]
      }
    ]
  }
}
- 响应结果
 
{
  "data": {
    "data": [
      [
        "Americas",
        2
      ],
      [
        "Middle East and Africa",
        4
      ],
      [
        "Asia",
        3
      ],
      [
        "Europe",
        1
      ]
    ],
    "schema": [
      {
        "fieldName": "u_edbee8adba68e26a_0"
      },
      {
        "fieldName": "u_9f886f9cb7bdf1d2_1"
      }
    ]
  }
}
1.2.7. 运行图表获取原始数据
根据图表配置信息获取图表用到的数据集的原始数据。
请求URL
POST /api/v1/apps/{appId}/chart-related-data
请求参数
URL 参数
| 字段 | 类型 | 说明 | 
|---|---|---|
| appId | NUMBER | 必填 | 
Request Body 参数
图表的配置信息,详见图表结构说明
返回对象的格式说明
接口示例1
- 请求
POST /api/v1/apps/1/chart-related-data 
{
   "datasetId": 3,
   "options": {
      "axes": [
         {
            "op": "group",
            "uid": "u_edbee8adba68e26a_0",
            "kind": "function",
            "args": [
               {
                  "kind": "field",
                  "op": "region_name",
                  "dataset": 3
          }
        ]
      },
      {
        "op": "sum",
        "uid": "u_9f886f9cb7bdf1d2_1",
        "kind": "function",
        "args": [
          {
            "kind": "field",
            "op": "region_id",
            "dataset": 3
          }
        ]
      }
    ],
    "fieldsPolicy": "AXES_ALL"
  }
}
- 响应结果
 
{
  "data": [
    {
      "data": [
        [
          1,
          "Europe"
        ],
        [
          2,
          "Americas"
        ],
        [
          3,
          "Asia"
        ],
        [
          4,
          "Middle East and Africa"
        ]
      ],
      "schema": [
        {
          "fieldName": "region_id",
          "type": "number",
          "label": "region_id"
        },
        {
          "fieldName": "region_name",
          "type": "string",
          "label": "region_name"
        }
      ],
      "layer": "a_ivt_regions"
    }
  ]
}
1.2.8. 分页查询回收站中的应用
查询不同区域下回收站中的应用
请求URL
GET /api/v1/list-trash
请求参数
URL 参数
| 字段 | 类型 | 说明 | 
|---|---|---|
| area | 枚举 | 可选,有效值参照area值说明,默认是 PERSONAL_AREA | 
| orderBy | STRING | 可选,排序字段,默认是按照更新时间降序排序 | 
| orderType | STRING | 可选,排序类型,asc - 表示升序,desc - 表示降序 | 
| limit | NUMBER | 可选,单页限制条数,默认是10 | 
| offset | NUMBER | 可选,页数偏移量,默认是0 | 
返回对象的格式说明
app对象的数组。
接口示例1
- 请求
 
GET /api/v1/list-trash?area=PERSONAL_AREA
- 响应结果
 
{
  "version": "2.7-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success",
  "data": {
    "offset": 0,
    "totalHits": 127,
    "data": [
      {
        "id": 327,
        "title": "新建应用2 (9)",
        "cover": "",
        "options": {
          "dashboardsOrder": [
            1,
            2
          ]
        },
        "createdBy": 1,
        "createdAt": "2019-08-20 16:20:56",
        "updatedBy": 1,
        "updatedAt": "2019-12-17 17:47:30",
        "visible": true,
        "isDelete": true,
        "hsVersion": 4,
        "area": "PERSONAL_AREA",
        "publish": false,
        "publicPublish": false
      }
    ]
  }
}
1.2.9. 恢复回收站中的应用
恢复回收站中的应用
请求URL
POST /api/v1/apps/{appId}/restore
请求参数
URL 参数
| 字段 | 类型 | 说明 | 
|---|---|---|
| appId | INTEGER | 指定要恢复的应用 id | 
接口示例1
- 请求
 
POST /api/v1/apps/1664/restore
- 响应结果
 
{
  "version": "2.7-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success",
  "data": 1
}
1.2.10. 彻底删除回收站中的应用
彻底删除回收站中的应用
请求URL
POST /api/v1/apps/{appId}/prune
请求参数
URL 参数
| 字段 | 类型 | 说明 | 
|---|---|---|
| appId | INTEGER | 指定要恢复的应用 id | 
接口示例1
- 请求
 
POST /api/v1/apps/1664/prune
- 响应结果
 
{
  "version": "2.7-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success",
  "data": 1
}
1.2.11. 在当前app下用HE 查询数据
在当前app下用 HE 语句查询数据
请求URL
POST /api/v1/apps/{appId}/query
URL 请求参数
| appId | NUMBER | 必填,应用的 id | | limit | NUMBER | 可选,返回记录的最大条数,默认是1000 | | offset | NUMBER | 可选,返回第几页数据,默认是0 |
Request Body 参数
HE 表达式,详情参照HE 的数据集函数
返回对象的格式说明
参考示例
- 请求
 
POST /api/v1/apps/1/query
- Request Body 参数
 
{
  "kind": "formula",
  "op": "summarize(dataset(1), {type}, sum({votes}) as 'sum1')"
}
- 响应结果
 
{
  "version": "2.7-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success",
  "data": {
    "data": [
      [
        "喜剧",
        16.5
      ],
      [
        "动画",
        16.6
      ]
    ],
    "schema": [
      {
        "fieldName": "type",
        "visible": true,
        "nativeType": "text"
      },
      {
        "fieldName": "sum1",
        "visible": true,
        "nativeType": "numeric"
      }
    ]
  }
}
1.2.12. 批量隐藏 & 排序仪表盘
批量隐藏 & 排序仪表盘
请求URL
PUT /api/v1/apps/{appId}/update-dashbords-order-hide
请求参数
Request Body 参数
{
  "options": {
    "dashboardsOrder": [
      1,
      2,
      3
    ]
  },
  "resourceBatchUpdateDtos": [
    {
      "ids": [
        1
      ],
      "pathAndValues": [
        {
          "path": [
            "hide"
          ],
          "value": false
        }
      ]
    },
    {
      "ids": [
        2,
        3
      ],
      "pathAndValues": [
        {
          "path": [
            "hide"
          ],
          "value": true
        }
      ]
    }
  ]
}
接口示例1
- 请求
 
PUT /api/v1/apps/{appId}/update-dashbords-order-hide
- 请求体
 
{
  "options": {
    "dashboardsOrder": [
      1,
      2,
      3
    ]
  },
  "resourceBatchUpdateDtos": [
    {
      "ids": [
        1
      ],
      "pathAndValues": [
        {
          "path": [
            "hide"
          ],
          "value": false
        }
      ]
    },
    {
      "ids": [
        2,
        3
      ],
      "pathAndValues": [
        {
          "path": [
            "hide"
          ],
          "value": true
        }
      ]
    }
  ],
  "hsVersion": 5
}
- 响应结果
 
{
  "version": "3.2-SNAPSHOT@f8dc947#95a976a",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 45821,
    "title": "hideDashbaord",
    "cover": "",
    "options": {
      "dashboardsOrder": [
        1,
        2,
        3
      ],
      "enableAppRule": false
    },
    "createdBy": 8,
    "createdAt": "2020-05-13 14:16:58",
    "updatedBy": 8,
    "updatedAt": "2020-05-13 14:39:14",
    "visible": true,
    "isDelete": false,
    "hsVersion": 6,
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "publish": false
  }
}
1.2.13. 上传封面
请求URL
PUT /api/v1/apps/{appId}/cover
请求参数
Request Body 参数
表单数据
后端API请求代码样例
@Test
public void uploadTest()throws Exception{
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory=new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setConnectTimeout(15000);
        simpleClientHttpRequestFactory.setReadTimeout(5000);
        RestTemplate restTemplate=new RestTemplate(simpleClientHttpRequestFactory);
        HttpHeaders headers=new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        headers.set("Cookie","csrf=142b7fd3-2cbf-4caa-ace5-480ad9871623; sid=3aadc6f7-67ea-49d7-8ec1-de4bb7ef673b");
        headers.set("X-CSRF-Token","142b7fd3-2cbf-4caa-ace5-480ad9871623");
        String url="http://localhost:9981/api/apps/47/cover";
        FileSystemResource fileSystemResource=new FileSystemResource("/Users/hengshi/Documents/a.jpg");
        MultiValueMap<String, Object> form=new LinkedMultiValueMap<>();
        form.add("file",fileSystemResource);
        form.add("filename","a.jpg");
        HttpEntity<MultiValueMap<String, Object>>files=new HttpEntity<>(form,headers);
        String s=restTemplate.postForObject(url,files,String.class);
        }
返回对象的格式说明
| 字段 | 类型 | 说明 | 
|---|---|---|
| version | STRING | 当前系统版本哈希值 | 
| data | INTEGER | 图片的 id | 
1.2.14. 上传水印
请求URL
PUT /api/v1/apps/{appId}/watermark
请求参数
Request Body 参数
表单数据
后端API请求代码样例
返回对象的格式说明
| 字段 | 类型 | 说明 | 
|---|---|---|
| version | STRING | 当前系统版本哈希值 | 
| data | INTEGER | 图片的 id | 
1.2.15. 发布应用
请求URL
POST /api/v1/apps/{appId}/publish
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
应用结构说明,只涉及到 options.publishConfig 实体
返回对象的格式说明
接口示例1 在应用创作区新建应用
- 请求
POST /api/v1/apps/1/publish 
{
  "targetFolderId": 2805,
  "targetArea": "SYSTEM_PORTAL",
  "options": {
    "publishConfig": {
      "publishTitle": "0529-3.1-app",
      "publisher": "trial",
      "coverImageId": 102,
      "watermarkImageId": 103,
      "zoomInPermitted": true,
      "showDetailPermitted": true,
      "downloadPermitted": true,
      "duplicatedPermitted": true,
      "targetFolderId": 1,
      "description": "app description",
      "foldersTitle": [
        "公共空间",
        "文件夹"
      ],
      "publisherDisplayConfig": {
        "id": 123,
        "type": "user",
        "name": "trial"
      }
    }
  }
- 响应结果
 
{
  "version": "",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 43421,
    "title": "publish app",
    "options": {
      "dashboards": [
        1
      ],
      "datasets": [
      ],
      "dashboardsOrder": [
        1
      ],
      "publishConfig": {
        "zoomInPermitted": false,
        "showDetailPermitted": true,
        "downloadPermitted": true,
        "publishTitle": "publish app",
        "publisher": "trial",
        "totalPages": {
        },
        "duplicatedPermitted": true,
        "publisherDisplayConfig": {
          "id": 1337,
          "type": "user",
          "name": "trial"
        },
        "targetFolderId": 263,
        "foldersTitle": [
          "公共空间",
          "文件夹"
        ],
        "displayPublisher": true
      },
      "enableAppRule": false,
      "enableRuleStrictValidate": false,
      "pagination": {
        "applyToDashboards": [
          1,
          1
        ]
      },
      "source": "PERSONAL_AREA",
      "devices": {
        "pc": true,
        "mobile": false
      },
      "resultCacheInterval": 3600
    },
    "createdBy": 1337,
    "createdAt": "2022-12-29 15:30:58",
    "updatedBy": 1337,
    "updatedAt": "2022-12-29 15:30:58",
    "isDelete": false,
    "isPublish": true,
    "publishHash": "EB086EF1566A844FFF077D40742C9821B",
    "publishedBy": 41589,
    "datasets": [
    ],
    "refreshEntityGroup": "APP_REFRESH",
    "entityKey": "43421",
    "entityGroup": "APP_EMAIL"
  }
}
1.2.16. 取消发布
取消发布
请求URL
DELETE /api/v1/apps/{appId}/publish/cancel
请求参数
无
request body 参数
无
返回对象的格式说明
| 字段 | 类型 | 说明 | 
|---|---|---|
| version | STRING | 当前系统版本哈希值 | 
说明
该操作只能由应用的创建者执行
接口示例1: 取消发布
DELETE /api/v1/apps/{appId}/publish/cancel
返回
{
  "version": "3.2-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.17. 查看应用中使用的数据连接
请求URL
GET /api/v1/apps/{appId}/connection-replace
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
返回对象的格式说明
返回对象是dataset list,每个dataset里带有connection的信息。
| 字段 | 类型 | 描述 | 
|---|---|---|
| id | NUMBER | 数据集的 id | 
| options.connectionId | NUMBER | 数据连接的 id | 
| options.connectionTitle | NUMBER | 数据连接的标题 | 
| options.origin | STRING | 数据连接的类型 | 
接口示例1 列出应用 1 中图表所用到的所有数据连接
请求
GET /api/v1/apps/1/connection-replace响应结果
{
  "version": "3.3-SNAPSHOT@@git.commit.id.abbrev@#8500a3e",
  "code": 0,
  "msg": "success",
  "data": [
    {
      "id": 1,
      "options": {
        "connectionTitle": "testuserattr",
        "connectionId": 4197,
        "origin": "postgresql"
      }
    }
  ]
}
1.2.18. 替换应用中使用的数据连接
请求URL
POST /api/v1/apps/{appId}/connection-replace
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
现在使用的数据连接 id 和要替换的数据连接 id 对应关系的列表。例如:[{"current":4197,"replace":4122}]
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| msg | STRING | 执行成功返回 success | 
接口示例1 替换应用 1 中图表所用到的一个数据连接
- 请求
POST /api/v1/apps/1/connection-replace 
[
  {
    "current": 4197,
    "replace": 4122
  }
]
- 响应结果
 
{
  "version": "3.2-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.19. 查看应用中使用的数据包
请求URL
GET /api/v1/apps/{appId}/dataapp-replace
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| id | NUMBER | 应用的 id | 
| title | STRING | 应用的标题 | 
| area | STRING | 应用所在的区域,可选值参照area值说明 | 
| parents | OBJECT 数组 | 应用所在的文件夹列表,顺序是从外层目录到里层目录 | 
| parents.[].id | NUMBER | 文件夹的id | 
| parents.[].title | STRING | 文件夹的标题 | 
| parents.[].area | STRING | 文件夹所在的区域 | 
接口示例1 列出应用 1 中图表所用到的所有数据包
请求
GET /api/v1/apps/1/dataapp-replace响应结果
{
  "version": "3.2-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success",
  "data": [
    {
      "id": 3376,
      "title": "新建数据包 (2)",
      "area": "DATA_MART",
      "parents": [
        {
          "id": 2,
          "title": "data_mart_root_folder",
          "options": {
            "rootType": "PUBLIC_ROOT_FOLDER"
          },
          "isDelete": false,
          "area": "DATA_MART"
        }
      ]
    },
    {
      "id": 3378,
      "title": "数据包过滤 (2)",
      "area": "PERSONAL_AREA"
    }
  ]
}
1.2.20. 替换应用中使用的数据包
请求URL
POST /api/v1/apps/{appId}/dataapp-replace
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
现在使用的数据包 id 和要替换的数据包 id 对应关系的列表。例如:[{"current":3376,"replace":154}]
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| msg | STRING | 执行成功返回 success | 
接口示例1 替换应用 1 中图表所用到的一个数据包
- 请求
POST /api/v1/apps/1/dataapp-replace 
[
  {
    "current": 3376,
    "replace": 154
  }
]
- 响应结果
 
{
  "version": "3.2-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.21. 全部禁用应用中的单个数据集更新计划
请求URL
POST /api/apps/{appId}/disable-all-dataset-schedule
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
| 字段 | 类型 | 描述 | 
|---|---|---|
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| msg | STRING | 执行成功返回 success | 
接口示例1 禁用app id为1的所有单个数据集更新计划
- 请求
POST /api/apps/1/disable-all-dataset-schedule 
{}
- 响应结果
 
{
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.22. 应用刷新时排除这个数据集
请求URL
POST /api/apps/{appId}/exclude-in-app-refresh
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
| 字段 | 类型 | 描述 | 
|---|---|---|
| entityKey | STRING | 被排除的数据集的执行计划的entityKey,不包含这个字段,表示全部 | 
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| msg | STRING | 执行成功返回 success | 
接口示例1 禁用app id为1的所有单个数据集更新计划
- 请求
POST /api/apps/1/exclude-in-app-refresh 
{
  "entityKey": "1-1"
}
- 响应结果
 
{
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.23. 应用刷新时包含这个数据集
请求URL
POST /api/apps/{appId}/include-in-app-refresh
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
| 字段 | 类型 | 描述 | 
|---|---|---|
| entityKey | STRING | 被包含的数据集的执行计划的entityKey,不包含这个字段,表示全部 | 
返回对象的格式说明
| 字段 | 类型 | 描述 | 
|---|---|---|
| msg | STRING | 执行成功返回 success | 
接口示例1 禁用app id为1的所有单个数据集更新计划
- 请求
POST /api/apps/1/include-in-app-refresh 
{
  "entityKey": "1-1"
}
- 响应结果
 
{
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#null",
  "code": 0,
  "msg": "success"
}
1.2.24. 查询应用中单个数据的执行计划列表
请求URL
GET /api/apps/{appId}/dataset-schedules
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 应用的 id | 
| includeInAppScope | BOOL | 可选 | 本dataset是否包括在app scope刷新中 | 
| q | STRING | 可选 | 搜索关键字 | 
返回对象的格式说明
和查询执行计划列表 返回数据一致,多一个字段:
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| includeInAppScope | BOOL | 可选 | 本dataset是否包括在app scope刷新中 | 
接口示例1
请求
GET /api/apps/1/dataset-schedules响应结果
{
  "code": 0,
  "data": [
    {
      "id": 1,
      "entityGroup": "DATASET",
      "entityKey": "1-1",
      "enabled": false,
      "planItems": [
        {
          "id": 1,
          "triggerType": "CRON_JOB",
          "cronDesc": "0 15 0 ? * 1",
          "cronType": "WEEKLY",
          "timeZone": "GMT+08:00"
        },
        {
          "id": 2,
          "triggerType": "CRON_JOB",
          "cronDesc": "*/30 * * * * ?",
          "cronType": "CRON",
          "timeZone": "GMT+08:00"
        }
      ],
      "execDetail": {
        "jobClass": "com.hengshi.nangaparbat.schedulejob.DatasetJob",
        "jobParams": {
          "app": 1,
          "dataset": 1
        },
        "retryTimes": 1
      },
      "title": "dataset1",
      "createdAt": "2020-03-05 15:01:02",
      "createdBy": 1,
      "updatedAt": "2020-03-05 15:01:02",
      "updatedBy": 1
    }
  ],
  "msg": "success",
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#1234567",
  "totalHits": 1,
  "offset": 0
}
1.2.25. 查询应用刷新的执行计划
请求URL
GET /api/apps/{appId}/refresh-schedule
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 应用的 id | 
返回对象的格式说明
和查询执行计划列表 返回数据一致,只有一个执行计划object
接口示例1
请求
GET /api/apps/1/refresh-schedule响应结果
{
  "code": 0,
  "data": {
    "id": 1,
    "entityGroup": "APP_REFRESH",
    "entityKey": "1",
    "enabled": false,
    "planItems": [
      {
        "id": 1,
        "triggerType": "CRON_JOB",
        "cronDesc": "0 15 0 ? * 1",
        "cronType": "WEEKLY",
        "timeZone": "GMT+08:00"
      },
      {
        "id": 2,
        "triggerType": "CRON_JOB",
        "cronDesc": "*/30 * * * * ?",
        "cronType": "CRON",
        "timeZone": "GMT+08:00"
      }
    ],
    "execDetail": {
      "jobClass": "com.hengshi.nangaparbat.schedulejob.AppDatasetRefreshJob",
      "jobParams": {
        "app": 1
      },
      "retryTimes": 1
    },
    "title": "app1",
    "createdAt": "2020-03-05 15:01:02",
    "createdBy": 1,
    "updatedAt": "2020-03-05 15:01:02",
    "updatedBy": 1
  },
  "msg": "success",
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#1234567",
  "totalHits": 1,
  "offset": 0
}
1.2.26. 创建自助查询应用的用户设置
请求URL
GET /api/apps/{appId}/profiles
请求参数
URL 参数
| 字段 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| appId | INTEGER | 是 | 应用的 id | 
返回对象的格式说明
和查询执行计划列表 返回数据一致,只有一个执行计划object
接口示例1
请求
GET /api/apps/1/refresh-schedule响应结果
{
  "code": 0,
  "data": {
    "id": 1,
    "entityGroup": "APP_REFRESH",
    "entityKey": "1",
    "enabled": false,
    "planItems": [
      {
        "id": 1,
        "triggerType": "CRON_JOB",
        "cronDesc": "0 15 0 ? * 1",
        "cronType": "WEEKLY",
        "timeZone": "GMT+08:00"
      },
      {
        "id": 2,
        "triggerType": "CRON_JOB",
        "cronDesc": "*/30 * * * * ?",
        "cronType": "CRON",
        "timeZone": "GMT+08:00"
      }
    ],
    "execDetail": {
      "jobClass": "com.hengshi.nangaparbat.schedulejob.AppDatasetRefreshJob",
      "jobParams": {
        "app": 1
      },
      "retryTimes": 1
    },
    "title": "app1",
    "createdAt": "2020-03-05 15:01:02",
    "createdBy": 1,
    "updatedAt": "2020-03-05 15:01:02",
    "updatedBy": 1
  },
  "msg": "success",
  "version": "3.5-SNAPSHOT@@git.commit.id.abbrev@#1234567",
  "totalHits": 1,
  "offset": 0
}
1.2.27. 复制应用
请求URL
POST /api/apps/{appId}/duplicate
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
request body 请求体
| 字段 | 类型 | 描述 | 
|---|---|---|
| targetFolderId | LONG | 复制到目录的id,不包含这个字段,表示和源应用同一目录 | 
| title | String | 新应用名称,可不传 | 
返回对象的格式说明
接口示例1 在应用创作区创建应用副本
请求
POST /api/apps/1/duplicate响应结果
{
  "version": "",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 43417,
    "title": "duplicate app",
    "cover": "",
    "options": {
      "dashboards": [
        1
      ],
      "datasets": [
      ],
      "dashboardsOrder": [
        1
      ],
      "enableAppRule": false,
      "enableRuleStrictValidate": false,
      "pagination": {
        "applyToDashboards": [
          1,
          1
        ]
      },
      "devices": {
        "pc": true,
        "mobile": false
      },
      "resultCacheInterval": 3600
    },
    "createdBy": 1337,
    "createdAt": "2022-12-29 15:24:18",
    "updatedBy": 1337,
    "updatedAt": "2022-12-29 15:24:18",
    "visible": true,
    "isDelete": false,
    "isPublish": false,
    "isBackup": false,
    "folderId": 0,
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "emailOptions": {
    },
    "type": "ANALYTIC_APP",
    "datasets": [
    ],
    "publishState": false
  }
}
接口示例2 在应用集市区使用模版新建应用
- 请求
POST /api/apps/2/duplicate - 响应结果
和接口示例1返回数据一致 
接口示例3 在应用创作区将应用复制到指定目录下
- 请求
POST /api/apps/3/duplicate 
{
  "targetFolderId": 0,
  "title": "duplicate app"
}
- 响应结果
和接口示例1返回数据一致 
1.2.28. 使用模板覆盖当前应用
请求URL
POST /api/apps/{appId}/overwrite
请求参数
url 参数
| 字段 | 类型 | 描述 | 
|---|---|---|
| appId | INTEGER | 应用的 id | 
| file | BINARY | 必填, 模版文件流 | 
| copy | BOOLEAN | 必填, 是否备份当前应用 | 
| overwriteAuth | BOOLEAN | 非 必填, 是否覆盖当前应用的权限配置 | 
返回对象的格式说明
接口示例1 使用模板覆盖当前应用
请求
POST /api/apps/1/overwrite?copy=false响应结果
{
  "version": "4.5-SNAPSHOT@109a613#0145565",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 128207,
    "title": "book",
    "cover": "",
    "options": {
      "dashboards": [
        1,
        2
      ],
      "datasets": [
        2,
        1,
        3
      ],
      "dashboardsOrder": [
        1,
        2
      ],
      "appTemplateUUID": "25d659a1-f6d4-4d95-94fc-e80a018d59a3",
      "enableAppRule": false,
      "enableRuleStrictValidate": true,
      "pagination": {
        "undefined": {}
      },
      "devices": {
        "pc": true,
        "mobile": false
      },
      "resultCacheInterval": 3600
    },
    "createdBy": 8,
    "createdAt": "2023-06-24 17:44:10",
    "updatedBy": 8,
    "updatedAt": "2023-08-11 01:00:09",
    "visible": true,
    "isDelete": false,
    "isPublish": false,
    "isBackup": false,
    "folderId": 0,
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "emailOptions": {},
    "type": "ANALYTIC_APP",
    "datasets": [
      2,
      1,
      3
    ],
    "publishState": false,
    "hideDatasets": [],
    "status": "RUNNING"
  },
  "chartDataStartTimeMillis": 0
}
1.2.29. 暂停/恢复APP
请求URL
POST /api/apps/{appId}/pending
请求参数
url 参数
| 字段 | 类型 | 描述 | |
|---|---|---|---|
| appId | INTEGER | 应用的 id | |
| status | STRING | 必填, 要修改的应用状态,可选值:PENDING | RUNNING | 
返回对象的格式说明
接口示例1 使用模板覆盖当前应用
请求
POST /api/apps/1/pending?status=pending响应结果
{
  "version": "4.5-SNAPSHOT@109a613#0145565",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 128207,
    "title": "book",
    "cover": "",
    "options": {
      "dashboards": [
        1,
        2
      ],
      "datasets": [
        2,
        1,
        3
      ],
      "dashboardsOrder": [
        1,
        2
      ],
      "appTemplateUUID": "25d659a1-f6d4-4d95-94fc-e80a018d59a3",
      "enableAppRule": false,
      "enableRuleStrictValidate": true,
      "pagination": {
        "undefined": {}
      },
      "devices": {
        "pc": true,
        "mobile": false
      },
      "resultCacheInterval": 3600
    },
    "createdBy": 8,
    "createdAt": "2023-06-24 17:44:10",
    "updatedBy": 8,
    "updatedAt": "2023-08-11 01:00:09",
    "visible": true,
    "isDelete": false,
    "isPublish": false,
    "isBackup": false,
    "folderId": 0,
    "area": "PERSONAL_AREA",
    "dataMode": "APP_MODE",
    "emailOptions": {},
    "type": "ANALYTIC_APP",
    "datasets": [
      2,
      1,
      3
    ],
    "publishState": false,
    "hideDatasets": [],
    "status": "PENDING"
  },
  "chartDataStartTimeMillis": 0
}
1.2.30. GET 获取指定用户创建的所有APP
GET /api/apps/created-list
获取指定用户创建的所有APP。针对SYSTEM_PORTAL、PUBLIC_AREA、DATA_MART的中的APP需要当前发起请求的用户拥有系统管理员以及数据管理员角色,当请求中显示指定了用户时则返回指定用户创建的所有应用,否则返回当前用户创建的所有应用。当指定非当前用户时, area取值只能是 SYSTEM_PORTAL | PUBLIC_AREA | DATA_MART之一。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| createdBy | query | integer | 否 | 指定用户ID | 
| creatorEmail | query | integer | 否 | 指定用户绑定电子邮箱 | 
| creatorMobile | query | integer | 否 | 指定用户绑定手机号码 | 
| creatorLoginName | query | integer | 否 | 指定用户登陆名 | 
| area | query | string | 是 | 指定区域,可选项:SYSTEM_PORTAL、PUBLIC_AREA、DATA_MART、PERSONAL_AREA、APP_MART | 
| orderBy | query | string | 否 | 排序字段 | 
| orderType | query | string | 否 | 排序方式 | 
| offset | query | string | 否 | 分页偏移量 | 
| limit | query | string | 否 | 分页大小 | 
返回示例
成功
{
  "code": 0,
  "msg": "success",
  "data": [
    {
      "id": 72,
      "title": "常驻",
      "cover": "",
      "options": {
        "dashboardsOrder": [],
        "enableRuleStrictValidate": true,
        "devices": {
          "pc": true,
          "mobile": true
        }
      },
      "createdBy": 7,
      "createdAt": "2022-09-28 16:52:28",
      "updatedBy": 7,
      "updatedAt": "2022-09-28 16:52:28",
      "latestAuthorizedBy": 2,
      "latestAuthorizedAt": "2022-09-28 16:40:03",
      "visible": true,
      "isDelete": false,
      "isPublish": false,
      "isBackup": false,
      "folderId": 17,
      "area": "DATA_MART",
      "dataMode": "APP_MODE",
      "emailOptions": {},
      "type": "DATA_APP",
      "publishState": false,
      "hideDatasets": [
        2
      ],
      "status": "RUNNING",
      "creator": {
        "id": 7,
        "name": "xf1",
        "email": "xf1dgfhijoiwjgiowhoughodhgdhsg@fffqqda.com",
        "loginName": "xf1"
      },
      "updater": {
        "id": 7,
        "name": "xf1",
        "email": "xf1dgfhijoiwjgiowhoughodhgdhsg@fffqqda.com",
        "loginName": "xf1"
      },
      "refreshExecDetail": {
        "jobClass": "com.hengshi.nangaparbat.schedulejob.AppDatasetRefreshJob",
        "jobParams": {
          "app": 72
        },
        "retryTimes": 1
      },
      "refreshEntityGroup": "APP_REFRESH",
      "entityKey": "72",
      "entityGroup": "APP_EMAIL",
      "execDetail": {
        "jobClass": "com.hengshi.nangaparbat.schedulejob.AppEmailJob",
        "jobParams": {
          "app": 72
        },
        "retryTimes": 1
      }
    },
    {
      "id": 73,
      "title": "常驻1",
      "cover": "",
      "options": {
        "dashboardsOrder": [],
        "enableRuleStrictValidate": true,
        "devices": {
          "pc": true,
          "mobile": true
        }
      },
      "createdBy": 7,
      "createdAt": "2022-09-28 16:53:29",
      "updatedBy": 7,
      "updatedAt": "2022-09-28 16:54:14",
      "latestAuthorizedBy": 2,
      "latestAuthorizedAt": "2022-09-28 16:40:03",
      "visible": true,
      "isDelete": false,
      "isPublish": false,
      "isBackup": false,
      "folderId": 17,
      "area": "DATA_MART",
      "dataMode": "APP_MODE",
      "emailOptions": {},
      "type": "DATA_APP",
      "publishState": false,
      "hideDatasets": [
        2
      ],
      "status": "RUNNING",
      "creator": {
        "id": 7,
        "name": "xf1",
        "email": "xf1dgfhijoiwjgiowhoughodhgdhsg@fffqqda.com",
        "loginName": "xf1"
      },
      "updater": {
        "id": 7,
        "name": "xf1",
        "email": "xf1dgfhijoiwjgiowhoughodhgdhsg@fffqqda.com",
        "loginName": "xf1"
      },
      "refreshExecDetail": {
        "jobClass": "com.hengshi.nangaparbat.schedulejob.AppDatasetRefreshJob",
        "jobParams": {
          "app": 73
        },
        "retryTimes": 1
      },
      "refreshEntityGroup": "APP_REFRESH",
      "entityKey": "73",
      "entityGroup": "APP_EMAIL",
      "execDetail": {
        "jobClass": "com.hengshi.nangaparbat.schedulejob.AppEmailJob",
        "jobParams": {
          "app": 73
        },
        "retryTimes": 1
      }
    }
  ],
  "totalHits": 14,
  "offset": 0,
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
状态码 200
| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | 
|---|---|---|---|---|---|
| » code | integer | true | none | none | |
| » msg | string | true | none | none | |
| » data | [object] | true | none | none | |
| »» id | integer | true | none | none | |
| »» title | string | true | none | none | |
| »» cover | string | true | none | none | |
| »» options | object | true | none | none | |
| »»» dashboardsOrder | [string] | true | none | none | |
| »»» enableRuleStrictValidate | boolean | true | none | none | |
| »»» devices | object | true | none | none | |
| »»»» pc | boolean | true | none | none | |
| »»»» mobile | boolean | true | none | none | |
| »» createdBy | integer | true | none | none | |
| »» createdAt | string | true | none | none | |
| »» updatedBy | integer | true | none | none | |
| »» updatedAt | string | true | none | none | |
| »» latestAuthorizedBy | integer | true | none | none | |
| »» latestAuthorizedAt | string | true | none | none | |
| »» visible | boolean | true | none | none | |
| »» isDelete | boolean | true | none | none | |
| »» isPublish | boolean | true | none | none | |
| »» isBackup | boolean | true | none | none | |
| »» folderId | integer | true | none | none | |
| »» area | string | true | none | none | |
| »» dataMode | string | true | none | none | |
| »» emailOptions | object | true | none | none | |
| »» type | string | true | none | none | |
| »» publishState | boolean | true | none | none | |
| »» hideDatasets | [integer] | true | none | none | |
| »» status | string | true | none | none | |
| »» creator | object | true | none | none | |
| »»» id | integer | true | none | none | |
| »»» name | string | true | none | none | |
| string | true | none | none | ||
| »»» loginName | string | true | none | none | |
| »» updater | object | true | none | none | |
| »»» id | integer | true | none | none | |
| »»» name | string | true | none | none | |
| string | true | none | none | ||
| »»» loginName | string | true | none | none | |
| »» refreshExecDetail | object | true | none | none | |
| »»» jobClass | string | true | none | none | |
| »»» jobParams | object | true | none | none | |
| »»»» app | integer | true | none | none | |
| »»» retryTimes | integer | true | none | none | |
| »» refreshEntityGroup | string | true | none | none | |
| »» entityKey | string | true | none | none | |
| »» entityGroup | string | true | none | none | |
| »» execDetail | object | true | none | none | |
| »»» jobClass | string | true | none | none | |
| »»» jobParams | object | true | none | none | |
| »»»» app | integer | true | none | none | |
| »»» retryTimes | integer | true | none | none | |
| » totalHits | integer | true | none | none | |
| » offset | integer | true | none | none | |
| » chartDataStartTimeMillis | integer | true | none | none | 
1.3. 应用/应用版本管理
1.3.1. GET 获取应用备份版本个数
GET /api/apps/{appId}/backups/count
查询当前app应用备份版本个数。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | none | 
返回示例
成功
{
  "version": "4.5-SNAPSHOT@9cbd562#8cac872",
  "code": 0,
  "msg": "success",
  "data": 3,
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
状态码 200
| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | 
|---|---|---|---|---|---|
| » version | string | true | none | none | |
| » code | integer | true | none | none | |
| » msg | string | true | none | none | |
| » data | integer | true | none | none | |
| » chartDataStartTimeMillis | integer | true | none | none | 
1.3.2. GET 获取应用备份列表
GET /api/apps/{appId}/backups
查询当前app备份信息。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | none | 
| orderBy | query | string | 否 | none | 
| limit | query | string | 否 | none | 
| orderType | query | string | 否 | none | 
| offset | query | string | 否 | none | 
返回示例
成功
{
  "version": "laborum",
  "code": 46,
  "msg": "mollit occaecat",
  "data": [
    {
      "id": 47,
      "appId": 36,
      "backupAppId": 85,
      "title": "基到大级",
      "createdBy": 99,
      "createdAt": "2010-05-18 09:08:54",
      "updatedBy": 64,
      "updatedAt": "1972-02-17 16:35:21",
      "isDeleted": false,
      "creator": {
        "id": 9,
        "name": "很知际快较量",
        "loginName": "及不三给于"
      },
      "updater": {
        "id": 23,
        "name": "即级风看以",
        "loginName": "把是们适我改已"
      }
    }
  ],
  "chartDataStartTimeMillis": 92027862253
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
状态码 200
| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | 
|---|---|---|---|---|---|
| » version | string | true | none | none | |
| » code | integer | true | none | none | |
| » msg | string | true | none | none | |
| » data | [object] | true | none | none | |
| »» id | integer | true | none | none | |
| »» appId | integer | true | none | 当前应用id | |
| »» backupAppId | integer | true | none | 备份应用id | |
| »» title | string | true | none | 备份记录标题 | |
| »» createdBy | integer | true | none | 备份记录创建者 | |
| »» createdAt | string | true | none | 备份记录创建时间 | |
| »» updatedBy | integer | true | none | 备份记录最后一次修改者 | |
| »» updatedAt | string | true | none | 备份记录最后一次修改时间 | |
| »» isDeleted | boolean | true | none | none | |
| »» creator | object | true | none | none | |
| »»» id | integer | true | none | none | |
| »»» name | string | true | none | none | |
| »»» loginName | string | true | none | none | |
| »» updater | object | true | none | none | |
| »»» id | integer | true | none | none | |
| »»» name | string | true | none | none | |
| »»» loginName | string | true | none | none | |
| » chartDataStartTimeMillis | integer | true | none | none | 
1.3.3. DELETE 删除备份
DELETE /api/apps/{appId}/backups/{backupId}
删除指定的app的指定备份文件。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | 应用id | 
| backupId | path | string | 是 | 应用备份记录id | 
返回示例
成功
{
  "version": "4.5-SNAPSHOT@9cbd562#8cac872",
  "code": 0,
  "msg": "success",
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.3.4. PUT 更新备份记录信息
PUT /api/apps/{appId}/backups/{backupId}
更新指定app的指定备份记录信息。更新的是备份记录信息,并不是副本本身。
Body 请求参数
{
  "title": "1号备份"
}
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | 应用id | 
| backupId | path | string | 是 | 应用备份记录id | 
| body | body | object | 否 | none | 
| » title | body | string | 是 | none | 
返回示例
成功
{
  "version": "4.5-SNAPSHOT@9cbd562#8cac872",
  "code": 0,
  "msg": "success",
  "data": {
    "id": 1958,
    "appId": 112326,
    "backupAppId": 129217,
    "title": "1号备份",
    "backupConfig": {
      "planDtos": []
    },
    "createdBy": 26889,
    "createdAt": "2023-08-11 11:50:26",
    "updatedBy": 26889,
    "updatedAt": "2023-08-11 12:17:31",
    "isDeleted": false
  },
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.3.5. GET 重置
GET /api/apps/{appId}/backups/{backupId}/restore
将指定app重置到指定的备份版本。
应用版本仅保留数据分析相关的所有内容:仪表盘、数据集、数据模型、参数、翻页器等,涉及到连接、权限相关的设置则无法保留。 应用发布时自动保留版本,仅保留最近的若干版本。更早的版本将被自动删除。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | none | 
| backupId | path | string | 是 | none | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.4. 应用/导入导出
1.4.1. GET 导出应用模板
GET /api/apps/{appId}/export-template
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | none | 
| exportAuth | query | string | 否 | 要导出的模版版本,若要将模版导入3.6或3.6之前的系统,则需要传3.6 | 
| tplVersion | query | string | 是 | 是否要导出应用的授权 & 权限模式 & 行权限信息,个人区需应用作者才能导出,公共区需应用管理员才能导出 | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.4.2. POST 校验应用模板
POST /api/apps/import-template-validate
在导入模板之前应先调用该API对要进行导入的模板文件进行校验。
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| area | query | string | 否 | 目标区域 | 
返回示例
200 Response
{}
模板中存在错误
{
  "version": "4.5-SNAPSHOT@9cbd562#dd4a12a",
  "code": 10273,
  "msg": "模板中不含权限规则和授权信息,\"数据权限\"部分的设定将按模板配置",
  "error": "error/app-template-not-contains-auth-info",
  "errorMap": {},
  "debug": "error/app-template-not-contains-auth-info",
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
| 400 | Bad Request | 模板中存在错误 | Inline | 
返回数据结构
1.4.3. POST 导入模板
POST /api/apps/import-template
根据导入的模板文件创建app。
Body 请求参数
file: string
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| folderId | query | string | 否 | 可选, 文件夹id,如果为空,就导入个人区 | 
| importAuth | query | string | 否 | 是否导入应用授权 & 权限模式 & 行权限信息 | 
| body | body | object | 否 | none | 
| » file | body | string(binary) | 是 | 模板文件 | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.4.4. POST 使用模板替换应用
POST /api/apps/{appId}/overwrite
使用提供的模板替换指定应用。
Body 请求参数
file: string
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| appId | path | string | 是 | none | 
| copy | query | string | 否 | 是否同时创建副本 | 
| overwriteAuth | query | string | 否 | 是否覆盖权限配置信息 | 
| body | body | object | 否 | none | 
| » file | body | string(binary) | 是 | 模板文件 | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.5. 应用/批量操作
1.5.1. 批量操作有以下几种类型:
- 普通操作
- move
 - delete
 - update
 - visible
 
 - 文件导出操作
- export-template
 
 
所有类型在批量操作预检查API中均可用,在具体执行批量操作的接口中会有区分。
普通操作只能在'批量操作'API中使用。 文件导出操作只能在'批量导出操作'API中使用。
各操作支持执行对象
每一种操作并不一定对所有的对象就支持,特定的对象只支持特定的操作。
下面列出每一种对象支持的操作:
| / | folder | app | dataset | chart | dashboard | field | metric | app param | |
|---|---|---|---|---|---|---|---|---|---|
| move | y | y | / | / | / | / | / | / | / | 
| delete | y | y | / | / | / | y | y | y | |
| update | / | / | / | / | / | y | y | / | |
| visible | / | / | / | / | / | y | / | / | |
| export-template | / | y | / | / | / | / | / | / | 
1.5.2. POST 批量操作预检查
POST /api/batch/check/{batch-operation}
执行批量操作之前,调用该API对该操作进行合法性校验。
Body 请求参数
{
  "items": [
    {
      "objectType": "app",
      "idSet": [
        112326,
        129220
      ]
    }
  ],
  "args": {
    "tplVersion": "4.5",
    "exportAuth": true
  }
}
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| batch-operation | path | string | 是 | 批量操作类型 | 
| body | body | object | 否 | none | 
| » items | body | [object] | 是 | 批量操作对象列表 | 
| »» objectType | body | string | 否 | 批量操作对象类型 | 
| »» idSet | body | [string] | 否 | 批量操作对象唯一标识集合 | 
| » args | body | object | 是 | 批量操作额外变量 | 
| »» tplVersion | body | string | 是 | none | 
| »» exportAuth | body | boolean | 是 | none | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.5.3. GET 批量导出操作
GET /api/batch/export/{export-operation}
Body 请求参数
{
  "items": [
    {
      "objectType": "app",
      "idSet": [
        112326,
        129220
      ]
    }
  ],
  "args": {
    "tplVersion": "4.5",
    "exportAuth": true
  }
}
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| export-operation | path | string | 是 | 批量导出操作 | 
| body | body | object | 否 | none | 
| » items | body | [object] | 是 | none | 
| »» objectType | body | string | 否 | none | 
| »» idSet | body | [string] | 否 | none | 
| » args | body | object | 是 | none | 
| »» tplVersion | body | string | 是 | none | 
| »» exportAuth | body | boolean | 是 | none | 
返回示例
200 Response
{}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
1.5.4. POST 批量操作
POST /api/batch/operation/{batch-operation}
执行批量操作
Body 请求参数
{
  "items": [
    {
      "objectType": "app",
      "idSet": [
        129052
      ]
    }
  ],
  "args": {
    "targetId": 3270,
    "keepAuth": false
  }
}
请求参数
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| batch-operation | path | string | 是 | 批量操作类型 | 
| body | body | object | 否 | none | 
| » items | body | [object] | 是 | none | 
| »» objectType | body | string | 否 | none | 
| »» idSet | body | [string] | 否 | none | 
| » args | body | object | 是 | none | 
| »» targetId | body | integer | 是 | none | 
| »» keepAuth | body | boolean | 是 | none | 
返回示例
成功
{
  "code": 0,
  "msg": "success",
  "data": {
    "items": [
      {
        "objectType": "app",
        "successIdSet": [
          129052
        ]
      }
    ]
  },
  "chartDataStartTimeMillis": 0
}
返回结果
| 状态码 | 状态码含义 | 说明 | 数据模型 | 
|---|---|---|---|
| 200 | OK | 成功 | Inline | 
返回数据结构
状态码 200
| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | 
|---|---|---|---|---|---|
| » code | integer | true | none | none | |
| » msg | string | true | none | none | |
| » data | object | true | none | none | |
| »» items | [object] | true | none | none | |
| »»» objectType | string | false | none | none | |
| »»» successIdSet | [integer] | false | none | none | |
| » chartDataStartTimeMillis | integer | true | none | none |