后端服务集成说明
控制台源码集成说明
项目说明
本项目是短视频管理后台web前端项目,用于直观地查看和管理用户信息及视频。包括预览视频,用户信息管理,视频管理等功能。使用 vue-cli 3 构建,vue-cli 选择的是Babel, Router, Vuex, CSS Pre-processors, Linter 配置。
环境说明
Node.js > 10.15.0
Linux/Mac: 如果已有Node.js环境,并且无符合要求的Node.js版本: 推荐使用 n 模块添加新版本Node.js.
sudo npm -g n
n 10.15.0
n (选择刚安装的版本)
sh web_build.sh (生成前端静态资源)
如果没有Node.js环境:
sh web_env.sh (运行项目根目录的 web_env.sh 脚本)
sh web_build.sh (生成前端静态资源)
Windows: 下载符合条件版本安装包/采用版本管理工具安装
主要技术栈
主要技术栈使用:
vue 前端 MVVM 框架
vue-router 前端 vue 路由框架
Element-UI UI框架
axios 基于 promise 的 HTTP 库
百度云视频播放器 查看Demo
短视频控制台源码和短视频AppServer源码在同一个文件夹中,所以要先下载 短视频AppServer源码,下载完源码之后,短视频控制台前端代码在 fe_source 文件夹中,fe_source 便是短视频控制台前端代码的工作目录,以下的命令都要进入到 fe_source 目录执行。
功能说明
主要功能有如下:
- 用户管理,用户信息查看,用户上传视频预览
- 视频管理,视频封禁,预览等
目录结构说明
下载源码之后,打开 fe_source 文件夹,fe_source 便是短视频控制台前端的工作目录。以下是 fe_source 的目录结构:
├── node_modules // node 依赖安装目录, 执行 npm install 之后各种依赖会安装在这儿
├── dist // 打包之后的文件目录
├── public
│ ├── favicon.ico
│ └── index.html // 网页主入口, 在这儿引用 cdn 等在线 js 和 css
├── src // 业务逻辑以及 Vue 组件目录
│ ├── api // 接口相关信息 集中写了所有AJAX请求
│ │ ├── client.js
│ │ └── config.js // 配置接口最终访问地址
│ ├── assets // 放置一些静态资源 css, images, fonts 放置在这儿
│ │ ├── images
│ │ └── scss
│ ├── components // vue 组件目录
│ │ └── HelloWorld.vue // 可复用组件
│ ├── common // 公共目录
│ │ ├── utils.js // 公共方法
│ │ └── enums.json // 一些状态的枚举变量值
│ ├── plugins // 插件目录
│ │ └── elements.js // 按需加载ElementUI 组件
│ ├── views // vue-router 对应的渲染组件所在目录
│ │ ├── userDatail.vue // 用户详情对应渲染组件
│ │ ├── userManage.vue // 用户管理对应渲染组件
│ │ └── videoManage.vue // 视频管理对应渲染组件
│ ├── App.vue // 渲染主组件
│ ├── main.js // 主入口文件
│ └── router.js // vue-router 路由配置文件
├── .browserslistrc // 浏览器兼容列表
├── .gitignore
├── babel.config.js // babel 配置文件
├── package-lock.json
├── package.json // 包说明文件, 包括各种依赖, 作者, 描述等
├── postcss.config.js // postcss 配置文件, 加上 css 的厂商前缀
├── README.md
├── README_zh.md
└── vue.config.js // vue 配置文件
编译发布
编译
首先安装好环境之后,打开命令行工具,切换到项目目录即 fe_source 下,安装项目依赖,执行:
npm install 修改 vue.config.js 中的配置将 proxy 设置成您的后端接口地址,完整的配置如下:
module.exports = {
// 设置前端开发时的代理
devServer: {
proxy: 'https://example.com', // 替换成你的接口域名地址, 后面不要加 '/'
},
productionSourceMap: false,
// 设置生产环境和开发环境时的静态资源路径
publicPath: process.env.NODE_ENV === 'production'
? 'https://example.com/resource/'
: '/',
}
安装依赖完毕并修改配置之后,执行:
npm run serve 这个命令会在本地开启一个服务,默认地址为 http://localhost:8080/ 在浏览器中打开,就能预览项目。
发布
--切换到项目目录 fe_source 下,执行打包命令:npm run build
--或者执行fe_source同级的 web_build.sh 脚本
生产环境即发布时 vue.config.js 中 publicPath 要设置成为您放置静态资源的地址,例如本项目后端使用的 spring boot 框架, 静态资源目录为 webapp/resource/,那么 vue.config.js 中的 publicPath 配置如下:
module.exports = {
// 设置前端开发时的代理
devServer: {
proxy: 'https://example.com', // 替换成你的接口域名地址, 后面不要加 '/'
},
productionSourceMap: false,
// 设置生产环境和开发环境时的静态资源路径
publicPath: process.env.NODE_ENV === 'production'
? 'https://example.com/resource/'
: '/',
}
实际上就是执行 vue-cli 封装的 webpack 来进行打包,webpack 的个性化设置可以在 vue.config.js 中设置,配置文档可以查看Vue-cli 配置参考。
执行完打包命令之后,项目根目录会生成打包文件,全部放置在 dist/ 目录中,这个目录下的文件就是需要放置到 webapp/resource 中的文件,其中的文件目录结构为:
├──dist
├── css
│ ├── app.[hash].css // vue 组件中的 css, 以及自定义的 css
│ └── chunk-vendors.[hash].css // 依赖中所引入的 css
├── fonts
├── img
├── js
│ ├── app.[hash].css // vue 组件中的 js, 以及自定义的 js
│ └── chunk-vendors.[hash].css // 依赖中所引入的 js
├── favicon.ico
└── index.
其中 webpack 已经帮我们把依赖中的 css, js 和自己写的 css, js 抽离并拆分成了不同的文件,这样不仅能加快页面响应速度,另外在迭代时,依赖没有更改的话我们只需要更新 app.[hash].js 和 app.[hash].css。
最后,将 dist 中的文件放置到服务器中。
服务器发布
实质上就是在服务器中放置静态资源,例如本项目后端使用的是 spring boot 框架,具体的可以查看 短视频AppServer文档。最后在 dist/ 目录中的文件放到 resource/static 文件夹中,输入 <你的域名地址>/index.html 访问成功,说明部署成功!
Project setup
npm install
Compiles and hot-reloads for development
npm run serve
Compiles and minifies for production
npm run build
Run your tests
npm run test
Lints and fixes files
npm run lint
Customize configuration
服务端源码集成说明
项目说明
本项目是智能小视频APPserver项目,集成了用户管理(注册、登录)、视频处理(上传、转码、截图)、播放管理(feed查询)、接口鉴权、 console管理(console支持用户查询、用户封禁/解封,支持媒资查询、视频封禁、解封等)等功能。 使用JAVA编写,依赖Springboot、Springdata jpa、Springdata redis等框架,使用MAVEN编译构建。 (如果是直接使用百度云云市场镜像启动服务可以直接看《镜像中服务运行》章节)
编译环境说明
jdk >= 1.8.0_*
mvn >= Maven 3
Mac/Linux/Windows:
可以使用IDE如IDEA内嵌的Maven进行编译构建
若果没有IDE集成的Maven环境,可以按照以下流程安装Maven
1、Maven下载:wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
2、Maven解压/安装:tar vxf apache-maven-3.6.1-bin.tar.gz
主要技术栈
主要技术栈使用: JAVA jdk1.8 Springboot1.4.2 Springdata jpa Springdata redis(基于Lettuce)
功能说明
主要功能有如下:
- 用户管理:支持用户注册、登录、查询指定用户信息
- 视频处理:支持用户上传文件、视频转码截图
- 播放管理:支持移动端查询feed、查询指定视频
- 接口鉴权:支持对端上所有接口添加鉴权
- console管理:支持所有所有用户信息查询及封禁解封功能;支持所有媒资查询及封禁解封功能。
目录结构说明
下载源码之后,打开 bce-shortvideo-server,该目录便是APPserve的工作目录。采用Maven多模块构建工程结构:
├── bce-shortvideo-server // 工程根目录
│ ├── bce-shortvideo-cloudsdk // 百度云集成相关sdk功能模块
│ ├── bce-shortvideo-common // 公共组件模块:包含注解、全局配置类、枚举、异常、工具类等
│ ├── bce-shortvideo-console // 控制台业务逻辑模块
│ ├── bce-shortvideo-entity // 持久化实体模块
│ ├── bce-shortvideo-media // 视频处理模块
│ ├── bce-shortvideo-platform // 启动类模块
│ └── bce-shortvideo-user // 用户管理模块
├── .gitignore
├── pom.xml // 工程pom配置文件
├── postBuild.sh // 工程编译构建脚本
├── web_build.sh // fe资源编译构建脚本
├── web_env.sh // fe资源编译环境脚本
└── README.md // readme
前端静态资源预发布
console的前端静态资源文件也会通过打入上述bce-shortvideo.jar包中,具体的为在配置好前端资源编译构建环境后执行web_build.sh脚本, 前端静态资源文件会被拷贝到启动模块bce-shortvideo-platform的resource/static文件夹中。
项目整体发布
1、当前源码的编译依赖jdk和maven,详情参考《环境说明》章节搭建编译环境。 2、jdk和maven安装好后修改工程编译构建脚本postBuild.sh中的JAVA_HOME和MAVEN_HOME路径 3、安装依赖完毕并修改配置之后,进入工程根目录bce-shortvideo-server即postBuild.sh文件所在文件夹执行: bash ./postBuild.sh编译打包 4、步骤"3"中执行结果会在工程根目录bce-shortvideo-server生成目标文件夹output,这个目录中内容是APPserver服务运行相关的所有文件,其中目录结构为:
├──output
├── bin
│ ├── bce-shortvideo.jar // Maven编译打包生成的jar文件
│ ├── start.sh // 服务启动脚本
│ └── stop.sh // 服务停止脚本
├── log // 日志文件目录
└── conf
├── application.yml // 服务配置文件
├── logback-access.xml // logback日志access配置
└── logback.xml // logback日志配置
服务配置说明
当前服务的业务配置文件为application.yml,其中关键项说明如下:
server-host: 服务host
server.port: 服务端口
spring.jpa: springdata jpa的配置
spring.datasource: spring数据源的配置,我们当前使用druid数据源
spring.cache: spring缓存配置
spring.redis: springdata redis的配置
bce.cloud.accessKey: 百度云账号ak,需要替换为用户自己账号
bce.cloud.secretKey: 百度云账号sk,需要替换为用户自己账号
bce.cloud.sts.endpoint: 百度云使用获取临时token的服务地址配置,不可更改
bce.cloud.bos.endpoint: 百度云对象存储服务地址配置,不可更改
bce.cloud.vod.endpoint: 百度云点播服务地址配置,不可更改
bce.cloud.vod.preset-group: 百度云点播转码模板组配置,需要开通百度云VCR服务并且进行相关配置,且替换为用户自己实际配置的模板组名称
bce.cloud.vcr: 百度云智能审核服务的配置,无需更改
shortVideo.ssl.enable: false 后端服务是否开启ssl,当前服务可以使用nginx作为代理服务器来访问,因此该配置设置为false,ssl的配置可以在nginx上添加
shortVideo.callback.positive.mode: false 后端服务查询VOD处理结果的方式,推荐设置为false,即为VOD回调方式
shortVideo.aes.secret.key: 123456 后端服务调用AES加密key,根据用户需求与移动端协作配置对某些参数使用AES加解密
shortVideo.vcr.active: false 后端服务开启VCR智能视频审核的开关,当前版本服务端业务逻辑已经支持VCR,但是移动端和console暂未支持,因此该参数暂设置为false
shortVideo.vcr.notification: shortvideo_addvcr 后端服务开启VCR智能视频审核的通知模板名称,需要开通百度云VCR服务并且进行相关配置,由于前一个参数暂无开启VCR,此参数可以不配置
shortVideo.vcr.callback.expire: 60 后端服务开启VCR智能视频审核的通知的超时时间,由于前一个参数暂无开启VCR,此参数可以不配置
shortVideo.signature: 后端服务接口鉴权的相关配置
enable: false
encryptKey: 123456789
expired:
second: 1800
shortVideo.login: 后端服务配置移动端用户登录超时的时间
timeout: 43200
数据库配置
数据库脚本所在位置为bce-shortvideo-server/bce-shortvideo-platform/src/main/resources/db/schema_shortvideo_mysql.sql,在用户自己的数据库服务器中创建数据库multimedia_shortvideo_new,且导入 该sql文件。更改《服务配置说明》章节中配置文件application.yml中数据库连接地址。
项目部署及运行
将《项目整体发布》章节的编译产出文件加output中内容拷贝到服务待部署机器指定目录,该机器保证有与《编译环境说明》章节相同的jdk环境才能运行服务。 服务启动:进入bin目录执行bash start.sh
镜像中服务运行
前提:当前章节的前提是用户已经在百度云云市场购买智能小视频镜像且通过购买配置BCC进入镜像中操作系统。
镜像环境说明:
1、镜像关键目录如下:
├──/home/work
├── shortvideo // 《项目整体发布》章节中output文件内容存放的目录
│ ├── bin
│ ├── conf
│ └── log
├── all_in_one_start.sh // 一键启动脚本
├── nginx_install // 代理服务器nginx安装目录
└── packages // 服务依赖第三方应用如mysql、redis、nginx、jdk等的安装包
2、修改用户服务配置。shortvideo目录详情请参考《项目整体发布》章节,服务配置请参考《服务配置说明》章节
3、nginx作为代理服务器配置
3-1 nginx配置域名访问:修改nginx.conf配置文件中的server_name参数为实际域名,且配置该域名到服务器ip地址的CNAME。
3-2 nginx配置ssl支持https协议:修改nginx.conf配置文件中的ssl_certificate、ssl_certificate_key为实际的证书路径。
3-3 nginx配置回源:修改upstream.conf配置文件中的server为实际回源url。
4、一键启动服务 执行bash all_in_one_start.sh即可启动APPserver所涉及到的mysql、redis、小视频服务、nginx等服务。
控制台接口文档
状态码
接口返回信息
public enum ResponseEnum {
EC_OK("0000", "OK"),
EC_BAD_REQUEST("0001", "Bad Request"),
EC_SIGN_ERROR("1000", "Invalid Token"),
EC_DATABASE_ERROR("1001", "Internal Server Error(db error)"),
EC_UPDATE_ERROR("1002", "update error"),
EC_INVALID_PARAM("1003", "invalid param"),
EC_MEDIA_NOT_EXIST("2005", "media not exist"),
EC_SYSTEM_INVALID_JSON_FORMAT("3001", "http post body is empty or invalid json format in post body from client!"),
}
视频封禁状态码
public enum VideoPublishStatus {
DEFALULT,
PUBLISHED,
BANNED
}
文件类型
public enum FileTypeEnum {
VIDEO(0),
USER_IMG(1),
VIDEO_IMG(2)
}
用户账号状态
public enum AccountStatus {
DEFAULT,
NORMAL,
BANNED
}
用户性别
public enum Sex {
FEMALE(0),
MALE(1),
UN_KNOWN(2)
}
用户账号类型
public enum AccountType {
APP,
TEL,
WERXIN
}
用户管理
一、分页查询用户列表
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
分页查询用户列表 | pageQueringUsers | HTTP | GET | /internal/v1/user |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
id_or_name | string | 否 | 用户全局唯一id或昵称 | 0123456789 | |
account_status | int | 否 | 用户账号状态 | 详见AccountStatus枚举 | |
index | int | 否 | 分页查询页数 | 0(默认为0) | |
count | int | 否 | 分页查询每页数量 | 10(默认为10) |
请求示例
curl http://127.0.0.1:9999/internal/v1/user?id_or_name=test&account_status=1&index=0&count=10
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.users | list | 用户列表 | |
data.users.user_id | string | 用户id | |
data.users.nickname | string | 用户昵称 | |
data.users.tel | long | 手机号 | |
data.users.sex | int | 用户性别(见Sex枚举) | |
data.users.account_type | int | 账号类型(见AccountType枚举) | |
data.users.total_video_count | long | 上传视频总数 | |
data.users.total_play_count | long | 总播放数量 | |
data.users.total_star_count | long | 总点赞数量 | |
data.users.create_time | string | 创建时间 | |
data.users.account_status | int | 用户账号状态(见AccountStatus枚举) |
应答示例
{
"code": "0000",
"message": "",
"data": {
"users":[
{
"user_id":"xxx",
"nickname":"xiaoli",
"tel":11122233344,
"sex:0,
...
}
]
}
}
二、查询指定用户详情:
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
用户详情 | getUserDetail | HTTP | GET | /internal/v1/user/{userId} |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 是 | 用户id |
请求示例
curl http://127.0.0.1:9999/internal/v1/user/4411424069714944
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.user_id | string | 用户id | |
data.nickname | string | 用户昵称 | |
data.avatar | string | 用户头像地址 | |
data.sex | int | 用户性别 | |
data.age | int | 年龄 | |
data.location | string | 地点 | |
data.description | string | 签名 | |
data.videos | list | 视频列表 | |
data.videos.front_cover | string | 视频封面 | |
data.videos.play_url | string | 视频播放地址 | |
data.videos.ratio | String | 视频宽高比 | 4:3 |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"user_id":"id",
"videos":[
{
"front_cover":"xxx",
"play_url":"xxx",
"ratio":"4:3"
},
...
]
}
}
三、封禁/解封用户
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
用户封禁 | banUser | HTTP | PUT | /internal/v1/user/{userId}?block |
用户解封 | unbanUser | HTTP | PUT | /internal/v1/user/{userId}?unblock |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 是 | 用户id | 无 | user001 |
请求示例
curl -X PUT -i 'http://127.0.0.1:9999/internal/v1/user/{userId}?block'
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | number | 返回码 | 200 |
message | string | 返回消息 |
应答示例
{
"code": "0000",
"message": "OK"
}
视频管理
一、分页查询视频信息
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
分页查询视频信息 | pageQueringVideos | HTTP | GET | /internal/v1/video |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
start_time | long | 是 | 查询开始时间ms | ||
end_time | long | 是 | 查询结束时间ms | ||
video_id_or_name | string | 否 | 用户id or name | user001 | |
video_status | int | 否 | 视频状态 | 见上述VideoStatus枚举 | |
sort_type | string | 否 | 按照创建时间排序类型 | DESC,ASC | |
index | int | 否 | 页索引 | ||
count | int | 否 | 每页数量 |
请求示例
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.videos | list | 视频列表 | |
data.videos.video_id | string | 视频id | |
data.videos.video_name | string | 视频名称 | |
data.videos.file_type | int | 文件类型 | |
data.videos.video_status | int | 视频状态发布/封禁 | |
data.videos.video_url | string | 视频播放地址 | |
data.videos.create_time | string | 创建时间 | |
data.videos.front_cover | string | 视频封面 |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"videos":[
{
"video_id":"11112222111",
...
}
]
}
}
二、查询指定视频id的详情
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
视频详情 | getVideoDetail | HTTP | GET | /internal/v1/video/{videoId} |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
video_id | string | 是 | 视频id | videoId |
请求示例
curl http://127.0.0.1:9999/internal/v1/video/4411424069714944
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.title | string | 标题 | |
data.classify | string | 分类 | |
data.label | sting | 标签 | |
data.introduction | string | 简介 | |
data.front_cover | string | 视频封面 | |
data.play_url | string | 视频地址 | |
data.author | string | 上传者 | |
data.create_time | string | 上传时间 |
应答示例
{
"code": "0000",
"message": "OK",
"data":{
"play_url":"http://xxxxx",
...
}
}
三、视频封禁/解封
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 | |
---|---|---|---|---|---|
视频封禁/解封 | banVideo | HTTP | PUT | /internal/v1/video/{videoId}?block | |
视频封禁/解封 | unbanVideo | HTTP | PUT | /internal/v1/video/{videoId}?unblock |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
video_id | string | 是 | 视频id | videoId |
请求示例
curl -X PUT -i 'http://127.0.0.1:9999/internal/v1/video/{videoId}?block'
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 |
应答示例
{
"code": "0000",
"message": "OK"
}
服务端接口文档
状态码
接口返回
public enum ResponseEnum {
EC_OK("0000", "OK"),
EC_BAD_REQUEST("0001", "Bad Request"),
EC_SIGN_ERROR("1000", "Invalid Token"),
EC_DATABASE_ERROR("1001", "Internal Server Error(db error)"),
EC_UPDATE_ERROR("1002", "update error"),
EC_INVALID_PARAM("1003", "invalid param"),
EC_USER_BANNED("2000", "user banned"),
EC_USER_EXIST("2001", "user exist"),
EC_USER_NOT_EXIST("2002", "user not exist"),
EC_USER_PWD_ERROR("2003", "password error"),
EC_USER_LOGIN_TIMEOUT("2004", "user login timeout"),
EC_MEDIA_NOT_EXIST("2005", "media not exist"),
EC_SYSTEM_INVALID_JSON_FORMAT("3001", "http post body is empty or invalid json format in post body from client!"),
EC_SYSTEM_INVALID_PARA("3002", "request para error"),
EC_SYSTEM_FREQUECY("3003", "frequency control");
}
处理状态码(内部)
public enum VideoStatus {
VS_UPLOAD_ING(10),
VS_UPLOAD_SUCCESS(11),
VS_UPLOAD_FAILED(12),
VS_TRANSCODE_ING(21),
VS_PUBLISHED(22),
VS_TRANSCODE_FAILED(23),
VS_BANNED(24);
}
资源可用状态码(外部)
ResourceStatus:{
READY:0, //视频处理完成
NOT_READY:1, //等待视频处理
}
上传文件类型
public enum FileTypeEnum {
VIDEO(0),
USER_IMG(1),
VIDEO_IMG(2);
}
鉴权算法
一、接口鉴权
鉴权流程 = 预准备token + signature生成
预准备token
token = 可以使用云级别或者appId级别信息提前准备公钥私钥对(服务端生成并维护该信息列表),将公钥作为token返回给app拥有者;
signature生成(dataMd5为uri+params拼接字符串且包含当前时间戳;服务端设置过期时间)
signature = crypto.createHash("md5").update(token + dataMd5).digest("hex")
public String createSignature(String url, String uId, Long currenTime) {
URL urlObj = null;
try {
urlObj = new URL(url);
String path = urlObj.getPath();
String currentHex = Long.toHexString(currenTime);
String toSignStr = null;
if (uId == null) {
toSignStr = String.format("%s%s%s", encryptKey, path, currentHex);
} else {
toSignStr = String.format("%s%s%s%s", encryptKey, path, uId, currentHex);
}
log.info("createSignature toSignStr : " + toSignStr);
String sign = md5ToLower(toSignStr);
log.info("createSignature sign : " + sign);
return sign;
} catch (MalformedURLException | UnsupportedEncodingException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
用户管理
一、用户注册:
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
注册 | register | HTTP | POST | /v1/user/register |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
name | string | 是 | 用户全局唯一名称 | user001 | |
password | string | 是 | 密码 | md5(password) |
请求示例
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.expire_time | long | 过期时间s |
应答示例
{
"code": "0000",
"message": "",
"data": {
"expire_time":"11111"
}
}
二、登录:
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
用户登录 | login | HTTP | POST | /v1/user/login |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
name | string | 是 | 用户全局唯一名称 | user001 | |
password | string | 是 | 密码 | md5(password) |
请求示例
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.user_id | string | 用户id | |
data.expire_time | long | 过期时间s |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"user_id":"id",
"expire_time":"11111"
}
}
三、获取用户信息
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
获取用户头像,昵称等信息 | getInfo | HTTP | GET | /v1/user/getInfo |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 是 | 用户id,用来表示用户自己 | user001 | |
video_id | string | 是 | 视频id,用来表示其他用户 | videoId |
请求示例
curl -d "user_id="id" /v1/user/getInfo
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.nickname | string | 昵称 | |
data.avatar | string | 头像访问地址 | |
data.sex | integer | 性别 | |
data.frontcover | string | 封面访问地址 |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"nickname":"xxx",
"avatar":"http://xxxx",
"sex":0 //0:male,1:female,-1:unknown
"frontcover":"http://xxxx", //封面图url
}
}
媒资管理
一、获取视频/图片上传参数
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
获取上传参数 | getUploadParam | HTTP | POST | /v1/video/getUploadParam |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 是 | 用户id | user001 | |
file_id | string | 是 | 文件id | test.mp4 | |
file_type | int | 是 | 文件类型 | 见上传文件类型枚举UploadFileType | |
title | string | 否 | 标题(图片上传可以没有) | ||
location | string | 是 | 地理位置(图片上传可以没有) |
请求示例
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.video_id | string | 视频id | |
data.bucket | string | bos种桶名 | |
data.bos_key | string | bos中的key | |
data.signature | string | 签名参数 |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"video_id":"videoId",
"bucket":"testBucket",
"bos_key":"path/file",
"signature":"xxx", //请求的点播签名
}
}
二、上传视频/文件结束
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 |
---|---|---|---|---|
移动端上传完通知 | uploadFinish | HTTP | POST | /v1/video/uploadFinish |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 否 | 用户id | user001 | |
video_id | string | 否(文件上传非必须,视频上传必需) | 视频id | videoId | |
file_type | int | 是 | 文件类型 | 见上传文件类型枚举UploadFileType | |
status | int | 是 | 文件上传状态 | 见视频处理状态枚举VideoStatus |
请求示例
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.img_url | string | 根据file_type返回用户资源图片url |
应答示例
{
"code": "0000",
"message": "OK",
"data":{
"img_url":"http://xxxxx"
}
}
三、分页获取视频列表(指定用户id)
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 | 排序方式 |
---|---|---|---|---|---|
拉取指定用户视频列表 | getSpecificVideoList | HTTP | GET | /v1/video/getSpecificVideoList | 默认按照最新时间 |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
user_id | string | 否 | 用户Id | 无 | user_id |
video_id | string | 否 | 视频id | videoId | |
index | number | 否 | 页码 | 0 | 0 |
count | number | 否 | 一页数量 | 10 | 10 |
请求示例
curl -d "user_id="id"&index=0&count=10" "/v1/video/getSpecificVideoList"
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.list | array | 视频列表 | |
data.list.n | videoinfo | 视频详细信息 |
videoinfo
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
videoId | string | 视频id | xxx |
status | integer | 视频状态 | 0 |
title | string | 视频标题 | |
front_cover | string | 视频封面 | |
location | string | 上传地理位置 | |
play_url | string | 播放地址 | |
create_time | string | 上传时间 | |
ratio | string | 宽高比 | |
duration | long | 视频时长(s) | |
author | authorinfo | 作者信息 |
authorinfo
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
nick_name | string | 用户昵称 | |
avatar | string | 用户头像 |
应答示例
{
"code": "0000",
"message": "OK",
"data": {
"list": [
{
"videoId":"xxx",
"status":0,
"title":"xxxx“, //标题
"front_cover":"xxx", //封面图url
"location":"xxx", //地理位置
"play_url":"xxx", //播放地址
"create_time":"xxxx-xx-xx xx:xx:xx", //创建时间
"ratio":"4:3",
"duration":10,
"author":{
"nick_name":"xxx", //昵称
"avatar":"xxx", //头像url
}
}
]
}
}
四、分页获取视频列表(所有用户)
功能说明 | 接口名称 | 请求方式 | 请求方法 | 请求地址 | 排序方式 |
---|---|---|---|---|---|
拉取服务端视频列表 | getVideoList | HTTP | GET | /v1/video/getVideoList | 默认按照最新时间 |
参数说明
参数名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
---|---|---|---|---|---|
index | number | 否 | 页码 | 0 | 0 |
count | number | 否 | 一页数量 | 10 | 10 |
请求示例
curl -d "index=0&count=10" "/v1/video/getVideoList"
接口应答
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
code | string | 返回码 | 0000 |
message | string | 返回消息 | |
data | object | 返回数据 | |
data.list | array | 视频列表 | |
data.list.n | videoinfo | 视频详细信息 |
videoinfo
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
videoId | string | 视频id | xxx |
status | integer | 视频状态 | 0 |
title | string | 视频标题 | |
front_cover | string | 视频封面 | |
location | string | 上传地理位置 | |
play_url | string | 播放地址 | |
create_time | string | 上传时间 | |
ratio | string | 宽高比 | |
duration | long | 视频时长(s) | |
author | authorinfo | 作者信息 |
authorinfo
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
user_id | string | 所属用户id | |
nick_name | string | 用户昵称 | |
avatar | string | 用户头像 |
应答示例(宽高)
{
"code": "0000",
"message": "OK",
"data": {
"list": [
{
"videoId":"xxx",
"status":0,
"title":"xxxx“, //标题
"front_cover":"xxx", //封面图url
"location":"xxx", //地理位置
"play_url":"xxx", //播放地址
"create_time":"xxxx-xx-xx xx:xx:xx", //创建时间
"ratio":"4:3",
"duration":10,
"author":{
"user_id":"xxx", //用户id
"nick_name":"xxx", //昵称
"avatar":"xxx", //头像url
}
}
]
}
}
服务端数据库文档
用户表
use multimedia_shortvideo_new;
DROP TABLE IF EXISTS `User`;
CREATE TABLE `User` (
`user_id` varchar(50) NOT NULL COMMENT '用户id',
`password` varchar(255) NOT NULL COMMENT '用户密码',
`nickname` varchar(100) NOT NULL COMMENT '用户昵称',
`telephone` bigint(20) DEFAULT 0 COMMENT '手机号',
`account_type` tinyint(4) DEFAULT 0 COMMENT '账号类型,默认为app账号',
`account_status` tinyint(4) DEFAULT 0 COMMENT '账号状态,默认为正常',
`sex` tinyint(4) DEFAULT 2 COMMENT '性别',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`front_cover` varchar(255) DEFAULT NULL COMMENT '用户封面',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登录更新时间',
`expire_time` int(11) DEFAULT 0 COMMENT '登录超时日期(s)',
`version` int(11) DEFAULT 0 COMMENT '内部使用, 乐观锁',
PRIMARY KEY (`user_id`),
UNIQUE KEY `nickname_idx` (`nickname`),
KEY `account_status_idx` (`account_status`),
KEY `create_time_idx` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
媒资表
DROP TABLE IF EXISTS `Media`;
CREATE TABLE `Media` (
`media_id` varchar(50) NOT NULL COMMENT '媒资id',
`sub_media_id` varchar(50) DEFAULT NULL COMMENT '子媒资id(转码模版对应)',
`user_id` varchar(50) NOT NULL COMMENT '用户id',
`file_id` varchar(100) NOT NULL COMMENT '文件名称',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '内部状态',
`review_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态',
`front_cover` varchar(255) DEFAULT NULL COMMENT '封面',
`location` varchar(128) DEFAULT NULL COMMENT '地理位置',
`play_url_list` varchar(4096) DEFAULT NULL COMMENT '转码后播放列表',
`thumbnail_list` varchar(4096) DEFAULT NULL COMMENT '缩略图列表',
`play_count` int(11) DEFAULT 0 COMMENT '单个视频播放数量',
`star_count` int(11) DEFAULT 0 COMMENT '单个视频点赞数量',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`version` int(11) DEFAULT 0 COMMENT '内部使用, 乐观锁',
PRIMARY KEY (`media_id`),
KEY `subMediaId_idx` (`sub_media_id`),
KEY `userId_idx` (`user_id`),
KEY `status_idx` (`status`,`review_status`),
KEY `create_time_idx` (`create_time`, `status`),
KEY `file_id_idx` (`file_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='媒资信息表';
token表
DROP TABLE IF EXISTS `Token`;
CREATE TABLE `Token` (
`id` varchar(64) NOT NULL COMMENT 'id',
`token` varchar(1024) DEFAULT NULL COMMENT 'sts密钥',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '密钥更新时间',
`expire_time_second` int(11) DEFAULT 0 COMMENT '超时日期(s)',
`version` int(11) DEFAULT 0 COMMENT '内部使用, 乐观锁',
PRIMARY KEY (`id`),
KEY `expireTime_idx` (`expire_time_second`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sts密钥信息表';
审核表
DROP TABLE IF EXISTS `media_review`;
CREATE TABLE `media_review` (
`media_id` varchar(50) NOT NULL COMMENT '用户id',
`review_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '媒资审核状态',
`vcr_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT 'vcr审核结果',
`system_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '系统标注状态',
`artificial_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '人工标注状态',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`version` int(11) DEFAULT 0 COMMENT '内部使用, 乐观锁',
PRIMARY KEY (`media_id`),
KEY `create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='媒资审核表';