[关闭]
@Andream 2017-12-25T17:09:53.000000Z 字数 4433 阅读 772

服务端接口定义

课程表开发日志


api接口:

api接口描述了客户端通过HTTP协议和服务端交互的协议。这里全部采用了POST方法,分为user , table, exam, grade, todo几个模块。返回的格式均为json格式,具体格式参见数据表的定义。

现在的想法是返回的数据就以数据库返回的数据为基础,然后加上status, error这两个参数,用于标识状态和错误信息,就ok了。

User

  1. 登录服务端 POST /user/login
  2. 设置教务网密码 POST /user/setPassword
  3. 注销 POST /user/logout

Table

  1. 获取自定义课程表 POST /table/getMyTable
  2. 添加课程 POST /table/addCourse
  3. 恢复教务网课程表 POST /table/resetMyTable
  4. 检索课程 POST /table/search

Exam

  1. 获取考试信息 POST /exam/getExams
  2. 添加考试 POST /exam/addExam
  3. 编辑考试 POST /exam/setExam
  4. 删除考试 POST /exam/deleteExam

Grade

  1. 获取成绩信息 POST /grade/getGrades

TODO

  1. 获取TODO信息 POST /todo/getTodos
  2. 添加Todo POST /todo/addTodo
  3. 编辑Todo POST /todo/setTodo
  4. 删除Todo POST /todo/deleteTodo

db接口

在介绍数据库提供的接口之前,先介绍数据表的结构吧。

参考:http://www.mongoing.com/mongodb-advanced-pattern-design
合理的内嵌和冗余:http://www.jianshu.com/p/bb0caddff60a
哈希id保证不会重复添加:https://docs.mongodb.com/manual/core/index-hashed/

数据库采用的是MongoDB,设置四个表,分别为User, Table, Course, Exam。现在分别用json格式描述各表的键值。

User

  1. {
  2. _id : ObjectId("4df08553188e444d001a763a"),
  3. stunum : "20151597",
  4. password : "123456",
  5. tel : "18216710629",
  6. academy : "软件学院",
  7. table : [
  8. {
  9. id : ObjectId("balabala"),
  10. course_name : "高等数学",
  11. classroom : "D1137",
  12. weeks : "[1-9],[10,18]",
  13. day : 1
  14. sections : "5-6",
  15. teacher : "杨向东",
  16. code : "MATH20041",
  17. note : "学分:3,总学时:48.0"
  18. },
  19. {
  20. id : ObjectId("balabala"),
  21. name : "线性代数",
  22. classroom : "D1233",
  23. weeks : "[1-9],[10,18]",
  24. day : 2
  25. sections : "1-2",
  26. teacher : "曾代敏",
  27. code : "MATH20001",
  28. note : "学分:3,总学时:48.0"
  29. }
  30. ],
  31. mytable : [
  32. {
  33. id : ObjectId("balabala"),
  34. course_name : "一颗高树",
  35. classroom : "D1137",
  36. weeks : "[1-9],[10,18]",
  37. day : 1,
  38. sections : "5-6",
  39. teacher : "杨向东",
  40. code : "MATH20041",
  41. note : "学分:3,总学时:48.0"
  42. },
  43. {
  44. id : ObjectId("balabala"),
  45. course_name : "线性代数",
  46. classroom : "D1233",
  47. weeks : "[1-9],[10,18]",
  48. day : 2,
  49. sections : "1-2",
  50. teacher : "曾代敏",
  51. code : "MATH20001",
  52. note : "学分:3,总学时:48.0"
  53. }
  54. ],
  55. exam : [
  56. {
  57. id : ObjectId("balabala"),
  58. code : "MATH20001",
  59. course_name : "概率论与数理统计",
  60. time_str : "2017-12-10(14周 星期日)09:00-11:00",
  61. start_time : "2017-12-10 09:00:00",
  62. end_time : "2017-12-10 11:00:00",
  63. classroom : "D区D一教学楼D1349",
  64. seat : "1-2",
  65. score : 3
  66. }
  67. ],
  68. myexam : [
  69. {
  70. id : ObjectId("balabala"),
  71. code : "",
  72. course_name : "英语六级",
  73. time_str : "2017-12-10(14周 星期日)09:00-11:00",
  74. start_time : "2017-12-10 09:00:00",
  75. end_time : "2017-12-10 11:00:00",
  76. classroom : "D区D一教学楼D1349",
  77. seat : "1-2",
  78. score : 3
  79. }
  80. ],
  81. grade : [
  82. [
  83. semester : "2015-2016学年 第一学期",
  84. gpa : 3.12,
  85. data : [
  86. {
  87. code : "MATH20001",
  88. course_name : "概率论与数理统计",
  89. score : 3.00,
  90. grade : 90,
  91. note : "类别:公共基础/必修\n考核方式:考试\n修读性质:初修\n辅修标记:主修"
  92. },
  93. {
  94. code : "MATH20002",
  95. course_name : "高等数学",
  96. score : 5.00,
  97. grade : 90,
  98. note : "类别:公共基础/必修\n考核方式:考试\n修读性质:初修\n辅修标记:主修"
  99. }
  100. ]
  101. ]
  102. ]
  103. todo : [
  104. ]
  105. }

User

  1. {
  2. _id : ObjectId("4df08553188e444d001a763a"),
  3. stunum : "20151597",
  4. password : "123456",
  5. tel : "18216710629",
  6. academy : "软件学院",
  7. table : ...
  8. mytable : ...
  9. exam : ...
  10. myexam : ...
  11. grade : ...
  12. todo : ...
  13. }

User是主要的数据表,大多数数据都采用了内嵌的形式。另外我还新建了Table、Exam两个子表,在User表中保留他们的引用和数据冗余。新建表是为了将来能开发课程检索和考试检索的功能。保留冗余是为了避免二次查询,提升查询效率。因为Table和Exam读写比很高,所以这种方案是合适的。

子表的格式和User表中内嵌的格式是一致的。

Table

  1. {
  2. id : ObjectId("balabala"),
  3. course_name : "数据结构",
  4. classroom : "D1343",
  5. weeks : "[1-9],[10,18]",
  6. day : 1,
  7. sections : "5-6",
  8. teacher : "蔡斌",
  9. code : "MATH20041",
  10. note : "学分:3,总学时:48.0"
  11. }

Exam

  1. {
  2. id : ObjectId("balabala"),
  3. code : "MATH20001",
  4. course_name : "概率论与数理统计",
  5. time_str : "2017-12-10(14周 星期日)09:00-11:00",
  6. start_time : "2017-12-10 09:00:00",
  7. end_time : "2017-12-10 11:00:00",
  8. classroom : "D区D一教学楼D1349",
  9. seat : "1-2",
  10. score : 3
  11. }

数据表的结构就大致如上面所述。

根据需求,为数据库提供了一些接口,方便api调用:

  1. ////////////////////////////////////////////
  2. // User
  3. ////////////////////////////////////////////
  4. /*
  5. * 检验用户名和密码是否正确,成功返回1,失败返回0
  6. * stunum : 学号
  7. * password : 密码
  8. * 异常:用户名或密码不完整
  9. * 该用户不存在(应该在调用过register之后才能调用login)
  10. * 密码错误
  11. */
  12. login(stunum, password);
  13. /*
  14. * 服务端在验证过密码可以登录教务网之后,调用该函数以在数据表中添加该用户的记录
  15. * stunum : 学号
  16. * password : 密码
  17. * 异常:用户名或密码不完整
  18. * 该用户已经存在
  19. */
  20. register(stunum, password);
  21. /*
  22. * 返回该用户的全部信息,包含课表考试和成绩
  23. * stunum : 学号
  24. * 异常:该用户不存在
  25. */
  26. getUserInfo(stunum);
  27. ////////////////////////////////////////////
  28. // Table
  29. ////////////////////////////////////////////
  30. /*
  31. * 返回该用户的课表信息
  32. * stunum : 学号
  33. * 异常:该用户不存在
  34. * 不存在课表信息
  35. */
  36. getMyTable(stunum);
  37. /*
  38. * 添加课程,并返回课表信息
  39. * stunum : 学号
  40. * course : 课程
  41. * 异常:该用户不存在
  42. */
  43. addCourse(stunum, course);
  44. /*
  45. * 重置课表为初始课表,并返回课表信息
  46. * stunum : 学号
  47. * 异常:该用户不存在
  48. * 不存在初始课表
  49. */
  50. resetMyTable(stunum);
  51. ////////////////////////////////////////////
  52. // Exam
  53. ////////////////////////////////////////////
  54. /*
  55. * 返回该用户的考试信息( 包括教务系统的和自定义的考试)
  56. * stunum : 学号
  57. * 异常:该用户不存在
  58. * 不存在考试信息
  59. */
  60. getMyExam(stunum);
  61. /*
  62. * 为该户用添加一个考试信息,并返回当前考试列表
  63. * stunum : 学号
  64. * exam : 要添加的考试信息
  65. * 异常:该用户不存在
  66. */
  67. addExam(stunum, exam);
  68. /*
  69. * 删除一条用户自定义的考试信息
  70. * stunum : 学号
  71. * exam : 要删除的考试信息
  72. * 异常:该用户不存在
  73. * 不存在考试信息
  74. */
  75. removeExam(stunum, exam);
  76. ////////////////////////////////////////////
  77. // Grade
  78. ////////////////////////////////////////////
  79. /*
  80. * 返回该用户的所有成绩信息
  81. * stunum : 学号
  82. * 异常:该用户不存在
  83. * 不存在成绩信息
  84. */
  85. getGrade(stunum);

另外的还有crawler和parser接口,这两部分比较简单,于是从简,可以一边开发一边决定。

crawler接口

  1. login();
  2. getTable();
  3. getExam();
  4. getGrade();
  5. getInfo();

parser接口

  1. parseLogin();
  2. parseTable();
  3. parseExam();
  4. parseGrade();
  5. parseInfo();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注