跳转至

CIMP系统项目实战

前面的课程学完后,我们现在就开发一个web系统,巩固锻炼一下。

点击这里,边看视频讲解,边学习以下内容

系统功能介绍

CIMP系统,中文全称:校园信息管理平台。

CIMP 实现校园 学生老师账号、通知公告、校园新闻动态、学生老师论文、学生毕业设计等数据的发布和管理。

其中内置了一个工作流系统,实现毕业设计项目的申请、审批、提交、评分功能。


具体功能描述,参见视频讲解

下载运行

百度云盘

链接:https://pan.baidu.com/s/19zJzs6ysqNIzUUuSfur6pA

提取码:rofe

下载zip包后,解压即可。

注意: CIMP 存放的路径上 一定不能有中文 ,否则前端模块启动不了(这是Nginx的问题)


进入到目录中,分别运行 启动前端.bat , 启动后端.bat

首次运行时,会有防火墙提示,选择允许即可。

浏览器输入网址 http://127.0.0.1,点击右上角登录,系统里面创建了系统管理员账号 byhy , 密码 111111

系统采用前后分离的模式进行开发,后端系统缺省服务端口号为 8210。

具体操作,参见视频讲解。

其架构图如下

image


接口概述

本接口是校园信息管理平台 (CIMP) 前端 和 后端子系统之间的接口。

所有的HTTP请求响应消息,如果有消息体,一律为json格式。

所有的API响应消息,如果操作不成功,返回消息体格式如下

{
    "ret": 1,    
    "msg":  "用户名或者密码错误"
}

ret 不为 0 表示操作失败, msg字段描述 API 操作失败的原因


登录

3种类型的账号:管理员、老师、学生, 均使用该接口进行登录。

前端发送的登录请求中包含账号、密码。

后端接收后,对账号密码的正确性进行校验。

CIMP系统使用session会话机制。

如果校验通过,服务端在响应消息头Set-Cookie 中存入sessionid ,该用户的后续请求头Cookie中必须携带sessionid。

请求

  • 请求头
POST /api/sign
Content-Type: application/json
  • 消息体

为json格式

{
    "action" : "signin",
    "username" : "xxxx",
    "password" : "yyyy"
}

响应

  • 响应头
200 OK
Content-Type: application/json
Set-Cookie: sessionid=<sessionid数值>
  • 消息体

如果校验通过,返回消息如下

{
    "ret": 0,
    "usertype":1,
    "userid":1,
    "realname":"白月黑羽",
}

ret 为 0 表示登录成功

usertype 是用户类型。 1:管理员,2000:学生,3000:老师

userid 是用户在系统中的id

realname 是用户的姓名

登录成功后, 服务端在消息头Set-Cookie 中存入sessionid ,该用户的后续请求头Cookie中必须携带sessionid。

如果登录校验失败,返回失败的原因,示例如下

{
    "ret": 1,    
    "msg":  "用户名或者密码错误"
}

ret 不为 0 表示登录失败, msg字段描述登录失败的原因

登出

请求

  • 请求头
POST /api/sign
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

为json格式

{
    "action" : "signout"
}

响应

后端应该根据sessionid清除掉session,然后返回响应消息

  • 响应头
200 OK
Content-Type: application/json
Set-Cookie: sessionid=""
  • 消息体
{
    "ret": 0
}

账号管理

该API接口 用来 列出、添加、修改、删除系统中的账号。

发出账号管理的API 只能是管理员用户。后端要根据session校验。

账号管理的API 路径均为 /api/account

列出账号

用来列出系统中的账号信息。

请求

  • 请求头
GET /api/account?action=listbypage&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
  • 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 数组 里面包含了当前页中的账号信息。

每个账号信息以如下格式存储

    {
      "id": 1,
      "username": "byhy",
      "realname": "白月黑羽",
      "studentno": null,
      "desc": null,
      "usertype": 1
    }

studentno 表示学号,非学生为null

usertype 表示 账号类型,取值前面已经说过

添加账号

用来添加系统中的账号信息。

请求

  • 请求头
POST /api/account
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

要添加的账号的具体信息,格式如下

{
  "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": 5
}

ret 为 0 表示添加成功

id 为添加账号的 id

修改账号

用来修改系统中的账号信息。

请求

  • 请求头
PUT /api/account
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

要修改的账号的具体信息,格式如下

{
  "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
}

ret 为 0 表示修改成功

删除账号

用来删除系统中的账号信息。

请求

  • 请求头
DELETE /api/account
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "deleteone",
  "id": 10
}

其中

action: 填写 deleteone ,表示 删除 一个账号的操作

id: 要删除账号的 id

响应

  • 消息体
{
  "ret": 0
}

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": "/upload/1_20200324085106_486799.png"
}

ret 为 0 表示设置成功 url 为 上传后图片文件在服务端的访问地址

为了保证产生唯一的文件url,存储文件时,需要重新命名。

推荐的格式为 {userid}_{timestamp}_{randomstring}.{filetype}

通知管理

该API接口 用来 列出、添加、删除、封禁、发布 系统中的通知。

通知管理的API 路径均为 /api/notice

该接口只能由管理员账号使用。

列出发布状态通知

用来列出系统中处于发布状态的通知。

请求

  • 请求头
GET /api/notice?action=listbypage&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
  • 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的响应 格式一致

查看一条通知

用来查看一条通知的内容。

请求

  • 请求头
GET /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 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校验。

请求

  • 请求头
POST /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

要添加的账号的具体信息,格式如下

{
  "action": "addone",
  "data": {
    "title": "2020软件工程研究生招收规定",
    "content": "规定内容详情如下"
  }
}

其中

action: 填写 addone, 表示 添加一条通知的操作

data 里面是通知的内容,其中:

title: 通知的标题

content: 通知的正文

响应

  • 消息体
{
  "ret": 0,
  "id": 5
}

ret 为 0 表示添加成功

id 为添加通知的 id

修改通知

发出该 API 只能是管理员用户。后端要根据session校验。

请求

  • 请求头
PUT /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "modifyone",
  "id": 2,
  "newdata": {
    "title": "给大一新学生的一封信",
    "content": "信的内容如下"
  }
}

其中

action: 填写 modifyone ,表示 修改一条通知的操作

id: 要修改通知的 id

newdata : 里面包含了要修改的信息,其中:

title: 通知的标题修改为什么。如果此项不用修改,该字段不出现

content: 通知的正文修改为什么。如果此项不用修改,该字段不出现

响应

  • 消息体
{
  "ret": 0
}

ret 为 0 表示修改成功

封禁通知

用来封禁一条通知。封禁后的通知,对学生、老师、未登录账号不可见

发出该 API 只能是管理员用户。后端要根据session校验。

请求

  • 请求头
PUT /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "banone",
  "id": 10
}

其中

action: 填写 banone ,表示 封禁一条通知 的操作

id: 要封禁通知的 id

响应

  • 消息体
{
  "ret": 0,
  "status": 3
}

ret 为 0 表示封禁成功 status 为 现在的状态值

发布(解禁)通知

用例发布被封禁一条通知。发布后的通知,对学生、老师、未登录账号恢复可见

发出该 API 只能是管理员用户。后端要根据session校验。

请求

  • 请求头
PUT /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "publishone",
  "id": 10
}

其中

action: 填写 publishone ,表示 解禁一条通知 的操作

id: 要解禁通知的 id

响应

  • 消息体
{
  "ret": 0,
  "status": 1
}

ret 为 0 表示解禁成功 status 为 现在的状态值

删除通知

用来删除一条通知。

发出该 API 只能是管理员用户。后端要根据session校验。

请求

  • 请求头
DELETE /api/notice
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "deleteone",
  "id": 10
}

其中

action: 填写 deleteone ,表示 删除 一个通知的操作

id: 要删除通知的 id

响应

  • 消息体
{
  "ret": 0
}

ret 为 0 表示删除成功


新闻管理

该API接口 用来 列出、添加、删除、封禁、发布 系统中的新闻。

新闻管理的API url路径均为 /api/news

除了API url路径, 新闻管理 API的规则 和 通知管理 完全一样。

该接口只能由管理员账号使用。


论文管理

该API接口 用来 列出、添加、删除、封禁、发布、撤回系统中的论文。

论文的属性类似 通知和新闻。

但是论文通常是由学生或者老师账号创建的。而通知、新闻是由管理员创建的。

论文可以被点赞。

论文管理的API url路径均为 /api/paper

论文

列出发布状态论文

用来列出系统中 发布状态 的论文。

请求

  • 请求头
GET /api/paper?action=listbypage&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
  • 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校验。

请求

  • 请求头
GET /api/paper?action=listminebypage&pagenum=1&pagesize=5&keywords=
Cookie: sessionid=<sessionid数值>
  • url参数
参数名 示例 必要性 含义
action listminebypage 必填项 指定列出系统中 所有我的 论文
pagenum 2 必填项 指定获取第几页的信息
pagesize 1 必填项 指定分页的 每页获取多少条记录
keywords 白月 黑 可选项 搜索关键字,如果提供,表示标题中包含的关键字。 多个关键字以空格隔开,表示标题中同时包含的关键字词

响应

后端返回列出结果,响应消息格式与 列出发布状态通知API的响应 格式一致

查看一条论文

用来查看一条论文的内容。该API的格式 和 查看一条通知API 格式一致

添加论文

用来添加一条论文。

请求

  • 请求头
POST /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

要添加的账号的具体信息,格式如下

{
  "action": "addone",
  "data": {
    "title": "海量数据从 MySQL 到 Hbase 的同步",
    "content": "海量数据从 MySQL 到 Hbase 的同步正文"
  }
}

其中

action: 填写 addone, 表示 添加一条论文的操作

data 里面是论文的内容,其中:

title: 论文的标题

content: 论文的正文

响应

  • 消息体
{
  "ret": 0,
  "id": 5
}

ret 为 0 表示添加成功

id 为添加论文的 id

修改论文

发出该 API 只能是该论文的作者。后端要根据session校验。

请求

  • 请求头
PUT /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "modifyone",
  "id": 2,
  "newdata": {
    "title": "海量数据从 MySQL 到 Hbase 的同步",
    "content": "海量数据从 MySQL 到 Hbase 的同步正文"
  }
}

其中

action: 填写 modifyone ,表示 修改一条论文的操作

id: 要修改论文的 id

newdata : 里面包含了要修改的信息,其中:

title: 论文的标题修改为什么。如果此项不用修改,该字段不出现

content: 论文的正文修改为什么。如果此项不用修改,该字段不出现

响应

  • 消息体
{
  "ret": 0
}

ret 为 0 表示修改成功

撤回论文

用来撤回一条论文。撤回后的论文,对学生、老师、未登录账号不可见

发出该 API 只能是作者本人。后端要根据session校验。

请求

  • 请求头
PUT /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "holdone",
  "id": 10
}

其中

action: 填写 holdone ,表示 撤回一条论文 的操作

id: 要撤回论文的 id

响应

  • 消息体
{
  "ret": 0,
  "status": 2
}

ret 为 0 表示撤回成功 status 为 现在的状态值

封禁论文

用来封禁一条论文。封禁后的论文,对学生、老师、未登录账号不可见

发出该 API 只能是管理员用户。后端要根据session校验。

请求

  • 请求头
PUT /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "banone",
  "id": 10
}

其中

action: 填写 banone ,表示 封禁一条论文 的操作

id: 要封禁论文的 id

响应

  • 消息体
{
  "ret": 0,
  "status": 3
}

ret 为 0 表示封禁成功 status 为 现在的状态值

发布(解禁)论文

用来发布 被封禁、撤回的 一条论文。发布后的论文,对学生、老师、未登录账号恢复可见

发出该 API 只能是管理员用户 或者 论文作者。

请求

  • 请求头
PUT /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "publishone",
  "id": 10
}

其中

action: 填写 publishone ,表示 解禁一条论文 的操作

id: 要解禁论文的 id

响应

  • 消息体
{
  "ret": 0,
  "status": 1
}

ret 为 0 表示解禁成功 status 为 现在的状态值

删除论文

用来删除一条论文。

发出该 API 只能是管理员用户 或者 论文作者。

请求

  • 请求头
DELETE /api/paper
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "deleteone",
  "id": 10
}

其中

action: 填写 deleteone ,表示 删除 一个论文的操作

id: 要删除论文的 id

响应

  • 消息体
{
  "ret": 0
}

ret 为 0 表示删除成功

首页设置

该API接口用来获取、设置显示在网站首页的信息

首页信息 的API url路径均为 /api/config

设置首页展示信息

该API 只能是管理员用户使用,后端应该做权限检查

请求

  • 请求头
POST /api/config
Cookie: sessionid=<sessionid数值>
  • 消息体
{
  "action": "set",
  "name": "homepage",
  "value": "{\"news\":[7,5,4],\"notice\":[5,2],\"paper\":[4,8]}"
}

其中

value 表示展示在首页的 新闻(news)、通知(notice)、论文(paper)id列表。

注意,这个值是 对象转化为json格式的字符串。

服务端只需要直接存储该字符串即可

响应

  • 消息体
{
  "ret": 0
}

ret 为 0 表示设置成功

获取首页简单信息

管理员接口, 用来获取显示在网站首页的记录。

该接口主要要来确定那些通知、新闻、论文是已经显示首页了的,从而在界面上显示 加入首页 还是 移出首页

请求

  • 请求头
GET /api/config?action=get&name=homepage
Cookie: sessionid=<sessionid数值>
  • url参数
参数名 示例 必要性 含义
action get 必填项 指明获取设置信息
name homepage 必填项 指明获取的是首页设置信息

响应

服务端返回结果

  • 消息体
{
  "ret": 0,
  "value": "{"news":[4,7,6,3,5],"notice":[7,1,3,5,2],"paper":[5,9,10,4,8]}"
}

ret 为 0 表示列出成功

value 表示展示在首页的 新闻(news)、通知(notice)、论文(paper)id列表。

注意,这个值是 对象转化为json格式的字符串,也就是set接口直接存入的内容。

获取首页详细内容

未登录用户、学生、老师 用来获取显示在网站首页的信息

请求

  • 请求头
GET /api/config?action=gethomepagebyconfig
Cookie: sessionid=<sessionid数值>
  • 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 只能是老师、学生 使用,后端应该做权限检查

请求

  • 请求头
GET /api/etc?action=getmyprofile
Cookie: sessionid=<sessionid数值>

响应

  • 消息体

如果是老师账号,格式如下

{
  "ret": 0,
  "profile": {
    "userid": 8,
    "username": "caocao",
    "usertype": 3000,
    "realname": "曹操"
  }
}


如果是学生账号,格式如下

{
  "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 只能是老师、学生 使用,后端应该做权限检查

请求

  • 请求头
POST /api/etc?action=setmyprofile
Cookie: sessionid=<sessionid数值>
  • 消息体

消息体中包含了修改后的 真实姓名、密码信息

如果是老师账号,格式如下

{
  "action": "setmyprofile",
  "newdata": {
    "realname": "曹操",
    "password": "111111"
  }
}


如果是学生账号,格式如下

{
  "action": "setmyprofile",
  "newdata": {
    "realname": "关羽",
    "password": "111111",
    "teacherid": 9
  }
}

多一个 teacherid,用来设置自己的老师。


注意:设置参数 realname、password、teacherid 都是可选的。如果没有修改就不携带

响应

  • 消息体

如果设置成功,返回如下

{
  "ret": 0
}

列出所有老师

该API 用来让学生在界面上选择自己的老师。

一次列出最多返回30个结果,可以通过关键字过滤选择老师。

请求

  • 请求头
GET /api/etc?action=listteachers&keywords=
Cookie: sessionid=<sessionid数值>
  • 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接口 用来 让学生、老师账号 进行论文的点赞和取消点赞

请求

  • 请求头
PUT /api/etc
Cookie: sessionid=<sessionid数值>
Content-Type: application/json
  • 消息体

格式如下

{
  "action": "thumbuporcancel",
  "paperid": 3
}

其中

action: 填写 thumbuporcancel ,表示 点赞或者取消点赞 一篇论文

id: 论文id

响应

服务端检查该用户是否点赞过该论文,如果没有,点赞数量+1,如果已经点赞过,点赞数量-1

返回响应格式

  • 消息体
{
  "ret": 0,
  "thumbupcount": 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数据信息。

  • 消息体
{"ret": 0, "wf_id": 15}

获取一个工作流操作步骤信息

大家可以发现,获取一个工作流信息时,里面的每个步骤并不包含submitdata。

因为 submitdata数据量可能很大。

当使用者要查看一个操作的具体 submitdata 数据的时候,前端发出此API请求获取该操作的 submitdata。

请求

  • 请求头
GET /api/wf_graduatedesign?action=getstepactiondata&step_id=24
Cookie: sessionid=<sessionid数值>

其中 step_id 参数为操作步骤id

响应

  • 消息体

格式示例如下:

{
  "ret": 0,
  "data": [
    {
      "name": "备注",
      "type": "richtext",
      "value": "批准啦"
    }
  ]
}

其中 data里面存储了该操作步骤的 submitdata数据。