1
0
WuXinyu 6 лет назад
Родитель
Сommit
92622d6e15

+ 5 - 0
.vscode/settings.json

@@ -0,0 +1,5 @@
+{
+  "cSpell.words": [
+    "Serializer"
+  ]
+}

+ 0 - 24
README.md

@@ -4,30 +4,6 @@
 
 
 ## 维护成员须知
 ## 维护成员须知
 
 
-### 文件夹管理须知
-
-1. 每个后端负责人创建并维护自己的文件夹
-2. 每个前端负责人协助维护各自负责的文件夹
-
-### 文件结构管理须知
-
-#### 每个小组文件夹下 **建议** 有
-
-1. README 声明负责人
-2. api 文件夹 (用于存放所有 api)
-3. serializer 文件夹 (用于存放所有 api 中提到的对象 细则)
-
-#### example:
-
-```
-user
-├── README.md
-├── api
-│   └── User-用户.md
-└── serializer
-    └── UserSerializer.md
-```
-
 ### api 规范
 ### api 规范
 
 
 #### 前缀与规范
 #### 前缀与规范

+ 1 - 1
user/api/Auth-权限.md → api/Auth-权限.md

@@ -1,4 +1,4 @@
-# User - 用户
+# Auth - 权限
 
 
 > url 前缀:**auth**
 > url 前缀:**auth**
 >
 >

+ 140 - 0
api/Course-课程.md

@@ -0,0 +1,140 @@
+# Course - 课程
+
+> url 前缀:**course**
+>
+> 示例:**https://xxxxxxxxx/api/course/xxxx**
+
+## 教师新建课程
+
+`TEACHER` `ADMIN`
+
+```http
+post
+```
+
+### Parameters
+
+```ts
+interface CourseDTO {
+  name: string;
+  code: string; // 选课码
+}
+```
+
+### Response
+
+```ts
+interface CourseData {
+  err: 0;
+  res: CourseSerializer;
+}
+```
+
+see [CourseSerializer](../serializer/CourseSerializer.md)
+
+## 教师获取自己创建的所有课程
+
+`TEACHER` `ADMIN`
+
+```http
+get
+```
+
+### Parameters
+
+| Name  | Type   | Description |
+| ----- | ------ | ----------- |
+| page  | number | 页码        |
+| limit | number | 每页条数    |
+
+### Response
+
+```ts
+interface CoursePageData {
+  err: 0;
+  res: Array<CourseSerializer>;
+  page: PageSerializer;
+}
+```
+
+see [CourseSerializer](../serializer/CourseSerializer.md), [PageSerializer](../serializer/PageSerializer.md)
+
+## 更新课程信息
+
+`TEACHER` `ADMIN`
+
+```http
+put /:courseId
+```
+
+### Parameters
+
+```ts
+interface CourseDTO {
+  name: string;
+  code: string; // 选课码
+}
+```
+
+### Response
+
+```ts
+interface CourseData {
+  err: 0;
+  res: CourseSerializer;
+}
+```
+
+see [CourseSerializer](../serializer/CourseSerializer.md)
+
+## 学生选课
+
+`STUDENT`
+
+```http
+post /student
+```
+
+### Parameters
+
+```ts
+interface CourseCodeDTO {
+  code: string; // 选课码
+}
+```
+
+### Response
+
+```ts
+interface CourseData {
+  err: 0;
+  res: CourseSerializer;
+}
+```
+
+see [CourseSerializer](../serializer/CourseSerializer.md)
+
+## 判断选课码是否重复
+
+`STUDENT` `ADMIN`
+
+```http
+post /code
+```
+
+### Parameters
+
+```ts
+interface CourseCodeDTO {
+  code: string; // 选课码
+}
+```
+
+### Response
+
+```ts
+interface DuplicateData {
+  err: 0;
+  res: boolean;
+}
+```

+ 245 - 0
api/Exam-考试.md

@@ -0,0 +1,245 @@
+# Exam - 考试
+
+> url 前缀:**exam**
+>
+> 示例:**https://xxxxxxxxx/api/exam/xxxx**
+
+## 创建考试
+
+`TEACHER`
+
+```http
+post
+```
+
+### Parameters
+
+```ts
+interface ExamDTO {
+  name: string;
+  startAt: LocalDateTime;
+  endAt: LocalDateTime;
+  problem: Array<number>;
+  courseId: number; // TODO: bed design
+}
+```
+
+### Response
+
+```ts
+interface ExamData {
+  err: 0;
+  res: ExamSerializer;
+}
+```
+
+see [ExamSerializer](../serializer/ExamSerializer.md)
+
+## 查看考试列表
+
+```http
+get
+```
+
+### Parameters
+
+| Name   | Type       | Description |
+| ------ | ---------- | ----------- |
+| page   | number     | 页码        |
+| limit  | number     | 每页条数    |
+| status | ExamStatus | 考试状态    |
+
+see [ExamStatus](../serializer/ExamSerializer.md)
+
+### Response
+
+```ts
+interface ExamPageData {
+  err: 0;
+  res: Array<ExamSerializer>;
+  page: PageSerializer;
+}
+```
+
+see [ExamSerializer](../serializer/ExamSerializer.md), [PageSerializer](../serializer/PageSerializer.md)
+
+## 查看考试信息
+
+`TEACHER` `ADMIN`
+
+```http
+get /:examId
+```
+
+### Response
+
+```ts
+interface ExamData {
+  err: 0;
+  res: ExamSerializer;
+}
+```
+
+see [ExamSerializer](../serializer/ExamSerializer.md)
+
+## 更新考试信息
+
+`TEACHER` `ADMIN`
+
+```http
+put /:examId
+```
+
+### Parameters
+
+```ts
+interface ExamDTO {
+  name: string;
+  startAt: LocalDateTime;
+  endAt: LocalDateTime;
+  problem: Array<number>;
+  courseId: number; // TODO: bed design
+}
+```
+
+### Response
+
+```ts
+interface ExamData {
+  err: 0;
+  res: ExamSerializer;
+}
+```
+
+see [ExamSerializer](../serializer/ExamSerializer.md)
+
+## 删除考试
+
+`TEACHER` `ADMIN`
+
+```http
+delete /:examId
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+## 参加考试
+
+`TEACHER` `STUDENT`
+
+```http
+post /:examId
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+### 获得在线代码(1)
+
+```http
+get /:examId/onlinecode
+```
+
+### Response
+
+```ts
+interface CodeData {
+  err: 0;
+  res: CodeSerializer;
+}
+```
+
+see [CodeSerializer](../serializer/CodeSerializer.md)
+
+### 获得在线代码(2)
+
+```http
+get /:examId/onlinecode/:questionId
+```
+
+### Response
+
+```ts
+interface CodeData {
+  err: 0;
+  res: CodeSerializer;
+}
+```
+
+see [CodeSerializer](../serializer/CodeSerializer.md)
+
+### 更新在线代码(1)
+
+```http
+post /:examId/onlinecode
+```
+
+### Parameters
+
+```ts
+interface CodeDTOMap {
+  [key: number]: {
+    code: Map<String, String>;
+  };
+}
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+### 更新在线代码(2)
+
+```http
+post /:examId/onlinecode/:questionId
+```
+
+### Parameters
+
+```ts
+interface CodeDTO {
+  code: Map<String, String>;
+}
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+### 获得考试结果
+
+`STUDENT` `ADMIN`
+
+```http
+get /:examId/result
+```
+
+### Response
+
+```ts
+interface ResultData {
+  err: 0;
+  res: ResultSerializer;
+}
+```
+
+see [ResultSerializer](../serializer/ResultSerializer.md)

+ 119 - 0
api/Problem-题目.md

@@ -0,0 +1,119 @@
+# Problem - 题目
+
+> url 前缀:**problem**
+>
+> 示例:**https://xxxxxxxxx/api/problem/xxxx**
+
+## 创建题目
+
+```http
+post
+```
+
+### Parameters
+
+**File upload**
+
+```ts
+interface ProblemDTO {
+  name: string;
+  type: ProblemType;
+  description: string;
+}
+```
+
+see [ProblemType](../serializer/ProblemSerializer.md)
+
+### Response
+
+```ts
+interface ProblemData {
+  err: 0;
+  res: ProblemSerializer;
+}
+```
+
+see [ProblemSerializer](../serializer/ProblemSerializer.md)
+
+## 查看题目列表
+
+```http
+get
+```
+
+### Parameters
+
+| Name  | Type        | Description |
+| ----- | ----------- | ----------- |
+| page  | number      | 页码        |
+| limit | number      | 每页条数    |
+| type  | ProblemType | 问题状态    |
+
+see [ProblemType](../serializer/ProblemSerializer.md)
+
+### Response
+
+```ts
+interface ProblemPageData {
+  err: 0;
+  res: Array<ProblemSerializer>;
+  page: PageSerializer;
+}
+```
+
+see [ProblemSerializer](../serializer/ProblemSerializer.md), [PageSerializer](../serializer/PageSerializer.md)
+
+## 查看题目信息
+
+```http
+get /:problemId
+```
+
+### Response
+
+```ts
+interface ProblemData {
+  err: 0;
+  res: ProblemSerializer;
+}
+```
+
+see [ProblemSerializer](../serializer/ProblemSerializer.md)
+
+## 更新题目信息
+
+```http
+put /:problemId
+```
+
+### Parameters
+
+**File upload**
+
+<!-- TODO: check param -->
+
+```ts
+string;
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+## 删除题目
+
+```http
+delete /:problemId
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```

+ 22 - 0
api/Record-记录.md

@@ -0,0 +1,22 @@
+# Problem - 题目
+
+> url 前缀:**record**
+>
+> 示例:**https://xxxxxxxxx/api/record/xxxx**
+
+## 创建题目
+
+```http
+get /record/:recordId
+```
+
+### Response
+
+```ts
+interface RecordData {
+  err: 0;
+  res: RecordSerializer;
+}
+```
+
+see [RecordSerializer](../serializer/RecordSerializer.md)

+ 43 - 0
api/Result-结果.md

@@ -0,0 +1,43 @@
+# Problem - 考试结果
+
+> url 前缀:**result**
+>
+> 示例:**https://xxxxxxxxx/api/result/xxxx**
+
+## 查看结果信息
+
+```http
+get /:resultId
+```
+
+### Response
+
+```ts
+interface ResultData {
+  err: 0;
+  res: ResultSerializer;
+}
+```
+
+see [ResultSerializer](../serializer/ResultSerializer.md)
+
+## 查看用户的结果列表
+
+`STUDENT` `ADMIN`
+
+<!-- TODO: bad design -->
+
+```http
+get
+```
+
+### Response
+
+```ts
+interface ProblemPageData {
+  err: 0;
+  res: Array<ProblemSerializer>;
+}
+```
+
+see [ProblemSerializer](../serializer/ProblemSerializer.md)

+ 28 - 0
api/Statistic-分析.md

@@ -0,0 +1,28 @@
+# Statistic - 系统分析
+
+> url 前缀:**statistic**
+>
+> 示例:**https://xxxxxxxxx/api/statistic/xxxx**
+
+## 查看分析结果
+
+```http
+get
+```
+
+### Response
+
+```ts
+interface StatisticData {
+  err: 0;
+  res: {
+    studentCount: number;
+    teacherCount: number;
+    examinationCount: number;
+    resultCount: number;
+    recordCount: number;
+    javaProblemCount: number;
+    pythonProblemCount: number;
+  };
+}
+```

+ 178 - 0
api/User-用户.md

@@ -0,0 +1,178 @@
+# User - 用户
+
+> url 前缀:**user**
+>
+> 示例:**https://xxxxxxxxx/api/user/xxxx**
+
+## 创建用户
+
+`ADMIN`
+
+```http
+post
+```
+
+### Parameters
+
+```ts
+interface UserDTO {
+  username: string;
+  email: string;
+  role: UserRole;
+  phone: string;
+}
+```
+
+### Response
+
+```ts
+interface UserData {
+  err: 0;
+  res: UserSerializer;
+}
+```
+
+see [UserSerializer](../serializer/UserSerializer.md)
+
+## 获得用户列表
+
+`ADMIN`
+
+```http
+get
+```
+
+### Parameters
+
+| Name   | Type   | Description |
+| ------ | ------ | ----------- |
+| page   | number | 页码        |
+| limit  | number | 每页条数    |
+| search | string | 搜索信息    |
+
+### Response
+
+```ts
+interface UserPageData {
+  err: 0;
+  res: Array<UserSerializer>;
+  page: PageSerializer;
+}
+```
+
+see [UserSerializer](../serializer/UserSerializer.md), [PageSerializer](../serializer/PageSerializer.md)
+
+## 查看用户
+
+`ADMIN`
+
+```http
+get /:userId
+```
+
+### Response
+
+```ts
+interface UserData {
+  err: 0;
+  res: UserSerializer;
+}
+```
+
+see [UserSerializer](../serializer/UserSerializer.md)
+
+## 获得当前登录用户的信息
+
+```http
+get /current
+```
+
+### Response
+
+```ts
+interface UserData {
+  err: 0 | 401 /* 用户信息失效 */;
+  res: UserSerializer;
+}
+```
+
+see [UserSerializer](../serializer/UserSerializer.md)
+
+## 删除用户
+
+`ADMIN`
+
+```http
+delete /:userId
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+## 修改密码
+
+`STUDENT` `TEACHER`
+
+```http
+post /password/change
+```
+
+### Parameters
+
+```ts
+interface ChangePasswordForm {
+  origin: string;
+  password: string;
+  confirm: string;
+}
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+## 重置密码
+
+`ADMIN`
+
+```http
+post /:userId/password/change
+```
+
+### Response
+
+```ts
+interface EmptyData {
+  err: 0;
+}
+```
+
+## 查看用户的考试结果列表
+
+`STUDENT` `ADMIN`
+
+<!-- TODO: bad design -->
+
+```http
+get /:userId/result
+```
+
+### Response
+
+```ts
+interface ProblemPageData {
+  err: 0;
+  res: Array<ProblemSerializer>;
+}
+```
+
+see [ProblemSerializer](../serializer/ProblemSerializer.md)

+ 0 - 28
prefix.md

@@ -1,28 +0,0 @@
-# 管理路径前缀
-
-## 修改记录
-
-| 修改人 | 修改内容                                       | 修改时间   |
-| ------ | ---------------------------------------------- | ---------- |
-| 吴新宇 | 创建                                           | 2018/12/18 |
-| 周玮璐 | 新增题目前缀                                   | 2018/12/20 |
-| 周玮璐 | 新增考试&&考试结果&&考试提交记录&&运行记录前缀 | 2018/12/22 |
-| 周玮璐 | 更改题目前缀为question                         | 2018/12/25 |
-| 张亚森 | 新增作业前缀                                   | 2018/12/25 |
-| 周玮璐 | 新增作业成绩统计前缀                           | 2018/01/13 |
-| 吴新宇 | 新增代码作业前缀                               | 2018/01/13 |
-
-## 前缀列表
-
-- [course](course/api/Course-课程.md)
-- [group](course/api/Group-小组.md)
-- [auth](user/api/Auth-权限.md)
-- [user](user/api/User-用户.md)
-- [question](question/api/Question-题目.md)
-- [exam](exam/api/Exam-考试.md)
-- [result](exam/api/Result-考试结果.md)
-- [commit](exam/api/Commit-提交记录.md)
-- [record](exam/api/Record-运行记录.md)
-- [assignment](assignment/api/Code-代码作业.md)
-- [resultstatistics](resultstatistics/api/Resultstatistics-成绩统计.md)
-- [codehw](codeHomework/api/index.md)

+ 23 - 0
serializer/CodeSerializer.md

@@ -0,0 +1,23 @@
+# CodeSerializer
+
+代码信息
+
+## Attributes
+
+```ts
+interface CodeSerializer {
+  examId: number;
+  fetchAt: LocalDateTime;
+  startAt: LocalDateTime;
+  endAt: LocalDateTime;
+  codeList: Array<NestedCodeItemVO>;
+}
+
+interface NestedCodeItemVO {
+  questionId: number;
+  language: string;
+  projectName: string;
+  editable: Map<String, String>;
+  uneditable: Map<String, String>;
+}
+```

+ 13 - 0
serializer/CourseSerializer.md

@@ -0,0 +1,13 @@
+# CourseSerializer
+
+课程信息
+
+## Attributes
+
+```ts
+interface CourseSerializer {
+  id: number;
+  name: string;
+  code: string; // 选课码
+}
+```

+ 50 - 0
serializer/ExamSerializer.md

@@ -0,0 +1,50 @@
+# ExamSerializer
+
+考试信息
+
+## Attributes
+
+```ts
+interface ExamSerializer {
+  id: number;
+  name: string;
+  createdAt: LocalDateTime;
+  startAt: LocalDateTime;
+  endAt: LocalDateTime;
+  status: ExamStatus;
+  creator: {
+    id: number;
+    username: string;
+  };
+  joined: boolean;
+  courseId: number;
+  courseName: string;
+}
+
+enum ExamStatus {
+  /**
+   * 正在准备试题,通常是正在PUSH试题
+   */
+  PREPARING,
+  /**
+   * 考试不可用,通常是PUSH试题失败
+   */
+  UNAVAILABLE,
+  /**
+   * 考试已准备好,在考试尚未开始时使用,不持久化到数据库中
+   */
+  READY,
+  /**
+   * 考试可用,表示考试正在进行,持久化时考试从准备好到考试被关闭均为此状态
+   */
+  AVAILABLE,
+  /**
+   * 考试已完成,在考试结束后使用,不持久化到数据库中
+   */
+  FINISHED,
+  /**
+   * 考试已关闭,表示考试生命周期结束,所有试卷均被存档
+   */
+  CLOSED
+}
+```

+ 14 - 0
serializer/PageSerializer.md

@@ -0,0 +1,14 @@
+# PageSerializer
+
+分页信息
+
+## Attributes
+
+```ts
+interface PageSerializer {
+  page: number;
+  limit: number;
+  size: number;
+  total: number;
+}
+```

+ 57 - 0
serializer/ProblemSerializer.md

@@ -0,0 +1,57 @@
+# ProblemSerializer
+
+问题的基本信息
+
+## Attributes
+
+```ts
+interface ProblemSerializer {
+  id: number;
+  name: string;
+  type: ProblemType;
+  description: string;
+  publicFiles: Array<string>;
+  protectedFiles: Array<string>;
+  privateFiles: Array<string>;
+  createdAt: LocalDateTime;
+  modifiedAt: LocalDateTime;
+  deprecated: boolean;
+  creator: {
+    id: number;
+    username: string;
+  };
+}
+
+enum ProblemType{
+  /**
+	 * 普通Java题目,统计测试用例通过情况
+	 */
+	JAVA("Java", "JAVA", "TEST",
+			new JavaHelper(), new BasicEvaluator()),
+	/**
+	 * 带数据库的Java题目,统计测试用例通过情况
+	 */
+	JAVA_DATABASE("Java", "JAVA", "TEST",
+			new JavaDatabaseHelper(), new BasicEvaluator()),
+	/**
+	 * 普通Python题目,统计测试用例通过情况
+	 */
+	PYTHON("Python", "PYTHON", "TEST",
+			new PythonHelper(), new PythonEvaluator()),
+	/**
+	 * Java测试覆盖率题目,统计测试覆盖率
+	 */
+	JAVA_COVERAGE("Java Coverage", "JAVA", "COVERAGE",
+			new JavaCoverageHelper(), new BasicCoverageEvaluator()),
+	/**
+	 * Python测试覆盖率题目,统计测试覆盖率
+	 */
+	PYTHON_COVERAGE("Python Coverage", "PYTHON", "COVERAGE",
+			new PythonCoverageHelper(), new BasicCoverageEvaluator()),
+	/**
+	 * Java变异覆盖题目,统计变异覆盖率
+	 */
+	JAVA_MUTATION("Java Mutation", "JAVA", "MUTATION",
+			new JavaMutationHelper(), new BasicMutationEvaluator());
+}
+```

+ 33 - 0
serializer/RecordSerializer.md

@@ -0,0 +1,33 @@
+# RecordSerializer
+
+记录(控制台)信息
+
+## Attributes
+
+```ts
+interface RecordSerializer {
+  id: number;
+  number: number;
+  status: BuildStatus;
+  consoleOutput: string;
+  score: number;
+  commit: {
+    id: number;
+    createdAt: LocalDateTime;
+  };
+  failures: Array<{
+    name: string;
+    details: string;
+    trace: string;
+  }>;
+}
+
+enum BuildStatus {
+  SUCCESS, //构建成功,表示没有错误
+  UNSTABLE, //构建不稳定,表示有测试错误等非致命错误
+  FAILURE, //构建失败,表示有语法错误等致命错误
+  TIMEOUT, //构建超时,表示运行测试时超时
+  WAITING, //等待构建,表示构建尚未开始
+  RUNNING //正在构建,表示构建正在进行
+}
+```

+ 29 - 0
serializer/ResultSerializer.md

@@ -0,0 +1,29 @@
+# ResultSerializer
+
+结果信息
+
+## Attributes
+
+```ts
+interface ResultSerializer {
+  id: number;
+  score: number;
+  lastCommitAt: LocalDateTime;
+  deleted: boolean;
+  exam: {
+    id: number;
+    name: string;
+    course: string;
+  };
+  owner: {
+    id: number;
+    username: string;
+  };
+  commits: Array<{
+    id: number;
+    finished: boolean;
+    score: number;
+    createdAt: LocalDateTime;
+  }>;
+}
+```

+ 29 - 0
serializer/UserSerializer.md

@@ -0,0 +1,29 @@
+# UserSerializer
+
+用户的基本信息
+
+## Attributes
+
+```ts
+interface UserSerializer {
+  id: number;
+  score: number;
+  username: string;
+  email: string;
+  phone: string;
+  role: UserRole;
+  createAt: LocalDateTime;
+}
+
+enum UserRole {
+  /**
+	 * 学生角色
+	 */
+	STUDENT("学生"),
+	/**
+	 * 教师角色
+	 */
+	TEACHER("教师");
+
+}
+```

+ 0 - 0
tmp-问题列表.md


+ 0 - 12
user/README.md

@@ -1,12 +0,0 @@
-### 负责人
-
-- 【后端】徐翔哲
-- 【前端】吴新宇
-
-### 修改记录
-
-| 修改人 | 修改内容          | 修改时间   |
-| ------ | ----------------- | ---------- |
-| 吴新宇 | 初始化api         | 2018/12/18 |
-| 吴新宇 | 新增很多问题TODO  | 2018/12/24 |
-| 吴新宇 | fix todo 新增异常 | 2018/12/28 |

+ 0 - 11
user/serializer/UserSerializer.md

@@ -1,11 +0,0 @@
-# UserSerializer
-
-用户的基本信息
-
-## Attributes
-
-- id : **Number** - 用户 id
-- role : **String** - 身份类型 `[ STUDENT - 学生用户, TEACHER - 教师用户]`
-- username : **String** - 用户名 | `[a-zA-Z0-9]{4-16}`
-- emall : **String** - 郵箱 | `email`
-- phoneNumber : **String** - 手機號 | `phoneNumber`