CIMP系统项目实战
前面的课程学完后,我们现在就开发一个web系统,巩固锻炼一下。
系统功能介绍
CIMP系统,中文全称:校园信息管理平台。
CIMP 实现校园 学生老师账号、通知公告、校园新闻动态、学生老师论文、学生毕业设计等数据的发布和管理。
其中内置了一个工作流系统,实现毕业设计项目的申请、审批、提交、评分功能。
具体功能描述,参见视频讲解
下载运行
百度云盘
链接:https://pan.baidu.com/s/19zJzs6ysqNIzUUuSfur6pA
提取码:rofe
下载zip包后,解压即可。
注意: CIMP 存放的路径上 一定不能有中文
,否则前端模块启动不了(这是Nginx的问题)
进入到目录中,分别运行 启动前端.bat
, 启动后端.bat
。
首次运行时,会有防火墙提示,选择允许即可。
浏览器输入网址 http://127.0.0.1,点击右上角登录,系统里面创建了系统管理员账号 byhy
, 密码 111111
系统采用前后分离的模式进行开发,后端系统缺省服务端口号为 8210。
具体操作,参见视频讲解。
其架构图如下
接口概述
本接口是校园信息管理平台 (CIMP) 前端 和 后端子系统之间的接口。
所有的HTTP请求响应消息,如果有消息体,一律为json格式。
所有的API响应消息,如果操作不成功,返回消息体格式如下
ret 不为 0 表示操作失败, msg字段描述 API 操作失败的原因
登录
3种类型的账号:管理员、老师、学生, 均使用该接口进行登录。
前端发送的登录请求中包含账号、密码。
后端接收后,对账号密码的正确性进行校验。
CIMP系统使用session会话机制。
如果校验通过,服务端在响应消息头Set-Cookie 中存入sessionid ,该用户的后续请求头Cookie中必须携带sessionid。
请求
- 请求头
- 消息体
为json格式
响应
- 响应头
- 消息体
如果校验通过,返回消息如下
ret 为 0 表示登录成功
usertype 是用户类型。 1:管理员,2000:学生,3000:老师
userid 是用户在系统中的id
realname 是用户的姓名
登录成功后, 服务端在消息头Set-Cookie 中存入sessionid ,该用户的后续请求头Cookie中必须携带sessionid。
如果登录校验失败,返回失败的原因,示例如下
ret 不为 0 表示登录失败, msg字段描述登录失败的原因
登出
请求
- 请求头
- 消息体
为json格式
响应
后端应该根据sessionid清除掉session,然后返回响应消息
- 响应头
- 消息体
账号管理
该API接口 用来 列出、添加、修改、删除系统中的账号。
发出账号管理的API 只能是管理员用户。后端要根据session校验。
账号管理的API 路径均为 /api/account
列出账号
用来列出系统中的账号信息。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage | 必填项 | 必须为 listbypage |
pagesize | 1 | 必填项 | 分页的 每页获取多少条记录 |
pagenum | 2 | 必填项 | 获取第几页的信息 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示用户姓名中包含的关键字。 多个关键字以空格隔开,表示姓名中同时包含的关键字词 |
响应
后端返回列出结果
- 消息体
{
"ret": 0,
"items": [
{
"id": 4,
"username": "student-2",
"realname": "学生-2",
"studentno": "00002",
"desc": "学生-2",
"usertype": 2000
},
{
"id": 3,
"username": "student-1",
"realname": "学生-1",
"studentno": "00001",
"desc": "学生-1",
"usertype": 2000
},
{
"id": 1,
"username": "byhy",
"realname": "白月黑羽",
"studentno": null,
"desc": null,
"usertype": 1
}
],
"total": 8,
"keywords": ""
}
ret 为 0 表示列出成功
total 为 8 表示系统中(不是当前页)总共有8个账号
items 数组 里面包含了当前页中的账号信息。
每个账号信息以如下格式存储
studentno 表示学号,非学生为null
usertype 表示 账号类型,取值前面已经说过
添加账号
用来添加系统中的账号信息。
请求
- 请求头
- 消息体
要添加的账号的具体信息,格式如下
{
"action": "addone",
"data": {
"realname" : "紫一元",
"username" : "ziyiyuan",
"password" : "111111",
"studentno": "300005",
"desc" : "白月黑羽的优秀学员",
"usertype" : 2000
}
}
其中
action
: 填写 addone, 表示 添加一个账号的操作
realname
: 用户的姓名
username
: 用户的登录名
password
: 用户的密码
studentno
: 如果该用户为学生,则为学生的学号,如果不是学生,此字段为空字符串
usertype
: 用户类型, 2000 为学生, 3000 为老师。
响应
- 消息体
ret
为 0 表示添加成功
id
为添加账号的 id
修改账号
用来修改系统中的账号信息。
请求
- 请求头
- 消息体
要修改的账号的具体信息,格式如下
{
"action": "modifyone",
"id": 10,
"newdata": {
"realname": "紫一元2",
"username": "ziyiyuan2",
"studentno": "300015",
"password": "111111",
"desc": "白月黑羽网站的Python老师,创业公司CTO"
}
}
其中
action
: 填写 modifyone ,表示 修改一个账号的操作
id
: 要修改账号的 id
newdata
: 里面包含了要修改的信息
realname
: 用户的姓名修改为什么。如果此项不用修改,该字段不出现
username
: 用户的登录名修改为什么。如果此项不用修改,该字段不出现
studentno
: 学生的学号修改为什么。如果此项不用修改,该字段不出现
password
: 用户的密码修改为什么。如果此项不用修改,该字段不出现
desc
: 账号的描述信息修改为什么。如果此项不用修改,该字段不出现
响应
- 消息体
ret
为 0 表示修改成功
删除账号
用来删除系统中的账号信息。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 deleteone ,表示 删除 一个账号的操作
id
: 要删除账号的 id
响应
- 消息体
ret
为 0 表示删除成功
上传图片
该API接口 在编辑 通知、新闻、论文等富文本数据时,上传图片到服务端
请求
- 请求头
POST /api/upload
Cookie: sessionid=<sessionid数值>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXXXXXXXXXX
- 消息体
------WebKitFormBoundarya8wf0W7tYnnff7ze
Content-Disposition: form-data; name="upload1"; filename="image.png"
Content-Type: image/png
消息体是 form data格式的数据
其中
name="upload1"
表示上传数据form-data的第一个formdata,此处固定填写upload1。
filename="image.png"
表示上传图片文件名。
消息体后续的内容 是 图片文件的内容字节串。
响应
服务端接收到上传请求后,检查 filename 参数必须是 png或者 jpg结尾的文件名,并且文件大小不能超过10M
检查通过后,存储上传文件内容在服务端。
返回响应消息体如下:
- 消息体
ret
为 0 表示设置成功
url
为 上传后图片文件在服务端的访问地址
为了保证产生唯一的文件url,存储文件时,需要重新命名。
推荐的格式为 {userid}_{timestamp}_{randomstring}.{filetype}
通知管理
该API接口 用来 列出、添加、删除、封禁、发布 系统中的通知。
通知管理的API 路径均为 /api/notice
。
该接口只能由管理员账号使用。
列出发布状态通知
用来列出系统中处于发布状态的通知。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage | 必填项 | 必须为 listbypage |
pagesize | 1 | 必填项 | 指定分页的 每页获取多少条记录 |
pagenum | 2 | 必填项 | 指定获取第几页的信息 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词 |
withoutcontent | true | 可选项 | 如果该字段出现,表示返回的条目中不需要包含具体内容,节省流量 |
响应
后端返回列出结果
- 消息体
{
"ret": 0,
"items": [
{
"id": 4,
"pubdate": "2020-03-13T08:30:47.985Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "公告4",
"content": "水电费水电费水电费4444",
"status": 1
},
{
"id": 3,
"pubdate": "2020-03-13T08:30:37.447Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "关于延迟2020年寒假后开学时间的通知",
"content": "各位同学,由于新冠疫情,2020年寒假后开学时间延迟至5月1日。",
"status": 1
}
],
"total": 2,
"keywords": ""
}
ret 为 0 表示列出成功
total 为 2 表示系统中(不是当前页)总共有2个通知
items 数组 里面包含了当前页中的通知信息。
每个通知信息以如下格式存储
{
"id": 3,
"pubdate": "2020-03-13T08:30:37.447Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "关于延迟2020年寒假后开学时间的通知",
"content": "各位同学,由于新冠疫情,2020年寒假后开学时间延迟至5月1日。",
"status": 1
}
pubdate
为创建时间,为iso格式
author
为创建者的id
author__realname
为创建者的姓名
title
为通知的标题
content
为通知的内容,如果请求参数中withoutcontent值为true,则没有该字段
status
为通知的状态。 正常发布状态:1, 撤回状态:2,封禁状态:3
列出所有状态通知
用来列出系统中 所有的
通知。 包括非发布状态的通知
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
GET /api/notice?action=listbypage_allstate&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage_allstate | 必填项 | 用来列出系统中 所有的 通知 |
pagenum | 2 | 必填项 | 获取第几页的信息 |
pagesize | 1 | 必填项 | 分页的 每页获取多少条记录 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词 |
响应
后端返回列出结果,响应消息格式与 列出发布状态通知API的响应
格式一致
查看一条通知
用来查看一条通知的内容。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | getone | 必填项 | 用来查看一条通知 |
id | 2 | 必填项 | 查看的通知对应的ID |
响应
- 消息体
{
"ret": 0,
"rec": {
"id": 5,
"pubdate": "2020-03-23T03:04:42.808Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "2020软件工程研究生招收规定",
"content": "规定内容详情如下",
"status": 1
}
}
rec
中包含了具体的通知信息,其中
pubdate
为创建时间,为iso格式
author
为创建者的id
author__realname
为创建者的姓名
title
为通知的标题
content
为通知的内容
status
为通知的状态。 正常发布状态:1, 撤回状态:2,封禁状态:3
添加通知
用来添加一条通知。
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
要添加的账号的具体信息,格式如下
其中
action
: 填写 addone, 表示 添加一条通知的操作
data
里面是通知的内容,其中:
title
: 通知的标题
content
: 通知的正文
响应
- 消息体
ret
为 0 表示添加成功
id
为添加通知的 id
修改通知
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 modifyone ,表示 修改一条通知的操作
id
: 要修改通知的 id
newdata
: 里面包含了要修改的信息,其中:
title
: 通知的标题修改为什么。如果此项不用修改,该字段不出现
content
: 通知的正文修改为什么。如果此项不用修改,该字段不出现
响应
- 消息体
ret
为 0 表示修改成功
封禁通知
用来封禁一条通知。封禁后的通知,对学生、老师、未登录账号不可见
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 banone ,表示 封禁一条通知 的操作
id
: 要封禁通知的 id
响应
- 消息体
ret
为 0 表示封禁成功
status
为 现在的状态值
发布(解禁)通知
用例发布被封禁一条通知。发布后的通知,对学生、老师、未登录账号恢复可见
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 publishone ,表示 解禁一条通知 的操作
id
: 要解禁通知的 id
响应
- 消息体
ret
为 0 表示解禁成功
status
为 现在的状态值
删除通知
用来删除一条通知。
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 deleteone ,表示 删除 一个通知的操作
id
: 要删除通知的 id
响应
- 消息体
ret
为 0 表示删除成功
新闻管理
该API接口 用来 列出、添加、删除、封禁、发布 系统中的新闻。
新闻管理的API url路径均为 /api/news
。
除了API url路径, 新闻管理
API的规则 和 通知管理
完全一样。
该接口只能由管理员账号使用。
论文管理
该API接口 用来 列出、添加、删除、封禁、发布、撤回系统中的论文。
论文的属性类似 通知和新闻。
但是论文通常是由学生或者老师账号创建的。而通知、新闻是由管理员创建的。
论文可以被点赞。
论文管理的API url路径均为 /api/paper
。
论文
列出发布状态论文
用来列出系统中 发布状态
的论文。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage | 必填项 | 指定列出系统中 发布状态 论文 |
pagesize | 1 | 必填项 | 指定分页的 每页获取多少条记录 |
pagenum | 2 | 必填项 | 指定获取第几页的信息 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词 |
withoutcontent | true | 可选项 | 如果该字段出现,表示返回的条目中不需要包含具体内容,节省流量 |
响应
后端返回列出结果
- 消息体
{
"ret": 0,
"items": [
{
"id": 4,
"pubdate": "2020-03-13T08:30:47.985Z",
"author": 2,
"author__realname": "张飞",
"title": "流体在管道中的动力表现",
"content": "流体在管道中的动力表现正文",
"thumbupcount": 1,
"status": 1
},
{
"id": 3,
"pubdate": "2020-03-13T08:30:37.447Z",
"author": 3,
"author__realname": "关羽",
"title": "海量数据从 MySQL 到 Hbase 的同步",
"content": "海量数据从 MySQL 到 Hbase 的同步正文",
"thumbupcount": 0,
"status": 1
}
],
"total": 2,
"keywords": ""
}
ret 为 0 表示列出成功
total 为 2 表示系统中(不是当前页)总共有2个论文
items 数组 里面包含了当前页中的论文信息。
每个论文信息以如下格式存储
{
"id": 3,
"pubdate": "2020-03-13T08:30:37.447Z",
"author": 3,
"author__realname": "关羽",
"title": "海量数据从 MySQL 到 Hbase 的同步",
"content": "海量数据从 MySQL 到 Hbase 的同步正文",
"thumbupcount": 0,
"status": 1
}
pubdate
为创建时间
author
为创建者的id
author__realname
为创建者的姓名
title
为论文的标题
content
为论文的内容,如果请求参数中withoutcontent值为true,则没有该字段
thumbupcount
为论文的点赞数量
status
为通知的状态。 正常发布状态:1, 撤回状态:2,封禁状态:3
列出所有状态论文
用来列出系统中 所有的
论文。 包括非发布状态的论文
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
GET /api/paper?action=listbypage_allstate&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage_allstate | 必填项 | 指定列出系统中 所有的 论文 |
pagenum | 2 | 必填项 | 指定获取第几页的信息 |
pagesize | 1 | 必填项 | 指定分页的 每页获取多少条记录 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词 |
响应
后端返回列出结果,响应消息格式与 只列出发布状态通知API的响应
格式一致
列出我的论文
用来列出系统中 我创建的
论文。 包括非发布状态的论文
发出该 API 只能是学生、老师账号。后端要根据session校验。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listminebypage | 必填项 | 指定列出系统中 所有我的 论文 |
pagenum | 2 | 必填项 | 指定获取第几页的信息 |
pagesize | 1 | 必填项 | 指定分页的 每页获取多少条记录 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词 |
响应
后端返回列出结果,响应消息格式与 列出发布状态通知API的响应
格式一致
查看一条论文
用来查看一条论文的内容。该API的格式 和 查看一条通知API
格式一致
添加论文
用来添加一条论文。
请求
- 请求头
- 消息体
要添加的账号的具体信息,格式如下
{
"action": "addone",
"data": {
"title": "海量数据从 MySQL 到 Hbase 的同步",
"content": "海量数据从 MySQL 到 Hbase 的同步正文"
}
}
其中
action
: 填写 addone, 表示 添加一条论文的操作
data
里面是论文的内容,其中:
title
: 论文的标题
content
: 论文的正文
响应
- 消息体
ret
为 0 表示添加成功
id
为添加论文的 id
修改论文
发出该 API 只能是该论文的作者。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
{
"action": "modifyone",
"id": 2,
"newdata": {
"title": "海量数据从 MySQL 到 Hbase 的同步",
"content": "海量数据从 MySQL 到 Hbase 的同步正文"
}
}
其中
action
: 填写 modifyone ,表示 修改一条论文的操作
id
: 要修改论文的 id
newdata
: 里面包含了要修改的信息,其中:
title
: 论文的标题修改为什么。如果此项不用修改,该字段不出现
content
: 论文的正文修改为什么。如果此项不用修改,该字段不出现
响应
- 消息体
ret
为 0 表示修改成功
撤回论文
用来撤回一条论文。撤回后的论文,对学生、老师、未登录账号不可见
发出该 API 只能是作者本人。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 holdone ,表示 撤回一条论文 的操作
id
: 要撤回论文的 id
响应
- 消息体
ret
为 0 表示撤回成功
status
为 现在的状态值
封禁论文
用来封禁一条论文。封禁后的论文,对学生、老师、未登录账号不可见
发出该 API 只能是管理员用户。后端要根据session校验。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 banone ,表示 封禁一条论文 的操作
id
: 要封禁论文的 id
响应
- 消息体
ret
为 0 表示封禁成功
status
为 现在的状态值
发布(解禁)论文
用来发布 被封禁、撤回的 一条论文。发布后的论文,对学生、老师、未登录账号恢复可见
发出该 API 只能是管理员用户 或者 论文作者。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 publishone ,表示 解禁一条论文 的操作
id
: 要解禁论文的 id
响应
- 消息体
ret
为 0 表示解禁成功
status
为 现在的状态值
删除论文
用来删除一条论文。
发出该 API 只能是管理员用户 或者 论文作者。
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 deleteone ,表示 删除 一个论文的操作
id
: 要删除论文的 id
响应
- 消息体
ret
为 0 表示删除成功
首页设置
该API接口用来获取、设置显示在网站首页的信息
首页信息 的API url路径均为 /api/config
设置首页展示信息
该API 只能是管理员用户使用,后端应该做权限检查
请求
- 请求头
- 消息体
{
"action": "set",
"name": "homepage",
"value": "{\"news\":[7,5,4],\"notice\":[5,2],\"paper\":[4,8]}"
}
其中
value
表示展示在首页的 新闻(news)、通知(notice)、论文(paper)id列表。
注意,这个值是 对象转化为json格式的字符串。
服务端只需要直接存储该字符串即可
响应
- 消息体
ret
为 0 表示设置成功
获取首页简单信息
管理员接口, 用来获取显示在网站首页的记录。
该接口主要要来确定那些通知、新闻、论文是已经显示首页了的,从而在界面上显示 加入首页
还是 移出首页
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | get | 必填项 | 指明获取设置信息 |
name | homepage | 必填项 | 指明获取的是首页设置信息 |
响应
服务端返回结果
- 消息体
ret
为 0 表示列出成功
value
表示展示在首页的 新闻(news)、通知(notice)、论文(paper)id列表。
注意,这个值是 对象转化为json格式的字符串,也就是set接口直接存入的内容。
获取首页详细内容
未登录用户、学生、老师 用来获取显示在网站首页的信息
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | gethomepagebyconfig | 必填项 | 指明获取网站首页的信息 |
响应
服务端返回结果
- 消息体
{
"ret": 0,
"info": {
"news": [
{
"id": 2,
"pubdate": "2020-03-08T14:30:39.413Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "玄武湖恢复开放首晚 市民表白“你可回来了!”",
"status": 1
},
{
"id": 4,
"pubdate": "2020-03-12T00:59:37.980Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "东南大学开展首场新冠肺炎防控实战演练",
"status": 1
}
],
"notice": [
{
"id": 5,
"pubdate": "2020-03-23T03:04:42.808Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "2020软件工程研究生招收规定",
"status": 1
},
{
"id": 1,
"pubdate": "2020-03-08T08:38:15.430Z",
"author": 1,
"author__realname": "白月黑羽",
"title": "公告2: 关于校园食堂的改革",
"status": 1
}
],
"paper": [
{
"id": 3,
"pubdate": "2020-03-07T09:48:03.546Z",
"author": 7,
"author__realname": "关羽",
"title": "线性代数中的向量和向量空间",
"status": 1
}
]
}
}
ret 为 0 表示列出成功
info 里面包含了首页的 新闻(news)、通知(notice)、论文(paper) 信息。
前端获取到该信息后,用来展示在界面上
个人信息
该API接口 用来获取、设置个人信息
获取个人信息
该 API 只能是老师、学生 使用,后端应该做权限检查
请求
- 请求头
响应
- 消息体
如果是老师账号,格式如下
如果是学生账号,格式如下
{
"ret": 0,
"profile": {
"userid": 7,
"username": "guanyu",
"usertype": 2000,
"realname": "关羽",
"teacher": {
"id": 8,
"realname": "曹操"
}
}
}
多了一个 teacher 信息,里面包含了这个学生对应老师 的 id 和 真实姓名
如果该学生,还没有设置老师,返回 内容如下
{
"ret": 0,
"profile": {
"userid": 7,
"username": "guanyu",
"usertype": 2000,
"realname": "关羽",
"teacher": {
"id": -1,
"realname": "尚未设置"
}
}
}
设置个人信息
该 API 只能是老师、学生 使用,后端应该做权限检查
请求
- 请求头
- 消息体
消息体中包含了修改后的 真实姓名、密码信息
如果是老师账号,格式如下
如果是学生账号,格式如下
多一个 teacherid,用来设置自己的老师。
注意:设置参数 realname、password、teacherid 都是可选的。如果没有修改就不携带
响应
- 消息体
如果设置成功,返回如下
列出所有老师
该API 用来让学生在界面上选择自己的老师。
一次列出最多返回30个结果,可以通过关键字过滤选择老师。
请求
- 请求头
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listteachers | 必填项 | 必须为 listteachers |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示用户姓名中包含的关键字。 多个关键字以空格隔开,表示姓名中同时包含的关键字词 |
响应
后端返回列出结果
- 消息体
{
"ret": 0,
"items": [
{
"id": 4,
"realname": "曹操"
},
{
"id": 5,
"realname": "孙权"
},
{
"id": 6,
"realname": "刘备"
},
],
"total": 3,
"keywords": ""
}
ret 为 0 表示列出成功
total 为 3 表示系统中(不是当前页)总共有3个账号
items 数组 里面包含了当前页中的账号信息。
点赞
该API接口 用来 让学生、老师账号 进行论文的点赞和取消点赞
请求
- 请求头
- 消息体
格式如下
其中
action
: 填写 thumbuporcancel ,表示 点赞或者取消点赞 一篇论文
id
: 论文id
响应
服务端检查该用户是否点赞过该论文,如果没有,点赞数量+1,如果已经点赞过,点赞数量-1
返回响应格式
- 消息体
ret
为 0 表示封禁成功
thumbupcount
为 该论文现在的点赞数量
毕业设计工作流
该API接口 用来 进行毕业设计发布流程 的处理。
毕业设计流程分为如下几个状态
- 开始
起始状态。学生可以提交毕业设计主题(进入主题已创建
状态)
- 主题已创建
此状态下,创建工作流的学生的老师可以批准该主题(进入 主题已通过
状态),也可以驳回主题(进入 主题被驳回
状态)
- 主题被驳回
此状态下,创建工作流的学生,可以修改主题,再次提交(进入主题已创建
状态)
- 主题已通过
此状态下,创建工作流的学生,可以提交毕业设计内容(进入学生已提交毕业设计
状态)
- 学生已提交毕业设计
此状态下,创建工作流的学生的老师可以评分结束流程(进入 已评分
状态),也可以打回重做(进入 主题已通过
状态)
- 评分结束
此状态下,流程已经结束,没有后续操作
毕业设计工作流 的API url路径均为 /api/wf_graduatedesign
。
列出
用来列出系统中的我可以看到的毕设工作流记录。
请求
- 请求头
GET /api/wf_graduatedesign?action=listbypage&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
- url参数
参数名 | 示例 | 必要性 | 含义 |
---|---|---|---|
action | listbypage | 必填项 | 必须为 listbypage |
pagesize | 1 | 必填项 | 分页的 每页获取多少条记录 |
pagenum | 2 | 必填项 | 获取第几页的信息 |
keywords | 白月 黑 | 可选项 | 搜索关键字,如果提供,表示工作流标题中包含的关键字。 多个关键字以空格隔开,表示工作流标题中同时包含的关键字词 |
响应
后端返回列出结果
- 消息体
{
"ret": 0,
"items": [
{
"id": 15,
"creator": 6,
"creator__realname": "张飞",
"title": "在线教育系统开发",
"currentstate": "主题被驳回",
"createdate": "2020-03-26T04:10:25.968Z"
},
{
"id": 12,
"creator": 6,
"creator__realname": "张飞",
"title": "在线教育系统的性能测试",
"currentstate": "结束",
"createdate": "2020-03-21T11:35:00.871Z"
}
],
"total": 2,
"keywords": ""
}
ret 为 0 表示列出成功
total 总共有2条工作流记录
items 数组 里面包含了当前页中的工作流记录。
每条记录以如下格式存储
{
"id": 12,
"creator": 6,
"creator__realname": "张飞",
"title": "在线教育系统的性能测试",
"currentstate": "结束",
"createdate": "2020-03-21T11:35:00.871Z"
}
其中:
title
是 毕设工作流流的 标题
currentstate
是该工作流的当前状态
获取一个工作流信息
请求
- 请求头
GET /api/wf_graduatedesign?action=getone&wf_id=15&withwhatcanido=true
Cookie: sessionid=<sessionid数值>
其中 withwhatcanido=true
参数指明了 同时要返回 当前我可以 对这个工作流 进行的操作
id参数为对应的工作流id
响应
- 消息体
{
"ret": 0,
"rec": {
"id": 15,
"creatorname": "张飞",
"title": "前后端分离的在线教育系统设计",
"currentstate": "主题已创建",
"createdate": "2020-03-26T04:10:25.968Z",
"steps": [
{
"id": 21,
"operator__realname": "张飞",
"actiondate": "2020-03-26T04:10:25.970Z",
"actionname": "创建主题",
"nextstate": "主题已创建"
},
{
"id": 22,
"operator__realname": "曹操2",
"actiondate": "2020-03-26T04:14:29.986Z",
"actionname": "驳回主题",
"nextstate": "主题被驳回"
},
{
"id": 23,
"operator__realname": "张飞",
"actiondate": "2020-03-26T06:52:02.155Z",
"actionname": "修改主题",
"nextstate": "主题已创建"
}
]
},
"whaticando": [
{
"name": "驳回主题",
"submitdata": [
{
"name": "驳回原因",
"type": "textarea",
"check_string_len": [
0,
10000
]
}
],
"whocan": 4,
"next": "主题被驳回",
"key": "reject_topic"
},
{
"name": "批准主题",
"submitdata": [
{
"name": "备注",
"type": "richtext",
"check_string_len": [
0,
10000
]
}
],
"whocan": 4,
"next": "主题已通过",
"key": "approve_topic"
}
]
}
其中:
rec 里面记录了工作流的信息,包括
id: 工作流的id,
creatorname: 工作流的创建者姓名,
title: 毕业设计的标题,
currentstate: 工作流的当前状态,
createdate: 工作流的创建时间,
steps: 工作流的步骤
里面的依次列出每个步骤的id,操作者名字,操作时间,操作名称、操作完进入什么状态
如果请求要获取的工作流的id为-1,表示要创建一个新工作流记录,应该返回如下
{
"ret": 0,
"rec": {
"id": -1,
"creatorname": "",
"title": "",
"currentstate": "",
"createdate": ""
},
"whaticando": [
{
"name": "创建主题",
"submitdata": [
{
"name": "毕业设计标题",
"type": "text",
"check_string_len": [
1,
50
]
},
{
"name": "主题描述",
"type": "richtext",
"check_string_len": [
10,
10000
]
}
],
"whocan": 1,
"next": "主题已创建",
"key": "create_topic"
}
]
}
whaticando 里面是当前状态下,我可以进行的操作,每个可行操作的格式如下
{
"name": "驳回主题",
"submitdata": [
{
"name": "驳回原因",
"type": "textarea",
"check_string_len": [
0,
10000
]
}
],
"whocan": 4,
"next": "主题被驳回",
"key": "reject_topic"
}
name 为操作名
key 为执行该操作,对应的 api 中 key字段的名称
submitdata 为该操作需要提交的参数数据,其中
name 是参数名
type 是参数类型,目前有4种
int: 整数,
text: 单行文本
textarea : 多行文本
richtext: 多行富文本,内容可以包含图片等
另外还可能有检查机制,目前主要有
check_int_range: 检查输入整数范围
check_string_len: 检查字符串长度范围
每个状态下,可以进行的操作,这里没有一一记录。请大家运行下载包,F12浏览器查看消息记录,根据实际的接口消息,编写后端代码。
执行一个工作流操作步骤
请求
- 消息体
{
"action": "stepaction",
"key": "approve_topic",
"wf_id": 15,
"submitdata": [
{
"name": "备注",
"type": "richtext",
"value": "批准啦"
}
]
}
其中:
action
固定为stepaction
key
为操作名
wf_id
为操作的工作流id
submitdata
为提交的操作数据
响应
服务端,应该对该操作进行鉴权,如果通过,存储操作数据到数据库中,并且返回响应。
注意,每个操作,服务端需要存储起来,并为其分配一个单独的id,对应这个操作,方便前端将来查询这个操作的具体submitdata数据信息。
- 消息体
获取一个工作流操作步骤信息
大家可以发现,获取一个工作流信息时,里面的每个步骤并不包含submitdata。
因为 submitdata数据量可能很大。
当使用者要查看一个操作的具体 submitdata 数据的时候,前端发出此API请求获取该操作的 submitdata。
请求
- 请求头
其中 step_id 参数为操作步骤id
响应
- 消息体
格式示例如下:
其中 data里面存储了该操作步骤的 submitdata数据。