USTC Software 2020 Backend Test
DDL:2020/6/30
学校的选课系统太慢了,我们希望能够使用 Django 重写一个能稍微快一点的选课系统。
这次我们要实现一个大幅精简的选课系统。
你需要:
- Fork 此仓库至你的账号。
- 使用 Django,完成如下所述的功能。
- 在本文件末尾为前端组的同学撰写一份说明文档,使他们了解你的应用的接口等信息。
- 发起 Pull Request。(请在 PR 时写上你的姓名、学号)
- 使用 Python 3.6+ 与 Django 3。
- Django 3 相对于 2 发生了一些变化,为了避免出现意外情况,请以 Django 3 完成后续的任务与接下来的开发。
- 考虑到 Ubuntu 20.04 已经将 Python 3.8 作为默认 Python 版本,我们不会强制要求使用 Python 3.6,并在部署时将采用 Python 3.8。
- 使用默认的数据库(SQLite)、默认的 HTTP 服务器和默认的端口。
- 不需要使用 template,不需要编写 HTML 文件。所有接口的返回内容为 JSON。
- 列出所有课程 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 下执行,所以如果你在使用其它操作系统开发,请谨慎使用依赖于特定操作系统的特性。(但这里应该不会出现这种情况)
请将你为前端组的同学撰写的报告放在这里。
后面有一个示例
account/login
key |
description |
username |
用户名 |
password |
密码 |
status |
description |
200 |
成功登陆 |
400 |
参数缺失 |
401 |
用户名不符合要求 |
405 |
已经登陆 |
407 |
用户名或者密码错误 |
key |
description |
msg |
状态码相关解释 |
account/register
key |
description |
username |
用户名 |
password |
密码 |
grade |
年级 |
status |
description |
200 |
成功登陆 |
400 |
参数缺失 |
401 |
用户名不符合要求 |
402 |
密码不符合要求 |
403 |
年级不符合要求 |
405 |
已经登陆 |
407 |
用户名或者密码错误 |
key |
description |
msg |
状态码相关解释 |
account/logout
无
status |
description |
200 |
成功登陆 |
406 |
已经登陆 |
407 |
用户名或者密码错误 |
key |
description |
msg |
状态码相关解释 |
account/changePassword
key |
description |
oldPassowrd |
用户名 |
newPassword |
密码 |
status |
description |
200 |
成功修改密码 |
400 |
参数缺失 |
404 |
新旧密码相同 |
406 |
尚未登陆 |
408 |
新密码不符合要求 |
409 |
旧密码错误 |
key |
description |
msg |
状态码相关解释 |
account/setGrade
status |
description |
200 |
成功登陆 |
400 |
参数缺失 |
403 |
年级不符合要求 |
406 |
尚未登陆 |
key |
description |
msg |
状态码相关解释 |
course/result
key |
description |
gradeFilter |
是否只展示符合用户年级的课程(默认缺省) |
value |
description |
1 |
只展示要求年级等于用户年级的课程 |
其他或缺省 |
忽略该过滤器 |
注意:若启用该开关,则需要先登陆,否则会返回406
status |
description |
200 |
成功查询 |
406 |
尚未登陆 |
key |
description |
msg |
状态码相关解释 |
total |
查询到的课程数目 |
course |
查询到的课程列表 |
key |
description |
pk |
课程唯一编号 |
course |
课程名称 |
haveLearnt |
是否已经学习 |
course/setLearnStatus
key |
description |
pk |
要学习的课程编号 |
status |
description |
200 |
成功更新进度 |
400 |
参数缺失 |
406 |
尚未登陆 |
410 |
尚未选中这门课 |
413 |
已经学习过这门课 |
key |
description |
msg |
状态码相关解释 |
course/choose
key |
description |
pk |
要选择的课程编号 |
status |
description |
200 |
成功选课 |
400 |
参数缺失 |
411 |
已经选过这门课 |
414 |
课程不存在,pk错误 |
415 |
课程要求的年级高于用户年级 |
416 |
前置课程未学习 |
key |
description |
msg |
状态码相关解释 |
total |
状态码为416时,返回还未满足的前置课程数目 |
requiredPk |
状态码为416时,返回还需要学习前置课程列表 |
key |
description |
pk |
需要学习的前置课程编号 |
course/exitCourse
key |
description |
pk |
要退的课程编号 |
status |
description |
200 |
成功退课 |
400 |
参数缺失 |
406 |
尚未登陆 |
410 |
未选择这门课 |
413 |
已经学完,不能退课 |
key |
description |
msg |
状态码相关解释 |
课程列表(可按年级分类,可只展示显示用户年级课程)
course/list
key |
description |
gradeFilter |
是否只展示符合用户年级的课程(默认缺省,需要登陆后使用) |
grade |
展示特定年级的课程(默认缺省) |
value |
desctiption |
1 |
只展示要求年级等于用户年级的课程 |
其他或缺省 |
忽略该过滤器 |
注意:若启用该开关,则需要先登陆,否则会返回406
status |
description |
200 |
成功查询 |
406 |
尚未登陆 |
403 |
年级不符合要求 |
key |
description |
msg |
状态码相关解释 |
total |
查询到的课程数目 |
course |
查询到的课程列表 |
key |
description |
pk |
课程唯一编号 |
course |
课程名称 |
course/prefix
key |
description |
pk |
查询的课程编号 |
gradeFilter |
是否只展示符合用户年级的课程(默认缺省,需要登陆后使用) |
value |
desctiption |
1 |
只展示要求年级等于用户年级的课程 |
其他或缺省 |
忽略该过滤器 |
注意:若启用该开关,则需要先登陆,否则会返回406
status |
description |
200 |
成功查询 |
400 |
参数缺失 |
406 |
尚未登陆 |
414 |
课程不存在,pk错误 |
key |
description |
msg |
状态码相关解释 |
total |
查询到的课程数目 |
course |
查询到的课程列表 |
key |
description |
pk |
课程唯一编号 |
course |
课程名称 |
course/haveLearntCourse
key |
description |
pk |
课程唯一编码 |
status |
description |
200 |
成功查询 |
400 |
参数缺失 |
406 |
尚未登陆 |
410 |
尚未选择这门课 |
key |
description |
msg |
状态码相关解释 |
haveLearnt |
是否已经学习过这门课 |