USTC Software 2020 Backend Test

DDL:2020/6/30

背景

学校的选课系统太慢了,我们希望能够使用 Django 重写一个能稍微快一点的选课系统。

这次我们要实现一个大幅精简的选课系统。

要求

你需要:

  1. Fork 此仓库至你的账号。
  2. 使用 Django,完成如下所述的功能。
  3. 在本文件末尾为前端组的同学撰写一份说明文档,使他们了解你的应用的接口等信息。
  4. 发起 Pull Request。(请在 PR 时写上你的姓名、学号)

约定

  1. 使用 Python 3.6+ 与 Django 3。
    1. Django 3 相对于 2 发生了一些变化,为了避免出现意外情况,请以 Django 3 完成后续的任务与接下来的开发。
    2. 考虑到 Ubuntu 20.04 已经将 Python 3.8 作为默认 Python 版本,我们不会强制要求使用 Python 3.6,并在部署时将采用 Python 3.8。
  2. 使用默认的数据库(SQLite)、默认的 HTTP 服务器和默认的端口。
  3. 不需要使用 template,不需要编写 HTML 文件。所有接口的返回内容为 JSON。

目标功能

必须完成的功能

用户账户相关

  • 注册与登录账户 x
  • 退出账户 x

系统相关

  • 列出所有课程 x
  • 用户根据课程的pk选中课程 x
  • 列出用户选中的课程 x
  • 退课 x

可以选做的功能

用户相关

系统相关

  • 根据年级分类课程 x
  • 返回给用户的结果中只展示符合用户年级的课程
  • 添加前置课程,并在结果中返回相对应的前置课程 x
  • 更新用户是否学过某个课程 x

前置课程即为用户想要选中某个课程,必须要先选中的课程,例如数分A2需要先学数分A1。注意避免循环引用。

补充说明

对于添加年级属性,一种方法是创建一个新的 Model,并与 User 绑定 One-to-one 关系(参考 OneToOneField),在这个 Model 中添加需要的属性。

还有一种方法是,从 AbstractUser 继承一个新的 User Model,并在新的 User Model 中添加需要的属性(参考Substituting a custom User model)。

对于第二种方法,在其他地方引用User时,需要通过 django.contrib.auth.get_user_model (参考 Referencing the User model 得到新的 User Model,或者直接从相应的文件中导入新的 Model。

加分项

这些加分项都是值得提倡的良好的开发习惯,因此我们将它们作为加分项。

  • 良好的代码风格(如变量命名)会有额外加分
  • 良好的注释和文档会有额外加分
  • 良好的 Git 提交记录(每次提交有明确的信息)会有额外加分
  • 良好的安全性、鲁棒性和可扩展性会有额外加分
  • 良好的单元测试有额外加分

其它注意事项和提醒

  • 对于以上提到的各项功能,最基础的要求是:用户输入正确的请求时,程序可以给出正确的回复。同时,对于用户发起的错误的请求,程序不会受到灾难性的破坏,不会影响其它用户的正常使用(例如,在注册账户时把已有的账户「覆盖」掉是不容许的)。

  • 你可以选择将这些功能做得更完善和更安全,具体内容和方式请自行决定,例如检查输入并返回有意义的错误信息等。

  • 你可以参考去年的后端测试题,但请注意,不要抄袭其他人的代码,如果某段代码对你编写有帮助,请在注释中写明来源。

  • 允许使用任意 PyPI 中的模块,即可以使用 pip 命令安装的模块。请在 requirements.txt 中添加需要的模块。

  • 我们最终的代码会在 Linux 下执行,所以如果你在使用其它操作系统开发,请谨慎使用依赖于特定操作系统的特性。(但这里应该不会出现这种情况)

报告(需要完成)

请将你为前端组的同学撰写的报告放在这里。

后面有一个示例

登陆

URL

account/login

要求未登陆使用

POST

请求参数
key description
username 用户名
password 密码
响应参数
status description
200 成功登陆
400 参数缺失
401 用户名不符合要求
405 已经登陆
407 用户名或者密码错误
key description
msg 状态码相关解释

注册

URL

account/register

要求未登陆使用

POST

请求参数
key description
username 用户名
password 密码
grade 年级
响应参数
status description
200 成功登陆
400 参数缺失
401 用户名不符合要求
402 密码不符合要求
403 年级不符合要求
405 已经登陆
407 用户名或者密码错误
key description
msg 状态码相关解释

登出

URL

account/logout

要求登陆后使用

POST

请求参数

响应参数
status description
200 成功登陆
406 已经登陆
407 用户名或者密码错误
key description
msg 状态码相关解释

修改密码

URL

account/changePassword

要求登陆后使用

POST

请求参数
key description
oldPassowrd 用户名
newPassword 密码
响应参数
status description
200 成功修改密码
400 参数缺失
404 新旧密码相同
406 尚未登陆
408 新密码不符合要求
409 旧密码错误
key description
msg 状态码相关解释

设置年级

URL

account/setGrade

要求登陆后使用

POST

请求参数
key description
grade 年级
响应参数
status description
200 成功登陆
400 参数缺失
403 年级不符合要求
406 尚未登陆
key description
msg 状态码相关解释

查看当前用户选课结果

URL

course/result

要求登陆后使用

GET

请求参数
key description
gradeFilter 是否只展示符合用户年级的课程(默认缺省)
参数含义
gradeFilter
value description
1 只展示要求年级等于用户年级的课程
其他或缺省 忽略该过滤器
注意:若启用该开关,则需要先登陆,否则会返回406
响应参数
status description
200 成功查询
406 尚未登陆
key description
msg 状态码相关解释
total 查询到的课程数目
course 查询到的课程列表
course
key description
pk 课程唯一编号
course 课程名称
haveLearnt 是否已经学习

更新学习进度

URL

course/setLearnStatus

要求登陆

GET

请求参数
key description
pk 要学习的课程编号
响应参数
status description
200 成功更新进度
400 参数缺失
406 尚未登陆
410 尚未选中这门课
413 已经学习过这门课
key description
msg 状态码相关解释

选课

URL

course/choose

需要登陆

GET

请求参数
key description
pk 要选择的课程编号
响应参数
status description
200 成功选课
400 参数缺失
411 已经选过这门课
414 课程不存在,pk错误
415 课程要求的年级高于用户年级
416 前置课程未学习
key description
msg 状态码相关解释
total 状态码为416时,返回还未满足的前置课程数目
requiredPk 状态码为416时,返回还需要学习前置课程列表
requiredPk
key description
pk 需要学习的前置课程编号

退课

URL

course/exitCourse

要求登陆

GET

请求参数
key description
pk 要退的课程编号
响应参数
status description
200 成功退课
400 参数缺失
406 尚未登陆
410 未选择这门课
413 已经学完,不能退课
key description
msg 状态码相关解释

课程列表(可按年级分类,可只展示显示用户年级课程)

URL

course/list

不要求登陆

GET

请求参数
key description
gradeFilter 是否只展示符合用户年级的课程(默认缺省,需要登陆后使用)
grade 展示特定年级的课程(默认缺省)
含义
gradeFilter
value desctiption
1 只展示要求年级等于用户年级的课程
其他或缺省 忽略该过滤器
注意:若启用该开关,则需要先登陆,否则会返回406
响应参数
status description
200 成功查询
406 尚未登陆
403 年级不符合要求
key description
msg 状态码相关解释
total 查询到的课程数目
course 查询到的课程列表
course
key description
pk 课程唯一编号
course 课程名称

查看前置课程(可只展示符合用户年级的结果)

URL

course/prefix

不需要登陆

GET

请求参数
key description
pk 查询的课程编号
gradeFilter 是否只展示符合用户年级的课程(默认缺省,需要登陆后使用)
含义
gradeFilter
value desctiption
1 只展示要求年级等于用户年级的课程
其他或缺省 忽略该过滤器
注意:若启用该开关,则需要先登陆,否则会返回406
响应参数
status description
200 成功查询
400 参数缺失
406 尚未登陆
414 课程不存在,pk错误
key description
msg 状态码相关解释
total 查询到的课程数目
course 查询到的课程列表
course
key description
pk 课程唯一编号
course 课程名称

查询课程学习状态

GET

course/haveLearntCourse

需要登陆

GET

请求参数
key description
pk 课程唯一编码
响应参数
status description
200 成功查询
400 参数缺失
406 尚未登陆
410 尚未选择这门课
key description
msg 状态码相关解释
haveLearnt 是否已经学习过这门课