文档

服务端集成示例源码

更新时间:

本文介绍远程监考服务端集成示例源码说明。

环境说明

安装编译依赖

  • 安装Go 1.18.x及以上版本,请参见Go

  • 安装swagger工具,请参见swag

go install github.com/swaggo/swag/cmd/swag@latest

运行时相关配置

服务端涉及3类信息的配置,完成相关的云服务开通、配置后,相应的配置项需要写入服务端源码/conf/config.json里。

推拉流配置

    "live_stream": {
        "scheme": "http",
        // 推流域名
        "push_url": "****.examplepush.vip", 
        // 拉流域名
        "pull_url": "****.examplepull.vip", 
        // 推流域名的鉴权key,可通过直播控制台->加速服务->域名管理->直播管理->访问控制->URL鉴权->主key获取,详细路径见下图
        "push_auth_key": "********",
        // 拉流域名的鉴权key,可通过直播控制台->加速服务->域名管理->直播管理->访问控制->URL鉴权->主key获取,详细路径见下图
        "pull_auth_key": "********",
        // 应用名称,支持自定义
        "app_name": "exam", 
        "auth_expires": 604800
    },

URL鉴权

IM配置

"live_im": {
				//IM的app ID,可通过视频直播控制台->直播互动->应用管理获取,详细路径见下图
        "app_id": "****" 
    }

应用管理

OpenAPI配置

    "openapi": {
        "endpoint": "live.aliyuncs.com",
        "region": "cn-shanghai",
        "version": "2016-11-01",
        "access_key_id": "********", //阿里云服务的AccessKey ID,可以通过RAM控制台获取
        "access_key_secret": "****", //阿里云服务的AccessKey Secret,可以通过RAM控制台获取
        "sts_token": ""
    },

编译运行

详细信息请参见源码中的README文件。

## 构建执行文件


```bash
go build -o main ./cmd/main.go
```


## 本地运行


```bash
export ADMIN_PASSWORD=your-secret
./main
```


所有 API 及对应文档:
浏览器打开:http://localhost:7001/swagger/index.html
用户名为 admin,密码为您自行设置


## 生成`swagger`文档


```bash
# 安装swagger工具 请具体参考:https://github.com/swaggo/swag
go install github.com/swaggo/swag/cmd/swag@latest


# 动态生成文档
swag init -g pkg/handler/*.go
```

接口

通用请求头参数

用于请求header上。

name

type

required

desc

authorization

string

YES

身份认证token,通过页面URL参数传入。

创建考场

Path:/exam/createRoom

Method:POST

Query:

param

type

required

desc

name

string

YES

考场名称。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─id

string

考场ID。

  |─name

string

考场名称。

  |─examId

string

考试ID。

  |─status

integer

考场状态。

  • 0:进行中。

  • 1:已结束。

  |─audioStatus

integer

考场口播状态。

  • 0:未口播。

  • 1:正在口播。

  |─imGroupId

string

消息组ID。

  |─createTeacher

string

考场创建者ID。

Response Demo:

{
 "success": false,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "id": "roomId",
 "name": "模拟考场",
 "examId": "examId",
 "status": 0,
 "audioStatus": 0,
 "imGroupId": "xxx",
 "createTeacher": "teacherId"
 }
}

addRoom 时序图

时序图新

获取考场信息Path: /exam/roomInfo

Method:GET

Query:

name

type

required

desc

roomId

string

YES

考场ID,通过页面URL参数传入。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─id

string

考场ID。

  |─name

string

考场名称。

  |─examId

string

考试ID。

  |─status

integer

考场状态。

  • 0:进行中。

  • 1:已结束。

  |─audioStatus

integer

考场口播状态。

  • 0:未口播。

  • 1:正在口播。

  |─imGroupId

string

消息组ID。

  |─createTeacher

string

考场创建者ID。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "id": "roomId",
 "name": "模拟考场",
 "examId": "examId",
 "status": 0,
 "audioStatus": 0,
 "imGroupId": "xxx",
 "createTeacher": "teacherId"
 }
}

获取考试信息

Path:/exam/examInfo

Method:GET

Query:

name

type

required

desc

examId

string

YES

考试ID,来源是考场信息返回。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─id

string

考试ID。

  |─name

string

考试名称。

  |─startTime

string

开始时间,使用YYYY/MM/DD HH:mm:ss格式化。

  |─endTime

string

结束时间。

  |─radioInfo

array

定时播放的音频。

    |─

object

      |─id

string

ID。

      |─classify

integer

分类。

      |─name

string

名字。

      |─startTime

string

触发播放时间。

      |─url

string

CDN地址。

      |─ossUrl

string

OSS地址(非必需)。

  |─audioInfo

array

需要老师手动播放的音频。

    |─

object

      |─id

string

ID。

      |─classify

integer

分类字典。

      |─name

string

音频名字。

      |─url

string

音频地址。

      |─ossUrl

string

OSS地址(非必需)。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "id": "123456",
 "name": "exam",
 "startTime": "2023/03/30 14:00:00",
 "endTime": "2023/03/30 17:00:00",
 "radioInfo": [
 {
 "id": "",
 "classify": 0,
 "name": "",
 "startTime": "2023/03/30 14:30:00",
 "url": ""
 }
 ],
 "audioInfo": [
 {
 "id": "",
 "classify": 0,
 "name": "",
 "url": ""
 }
 ]
 }
}

获取用户信息

Path:/exam/userInfo

Method:GET

Query:

name

type

required

desc

userId

string

YES

用户ID,通过页面URL参数传入。

roomId

string

YES

考场ID,通过页面URL参数传入。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─id

string

用户ID。

  |─name

string

昵称。

  |─userStatus

int

状态(目前没用上)。

  • 0: 有进行中的考场。

  • 1: 无进行中的考场。

  |─rtcPushUrl

string

推流地址。

  |─rtcPullUrl

string

大流地址。

  |─rtsPullUrl

string

小流地址(转码低清晰度的流)。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "id": "userid",
 "name": "username",
 "userStatus": 0,
 "rtcPushUrl": "artc://{yourPushDomain}/exam/xxx-xxx-xxx?grtn_twin_rtmp=on",
 "rtcPullUrl": "artc://{yourBigPullDomain}/exam/xxx-xxx-xxx",
 "rtsPullUrl": "artc://{yourSmallPullDomain}/exam/xxx-xxx-xxx_240p"
 }
}

获取考场的学生列表

Path:/exam/userList

Method:GET

Query:

name

type

required

desc

roomId

考场id

YES

考场ID,通过页面URL参数传入。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

array

数据。

  |─

object

    |─id

string

用户ID。

    |─name

string

昵称。

    |─userStatus

int

状态(目前没有用上)。

    |─rtcPushUrl

string

推流地址。

    |─rtcPullUrl

string

大流地址。

    |─rtsPullUrl

string

小流地址。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": [
 {
 "id": "userid",
 "name": "username",
 "userStatus": 0,
 "rtcPushUrl": "artc://{yourPushDomain}/exam/xxx-xxx-xxx?grtn_twin_rtmp=on",
 "rtcPullUrl": "artc://{yourBigPullDomain}/exam/xxx-xxx-xxx",
 "rtsPullUrl": "artc://{yourSmallPullDomain}/exam/xxx-xxx-xxx_240p"
 }
 ]
}

获取考场IM token接口

请参考建立长连接文档接入。

Path:/exam/getIMToken

Method:POST

Request Body:

name

type

desc

deviceId

string

设备ID,唯一串即可。

deviceType

string

设备类型,这里目前填web

userId

string

用户ID,通过页面URL参数传入。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─accessToken

string

阿里云互动消息的accessToken。

  |─rongToken

string

融云IMSDK所需的token,非必要,如果没有就不初始化融云服务。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "accessToken": "",
 "rongToken": "",
 }
}

获取OSS配置

请参考使用STS临时访问凭证访问OSS实现,目前开源的Appserver源码中暂未实现,请自行实现。

Path:/exam/getOssConfig

Method:GET

Query:

name

type

required

desc

examId

考试ID

YES

考试ID。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─region

string

以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。

  |─accessKeyId

string

从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。

  |─accessKeySecret

string

Secret。

  |─stsToken

string

从STS服务获取的安全令牌(SecurityToken)。

  |─bucket

string

填写Bucket名称。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "region": "",
 "accessKeyId": "",
 "accessKeySecret": "",
 "stsToken": "",
 "bucket": ""
 }
}

查询系统音频列表

Path:/exam/selectAudio

Method:POST

Request Body:

name

type

desc

pageSize

integer

页面大小。

pageNum

integer

页数。

name

string

筛选音频名称(非必填)。

classify

integer

分类。

Request Demo:

{
 "pageSize": 0,
 "pageNum": 0,
 "name": "",
 "classify": 0
}

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

object

数据。

  |─pageNum

integer

分页。

  |─pageSize

integer

一页条数。

  |─total

integer

总数。

  |─list

array

    |─

object

      |─id

string

ID。

      |─classify

integer

分类字典。

      |─name

string

音频名字。

      |─url

string

音频地址。

      |─ossUrl

string

OSS地址(非必需)。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": {
 "pageNum": 1,
 "pageSize": 10,
 "total": 14,
 "list": [
 {
 "id": "11111",
 "classify": 0,
 "name": "audio",
 "url": "",
 "ossUrl": "",
 }
 ]
 }
}

更新考场口播状态

Path:/exam/updateRoomAudioStatus

Method:POST

Query:

name

value

required

desc

id

string

YES

考场ID。

audioStatus

int

YES

考场口播状态。

  • 0:未口播。

  • 1:正在口播。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

boolean

数据。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": true
}

结束考场

Path:/exam/endRoom

Method:GET

Query:

name

type

required

desc

roomId

string

YES

考场ID,通过页面URL参数传入。

Body:

name

type

desc

success

boolean

是否成功。

errorCode

string

异常码。

errorMsg

string

异常信息。

data

boolean

数据。

Response Demo:

{
 "success": true,
 "errorCode": "",
 "errorMsg": "",
 "data": true
}
  • 本页导读 (1)
文档反馈