Merge branch 'main' of http://8.148.151.56:3000/tonytech/kindergarten_java into main_dev
This commit is contained in:
commit
7d86fb08c5
161
API 对比分析.md
161
API 对比分析.md
@ -1,161 +0,0 @@
|
|||||||
# API 对比分析报告
|
|
||||||
|
|
||||||
## 概述
|
|
||||||
对比 reading-platform-backend (Node.js/NestJS) 和 reading-platform-java (Spring Boot) 的 API 接口差异
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 已补全的接口
|
|
||||||
|
|
||||||
### 1. 任务管理相关接口(SchoolTaskController, TeacherTaskController)
|
|
||||||
|
|
||||||
#### 任务统计接口
|
|
||||||
- `GET /api/v1/school/tasks/stats` - 获取任务统计数据
|
|
||||||
- `GET /api/v1/school/tasks/stats/by-type` - 按任务类型统计
|
|
||||||
- `GET /api/v1/school/tasks/stats/by-class` - 按班级统计
|
|
||||||
- `GET /api/v1/school/tasks/stats/monthly` - 月度统计趋势
|
|
||||||
|
|
||||||
#### 任务完成情况接口
|
|
||||||
- `GET /api/v1/school/tasks/:id/completions` - 获取任务完成情况分页
|
|
||||||
- `PUT /api/v1/school/tasks/:taskId/completions/:studentId` - 更新任务完成状态
|
|
||||||
|
|
||||||
#### 任务模板接口
|
|
||||||
- `GET /api/v1/school/task-templates` - 获取任务模板列表
|
|
||||||
- `GET /api/v1/school/task-templates/:id` - 获取单个模板
|
|
||||||
- `GET /api/v1/school/task-templates/default/:taskType` - 获取默认模板
|
|
||||||
- `POST /api/v1/school/task-templates` - 创建模板
|
|
||||||
- `PUT /api/v1/school/task-templates/:id` - 更新模板
|
|
||||||
- `DELETE /api/v1/school/task-templates/:id` - 删除模板
|
|
||||||
- `POST /api/v1/school/tasks/from-template` - 从模板创建任务
|
|
||||||
|
|
||||||
### 2. 通知相关接口
|
|
||||||
|
|
||||||
#### 学校管理员通知(SchoolNotificationController - 新增)
|
|
||||||
- `GET /api/v1/school/notifications` - 获取通知列表
|
|
||||||
- `GET /api/v1/school/notifications/:id` - 根据 ID 获取通知
|
|
||||||
- `GET /api/v1/school/notifications/unread-count` - 获取未读数量
|
|
||||||
- `POST /api/v1/school/notifications/:id/read` - 标记已读
|
|
||||||
- `POST /api/v1/school/notifications/read-all` - 全部标记已读
|
|
||||||
|
|
||||||
### 3. 排课和课表相关接口(SchoolScheduleController)
|
|
||||||
- `GET /api/v1/school/schedules/timetable` - 获取课表(带日期范围)
|
|
||||||
- `POST /api/v1/school/schedules/batch` - 批量创建排课
|
|
||||||
- `GET /api/v1/school/schedules/templates/:id` - 获取单个模板
|
|
||||||
- `PUT /api/v1/school/schedules/templates/:id` - 更新模板
|
|
||||||
- `POST /api/v1/school/schedules/templates/:id/apply` - 应用模板
|
|
||||||
|
|
||||||
### 4. 新增 DTO
|
|
||||||
- `TaskTemplateCreateRequest` - 任务模板创建请求
|
|
||||||
- `TaskTemplateUpdateRequest` - 任务模板更新请求
|
|
||||||
- `CreateTaskFromTemplateRequest` - 从模板创建任务请求
|
|
||||||
- `SchedulePlanCreateRequest` - 课表计划创建请求
|
|
||||||
- `ScheduleTemplateApplyRequest` - 课表模板应用请求
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 仍需补全的接口
|
|
||||||
|
|
||||||
### P1 - 重要功能
|
|
||||||
|
|
||||||
#### 1. 成长档案接口(SchoolGrowthController, TeacherGrowthController)
|
|
||||||
- `GET /api/v1/school/students/:studentId/growth-records` - 按学生查询成长档案
|
|
||||||
- `GET /api/v1/school/classes/:classId/growth-records` - 按班级查询成长档案
|
|
||||||
- `GET /api/v1/teacher/classes/:classId/growth-records` - 教师端按班级查询
|
|
||||||
|
|
||||||
#### 2. 教师端课时增强接口(TeacherLessonController)
|
|
||||||
- `POST /api/v1/teacher/lessons/:id/finish` - 完成课时(带反馈数据)
|
|
||||||
- `POST /api/v1/teacher/lessons/:id/students/:studentId/record` - 保存学生记录
|
|
||||||
- `GET /api/v1/teacher/lessons/:id/student-records` - 获取学生记录
|
|
||||||
- `POST /api/v1/teacher/lessons/:id/student-records/batch` - 批量保存学生记录
|
|
||||||
- `POST /api/v1/teacher/lessons/:id/feedback` - 提交反馈
|
|
||||||
- `GET /api/v1/teacher/lessons/:id/feedback` - 获取反馈
|
|
||||||
|
|
||||||
#### 3. 教师端课程增强接口(TeacherCourseController)
|
|
||||||
- `GET /api/v1/teacher/courses/classes` - 获取班级列表
|
|
||||||
- `GET /api/v1/teacher/students` - 获取所有学生
|
|
||||||
- `GET /api/v1/teacher/classes/:id/students` - 获取班级学生
|
|
||||||
- `GET /api/v1/teacher/classes/:id/teachers` - 获取班级教师
|
|
||||||
- `GET /api/v1/teacher/schedules/timetable` - 获取课表
|
|
||||||
- `GET /api/v1/teacher/schedules/today` - 获取今天排课
|
|
||||||
- `POST /api/v1/teacher/schedules` - 创建排课
|
|
||||||
- `PUT /api/v1/teacher/schedules/:id` - 更新排课
|
|
||||||
- `DELETE /api/v1/teacher/schedules/:id` - 取消排课
|
|
||||||
|
|
||||||
#### 4. 班级管理接口(SchoolClassController)
|
|
||||||
- `GET /api/v1/school/classes/:id/students` - 获取班级学生
|
|
||||||
- `GET /api/v1/school/classes/:id/teachers` - 获取班级教师
|
|
||||||
- `POST /api/v1/school/classes/:id/teachers` - 添加班级教师
|
|
||||||
- `PUT /api/v1/school/classes/:id/teachers/:teacherId` - 更新班级教师
|
|
||||||
- `DELETE /api/v1/school/classes/:id/teachers/:teacherId` - 移除班级教师
|
|
||||||
- `POST /api/v1/school/students/:id/transfer` - 学生调班
|
|
||||||
- `GET /api/v1/school/students/:id/history` - 学生调班历史
|
|
||||||
- `POST /api/v1/school/students/import` - 批量导入学生
|
|
||||||
- `GET /api/v1/school/students/import/template` - 获取导入模板
|
|
||||||
|
|
||||||
### P2 - 辅助功能
|
|
||||||
|
|
||||||
#### 1. 统计报告接口(SchoolStatsController)
|
|
||||||
- `GET /api/v1/school/stats/teachers` - 活跃教师统计
|
|
||||||
- `GET /api/v1/school/stats/courses` - 课程使用统计
|
|
||||||
- `GET /api/v1/school/stats/activities` - 最近活动
|
|
||||||
- `GET /api/v1/school/stats/lesson-trend` - 课时趋势
|
|
||||||
- `GET /api/v1/school/stats/course-distribution` - 课程分布
|
|
||||||
- `GET /api/v1/school/reports/overview` - 概览报告
|
|
||||||
- `GET /api/v1/school/reports/teachers` - 教师报告
|
|
||||||
- `GET /api/v1/school/reports/courses` - 课程报告
|
|
||||||
- `GET /api/v1/school/reports/students` - 学生报告
|
|
||||||
|
|
||||||
#### 2. 导出接口增强(SchoolExportController)
|
|
||||||
- `GET /api/v1/school/export/lessons?startDate=&endDate=` - 导出课时(带日期范围)
|
|
||||||
- `GET /api/v1/school/export/teacher-stats?startDate=&endDate=` - 导出教师统计
|
|
||||||
- `GET /api/v1/school/export/student-stats?classId=` - 导出学生统计(按班级)
|
|
||||||
|
|
||||||
#### 3. 课程包/套餐接口
|
|
||||||
- `GET /api/v1/school/package` - 获取套餐信息
|
|
||||||
- `GET /api/v1/school/package/usage` - 获取套餐使用情况
|
|
||||||
|
|
||||||
#### 4. 家长相关接口
|
|
||||||
- `POST /api/v1/school/parents/:parentId/children/:studentId` - 添加孩子到家长
|
|
||||||
- `DELETE /api/v1/school/parents/:parentId/children/:studentId` - 从家长移除孩子
|
|
||||||
|
|
||||||
#### 5. 管理员课程接口
|
|
||||||
- `GET /api/v1/admin/courses/:id/stats` - 课程统计
|
|
||||||
- `GET /api/v1/admin/courses/:id/validate` - 验证课程
|
|
||||||
- `GET /api/v1/admin/courses/:id/versions` - 版本历史
|
|
||||||
- `POST /api/v1/admin/courses/:id/submit` - 提交审核
|
|
||||||
- `POST /api/v1/admin/courses/:id/withdraw` - 撤销审核
|
|
||||||
- `POST /api/v1/admin/courses/:id/approve` - 审核通过
|
|
||||||
- `POST /api/v1/admin/courses/:id/reject` - 审核驳回
|
|
||||||
- `POST /api/v1/admin/courses/:id/direct-publish` - 直接发布
|
|
||||||
- `POST /api/v1/admin/courses/:id/publish` - 发布
|
|
||||||
- `POST /api/v1/admin/courses/:id/unpublish` - 下架
|
|
||||||
- `POST /api/v1/admin/courses/:id/republish` - 重新发布
|
|
||||||
|
|
||||||
#### 6. 资源接口增强
|
|
||||||
- `POST /api/v1/admin/resources/items/batch-delete` - 批量删除资源项
|
|
||||||
- `GET /api/v1/admin/resources/stats` - 资源统计
|
|
||||||
|
|
||||||
#### 7. 反馈接口
|
|
||||||
- `GET /api/v1/teacher/feedbacks` - 获取反馈列表
|
|
||||||
- `GET /api/v1/teacher/feedbacks/stats` - 获取反馈统计
|
|
||||||
- `GET /api/v1/school/feedbacks` - 获取反馈列表(学校端)
|
|
||||||
- `GET /api/v1/school/feedbacks/stats` - 获取反馈统计(学校端)
|
|
||||||
|
|
||||||
#### 8. 认证接口
|
|
||||||
- `GET /api/v1/auth/profile` - 获取用户信息
|
|
||||||
- `POST /api/v1/auth/logout` - 登出
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 总结
|
|
||||||
|
|
||||||
本次补全了以下主要功能:
|
|
||||||
1. 任务管理:统计、模板、完成情况更新
|
|
||||||
2. 通知:学校管理员通知接口
|
|
||||||
3. 排课:课表模板、批量创建、应用模板
|
|
||||||
|
|
||||||
下一步建议优先补全:
|
|
||||||
1. 成长档案按学生/班级查询接口
|
|
||||||
2. 教师端课时反馈接口
|
|
||||||
3. 班级管理相关接口
|
|
||||||
4. 学生调班和批量导入接口
|
|
||||||
586
CLAUDE.md
586
CLAUDE.md
@ -87,8 +87,483 @@ Result<T> error(code, msg) // { code: xxx, message: "...", data: null }
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 4. OpenAPI 驱动开发
|
### 4. OpenAPI 驱动开发
|
||||||
- 后端:在 Controller 上使用 `@Operation`、`@Parameter`、`@Schema` 注解
|
|
||||||
- 前端:运行 `npm run api:update` 从 `api-spec.yml` 重新生成 TypeScript 客户端
|
- **后端**:在 Controller 上使用 `@Operation`、`@Parameter`、`@Schema` 注解
|
||||||
|
- **前端**:运行 `npm run api:update` 从 `api-spec.yml` 重新生成 TypeScript 客户端
|
||||||
|
|
||||||
|
### 5. 前后端接口规范
|
||||||
|
|
||||||
|
#### 后端:以 Controller 为"唯一真源"
|
||||||
|
|
||||||
|
以后端 `Spring Boot Controller` 为接口定义的唯一真源,通过 `SpringDoc/Knife4j` 导出`OpenAPI` 规范,所有接口必须符合统一响应模型。
|
||||||
|
|
||||||
|
**统一响应模型:**
|
||||||
|
```java
|
||||||
|
// 普通接口
|
||||||
|
Result<T> success(T data) // { code: 200, message: "success", data: ... }
|
||||||
|
Result<T> error(code, msg) // { code: xxx, message: "...", data: null }
|
||||||
|
|
||||||
|
// 分页接口
|
||||||
|
Result<PageResult<T>> // { code: 200, message: "success", data: { items, total, page, pageSize } }
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应结构说明:**
|
||||||
|
| 接口类型 | 返回类型 | 分页字段命名 |
|
||||||
|
|---------|---------|-------------|
|
||||||
|
| 普通接口 | `Result<T>` | - |
|
||||||
|
| 分页接口 | `Result<PageResult<T>>` | `page`, `pageSize`, `total`, `items` |
|
||||||
|
| 错误响应 | `Result<Void>` | 参考 `ErrorCode` 枚举 |
|
||||||
|
|
||||||
|
**请求参数规范:**
|
||||||
|
| 参数类型 | 注解 | 说明 |
|
||||||
|
|---------|------|------|
|
||||||
|
| 路径变量 | `@PathVariable` | 与 OpenAPI path 模板保持一致 |
|
||||||
|
| 查询参数 | `@RequestParam` | 分页:`page`, `pageSize`;过滤:`keyword`, `category` 等 |
|
||||||
|
| 请求体 | `@RequestBody DTO` | 使用 `*Request` 类,不直接暴露实体 |
|
||||||
|
|
||||||
|
#### 前端:src/apis + fetch.ts 调用模式
|
||||||
|
|
||||||
|
围绕 `src/apis` + `fetch.ts` 的调用模式,将真实接口规范(路径、method、参数、响应结构)维护到 `apis.ts`。
|
||||||
|
|
||||||
|
**工作流程:**
|
||||||
|
```
|
||||||
|
后端 Controller (带 @Schema 注解)
|
||||||
|
↓
|
||||||
|
Knife4j/Swagger → /v3/api-docs
|
||||||
|
↓
|
||||||
|
api-spec.yml (OpenAPI 规范)
|
||||||
|
↓
|
||||||
|
orval (npm run api:gen)
|
||||||
|
↓
|
||||||
|
生成的 TypeScript 类型 + API 客户端
|
||||||
|
↓
|
||||||
|
Vue 组件使用 (强制类型校验)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 实施步骤
|
||||||
|
|
||||||
|
**一、梳理并固化接口响应规范**
|
||||||
|
|
||||||
|
1. **确认统一响应模型**
|
||||||
|
- 普通接口:`Result<业务 DTO>`,字段 `code/message/data`
|
||||||
|
- 分页接口:`Result<PageResult<业务 DTO>>`,分页字段命名(`page`, `pageSize`, `total` 等)
|
||||||
|
- 错误响应:统一使用 `Result<Void>` 或类似 `ResultVoid` schema
|
||||||
|
|
||||||
|
2. **从后端提炼规范说明**
|
||||||
|
- 位置:`reading-platform-java/common/response` 与 `common/enums/ErrorCode`
|
||||||
|
- 输出:简短的"接口规范说明"文档,写入 `docs/` 目录
|
||||||
|
|
||||||
|
**二、从后端生成/校准 OpenAPI 规范**
|
||||||
|
|
||||||
|
1. **配置 SpringDoc/Knife4j 导出 OpenAPI**
|
||||||
|
- 查看/完善后端 OpenAPI 配置类(如 `OpenApiConfig` 或 Knife4j 配置)
|
||||||
|
- 指定 API 基本信息(title/description/version),与当前 `api-spec.yml` 对齐
|
||||||
|
- 扫描 `controller/*` 包下所有带 `@RestController` 的类
|
||||||
|
- 支持 `@Operation`、`@Parameter`、`@Schema` 注解
|
||||||
|
|
||||||
|
2. **规范化 Controller 注解与返回类型**
|
||||||
|
- 检查 Controller 方法返回类型是否全部为 `Result<T>` 或`Result<PageResult<T>>`
|
||||||
|
- 为缺少注解的接口补全 `@Operation`、`@Parameter`、`@Schema`
|
||||||
|
- 校准路径前缀与角色划分(`/api/v1/teacher/*`、`/api/v1/school/*` 等)
|
||||||
|
|
||||||
|
3. **替换/同步前端 api-spec.yml**
|
||||||
|
- 使用导出的 OpenAPI JSON/YAML 覆盖/更新 `reading-platform-frontend/api-spec.yml`
|
||||||
|
- 约定更新流程:修改后端 Controller → 查看/验证文档 → 导出并覆盖 api-spec.yml → 前端重新生成客户端
|
||||||
|
|
||||||
|
**三、将接口规范映射到前端 src/apis 体系**
|
||||||
|
|
||||||
|
1. **分析现有 src/apis 使用方式**
|
||||||
|
- 搜索全项目对 `from 'src/apis/fetch'` 或`getRequests` 的引用
|
||||||
|
- 列出当前真实在用的 URL 列表及对应页面组件
|
||||||
|
- 对比这些 URL 与后端 Controller 路径以及 `api-spec.yml` 中的 paths
|
||||||
|
|
||||||
|
2. **设计 apis.ts 的"接口字典"结构**
|
||||||
|
- 以 `SwaggerType` / `RequestType` 为基础
|
||||||
|
- 将真实接口按模块分类(教师端、学校端、家长端、管理员端)
|
||||||
|
- 每个接口包含:路径、method、请求参数类型、响应类型
|
||||||
|
|
||||||
|
### 6. DTO/VO 使用规范
|
||||||
|
|
||||||
|
#### 响应对象(Response/VO)
|
||||||
|
- **必须创建独立的 VO 实体类**,不要使用 `Map`、`HashMap` 或 `JSONObject` 返回数据
|
||||||
|
- VO 类应放在 `com.reading.platform.dto.response` 包下
|
||||||
|
- 使用 `@Schema` 注解描述字段含义,便于生成 API 文档
|
||||||
|
- 使用 `@Data` 和 `@Builder` 注解简化代码
|
||||||
|
|
||||||
|
**示例:**
|
||||||
|
```java
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@Schema(description = "用户信息响应")
|
||||||
|
public class UserInfoResponse {
|
||||||
|
@Schema(description = "用户 ID")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Schema(description = "昵称")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "角色")
|
||||||
|
private String role;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 请求对象(Request/DTO)
|
||||||
|
- 复杂请求参数应创建 DTO 类,放在 `com.reading.platform.dto.request` 包下
|
||||||
|
- 使用 `@Valid` 和校验注解确保参数合法性
|
||||||
|
|
||||||
|
#### 为什么不用 Map?
|
||||||
|
- ✅ VO 实体类:类型安全、IDE 智能提示、API 文档自动生成、易于维护
|
||||||
|
- ❌ Map:类型不安全、无文档、易出错、难以重构
|
||||||
|
|
||||||
|
### 7. Swagger/OpenAPI 注解规范
|
||||||
|
|
||||||
|
#### 强制要求
|
||||||
|
**所有实体类(Entity)、DTO、VO 都必须添加 `@Schema` 注解**,确保 API 文档完整性和前端类型生成准确性。
|
||||||
|
|
||||||
|
#### 注解使用规范
|
||||||
|
|
||||||
|
**1. 类级别注解**
|
||||||
|
```java
|
||||||
|
// Entity 类
|
||||||
|
@Data
|
||||||
|
@TableName("users")
|
||||||
|
@Schema(description = "用户信息") // 必须添加
|
||||||
|
public class User { ... }
|
||||||
|
|
||||||
|
// DTO/VO 类
|
||||||
|
@Data
|
||||||
|
@Schema(description = "用户创建请求") // 必须添加
|
||||||
|
public class UserCreateRequest { ... }
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Schema(description = "用户信息响应") // 必须添加
|
||||||
|
public class UserResponse { ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 字段级别注解**
|
||||||
|
```java
|
||||||
|
@Schema(description = "用户 ID", example = "1", requiredMode = Schema.RequiredMode.READ_ONLY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名", example = "zhangsan", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Schema(description = "年龄", example = "18", minimum = "1", maximum = "150")
|
||||||
|
private Integer age;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间", example = "2024-01-01 12:00:00")
|
||||||
|
private LocalDateTime createdAt;
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Controller 方法注解**
|
||||||
|
```java
|
||||||
|
@Operation(summary = "创建用户", description = "创建新用户并返回用户信息")
|
||||||
|
@ApiResponses({
|
||||||
|
@ApiResponse(responseCode = "200", description = "创建成功"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "参数错误"),
|
||||||
|
@ApiResponse(responseCode = "409", description = "用户名已存在")
|
||||||
|
})
|
||||||
|
@PostMapping
|
||||||
|
public Result<UserResponse> createUser(@Valid @RequestBody UserCreateRequest request) {
|
||||||
|
return Result.success(userService.createUser(request));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. 参数注解**
|
||||||
|
```java
|
||||||
|
@Operation(summary = "根据 ID 获取用户")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public Result<UserResponse> getUser(
|
||||||
|
@Parameter(description = "用户 ID", required = true)
|
||||||
|
@PathVariable Long id,
|
||||||
|
|
||||||
|
@Parameter(description = "是否包含详细信息")
|
||||||
|
@RequestParam(defaultValue = "false")
|
||||||
|
Boolean includeDetails
|
||||||
|
) {
|
||||||
|
return Result.success(userService.getUser(id, includeDetails));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 常用注解说明
|
||||||
|
|
||||||
|
| 注解 | 位置 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| `@Schema(description = "...")` | 类/字段 | 描述类或字段的含义 |
|
||||||
|
| `@Schema(example = "...")` | 字段 | 示例值 |
|
||||||
|
| `@Schema(requiredMode = REQUIRED)` | 字段 | 必填字段 |
|
||||||
|
| `@Schema(requiredMode = READ_ONLY)` | 字段 | 只读字段(如 ID、创建时间) |
|
||||||
|
| `@Schema(minimum = "1", maximum = "100")` | 字段 | 数值范围 |
|
||||||
|
| `@Schema(minLength = 1, maxLength = 50)` | 字段 | 字符串长度 |
|
||||||
|
| `@Schema(pattern = "^[a-zA-Z]+$")` | 字段 | 正则表达式 |
|
||||||
|
| `@Operation(summary = "...")` | 方法 | 接口摘要 |
|
||||||
|
| `@Parameter(description = "...")` | 参数 | 参数描述 |
|
||||||
|
|
||||||
|
#### 完整示例
|
||||||
|
|
||||||
|
**Entity 类:**
|
||||||
|
```java
|
||||||
|
package com.reading.platform.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@TableName("courses")
|
||||||
|
@Schema(description = "课程信息")
|
||||||
|
public class Course {
|
||||||
|
|
||||||
|
@Schema(description = "课程 ID", requiredMode = Schema.RequiredMode.READ_ONLY)
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "租户 ID", requiredMode = Schema.RequiredMode.READ_ONLY)
|
||||||
|
private Long tenantId;
|
||||||
|
|
||||||
|
@Schema(description = "课程名称", example = "绘本阅读入门", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Schema(description = "课程编码", example = "READ001")
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
@Schema(description = "课程描述")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Schema(description = "封面图片 URL")
|
||||||
|
private String coverUrl;
|
||||||
|
|
||||||
|
@Schema(description = "分类", example = "language")
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@Schema(description = "适用年龄段", example = "5-6 岁")
|
||||||
|
private String ageRange;
|
||||||
|
|
||||||
|
@Schema(description = "难度等级", example = "beginner")
|
||||||
|
private String difficultyLevel;
|
||||||
|
|
||||||
|
@Schema(description = "课程时长(分钟)", example = "30")
|
||||||
|
private Integer durationMinutes;
|
||||||
|
|
||||||
|
@Schema(description = "状态", example = "published")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.READ_ONLY)
|
||||||
|
@TableField(fill = FieldFill.INSERT)
|
||||||
|
private LocalDateTime createdAt;
|
||||||
|
|
||||||
|
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.READ_ONLY)
|
||||||
|
@TableField(fill = FieldFill.INSERT_UPDATE)
|
||||||
|
private LocalDateTime updatedAt;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**DTO 类:**
|
||||||
|
```java
|
||||||
|
package com.reading.platform.dto.request;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Schema(description = "课程创建请求")
|
||||||
|
public class CourseCreateRequest {
|
||||||
|
|
||||||
|
@Schema(description = "课程名称", example = "绘本阅读入门", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotBlank(message = "课程名称不能为空")
|
||||||
|
@Size(max = 100, message = "课程名称不能超过 100 个字符")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Schema(description = "课程描述", example = "适合大班幼儿的绘本阅读课程")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Schema(description = "分类", example = "language")
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@Schema(description = "适用年龄段", example = "5-6 岁")
|
||||||
|
private String ageRange;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 代码审查要点
|
||||||
|
|
||||||
|
- [ ] Entity 类是否添加了 `@Schema(description = "...")`
|
||||||
|
- [ ] Entity 字段是否添加了 `@Schema` 注解描述字段含义
|
||||||
|
- [ ] DTO/VO 类是否添加了 `@Schema(description = "...")`
|
||||||
|
- [ ] DTO/VO 字段是否添加了 `@Schema` 注解
|
||||||
|
- [ ] Controller 方法是否添加了 `@Operation` 注解
|
||||||
|
- [ ] Controller 参数是否添加了 `@Parameter` 注解
|
||||||
|
- [ ] 必填字段是否标注了 `requiredMode = REQUIRED`
|
||||||
|
- [ ] 只读字段(ID、时间戳)是否标注了 `requiredMode = READ_ONLY`
|
||||||
|
- [ ] 是否有合适的 `example` 示例值
|
||||||
|
|
||||||
|
#### 注意事项
|
||||||
|
|
||||||
|
1. **导入正确的包**
|
||||||
|
```java
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema; // Swagger 3.x
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Lombok 与 Schema 的配合**
|
||||||
|
- `@Data` 生成的 getter 方法会自动继承字段上的 `@Schema` 注解
|
||||||
|
- 但建议字段和方法都加上注解以确保兼容性
|
||||||
|
|
||||||
|
3. **必填校验**
|
||||||
|
- `requiredMode = REQUIRED` 仅用于文档说明
|
||||||
|
- 实际校验需要配合 `@NotNull`、`@NotBlank` 等校验注解
|
||||||
|
|
||||||
|
4. **枚举类型**
|
||||||
|
```java
|
||||||
|
@Schema(description = "状态", example = "active", allowableValues = {"active", "inactive"})
|
||||||
|
private String status;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. 前端接口校验规范
|
||||||
|
|
||||||
|
#### 基于 OpenAPI + orval + TypeScript 的强制校验链路
|
||||||
|
|
||||||
|
本项目前端采用**从接口文档到页面代码的强制类型校验链路**,确保前后端接口一致性和类型安全。
|
||||||
|
|
||||||
|
**技术栈:**
|
||||||
|
- **OpenAPI 3.0**:统一的 API 接口规范
|
||||||
|
- **orval**:从 OpenAPI 规范生成 TypeScript 类型和 API 客户端
|
||||||
|
- **TypeScript**:静态类型检查
|
||||||
|
- **ESLint**:代码规范约束
|
||||||
|
- **axios**:HTTP 请求(由 orval 自动生成)
|
||||||
|
|
||||||
|
**工作流程:**
|
||||||
|
|
||||||
|
```
|
||||||
|
后端 Controller (带 @Schema 注解)
|
||||||
|
↓
|
||||||
|
Knife4j/Swagger
|
||||||
|
↓
|
||||||
|
api-spec.yml (OpenAPI 规范)
|
||||||
|
↓
|
||||||
|
orval (npm run api:gen)
|
||||||
|
↓
|
||||||
|
生成的 TypeScript 类型 + API 客户端
|
||||||
|
↓
|
||||||
|
Vue 组件使用 (强制类型校验)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 配置说明
|
||||||
|
|
||||||
|
**orval 配置 (`orval.config.ts` 或 `vite.config.ts`):**
|
||||||
|
```typescript
|
||||||
|
export default {
|
||||||
|
'api': {
|
||||||
|
input: {
|
||||||
|
target: './api-spec.yml',
|
||||||
|
filters: {
|
||||||
|
tags: ['default'], // 只生成指定标签的接口
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
mode: 'split', // 分离模式:每个接口一个文件
|
||||||
|
target: './src/api/generated/client.ts',
|
||||||
|
schemas: './src/api/generated/schemas',
|
||||||
|
client: 'axios',
|
||||||
|
mock: false,
|
||||||
|
override: {
|
||||||
|
fetch: {
|
||||||
|
includeHttpRequestHeader: true,
|
||||||
|
},
|
||||||
|
useTypeOverInterfaces: true, // 优先使用 type
|
||||||
|
useDate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用规范
|
||||||
|
|
||||||
|
**1. 后端必须添加 @Schema 注解**
|
||||||
|
```java
|
||||||
|
@Operation(summary = "获取用户信息")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public Result<UserInfoResponse> getUser(@PathVariable Long id) {
|
||||||
|
return Result.success(userService.getUser(id));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 前端必须使用生成的类型和客户端**
|
||||||
|
```typescript
|
||||||
|
// ✅ 正确:使用生成的类型和 API
|
||||||
|
import { getUser } from '@/api/generated/client';
|
||||||
|
import type { UserInfoResponse } from '@/api/generated/schemas';
|
||||||
|
|
||||||
|
const user: UserInfoResponse = await getUser(id);
|
||||||
|
|
||||||
|
// ❌ 错误:不要手写类型或手动调用 axios
|
||||||
|
interface ManualUser { id: number; name: string; }
|
||||||
|
const user = await axios.get(`/api/users/${id}`);
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. ESLint 约束规则**
|
||||||
|
```typescript
|
||||||
|
// .eslintrc.cjs 中添加
|
||||||
|
rules: {
|
||||||
|
// 禁止手动调用 axios,必须使用生成的 API 客户端
|
||||||
|
'no-restricted-imports': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
patterns: ['axios', '!@/api/generated/*'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
// 强制使用生成的类型定义
|
||||||
|
'@typescript-eslint/no-explicit-any': 'error',
|
||||||
|
// 禁止使用 any 类型(特殊情况需 eslint-disable 注释)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. 运行时校验(可选)**
|
||||||
|
使用 `zod` 或 `yup` 进行运行时数据校验:
|
||||||
|
```typescript
|
||||||
|
import { UserInfoSchema } from '@/api/generated/schemas';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
// 运行时校验响应数据
|
||||||
|
const parsedData = UserInfoSchema.parse(apiResponse);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 开发命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd reading-platform-frontend
|
||||||
|
|
||||||
|
# 从后端更新 API 规范并生成客户端
|
||||||
|
npm run api:gen
|
||||||
|
|
||||||
|
# 或者完整流程(包含从后端导出 swagger)
|
||||||
|
npm run api:update
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 代码审查要点
|
||||||
|
|
||||||
|
- [ ] 前端是否使用了 orval 生成的类型,而非手写 interface
|
||||||
|
- [ ] 是否使用生成的 API 客户端,而非手动 axios 调用
|
||||||
|
- [ ] TypeScript 编译是否通过(无类型错误)
|
||||||
|
- [ ] 后端 Controller 是否正确添加 @Schema 注解
|
||||||
|
- [ ] API 变更后是否重新运行了 `npm run api:gen`
|
||||||
|
|
||||||
|
#### 常见问题
|
||||||
|
|
||||||
|
**Q: 为什么要强制使用生成的类型?**
|
||||||
|
A: 手写类型容易与后端实际返回不一致,导致运行时错误。生成类型确保前后端一致性。
|
||||||
|
|
||||||
|
**Q: 如何添加自定义逻辑?**
|
||||||
|
A: 在生成的客户端外封装业务逻辑层,不要修改生成的文件。
|
||||||
|
|
||||||
|
**Q: API 变更后忘记更新怎么办?**
|
||||||
|
A: CI/CD 中可添加类型检查步骤,类型不通过则构建失败。
|
||||||
|
|
||||||
## 开发命令
|
## 开发命令
|
||||||
|
|
||||||
@ -141,4 +616,109 @@ npm run api:update
|
|||||||
| 家长 | parent1 | 123456 |
|
| 家长 | parent1 | 123456 |
|
||||||
|
|
||||||
## API 文档
|
## API 文档
|
||||||
- 访问地址:http://localhost:8080/doc.html(后端启动后)
|
- 访问地址:http://localhost:8080/doc.html(后端启动后)
|
||||||
|
|
||||||
|
## 近期补充的接口和字段(2026-03-10)
|
||||||
|
|
||||||
|
### 实体类新增字段
|
||||||
|
|
||||||
|
**StudentRecord** - 学生评价记录
|
||||||
|
- `focus` - 专注力评分 (1-5)
|
||||||
|
- `participation` - 参与度评分 (1-5)
|
||||||
|
- `interest` - 兴趣评分 (1-5)
|
||||||
|
- `understanding` - 理解度评分 (1-5)
|
||||||
|
|
||||||
|
**LessonFeedback** - 课时反馈
|
||||||
|
- `design_quality` - 设计质量评分 (1-5)
|
||||||
|
- `participation` - 参与度评分 (1-5)
|
||||||
|
- `goal_achievement` - 目标达成度评分 (1-5)
|
||||||
|
- `step_feedbacks` - 环节反馈 JSON
|
||||||
|
- `pros` - 优点
|
||||||
|
- `suggestions` - 建议
|
||||||
|
- `activities_done` - 完成的活动 JSON
|
||||||
|
|
||||||
|
**Lesson** - 课时
|
||||||
|
- `actual_duration` - 实际时长(分钟)
|
||||||
|
- `overall_rating` - 整体评分
|
||||||
|
- `participation_rating` - 参与度评分
|
||||||
|
- `completion_note` - 完成说明
|
||||||
|
|
||||||
|
**Student** - 学生
|
||||||
|
- `class_id` - 班级 ID
|
||||||
|
- `parent_name` - 家长姓名
|
||||||
|
- `parent_phone` - 家长手机号
|
||||||
|
- `reading_count` - 阅读次数
|
||||||
|
- `lesson_count` - 课时数
|
||||||
|
|
||||||
|
**ClassTeacher** - 班级教师
|
||||||
|
- `is_primary` - 是否主教
|
||||||
|
- `sort_order` - 排序
|
||||||
|
|
||||||
|
**StudentClassHistory** - 学生班级历史
|
||||||
|
- `reason` - 调班原因
|
||||||
|
|
||||||
|
### 新增 Service 方法
|
||||||
|
|
||||||
|
**ClassService**
|
||||||
|
- `getClassList(Long tenantId)` - 获取班级列表(无分页)
|
||||||
|
- `getClassStudents(Long classId, ...)` - 获取班级学生分页
|
||||||
|
- `getClassTeachers(Long classId)` - 获取班级教师列表
|
||||||
|
- `addClassTeacher(...)` - 添加班级教师
|
||||||
|
- `updateClassTeacher(...)` - 更新班级教师角色
|
||||||
|
- `removeClassTeacher(...)` - 移除班级教师
|
||||||
|
|
||||||
|
**LessonService**
|
||||||
|
- `finishLesson(...)` - 结束课时
|
||||||
|
- `saveStudentRecord(...)` - 保存学生评价记录
|
||||||
|
- `getStudentRecords(Long lessonId)` - 获取课程所有学生记录
|
||||||
|
- `batchSaveStudentRecords(...)` - 批量保存学生评价记录
|
||||||
|
- `saveLessonFeedback(...)` - 提交课程反馈
|
||||||
|
- `getLessonFeedback(Long lessonId)` - 获取课程反馈
|
||||||
|
|
||||||
|
**StudentService**
|
||||||
|
- `transferStudent(...)` - 学生调班
|
||||||
|
- `getStudentClassHistory(Long studentId)` - 获取学生调班历史
|
||||||
|
|
||||||
|
**TaskService**
|
||||||
|
- `getTaskCompletion(Long taskId, Long studentId)` - 获取任务完成记录
|
||||||
|
|
||||||
|
### 新增 Controller 接口
|
||||||
|
|
||||||
|
**学校端 (/api/v1/school/*)**
|
||||||
|
- `GET /classes/list` - 获取班级列表(无分页)
|
||||||
|
- `GET /classes/{id}/students` - 获取班级学生分页
|
||||||
|
- `GET /classes/{id}/teachers` - 获取班级教师列表
|
||||||
|
- `POST /classes/{id}/teachers` - 添加班级教师
|
||||||
|
- `PUT /classes/{id}/teachers/{teacherId}` - 更新班级教师角色
|
||||||
|
- `DELETE /classes/{id}/teachers/{teacherId}` - 移除班级教师
|
||||||
|
- `POST /students/{id}/transfer` - 学生调班
|
||||||
|
- `GET /students/{id}/history` - 获取学生调班历史
|
||||||
|
|
||||||
|
**教师端 (/api/v1/teacher/*)**
|
||||||
|
- `GET /courses/classes` - 获取教师的班级列表
|
||||||
|
- `GET /courses/students` - 获取教师所有学生分页
|
||||||
|
- `GET /courses/classes/{classId}/students` - 获取班级学生分页
|
||||||
|
- `GET /courses/classes/{classId}/teachers` - 获取班级教师列表
|
||||||
|
- `POST /lessons/{id}/finish` - 结束课时
|
||||||
|
- `POST /lessons/{lessonId}/students/{studentId}/record` - 保存学生评价记录
|
||||||
|
- `GET /lessons/{lessonId}/student-records` - 获取课程所有学生记录
|
||||||
|
- `POST /lessons/{lessonId}/student-records/batch` - 批量保存学生评价记录
|
||||||
|
- `POST /lessons/{lessonId}/feedback` - 提交课程反馈
|
||||||
|
- `GET /lessons/{lessonId}/feedback` - 获取课程反馈
|
||||||
|
- `GET /schedules/timetable` - 获取课表(按日期范围)
|
||||||
|
- `GET /schedules/today` - 获取今日课表
|
||||||
|
- `POST /schedules` - 创建课表计划
|
||||||
|
- `PUT /schedules/{id}` - 更新课表计划
|
||||||
|
- `DELETE /schedules/{id}` - 取消课表计划
|
||||||
|
|
||||||
|
**家长端 (/api/v1/parent/*)**
|
||||||
|
- `GET /children` - 获取我的孩子(增强返回格式)
|
||||||
|
- `GET /children/{id}` - 获取孩子详情(增强返回格式)
|
||||||
|
- `GET /children/{childId}/lessons` - 获取孩子的课时记录
|
||||||
|
- `GET /children/{childId}/tasks` - 获取孩子的任务(带完成状态)
|
||||||
|
- `PUT /children/{childId}/tasks/{taskId}/feedback` - 提交任务家长反馈
|
||||||
|
|
||||||
|
### 数据库迁移
|
||||||
|
|
||||||
|
- 迁移脚本:``
|
||||||
|
- 包含上述所有实体类新增字段的 ALTER TABLE 语句
|
||||||
132
Service 重构总结.md
132
Service 重构总结.md
@ -1,132 +0,0 @@
|
|||||||
# Service 层重构总结
|
|
||||||
|
|
||||||
## 重构时间
|
|
||||||
2026-03-10
|
|
||||||
|
|
||||||
## 重构目的
|
|
||||||
将 Service 层从"直接 class 实现"重构为"interface + impl"模式,符合 Spring 最佳实践。
|
|
||||||
|
|
||||||
## 重构的 Service 列表
|
|
||||||
|
|
||||||
本次重构共完成了 14 个 Service 的 interface + impl 模式改造:
|
|
||||||
|
|
||||||
### 新增的 Interface 文件
|
|
||||||
|
|
||||||
| 序号 | 接口文件 | 实现类文件 |
|
|
||||||
|------|----------|------------|
|
|
||||||
| 1 | `AdminStatsService.java` | `AdminStatsServiceImpl.java` |
|
|
||||||
| 2 | `CourseLessonService.java` | `CourseLessonServiceImpl.java` |
|
|
||||||
| 3 | `CoursePackageService.java` | `CoursePackageServiceImpl.java` |
|
|
||||||
| 4 | `ExportService.java` | `ExportServiceImpl.java` |
|
|
||||||
| 5 | `FileUploadService.java` | `FileUploadServiceImpl.java` |
|
|
||||||
| 6 | `OperationLogService.java` | `OperationLogServiceImpl.java` |
|
|
||||||
| 7 | `ResourceService.java` | `ResourceServiceImpl.java` |
|
|
||||||
| 8 | `SchoolCourseService.java` | `SchoolCourseServiceImpl.java` |
|
|
||||||
| 9 | `SystemSettingService.java` | `SystemSettingServiceImpl.java` |
|
|
||||||
| 10 | `TeacherDashboardService.java` | `TeacherDashboardServiceImpl.java` |
|
|
||||||
| 11 | `ScheduleService.java` | `ScheduleServiceImpl.java` |
|
|
||||||
| 12 | `ThemeService.java` | `ThemeServiceImpl.java` |
|
|
||||||
| 13 | `TenantService.java` | `TenantServiceImpl.java` (已存在) |
|
|
||||||
| 14 | `SchoolStatsService.java` | `SchoolStatsServiceImpl.java` |
|
|
||||||
|
|
||||||
### 已有的 Interface + Impl 模式 Service
|
|
||||||
|
|
||||||
以下 Service 在重构前已经是 interface + impl 模式:
|
|
||||||
|
|
||||||
1. `AuthService` → `AuthServiceImpl`
|
|
||||||
2. `ClassService` → `ClassServiceImpl`
|
|
||||||
3. `StudentService` → `StudentServiceImpl`
|
|
||||||
4. `TaskService` → `TaskServiceImpl`
|
|
||||||
5. `CourseService` → `CourseServiceImpl`
|
|
||||||
6. `GrowthRecordService` → `GrowthRecordServiceImpl`
|
|
||||||
7. `LessonService` → `LessonServiceImpl`
|
|
||||||
8. `NotificationService` → `NotificationServiceImpl`
|
|
||||||
9. `ParentService` → `ParentServiceImpl`
|
|
||||||
10. `TeacherService` → `TeacherServiceImpl`
|
|
||||||
11. `TokenService` → `TokenServiceImpl`
|
|
||||||
|
|
||||||
## 重构模式
|
|
||||||
|
|
||||||
所有 Service 遵循以下模式:
|
|
||||||
|
|
||||||
### Interface 定义
|
|
||||||
```java
|
|
||||||
package com.reading.platform.service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 服务接口
|
|
||||||
*/
|
|
||||||
public interface XxxService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 方法描述
|
|
||||||
*/
|
|
||||||
List<Xxx> getXxxList(Long id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 方法描述
|
|
||||||
*/
|
|
||||||
Xxx createXxx(XxxCreateRequest request);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Impl 实现类
|
|
||||||
```java
|
|
||||||
package com.reading.platform.service.impl;
|
|
||||||
|
|
||||||
import com.reading.platform.mapper.XxxMapper;
|
|
||||||
import com.reading.platform.service.XxxService;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 服务实现类
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class XxxServiceImpl implements XxxService {
|
|
||||||
|
|
||||||
private final XxxMapper xxxMapper;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Xxx> getXxxList(Long id) {
|
|
||||||
// 业务逻辑
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Xxx createXxx(XxxCreateRequest request) {
|
|
||||||
// 业务逻辑
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 架构优势
|
|
||||||
|
|
||||||
1. **依赖倒置**:Controller 依赖接口而非具体实现
|
|
||||||
2. **易于测试**:可以通过 Mock 接口进行测试
|
|
||||||
3. **易于扩展**:可以轻松切换不同的实现
|
|
||||||
4. **代码规范**:符合 Spring 官方推荐的最佳实践
|
|
||||||
|
|
||||||
## 编译验证
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd reading-platform-java
|
|
||||||
mvn clean compile -DskipTests
|
|
||||||
```
|
|
||||||
|
|
||||||
编译结果:**BUILD SUCCESS**
|
|
||||||
|
|
||||||
## 文件统计
|
|
||||||
|
|
||||||
- 接口文件:25 个
|
|
||||||
- 实现类文件:25 个
|
|
||||||
- 总计:50 个 Service 相关文件
|
|
||||||
|
|
||||||
## 后续建议
|
|
||||||
|
|
||||||
1. 为新实现的接口添加单元测试
|
|
||||||
2. 在 CI/CD 流程中确保编译使用 JDK 17
|
|
||||||
3. 保持新增 Service 遵循 interface + impl 模式
|
|
||||||
157
docs/后端接口补全总结.md
Normal file
157
docs/后端接口补全总结.md
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
# 后端接口补全总结
|
||||||
|
|
||||||
|
本文档总结了为匹配前端 API 调用而补全的后端接口。
|
||||||
|
|
||||||
|
## 已完成的工作
|
||||||
|
|
||||||
|
### 1. 学校端 (`/api/v1/school/*`)
|
||||||
|
|
||||||
|
#### 班级管理 (`/classes`)
|
||||||
|
- `GET /list` - 获取班级列表(无分页)
|
||||||
|
- `GET /{id}/students` - 获取班级学生分页
|
||||||
|
- `GET /{id}/teachers` - 获取班级教师列表
|
||||||
|
- `POST /{id}/teachers` - 添加班级教师
|
||||||
|
- `PUT /{id}/teachers/{teacherId}` - 更新班级教师角色
|
||||||
|
- `DELETE /{id}/teachers/{teacherId}` - 移除班级教师
|
||||||
|
|
||||||
|
#### 学生管理 (`/students`)
|
||||||
|
- `POST /{id}/transfer` - 学生调班
|
||||||
|
- `GET /{id}/history` - 获取学生调班历史
|
||||||
|
|
||||||
|
### 2. 教师端 (`/api/v1/teacher/*`)
|
||||||
|
|
||||||
|
#### 课程管理 (`/courses`)
|
||||||
|
- `GET /classes` - 获取教师的班级列表
|
||||||
|
- `GET /students` - 获取教师所有学生分页
|
||||||
|
- `GET /classes/{classId}/students` - 获取班级学生分页
|
||||||
|
- `GET /classes/{classId}/teachers` - 获取班级教师列表
|
||||||
|
|
||||||
|
#### 课时管理 (`/lessons`)
|
||||||
|
- `POST /{id}/finish` - 结束课时(包含实际时长、评分等)
|
||||||
|
- `POST /{lessonId}/students/{studentId}/record` - 保存学生评价记录
|
||||||
|
- `GET /{lessonId}/student-records` - 获取课程所有学生记录
|
||||||
|
- `POST /{lessonId}/student-records/batch` - 批量保存学生评价记录
|
||||||
|
- `POST /{lessonId}/feedback` - 提交课程反馈
|
||||||
|
- `GET /{lessonId}/feedback` - 获取课程反馈
|
||||||
|
|
||||||
|
#### 课表管理 (`/schedules`)
|
||||||
|
- `GET /timetable` - 获取课表(按日期范围)
|
||||||
|
- `GET /today` - 获取今日课表
|
||||||
|
- `POST /` - 创建课表计划
|
||||||
|
- `PUT /{id}` - 更新课表计划
|
||||||
|
- `DELETE /{id}` - 取消课表计划
|
||||||
|
|
||||||
|
### 3. 家长端 (`/api/v1/parent/*`)
|
||||||
|
|
||||||
|
#### 孩子信息 (`/children`)
|
||||||
|
- `GET /` - 获取我的孩子(增强返回格式)
|
||||||
|
- `GET /{id}` - 获取孩子详情(增强返回格式)
|
||||||
|
- `GET /{childId}/lessons` - 获取孩子的课时记录
|
||||||
|
- `GET /{childId}/tasks` - 获取孩子的任务(带完成状态)
|
||||||
|
|
||||||
|
#### 任务管理 (`/tasks`)
|
||||||
|
- `PUT /{childId}/tasks/{taskId}/feedback` - 提交任务家长反馈
|
||||||
|
|
||||||
|
### 4. 管理员端 (`/api/v1/admin/*`)
|
||||||
|
|
||||||
|
管理员端接口大部分已存在,以下接口需要在未来补充:
|
||||||
|
- `PUT /themes/reorder` - 主题重新排序
|
||||||
|
- `PUT /packages/{packageId}/courses` - 设置套餐课程
|
||||||
|
- `POST /packages/{packageId}/courses` - 添加课程到套餐
|
||||||
|
- `DELETE /packages/{packageId}/courses/{courseId}` - 从套餐移除课程
|
||||||
|
- `POST /packages/{id}/submit` - 提交审核
|
||||||
|
- `POST /packages/{id}/review` - 审核套餐
|
||||||
|
- `POST /packages/{id}/publish` - 发布套餐
|
||||||
|
- `POST /packages/{id}/offline` - 下架套餐
|
||||||
|
|
||||||
|
## 实体类更新
|
||||||
|
|
||||||
|
### StudentRecord
|
||||||
|
新增字段:
|
||||||
|
- `focus` - 专注力评分 (1-5)
|
||||||
|
- `participation` - 参与度评分 (1-5)
|
||||||
|
- `interest` - 兴趣评分 (1-5)
|
||||||
|
- `understanding` - 理解度评分 (1-5)
|
||||||
|
|
||||||
|
### LessonFeedback
|
||||||
|
新增字段:
|
||||||
|
- `designQuality` - 设计质量评分 (1-5)
|
||||||
|
- `participation` - 参与度评分 (1-5)
|
||||||
|
- `goalAchievement` - 目标达成度评分 (1-5)
|
||||||
|
- `stepFeedbacks` - 环节反馈 JSON
|
||||||
|
- `pros` - 优点
|
||||||
|
- `suggestions` - 建议
|
||||||
|
- `activitiesDone` - 完成的活动 JSON
|
||||||
|
|
||||||
|
## Service 方法更新
|
||||||
|
|
||||||
|
### ClassService
|
||||||
|
- `getClassList(Long tenantId)` - 获取班级列表
|
||||||
|
- `getClassStudents(Long classId, ...)` - 获取班级学生分页
|
||||||
|
- `getClassTeachers(Long classId)` - 获取班级教师列表
|
||||||
|
- `addClassTeacher(...)` - 添加班级教师
|
||||||
|
- `updateClassTeacher(...)` - 更新班级教师角色
|
||||||
|
- `removeClassTeacher(...)` - 移除班级教师
|
||||||
|
|
||||||
|
### LessonService
|
||||||
|
- `finishLesson(...)` - 结束课时
|
||||||
|
- `saveStudentRecord(...)` - 保存学生评价记录
|
||||||
|
- `getStudentRecords(Long lessonId)` - 获取课程所有学生记录
|
||||||
|
- `batchSaveStudentRecords(...)` - 批量保存学生评价记录
|
||||||
|
- `saveLessonFeedback(...)` - 提交课程反馈
|
||||||
|
- `getLessonFeedback(Long lessonId)` - 获取课程反馈
|
||||||
|
|
||||||
|
### StudentService
|
||||||
|
- `transferStudent(...)` - 学生调班
|
||||||
|
- `getStudentClassHistory(Long studentId)` - 获取学生调班历史
|
||||||
|
|
||||||
|
### TaskService
|
||||||
|
- `getTaskCompletion(Long taskId, Long studentId)` - 获取任务完成记录
|
||||||
|
|
||||||
|
## 数据库迁移需求
|
||||||
|
|
||||||
|
需要创建数据库迁移脚本,添加以下字段:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- student_records 表新增字段
|
||||||
|
ALTER TABLE student_records ADD COLUMN focus INT COMMENT '专注力评分 (1-5)';
|
||||||
|
ALTER TABLE student_records ADD COLUMN participation INT COMMENT '参与度评分 (1-5)';
|
||||||
|
ALTER TABLE student_records ADD COLUMN interest INT COMMENT '兴趣评分 (1-5)';
|
||||||
|
ALTER TABLE student_records ADD COLUMN understanding INT COMMENT '理解度评分 (1-5)';
|
||||||
|
|
||||||
|
-- lesson_feedbacks 表新增字段
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN design_quality INT COMMENT '设计质量评分 (1-5)';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN participation INT COMMENT '参与度评分 (1-5)';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN goal_achievement INT COMMENT '目标达成度评分 (1-5)';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN step_feedbacks TEXT COMMENT '环节反馈 JSON';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN pros TEXT COMMENT '优点';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN suggestions TEXT COMMENT '建议';
|
||||||
|
ALTER TABLE lesson_feedbacks ADD COLUMN activities_done TEXT COMMENT '完成的活动 JSON';
|
||||||
|
|
||||||
|
-- student_class_history 表新增字段
|
||||||
|
ALTER TABLE student_class_history ADD COLUMN reason VARCHAR(255) COMMENT '调班原因';
|
||||||
|
```
|
||||||
|
|
||||||
|
## 待补充的接口
|
||||||
|
|
||||||
|
### 学校端
|
||||||
|
- `GET /stats/teachers/active` - 获取活跃教师统计
|
||||||
|
- `GET /stats/courses` - 获取课程使用统计
|
||||||
|
- `GET /stats/activities` - 获取最近活动
|
||||||
|
- `GET /stats/lesson-trend` - 课时趋势
|
||||||
|
- `GET /stats/course-distribution` - 课程分布
|
||||||
|
- `GET /reports/*` - 数据报告接口
|
||||||
|
|
||||||
|
### 教师端
|
||||||
|
- `POST /tasks/{taskId}/remind` - 发送任务提醒
|
||||||
|
- `GET /school-courses/*` - 校本课程相关接口
|
||||||
|
|
||||||
|
### 家长端
|
||||||
|
- `GET /growth-records/student/{studentId}` - 获取孩子成长记录(已存在,路径不同)
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. 所有新增的数据库字段需要创建 Flyway 迁移脚本
|
||||||
|
2. 部分接口的返回数据结构已调整以匹配前端需求
|
||||||
|
3. 部分 Service 方法需要进一步测试验证
|
||||||
|
4. 教师端的班级、学生过滤逻辑需要根据实际业务场景优化
|
||||||
135
docs/表名统一修改说明.md
Normal file
135
docs/表名统一修改说明.md
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
# 表名统一修改说明
|
||||||
|
|
||||||
|
## 修改时间
|
||||||
|
2026-03-10
|
||||||
|
|
||||||
|
## 修改目的
|
||||||
|
将数据库表名从复数形式改为单数形式,使其与 ORM 实体类名保持一致(除了下划线和驼峰的区别)。
|
||||||
|
|
||||||
|
## 修改内容
|
||||||
|
|
||||||
|
### 1. Flyway 迁移脚本
|
||||||
|
创建了新的 Flyway 迁移脚本:
|
||||||
|
- 文件:`reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql`
|
||||||
|
- 功能:将所有数据库表名从复数改为单数
|
||||||
|
|
||||||
|
### 2. 实体类 @TableName 注解更新
|
||||||
|
更新了 36 个实体类的 `@TableName` 注解:
|
||||||
|
|
||||||
|
| 序号 | 原表名(复数) | 新表名(单数) | 实体类名 |
|
||||||
|
|-----|---------------|---------------|---------|
|
||||||
|
| 1 | `admin_users` | `admin_user` | `AdminUser` |
|
||||||
|
| 2 | `tenants` | `tenant` | `Tenant` |
|
||||||
|
| 3 | `teachers` | `teacher` | `Teacher` |
|
||||||
|
| 4 | `students` | `student` | `Student` |
|
||||||
|
| 5 | `parents` | `parent` | `Parent` |
|
||||||
|
| 6 | `parent_students` | `parent_student` | `ParentStudent` |
|
||||||
|
| 7 | `classes` | `clazz` | `Clazz` |
|
||||||
|
| 8 | `class_teachers` | `class_teacher` | `ClassTeacher` |
|
||||||
|
| 9 | `student_class_history` | `student_class_history` | `StudentClassHistory` (无需修改) |
|
||||||
|
| 10 | `courses` | `course` | `Course` |
|
||||||
|
| 11 | `course_versions` | `course_version` | `CourseVersion` |
|
||||||
|
| 12 | `course_resources` | `course_resource` | `CourseResource` |
|
||||||
|
| 13 | `course_scripts` | `course_script` | `CourseScript` |
|
||||||
|
| 14 | `course_script_pages` | `course_script_page` | `CourseScriptPage` |
|
||||||
|
| 15 | `course_activities` | `course_activity` | `CourseActivity` |
|
||||||
|
| 16 | `course_packages` | `course_package` | `CoursePackage` |
|
||||||
|
| 17 | `school_courses` | `school_course` | `SchoolCourse` |
|
||||||
|
| 18 | `tenant_courses` | `tenant_course` | `TenantCourse` |
|
||||||
|
| 19 | `lessons` | `lesson` | `Lesson` |
|
||||||
|
| 20 | `lesson_feedbacks` | `lesson_feedback` | `LessonFeedback` |
|
||||||
|
| 21 | `student_records` | `student_record` | `StudentRecord` |
|
||||||
|
| 22 | `tasks` | `task` | `Task` |
|
||||||
|
| 23 | `task_targets` | `task_target` | `TaskTarget` |
|
||||||
|
| 24 | `task_completions` | `task_completion` | `TaskCompletion` |
|
||||||
|
| 25 | `task_templates` | `task_template` | `TaskTemplate` |
|
||||||
|
| 26 | `growth_records` | `growth_record` | `GrowthRecord` |
|
||||||
|
| 27 | `resource_libraries` | `resource_library` | `ResourceLibrary` |
|
||||||
|
| 28 | `resource_items` | `resource_item` | `ResourceItem` |
|
||||||
|
| 29 | `schedule_plans` | `schedule_plan` | `SchedulePlan` |
|
||||||
|
| 30 | `schedule_templates` | `schedule_template` | `ScheduleTemplate` |
|
||||||
|
| 31 | `system_settings` | `system_setting` | `SystemSetting` |
|
||||||
|
| 32 | `themes` | `theme` | `Theme` |
|
||||||
|
| 33 | `tags` | `tag` | `Tag` |
|
||||||
|
| 34 | `notifications` | `notification` | `Notification` |
|
||||||
|
| 35 | `operation_logs` | `operation_log` | `OperationLog` |
|
||||||
|
|
||||||
|
### 3. Mapper 接口 SQL 更新
|
||||||
|
更新了以下 Mapper 接口中的硬编码 SQL 表名:
|
||||||
|
|
||||||
|
| 文件 | 修改内容 |
|
||||||
|
|-----|---------|
|
||||||
|
| `ThemeMapper.java` | `DELETE FROM themes` → `DELETE FROM theme` |
|
||||||
|
| `ParentMapper.java` | `DELETE FROM parents` → `DELETE FROM parent` |
|
||||||
|
| `TenantMapper.java` | `DELETE FROM tenants` → `DELETE FROM tenant` (2 处) |
|
||||||
|
| `TeacherMapper.java` | `DELETE FROM teachers` → `DELETE FROM teacher` |
|
||||||
|
| `StudentMapper.java` | `DELETE FROM students` → `DELETE FROM student` |
|
||||||
|
|
||||||
|
## 部署步骤
|
||||||
|
|
||||||
|
### 步骤 1:备份数据库
|
||||||
|
在执行迁移前,务必备份开发/生产数据库:
|
||||||
|
```bash
|
||||||
|
mysqldump -u root -p reading_platform > backup_$(date +%Y%m%d).sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:执行 Flyway 迁移
|
||||||
|
启动后端服务,Flyway 会自动执行 `V22__rename_tables_to_singular.sql` 迁移脚本。
|
||||||
|
|
||||||
|
或者手动执行:
|
||||||
|
```bash
|
||||||
|
mysql -u root -p reading_platform < reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:验证迁移结果
|
||||||
|
在 MySQL 中执行:
|
||||||
|
```sql
|
||||||
|
-- 查看所有表名
|
||||||
|
SHOW TABLES;
|
||||||
|
|
||||||
|
-- 验证特定表是否存在
|
||||||
|
SHOW TABLES LIKE 'student';
|
||||||
|
SHOW TABLES LIKE 'student_record';
|
||||||
|
SHOW TABLES LIKE 'lesson_feedback';
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4:测试功能
|
||||||
|
启动后端服务后,测试以下功能:
|
||||||
|
1. 用户管理(管理员、教师、学生、家长)
|
||||||
|
2. 班级管理
|
||||||
|
3. 课程管理
|
||||||
|
4. 课时管理
|
||||||
|
5. 任务管理
|
||||||
|
6. 成长记录
|
||||||
|
7. 资源管理
|
||||||
|
8. 日程管理
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **外键处理**:迁移脚本中先禁用外键检查(`SET FOREIGN_KEY_CHECKS = 0`),执行完后再启用
|
||||||
|
2. **Flyway 历史**:确保 `flyway_schema_history` 表正确记录迁移历史
|
||||||
|
3. **生产环境**:在生产环境执行前,务必在开发/测试环境充分测试
|
||||||
|
4. **回滚方案**:如需回滚,可以准备反向迁移脚本(将单数表名改回复数)
|
||||||
|
|
||||||
|
## 相关文件清单
|
||||||
|
|
||||||
|
### 新增文件
|
||||||
|
- `reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql`
|
||||||
|
|
||||||
|
### 修改的文件
|
||||||
|
- 所有 Entity 类(36 个文件)
|
||||||
|
- 5 个 Mapper 接口
|
||||||
|
|
||||||
|
## 验证清单
|
||||||
|
|
||||||
|
- [x] 所有 Entity 类的 `@TableName` 注解已更新
|
||||||
|
- [x] 所有 Mapper 接口的 SQL 已更新
|
||||||
|
- [x] Controller 中无硬编码表名引用
|
||||||
|
- [x] Service 中无硬编码表名引用
|
||||||
|
- [x] Flyway 迁移脚本已创建
|
||||||
|
|
||||||
|
## 后续工作
|
||||||
|
|
||||||
|
1. 在开发环境执行迁移并验证
|
||||||
|
2. 更新 API 文档中的表名引用(如有)
|
||||||
|
3. 更新项目文档中的表名引用(如有)
|
||||||
224
docs/限流功能使用说明.md
Normal file
224
docs/限流功能使用说明.md
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
# 限流功能使用说明
|
||||||
|
|
||||||
|
## 功能概述
|
||||||
|
|
||||||
|
本项目已集成基于 Redis 滑动窗口算法的限流功能,支持两种使用方式:
|
||||||
|
1. **配置化限流** - 在 `application.yml` 中配置规则,自动对所有接口生效
|
||||||
|
2. **注解限流** - 在 Controller 方法上使用 `@RateLimit` 注解,针对特定接口限流
|
||||||
|
|
||||||
|
## 技术实现
|
||||||
|
|
||||||
|
### 核心组件
|
||||||
|
|
||||||
|
| 组件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `@RateLimit` | 限流注解,可自定义时间窗口、最大请求数 |
|
||||||
|
| `RateLimitProperties` | 配置化限流的属性类 |
|
||||||
|
| `RateLimiter` | Redis 限流工具类(滑动窗口算法) |
|
||||||
|
| `RateLimitAspect` | 注解限流的 AOP 切面 |
|
||||||
|
| `RateLimitInterceptor` | 配置化限流的拦截器 |
|
||||||
|
| `ErrorCode.RATE_LIMIT_EXCEEDED` | 限流错误码(5001) |
|
||||||
|
|
||||||
|
### 限流优先级
|
||||||
|
|
||||||
|
**注解限流 > 配置化限流 > 默认限流**
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
### 方式一:配置化限流(推荐作为基础防护)
|
||||||
|
|
||||||
|
在 `application.yml` 中配置:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
rate-limit:
|
||||||
|
enabled: true # 是否启用限流
|
||||||
|
default-time-window: 60 # 默认时间窗口(秒)
|
||||||
|
default-max-requests: 1000 # 默认时间窗口内最大请求数
|
||||||
|
rules: # 限流规则列表
|
||||||
|
# 登录接口限流 - 防止暴力破解
|
||||||
|
- pattern: "/api/v1/auth/login"
|
||||||
|
time-window: 60
|
||||||
|
max-requests: 10
|
||||||
|
# 验证码接口限流 - 防止刷验证码
|
||||||
|
- pattern: "/api/v1/auth/captcha"
|
||||||
|
time-window: 60
|
||||||
|
max-requests: 5
|
||||||
|
# 短信接口限流 - 防止短信轰炸
|
||||||
|
- pattern: "/api/v1/sms/**"
|
||||||
|
time-window: 60
|
||||||
|
max-requests: 3
|
||||||
|
# 文件上传接口限流
|
||||||
|
- pattern: "/api/v1/**/upload/**"
|
||||||
|
time-window: 60
|
||||||
|
max-requests: 30
|
||||||
|
exclude-patterns: # 排除限流的接口
|
||||||
|
- "/doc.html"
|
||||||
|
- "/swagger-resources/**"
|
||||||
|
- "/v3/api-docs/**"
|
||||||
|
- "/webjars/**"
|
||||||
|
- "/uploads/**"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二:注解限流(针对特殊接口)
|
||||||
|
|
||||||
|
在 Controller 方法上添加 `@RateLimit` 注解:
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.reading.platform.controller.auth;
|
||||||
|
|
||||||
|
import com.reading.platform.common.annotation.RateLimit;
|
||||||
|
import com.reading.platform.common.response.Result;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/auth")
|
||||||
|
public class AuthController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录接口 - 限流防止暴力破解
|
||||||
|
* 60 秒内最多 10 次请求
|
||||||
|
*/
|
||||||
|
@PostMapping("/login")
|
||||||
|
@RateLimit(time = 60, maxRequests = 10, message = "登录过于频繁,请稍后再试")
|
||||||
|
public Result<LoginResponse> login(@RequestBody LoginRequest request) {
|
||||||
|
// ... 登录逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信验证码 - 严格限流
|
||||||
|
* 60 秒内最多 3 次请求
|
||||||
|
*/
|
||||||
|
@PostMapping("/captcha")
|
||||||
|
@RateLimit(time = 60, maxRequests = 3, message = "操作过于频繁,请稍后再试")
|
||||||
|
public Result<Void> sendCaptcha(@RequestParam String phone) {
|
||||||
|
// ... 发送验证码逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义限流键前缀
|
||||||
|
* 适用于需要按用户 ID 等特殊维度限流的场景
|
||||||
|
*/
|
||||||
|
@PostMapping("/special")
|
||||||
|
@RateLimit(keyPrefix = "special_api:", time = 60, maxRequests = 5)
|
||||||
|
public Result<Void> specialApi() {
|
||||||
|
// ... 特殊接口逻辑
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常见限流场景建议值
|
||||||
|
|
||||||
|
| 接口类型 | 时间窗口 | 最大请求数 | 说明 |
|
||||||
|
|---------|---------|-----------|------|
|
||||||
|
| 登录接口 | 60 秒 | 10 | 防止暴力破解 |
|
||||||
|
| 验证码/短信 | 60 秒 | 3-5 | 防止短信轰炸 |
|
||||||
|
| 文件上传 | 60 秒 | 30 | 防止资源滥用 |
|
||||||
|
| 普通业务接口 | 60 秒 | 100-1000 | 根据业务调整 |
|
||||||
|
| 导出接口 | 60 秒 | 5-10 | 防止服务器过载 |
|
||||||
|
|
||||||
|
## 限流响应
|
||||||
|
|
||||||
|
当请求被限流拦截时,返回:
|
||||||
|
|
||||||
|
**配置化限流响应:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 5001,
|
||||||
|
"message": "请求过于频繁,请稍后再试",
|
||||||
|
"data": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
HTTP 状态码:`429 Too Many Requests`
|
||||||
|
|
||||||
|
响应头:
|
||||||
|
```
|
||||||
|
X-RateLimit-Limit: 1
|
||||||
|
X-RateLimit-Remaining: 0
|
||||||
|
Retry-After: 60
|
||||||
|
```
|
||||||
|
|
||||||
|
**注解限流响应:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 5001,
|
||||||
|
"message": "登录过于频繁,请稍后再试",
|
||||||
|
"data": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Redis 数据结构
|
||||||
|
|
||||||
|
限流使用 Redis 的 `Sorted Set`(有序集合)存储:
|
||||||
|
|
||||||
|
- **Key 格式**: `rate_limit:{key}`
|
||||||
|
- **Member**: 时间戳(毫秒)
|
||||||
|
- **Score**: 时间戳(毫秒)
|
||||||
|
|
||||||
|
示例:
|
||||||
|
```
|
||||||
|
rate_limit:192.168.1.1:/api/v1/auth/login
|
||||||
|
|- 1710000000000
|
||||||
|
|- 1710000001000
|
||||||
|
|- 1710000002000
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **Redis 依赖**: 限流功能依赖 Redis,需确保 Redis 服务可用
|
||||||
|
2. **异常情况放行**: 当 Redis 不可用时,系统会自动放行请求,避免影响正常业务
|
||||||
|
3. **集群部署**: 滑动窗口算法天然支持分布式,无需额外配置
|
||||||
|
4. **监控告警**: 建议添加限流触发的监控告警,及时发现异常流量
|
||||||
|
|
||||||
|
## 日志示例
|
||||||
|
|
||||||
|
```
|
||||||
|
2024-03-10 22:00:00 WARN - 请求被限流拦截:URI=/api/v1/auth/login, 规则=/api/v1/auth/login, 最大请求数=10
|
||||||
|
2024-03-10 22:00:01 DEBUG - 请求通过限流检查:URI=/api/v1/users, 规则=default
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试方法
|
||||||
|
|
||||||
|
使用 `curl` 或 Postman 快速测试:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 循环发送 15 次登录请求(第 11 次开始应该被限流)
|
||||||
|
for i in {1..15}; do
|
||||||
|
echo "请求 $i:"
|
||||||
|
curl -X POST http://localhost:8080/api/v1/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"username":"test","password":"test"}' \
|
||||||
|
-w "\nHTTP 状态码:%{http_code}\n\n"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置说明
|
||||||
|
|
||||||
|
### RateLimit 注解参数
|
||||||
|
|
||||||
|
| 参数 | 类型 | 默认值 | 说明 |
|
||||||
|
|------|------|--------|------|
|
||||||
|
| `keyPrefix` | String | "" | 限流键前缀,默认使用 `IP:类名。方法名` |
|
||||||
|
| `time` | long | 60 | 时间窗口大小 |
|
||||||
|
| `timeUnit` | TimeUnit | SECONDS | 时间单位 |
|
||||||
|
| `maxRequests` | long | 100 | 时间窗口内最大请求数 |
|
||||||
|
| `message` | String | "请求过于频繁,请稍后再试" | 限流提示信息 |
|
||||||
|
| `enabled` | boolean | true | 是否启用限流 |
|
||||||
|
|
||||||
|
### application.yml 配置参数
|
||||||
|
|
||||||
|
| 参数 | 类型 | 默认值 | 说明 |
|
||||||
|
|------|------|--------|------|
|
||||||
|
| `enabled` | boolean | true | 是否启用限流 |
|
||||||
|
| `default-time-window` | long | 60 | 默认时间窗口(秒) |
|
||||||
|
| `default-max-requests` | long | 1000 | 默认最大请求数 |
|
||||||
|
| `rules` | List | [] | 限流规则列表 |
|
||||||
|
| `exclude-patterns` | List | [] | 排除限流的接口路径 |
|
||||||
|
|
||||||
|
### RateLimitRule 配置参数
|
||||||
|
|
||||||
|
| 参数 | 类型 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| `pattern` | String | 接口路径(支持 Ant 风格通配符) |
|
||||||
|
| `time-window` | long | 时间窗口(秒) |
|
||||||
|
| `max-requests` | long | 最大请求数 |
|
||||||
@ -1,5 +1,5 @@
|
|||||||
import { http } from './index';
|
import { http } from "./index";
|
||||||
import { readingApi, GetTenantPageResult } from './client';
|
import { readingApi, GetTenantPageResult } from "./client";
|
||||||
|
|
||||||
// ==================== 类型定义 ====================
|
// ==================== 类型定义 ====================
|
||||||
|
|
||||||
@ -164,12 +164,46 @@ export interface AdminSettings {
|
|||||||
notifyBeforeDays?: number;
|
notifyBeforeDays?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AdminSettingsUpdateRequest {
|
||||||
|
systemName?: string;
|
||||||
|
systemDesc?: string;
|
||||||
|
contactPhone?: string;
|
||||||
|
contactEmail?: string;
|
||||||
|
systemLogo?: string;
|
||||||
|
passwordStrength?: string;
|
||||||
|
maxLoginAttempts?: number;
|
||||||
|
tokenExpire?: string;
|
||||||
|
forceHttps?: boolean;
|
||||||
|
emailEnabled?: boolean;
|
||||||
|
smtpHost?: string;
|
||||||
|
smtpPort?: number;
|
||||||
|
smtpUser?: string;
|
||||||
|
smtpPassword?: string;
|
||||||
|
fromEmail?: string;
|
||||||
|
smsEnabled?: boolean;
|
||||||
|
storageType?: string;
|
||||||
|
maxFileSize?: number;
|
||||||
|
allowedTypes?: string;
|
||||||
|
defaultTeacherQuota?: number;
|
||||||
|
defaultStudentQuota?: number;
|
||||||
|
enableAutoExpire?: boolean;
|
||||||
|
notifyBeforeDays?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TenantStatusUpdateRequest {
|
||||||
|
status: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TenantQuotaUpdateRequest {
|
||||||
|
packageType?: string;
|
||||||
|
teacherQuota?: number;
|
||||||
|
studentQuota?: number;
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 租户管理 ====================
|
// ==================== 租户管理 ====================
|
||||||
|
|
||||||
export const getTenants = (
|
export const getTenants = (params: TenantQueryParams) =>
|
||||||
params: TenantQueryParams,
|
readingApi.getTenantPage(params);
|
||||||
): Promise<GetTenantPageResult> =>
|
|
||||||
readingApi.getTenantPage(params as any).then((res) => res.data as any);
|
|
||||||
|
|
||||||
export const getTenant = (id: number): Promise<TenantDetail> =>
|
export const getTenant = (id: number): Promise<TenantDetail> =>
|
||||||
readingApi.getTenant(id).then((res) => res.data as any);
|
readingApi.getTenant(id).then((res) => res.data as any);
|
||||||
@ -182,7 +216,7 @@ export const createTenant = (
|
|||||||
// Orval 将返回值定义为 ResultTenant / ResultMapStringString,这里按现有前端期望结构进行兼容转换
|
// Orval 将返回值定义为 ResultTenant / ResultMapStringString,这里按现有前端期望结构进行兼容转换
|
||||||
return {
|
return {
|
||||||
...(map as Tenant),
|
...(map as Tenant),
|
||||||
tempPassword: (map as any).tempPassword ?? '',
|
tempPassword: (map as any).tempPassword ?? "",
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -196,9 +230,7 @@ export const updateTenantQuota = (
|
|||||||
id: number,
|
id: number,
|
||||||
data: UpdateTenantQuotaDto,
|
data: UpdateTenantQuotaDto,
|
||||||
): Promise<Tenant> =>
|
): Promise<Tenant> =>
|
||||||
readingApi
|
readingApi.updateTenantQuota(id, data as any).then((res) => res.data as any);
|
||||||
.updateTenantQuota(id, data as any)
|
|
||||||
.then((res) => res.data as any);
|
|
||||||
|
|
||||||
export const updateTenantStatus = (
|
export const updateTenantStatus = (
|
||||||
id: number,
|
id: number,
|
||||||
@ -224,19 +256,11 @@ export const getAdminStats = (): Promise<AdminStats> =>
|
|||||||
export const getTrendData = (): Promise<TrendData[]> =>
|
export const getTrendData = (): Promise<TrendData[]> =>
|
||||||
readingApi.getTrendData().then((res) => res.data as any);
|
readingApi.getTrendData().then((res) => res.data as any);
|
||||||
|
|
||||||
export const getActiveTenants = (
|
export const getActiveTenants = (limit?: number): Promise<ActiveTenant[]> =>
|
||||||
limit?: number,
|
readingApi.getActiveTenants({ limit } as any).then((res) => res.data as any);
|
||||||
): Promise<ActiveTenant[]> =>
|
|
||||||
readingApi
|
|
||||||
.getActiveTenants({ limit } as any)
|
|
||||||
.then((res) => res.data as any);
|
|
||||||
|
|
||||||
export const getPopularCourses = (
|
export const getPopularCourses = (limit?: number): Promise<PopularCourse[]> =>
|
||||||
limit?: number,
|
readingApi.getPopularCourses({ limit } as any).then((res) => res.data as any);
|
||||||
): Promise<PopularCourse[]> =>
|
|
||||||
readingApi
|
|
||||||
.getPopularCourses({ limit } as any)
|
|
||||||
.then((res) => res.data as any);
|
|
||||||
|
|
||||||
// ==================== 系统设置 ====================
|
// ==================== 系统设置 ====================
|
||||||
|
|
||||||
@ -246,6 +270,4 @@ export const getAdminSettings = (): Promise<AdminSettings> =>
|
|||||||
export const updateAdminSettings = (
|
export const updateAdminSettings = (
|
||||||
data: Record<string, any>,
|
data: Record<string, any>,
|
||||||
): Promise<AdminSettings> =>
|
): Promise<AdminSettings> =>
|
||||||
readingApi
|
readingApi.updateSettings1(data as any).then(() => getAdminSettings());
|
||||||
.updateSettings1(data as any)
|
|
||||||
.then(() => getAdminSettings());
|
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 活跃教师统计响应
|
||||||
|
*/
|
||||||
|
export interface ActiveTeacherStatsResponse {
|
||||||
|
/** 教师 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 教师姓名 */
|
||||||
|
name?: string;
|
||||||
|
/** 课时数 */
|
||||||
|
lessonCount?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理员设置更新请求
|
||||||
|
*/
|
||||||
|
export interface AdminSettingsUpdateRequest {
|
||||||
|
/** 系统名称 */
|
||||||
|
systemName?: string;
|
||||||
|
/** 系统描述 */
|
||||||
|
systemDesc?: string;
|
||||||
|
/** 联系电话 */
|
||||||
|
contactPhone?: string;
|
||||||
|
/** 联系邮箱 */
|
||||||
|
contactEmail?: string;
|
||||||
|
/** 系统 Logo */
|
||||||
|
systemLogo?: string;
|
||||||
|
/** 密码强度 */
|
||||||
|
passwordStrength?: string;
|
||||||
|
/** 最大登录尝试次数 */
|
||||||
|
maxLoginAttempts?: number;
|
||||||
|
/** Token 过期时间 */
|
||||||
|
tokenExpire?: string;
|
||||||
|
/** 强制 HTTPS */
|
||||||
|
forceHttps?: boolean;
|
||||||
|
/** 邮箱启用 */
|
||||||
|
emailEnabled?: boolean;
|
||||||
|
/** SMTP 主机 */
|
||||||
|
smtpHost?: string;
|
||||||
|
/** SMTP 端口 */
|
||||||
|
smtpPort?: number;
|
||||||
|
/** SMTP 用户 */
|
||||||
|
smtpUser?: string;
|
||||||
|
/** SMTP 密码 */
|
||||||
|
smtpPassword?: string;
|
||||||
|
/** 发件人邮箱 */
|
||||||
|
fromEmail?: string;
|
||||||
|
/** 短信启用 */
|
||||||
|
smsEnabled?: boolean;
|
||||||
|
/** 存储类型 */
|
||||||
|
storageType?: string;
|
||||||
|
/** 最大文件大小 */
|
||||||
|
maxFileSize?: number;
|
||||||
|
/** 允许的文件类型 */
|
||||||
|
allowedTypes?: string;
|
||||||
|
/** 默认教师配额 */
|
||||||
|
defaultTeacherQuota?: number;
|
||||||
|
/** 默认学生配额 */
|
||||||
|
defaultStudentQuota?: number;
|
||||||
|
/** 启用自动过期 */
|
||||||
|
enableAutoExpire?: boolean;
|
||||||
|
/** 提前通知天数 */
|
||||||
|
notifyBeforeDays?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理员统计数据响应
|
||||||
|
*/
|
||||||
|
export interface AdminStatsResponse {
|
||||||
|
/** 租户总数 */
|
||||||
|
tenantCount?: number;
|
||||||
|
/** 活跃租户数 */
|
||||||
|
activeTenantCount?: number;
|
||||||
|
/** 教师总数 */
|
||||||
|
teacherCount?: number;
|
||||||
|
/** 学生总数 */
|
||||||
|
studentCount?: number;
|
||||||
|
/** 课程总数 */
|
||||||
|
courseCount?: number;
|
||||||
|
/** 已发布课程数 */
|
||||||
|
publishedCourseCount?: number;
|
||||||
|
/** 课时总数 */
|
||||||
|
lessonCount?: number;
|
||||||
|
/** 本月课时数 */
|
||||||
|
monthlyLessons?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StudentRecordResponse } from './studentRecordResponse';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量保存学生记录响应
|
||||||
|
*/
|
||||||
|
export interface BatchSaveStudentRecordResponse {
|
||||||
|
/** 保存数量 */
|
||||||
|
count?: number;
|
||||||
|
/** 学生记录列表 */
|
||||||
|
records?: StudentRecordResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { BatchStudentRecordRequestRecordsItem } from './batchStudentRecordRequestRecordsItem';
|
||||||
|
|
||||||
|
export interface BatchStudentRecordRequest {
|
||||||
|
records?: BatchStudentRecordRequestRecordsItem[];
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type BatchStudentRecordRequestRecordsItem = {[key: string]: { [key: string]: unknown }};
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ChildStats } from './childStats';
|
||||||
|
import type { ClassInfo } from './classInfo';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 孩子详情响应
|
||||||
|
*/
|
||||||
|
export interface ChildDetailResponse {
|
||||||
|
/** 孩子 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 孩子姓名 */
|
||||||
|
name?: string;
|
||||||
|
/** 性别 */
|
||||||
|
gender?: string;
|
||||||
|
/** 出生日期 */
|
||||||
|
birthDate?: string;
|
||||||
|
/** 阅读次数 */
|
||||||
|
readingCount?: number;
|
||||||
|
/** 课时数 */
|
||||||
|
lessonCount?: number;
|
||||||
|
stats?: ChildStats;
|
||||||
|
classInfo?: ClassInfo;
|
||||||
|
/** 关系 */
|
||||||
|
relationship?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ClassInfo } from './classInfo';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 孩子信息响应
|
||||||
|
*/
|
||||||
|
export interface ChildInfoResponse {
|
||||||
|
/** 孩子 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 孩子姓名 */
|
||||||
|
name?: string;
|
||||||
|
/** 性别 */
|
||||||
|
gender?: string;
|
||||||
|
/** 出生日期 */
|
||||||
|
birthDate?: string;
|
||||||
|
/** 阅读次数 */
|
||||||
|
readingCount?: number;
|
||||||
|
/** 课时数 */
|
||||||
|
lessonCount?: number;
|
||||||
|
classInfo?: ClassInfo;
|
||||||
|
/** 关系 */
|
||||||
|
relationship?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 孩子统计信息
|
||||||
|
*/
|
||||||
|
export interface ChildStats {
|
||||||
|
/** 课时记录数 */
|
||||||
|
lessonRecords?: number;
|
||||||
|
/** 成长记录数 */
|
||||||
|
growthRecords?: number;
|
||||||
|
/** 任务完成数 */
|
||||||
|
taskCompletions?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息
|
||||||
|
*/
|
||||||
|
export interface ClassInfo {
|
||||||
|
/** 班级 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 年级 */
|
||||||
|
grade?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息响应
|
||||||
|
*/
|
||||||
|
export interface ClassInfoResponse {
|
||||||
|
/** 班级 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 年级 */
|
||||||
|
grade?: string;
|
||||||
|
/** 学生数量 */
|
||||||
|
studentCount?: number;
|
||||||
|
/** 课时数量 */
|
||||||
|
lessonCount?: number;
|
||||||
|
/** 我的角色 */
|
||||||
|
myRole?: string;
|
||||||
|
/** 是否主教 */
|
||||||
|
isPrimary?: boolean;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级简单信息
|
||||||
|
*/
|
||||||
|
export interface ClassSimpleInfo {
|
||||||
|
/** 班级 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 年级 */
|
||||||
|
grade?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级教师关联
|
||||||
|
*/
|
||||||
|
export interface ClassTeacher {
|
||||||
|
/** ID */
|
||||||
|
readonly id?: string;
|
||||||
|
classId?: string;
|
||||||
|
teacherId?: string;
|
||||||
|
role?: string;
|
||||||
|
isPrimary?: boolean;
|
||||||
|
sortOrder?: number;
|
||||||
|
/** 创建人用户名 */
|
||||||
|
readonly createdBy?: string;
|
||||||
|
/** 更新人用户名 */
|
||||||
|
readonly updatedBy?: string;
|
||||||
|
/** 创建时间 */
|
||||||
|
readonly createdAt?: string;
|
||||||
|
/** 更新时间 */
|
||||||
|
readonly updatedAt?: string;
|
||||||
|
/** 逻辑删除标志 */
|
||||||
|
readonly deleted?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface ClassTeacherRequest {
|
||||||
|
teacherId?: string;
|
||||||
|
role?: string;
|
||||||
|
isPrimary?: boolean;
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { Lesson } from './lesson';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页响应
|
||||||
|
*/
|
||||||
|
export interface CommonPageResponseLesson {
|
||||||
|
/** 数据列表 */
|
||||||
|
items?: Lesson[];
|
||||||
|
/** 总数 */
|
||||||
|
total?: number;
|
||||||
|
/** 当前页码 */
|
||||||
|
page?: number;
|
||||||
|
/** 每页大小 */
|
||||||
|
pageSize?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskCompletionInfoResponse } from './taskCompletionInfoResponse';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页响应
|
||||||
|
*/
|
||||||
|
export interface CommonPageResponseTaskCompletionInfoResponse {
|
||||||
|
/** 数据列表 */
|
||||||
|
items?: TaskCompletionInfoResponse[];
|
||||||
|
/** 总数 */
|
||||||
|
total?: number;
|
||||||
|
/** 当前页码 */
|
||||||
|
page?: number;
|
||||||
|
/** 每页大小 */
|
||||||
|
pageSize?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程分布响应
|
||||||
|
*/
|
||||||
|
export interface CourseDistributionResponse {
|
||||||
|
/** 课程名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 课时数量 */
|
||||||
|
value?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 热门课程统计响应
|
||||||
|
*/
|
||||||
|
export interface CourseStatsResponse {
|
||||||
|
/** 课程 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 课程名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 分类 */
|
||||||
|
category?: string;
|
||||||
|
/** 状态 */
|
||||||
|
status?: string;
|
||||||
|
/** 使用次数 */
|
||||||
|
usageCount?: number;
|
||||||
|
/** 教师数 */
|
||||||
|
teacherCount?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程使用统计响应
|
||||||
|
*/
|
||||||
|
export interface CourseUsageStatsResponse {
|
||||||
|
/** 课程 ID */
|
||||||
|
courseId?: string;
|
||||||
|
/** 课程名称 */
|
||||||
|
courseName?: string;
|
||||||
|
/** 使用次数 */
|
||||||
|
usageCount?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传响应
|
||||||
|
*/
|
||||||
|
export interface FileUploadResponse {
|
||||||
|
/** 文件 URL */
|
||||||
|
fileUrl?: string;
|
||||||
|
/** 文件名称 */
|
||||||
|
fileName?: string;
|
||||||
|
/** 文件大小 */
|
||||||
|
fileSize?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetChildLessonsParams = {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
};
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetChildTasksParams = {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
status?: string;
|
||||||
|
};
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetClassStudents1Params = {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
keyword?: string;
|
||||||
|
};
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetClassStudentsParams = {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
keyword?: string;
|
||||||
|
};
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetTeacherStudentsParams = {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
keyword?: string;
|
||||||
|
};
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GetTimetable1Params = {
|
||||||
|
startDate?: string;
|
||||||
|
endDate?: string;
|
||||||
|
classId?: string;
|
||||||
|
};
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入模板响应
|
||||||
|
*/
|
||||||
|
export interface ImportTemplateResponse {
|
||||||
|
/** 表头 */
|
||||||
|
headers?: string[];
|
||||||
|
/** 示例数据 */
|
||||||
|
example?: string[];
|
||||||
|
}
|
||||||
@ -6,188 +6,295 @@
|
|||||||
* OpenAPI spec version: 1.0.0
|
* OpenAPI spec version: 1.0.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export * from './approveCourseParams';
|
export * from "./activeTeacherStatsResponse";
|
||||||
export * from './bindStudentParams';
|
export * from "./adminSettingsUpdateRequest";
|
||||||
export * from './changePasswordParams';
|
export * from "./adminStatsResponse";
|
||||||
export * from './classCreateRequest';
|
export * from "./approveCourseParams";
|
||||||
export * from './classUpdateRequest';
|
export * from "./batchSaveStudentRecordResponse";
|
||||||
export * from './clazz';
|
export * from "./batchStudentRecordRequest";
|
||||||
export * from './completeTaskParams';
|
export * from "./batchStudentRecordRequestRecordsItem";
|
||||||
export * from './course';
|
export * from "./bindStudentParams";
|
||||||
export * from './courseCreateRequest';
|
export * from "./changePasswordParams";
|
||||||
export * from './courseLesson';
|
export * from "./childDetailResponse";
|
||||||
export * from './coursePackage';
|
export * from "./childInfoResponse";
|
||||||
export * from './courseUpdateRequest';
|
export * from "./childStats";
|
||||||
export * from './createTaskFromTemplateRequest';
|
export * from "./classCreateRequest";
|
||||||
export * from './deleteFileParams';
|
export * from "./classInfo";
|
||||||
export * from './getActiveTeachersParams';
|
export * from "./classInfoResponse";
|
||||||
export * from './getActiveTenantsParams';
|
export * from "./classSimpleInfo";
|
||||||
export * from './getActivitiesParams';
|
export * from "./classTeacher";
|
||||||
export * from './getClassPageParams';
|
export * from "./classTeacherRequest";
|
||||||
export * from './getCompletions1Params';
|
export * from "./classUpdateRequest";
|
||||||
export * from './getCompletionsParams';
|
export * from "./clazz";
|
||||||
export * from './getCoursePage1Params';
|
export * from "./commonPageResponseLesson";
|
||||||
export * from './getCoursePageParams';
|
export * from "./commonPageResponseTaskCompletionInfoResponse";
|
||||||
export * from './getCourses1Params';
|
export * from "./completeTaskParams";
|
||||||
export * from './getCoursesParams';
|
export * from "./course";
|
||||||
export * from './getGrowthRecordPage1Params';
|
export * from "./courseCreateRequest";
|
||||||
export * from './getGrowthRecordPageParams';
|
export * from "./courseDistributionResponse";
|
||||||
export * from './getGrowthRecordsByStudentParams';
|
export * from "./courseLesson";
|
||||||
export * from './getItemsParams';
|
export * from "./coursePackage";
|
||||||
export * from './getLessonTrendParams';
|
export * from "./courseStatsResponse";
|
||||||
export * from './getLibrariesParams';
|
export * from "./courseUpdateRequest";
|
||||||
export * from './getLogs1Params';
|
export * from "./courseUsageStatsResponse";
|
||||||
export * from './getLogsParams';
|
export * from "./createTaskFromTemplateRequest";
|
||||||
export * from './getMonthlyStats1Params';
|
export * from "./deleteFileParams";
|
||||||
export * from './getMonthlyStatsParams';
|
export * from "./fileUploadResponse";
|
||||||
export * from './getMyLessonsParams';
|
export * from "./getActiveTeachersParams";
|
||||||
export * from './getMyNotifications1Params';
|
export * from "./getActiveTenantsParams";
|
||||||
export * from './getMyNotifications2Params';
|
export * from "./getActivitiesParams";
|
||||||
export * from './getMyNotificationsParams';
|
export * from "./getChildLessonsParams";
|
||||||
export * from './getPackages1Params';
|
export * from "./getChildTasksParams";
|
||||||
export * from './getPackagesParams';
|
export * from "./getClassPageParams";
|
||||||
export * from './getParentPageParams';
|
export * from "./getClassStudents1Params";
|
||||||
export * from './getPopularCoursesParams';
|
export * from "./getClassStudentsParams";
|
||||||
export * from './getRecentActivitiesParams';
|
export * from "./getCompletions1Params";
|
||||||
export * from './getRecentGrowthRecordsParams';
|
export * from "./getCompletionsParams";
|
||||||
export * from './getReviewCoursePageParams';
|
export * from "./getCoursePage1Params";
|
||||||
export * from './getSchedulePlans1Params';
|
export * from "./getCoursePageParams";
|
||||||
export * from './getSchedulePlansParams';
|
export * from "./getCourses1Params";
|
||||||
export * from './getScheduleTemplatesParams';
|
export * from "./getCoursesParams";
|
||||||
export * from './getStudentPageParams';
|
export * from "./getGrowthRecordPage1Params";
|
||||||
export * from './getTaskPage1Params';
|
export * from "./getGrowthRecordPageParams";
|
||||||
export * from './getTaskPageParams';
|
export * from "./getGrowthRecordsByStudentParams";
|
||||||
export * from './getTasksByStudentParams';
|
export * from "./getItemsParams";
|
||||||
export * from './getTeacherPageParams';
|
export * from "./getLessonTrendParams";
|
||||||
export * from './getTemplates1Params';
|
export * from "./getLibrariesParams";
|
||||||
export * from './getTemplatesParams';
|
export * from "./getLogs1Params";
|
||||||
export * from './getTenantPageParams';
|
export * from "./getLogsParams";
|
||||||
export * from './getThemesParams';
|
export * from "./getMonthlyStats1Params";
|
||||||
export * from './getTimetableParams';
|
export * from "./getMonthlyStatsParams";
|
||||||
export * from './growthRecord';
|
export * from "./getMyLessonsParams";
|
||||||
export * from './growthRecordCreateRequest';
|
export * from "./getMyNotifications1Params";
|
||||||
export * from './growthRecordUpdateRequest';
|
export * from "./getMyNotifications2Params";
|
||||||
export * from './lesson';
|
export * from "./getMyNotificationsParams";
|
||||||
export * from './lessonCreateRequest';
|
export * from "./getPackages1Params";
|
||||||
export * from './lessonUpdateRequest';
|
export * from "./getPackagesParams";
|
||||||
export * from './localTime';
|
export * from "./getParentPageParams";
|
||||||
export * from './loginRequest';
|
export * from "./getPopularCoursesParams";
|
||||||
export * from './loginResponse';
|
export * from "./getRecentActivitiesParams";
|
||||||
export * from './notification';
|
export * from "./getRecentGrowthRecordsParams";
|
||||||
export * from './operationLog';
|
export * from "./getReviewCoursePageParams";
|
||||||
export * from './pageResultClazz';
|
export * from "./getSchedulePlans1Params";
|
||||||
export * from './pageResultCourse';
|
export * from "./getSchedulePlansParams";
|
||||||
export * from './pageResultCoursePackage';
|
export * from "./getScheduleTemplatesParams";
|
||||||
export * from './pageResultGrowthRecord';
|
export * from "./getStudentPageParams";
|
||||||
export * from './pageResultLesson';
|
export * from "./getTaskPage1Params";
|
||||||
export * from './pageResultNotification';
|
export * from "./getTaskPageParams";
|
||||||
export * from './pageResultOperationLog';
|
export * from "./getTasksByStudentParams";
|
||||||
export * from './pageResultParent';
|
export * from "./getTeacherPageParams";
|
||||||
export * from './pageResultResourceItem';
|
export * from "./getTeacherStudentsParams";
|
||||||
export * from './pageResultSchedulePlan';
|
export * from "./getTemplates1Params";
|
||||||
export * from './pageResultScheduleTemplate';
|
export * from "./getTemplatesParams";
|
||||||
export * from './pageResultSchoolCourse';
|
export * from "./getTenantPageParams";
|
||||||
export * from './pageResultStudent';
|
export * from "./getThemesParams";
|
||||||
export * from './pageResultTask';
|
export * from "./getTimetable1Params";
|
||||||
export * from './pageResultTaskCompletion';
|
export * from "./getTimetableParams";
|
||||||
export * from './pageResultTaskTemplate';
|
export * from "./growthRecord";
|
||||||
export * from './pageResultTeacher';
|
export * from "./growthRecordCreateRequest";
|
||||||
export * from './pageResultTenant';
|
export * from "./growthRecordUpdateRequest";
|
||||||
export * from './parent';
|
export * from "./importTemplateResponse";
|
||||||
export * from './parentCreateRequest';
|
export * from "./lesson";
|
||||||
export * from './parentUpdateRequest';
|
export * from "./lessonActivityResponse";
|
||||||
export * from './rejectCourseParams';
|
export * from "./lessonCreateRequest";
|
||||||
export * from './resetPassword1Params';
|
export * from "./lessonFeedback";
|
||||||
export * from './resetPasswordParams';
|
export * from "./lessonFeedbackRequest";
|
||||||
export * from './resourceItem';
|
export * from "./lessonFeedbackRequestActivitiesDone";
|
||||||
export * from './resourceLibrary';
|
export * from "./lessonFeedbackRequestStepFeedbacks";
|
||||||
export * from './resultClazz';
|
export * from "./lessonFinishRequest";
|
||||||
export * from './resultCourse';
|
export * from "./lessonSimpleInfo";
|
||||||
export * from './resultCourseLesson';
|
export * from "./lessonSimpleResponse";
|
||||||
export * from './resultCoursePackage';
|
export * from "./lessonUpdateRequest";
|
||||||
export * from './resultGrowthRecord';
|
export * from "./localTime";
|
||||||
export * from './resultLesson';
|
export * from "./loginRequest";
|
||||||
export * from './resultListCourse';
|
export * from "./loginResponse";
|
||||||
export * from './resultListCourseLesson';
|
export * from "./messageResponse";
|
||||||
export * from './resultListGrowthRecord';
|
export * from "./monthlyTaskStatsResponse";
|
||||||
export * from './resultListLesson';
|
export * from "./notification";
|
||||||
export * from './resultListMapStringObject';
|
export * from "./operationLog";
|
||||||
export * from './resultListMapStringObjectDataItem';
|
export * from "./pageResultClazz";
|
||||||
export * from './resultListResourceLibrary';
|
export * from "./pageResultCourse";
|
||||||
export * from './resultListSchedulePlan';
|
export * from "./pageResultCoursePackage";
|
||||||
export * from './resultListStudent';
|
export * from "./pageResultGrowthRecord";
|
||||||
export * from './resultListTenantResponse';
|
export * from "./pageResultLesson";
|
||||||
export * from './resultListTheme';
|
export * from "./pageResultNotification";
|
||||||
export * from './resultLoginResponse';
|
export * from "./pageResultOperationLog";
|
||||||
export * from './resultLong';
|
export * from "./pageResultParent";
|
||||||
export * from './resultMapStringObject';
|
export * from "./pageResultResourceItem";
|
||||||
export * from './resultMapStringObjectData';
|
export * from "./pageResultSchedulePlan";
|
||||||
export * from './resultMapStringString';
|
export * from "./pageResultScheduleTemplate";
|
||||||
export * from './resultMapStringStringData';
|
export * from "./pageResultSchoolCourse";
|
||||||
export * from './resultNotification';
|
export * from "./pageResultStudent";
|
||||||
export * from './resultPageResultClazz';
|
export * from "./pageResultStudentInfoResponse";
|
||||||
export * from './resultPageResultCourse';
|
export * from "./pageResultTask";
|
||||||
export * from './resultPageResultCoursePackage';
|
export * from "./pageResultTaskCompletion";
|
||||||
export * from './resultPageResultGrowthRecord';
|
export * from "./pageResultTaskTemplate";
|
||||||
export * from './resultPageResultLesson';
|
export * from "./pageResultTeacher";
|
||||||
export * from './resultPageResultNotification';
|
export * from "./pageResultTenant";
|
||||||
export * from './resultPageResultOperationLog';
|
export * from "./parent";
|
||||||
export * from './resultPageResultParent';
|
export * from "./parentCreateRequest";
|
||||||
export * from './resultPageResultResourceItem';
|
export * from "./parentUpdateRequest";
|
||||||
export * from './resultPageResultSchedulePlan';
|
export * from "./recentActivityResponse";
|
||||||
export * from './resultPageResultScheduleTemplate';
|
export * from "./rejectCourseParams";
|
||||||
export * from './resultPageResultSchoolCourse';
|
export * from "./resetPassword1Params";
|
||||||
export * from './resultPageResultStudent';
|
export * from "./resetPasswordParams";
|
||||||
export * from './resultPageResultTask';
|
export * from "./resetPasswordResponse";
|
||||||
export * from './resultPageResultTaskCompletion';
|
export * from "./resourceItem";
|
||||||
export * from './resultPageResultTaskTemplate';
|
export * from "./resourceLibrary";
|
||||||
export * from './resultPageResultTeacher';
|
export * from "./resultAdminStatsResponse";
|
||||||
export * from './resultPageResultTenant';
|
export * from "./resultBatchSaveStudentRecordResponse";
|
||||||
export * from './resultParent';
|
export * from "./resultChildDetailResponse";
|
||||||
export * from './resultResourceItem';
|
export * from "./resultClassTeacher";
|
||||||
export * from './resultResourceLibrary';
|
export * from "./resultClazz";
|
||||||
export * from './resultSchedulePlan';
|
export * from "./resultCommonPageResponseLesson";
|
||||||
export * from './resultScheduleTemplate';
|
export * from "./resultCommonPageResponseTaskCompletionInfoResponse";
|
||||||
export * from './resultSchoolCourse';
|
export * from "./resultCourse";
|
||||||
export * from './resultStudent';
|
export * from "./resultCourseLesson";
|
||||||
export * from './resultTask';
|
export * from "./resultCoursePackage";
|
||||||
export * from './resultTaskCompletion';
|
export * from "./resultFileUploadResponse";
|
||||||
export * from './resultTaskTemplate';
|
export * from "./resultGrowthRecord";
|
||||||
export * from './resultTeacher';
|
export * from "./resultImportTemplateResponse";
|
||||||
export * from './resultTenant';
|
export * from "./resultLesson";
|
||||||
export * from './resultTheme';
|
export * from "./resultLessonFeedback";
|
||||||
export * from './resultUserInfoResponse';
|
export * from "./resultListActiveTeacherStatsResponse";
|
||||||
export * from './resultVoid';
|
export * from "./resultListChildInfoResponse";
|
||||||
export * from './resultVoidData';
|
export * from "./resultListClassInfoResponse";
|
||||||
export * from './reviewPackageBody';
|
export * from "./resultListClassTeacher";
|
||||||
export * from './schedulePlan';
|
export * from "./resultListClazz";
|
||||||
export * from './schedulePlanCreateRequest';
|
export * from "./resultListCourse";
|
||||||
export * from './scheduleTemplate';
|
export * from "./resultListCourseDistributionResponse";
|
||||||
export * from './scheduleTemplateApplyRequest';
|
export * from "./resultListCourseLesson";
|
||||||
export * from './schoolCourse';
|
export * from "./resultListCourseStatsResponse";
|
||||||
export * from './student';
|
export * from "./resultListCourseUsageStatsResponse";
|
||||||
export * from './studentCreateRequest';
|
export * from "./resultListGrowthRecord";
|
||||||
export * from './studentUpdateRequest';
|
export * from "./resultListLesson";
|
||||||
export * from './task';
|
export * from "./resultListLessonActivityResponse";
|
||||||
export * from './taskCompletion';
|
export * from "./resultListLessonSimpleResponse";
|
||||||
export * from './taskCreateRequest';
|
export * from "./resultListMapStringObject";
|
||||||
export * from './taskTemplate';
|
export * from "./resultListMapStringObjectDataItem";
|
||||||
export * from './taskTemplateCreateRequest';
|
export * from "./resultListMonthlyTaskStatsResponse";
|
||||||
export * from './taskTemplateUpdateRequest';
|
export * from "./resultListRecentActivityResponse";
|
||||||
export * from './taskUpdateRequest';
|
export * from "./resultListResourceLibrary";
|
||||||
export * from './teacher';
|
export * from "./resultListSchedulePlan";
|
||||||
export * from './teacherCreateRequest';
|
export * from "./resultListSchedulePlanResponse";
|
||||||
export * from './teacherUpdateRequest';
|
export * from "./resultListStudent";
|
||||||
export * from './tenant';
|
export * from "./resultListStudentTransferHistoryResponse";
|
||||||
export * from './tenantCreateRequest';
|
export * from "./resultListTaskStatsByClassResponse";
|
||||||
export * from './tenantResponse';
|
export * from "./resultListTaskStatsByTypeResponse";
|
||||||
export * from './tenantUpdateRequest';
|
export * from "./resultListTeacherInfoResponse";
|
||||||
export * from './theme';
|
export * from "./resultListTenantResponse";
|
||||||
export * from './updateCompletion1Params';
|
export * from "./resultListTenantStatsResponse";
|
||||||
export * from './updateCompletionParams';
|
export * from "./resultListTheme";
|
||||||
export * from './updateSettings1Body';
|
export * from "./resultListTrendDataPointResponse";
|
||||||
export * from './updateSettingsBody';
|
export * from "./resultListTrendDataResponse";
|
||||||
export * from './updateTenantQuotaBody';
|
export * from "./resultLoginResponse";
|
||||||
export * from './updateTenantStatusBody';
|
export * from "./resultLong";
|
||||||
export * from './uploadFileBody';
|
export * from "./resultMapStringObject";
|
||||||
export * from './userInfoResponse';
|
export * from "./resultMapStringObjectData";
|
||||||
|
export * from "./resultMapStringString";
|
||||||
|
export * from "./resultMapStringStringData";
|
||||||
|
export * from "./resultMessageResponse";
|
||||||
|
export * from "./resultNotification";
|
||||||
|
export * from "./resultPageResultClazz";
|
||||||
|
export * from "./resultPageResultCourse";
|
||||||
|
export * from "./resultPageResultCoursePackage";
|
||||||
|
export * from "./resultPageResultGrowthRecord";
|
||||||
|
export * from "./resultPageResultLesson";
|
||||||
|
export * from "./resultPageResultNotification";
|
||||||
|
export * from "./resultPageResultOperationLog";
|
||||||
|
export * from "./resultPageResultParent";
|
||||||
|
export * from "./resultPageResultResourceItem";
|
||||||
|
export * from "./resultPageResultSchedulePlan";
|
||||||
|
export * from "./resultPageResultScheduleTemplate";
|
||||||
|
export * from "./resultPageResultSchoolCourse";
|
||||||
|
export * from "./resultPageResultStudent";
|
||||||
|
export * from "./resultPageResultStudentInfoResponse";
|
||||||
|
export * from "./resultPageResultTask";
|
||||||
|
export * from "./resultPageResultTaskCompletion";
|
||||||
|
export * from "./resultPageResultTaskTemplate";
|
||||||
|
export * from "./resultPageResultTeacher";
|
||||||
|
export * from "./resultPageResultTenant";
|
||||||
|
export * from "./resultParent";
|
||||||
|
export * from "./resultResetPasswordResponse";
|
||||||
|
export * from "./resultResourceItem";
|
||||||
|
export * from "./resultResourceLibrary";
|
||||||
|
export * from "./resultSchedulePlan";
|
||||||
|
export * from "./resultScheduleTemplate";
|
||||||
|
export * from "./resultSchoolCourse";
|
||||||
|
export * from "./resultStatsResponse";
|
||||||
|
export * from "./resultStudent";
|
||||||
|
export * from "./resultStudentRecord";
|
||||||
|
export * from "./resultStudentRecordListResponse";
|
||||||
|
export * from "./resultSystemSettingsResponse";
|
||||||
|
export * from "./resultTask";
|
||||||
|
export * from "./resultTaskCompletion";
|
||||||
|
export * from "./resultTaskFeedbackResponse";
|
||||||
|
export * from "./resultTaskStatsResponse";
|
||||||
|
export * from "./resultTaskTemplate";
|
||||||
|
export * from "./resultTeacher";
|
||||||
|
export * from "./resultTeacherDashboardResponse";
|
||||||
|
export * from "./resultTenant";
|
||||||
|
export * from "./resultTenantStatusUpdateResponse";
|
||||||
|
export * from "./resultTheme";
|
||||||
|
export * from "./resultUserInfoResponse";
|
||||||
|
export * from "./resultVoid";
|
||||||
|
export * from "./resultVoidData";
|
||||||
|
export * from "./reviewPackageBody";
|
||||||
|
export * from "./schedulePlan";
|
||||||
|
export * from "./schedulePlanCreateRequest";
|
||||||
|
export * from "./schedulePlanResponse";
|
||||||
|
export * from "./schedulePlanUpdateRequest";
|
||||||
|
export * from "./scheduleTemplate";
|
||||||
|
export * from "./scheduleTemplateApplyRequest";
|
||||||
|
export * from "./schoolCourse";
|
||||||
|
export * from "./schoolSettingsUpdateRequest";
|
||||||
|
export * from "./statsResponse";
|
||||||
|
export * from "./student";
|
||||||
|
export * from "./studentCreateRequest";
|
||||||
|
export * from "./studentInfoResponse";
|
||||||
|
export * from "./studentRecord";
|
||||||
|
export * from "./studentRecordListResponse";
|
||||||
|
export * from "./studentRecordRequest";
|
||||||
|
export * from "./studentRecordResponse";
|
||||||
|
export * from "./studentTransferHistoryResponse";
|
||||||
|
export * from "./studentUpdateRequest";
|
||||||
|
export * from "./systemSettingsResponse";
|
||||||
|
export * from "./task";
|
||||||
|
export * from "./taskCompletion";
|
||||||
|
export * from "./taskCompletionInfoResponse";
|
||||||
|
export * from "./taskCreateRequest";
|
||||||
|
export * from "./taskFeedbackResponse";
|
||||||
|
export * from "./taskFeedbackUpdateRequest";
|
||||||
|
export * from "./taskSimpleInfo";
|
||||||
|
export * from "./taskStatsByClassResponse";
|
||||||
|
export * from "./taskStatsByTypeResponse";
|
||||||
|
export * from "./taskStatsResponse";
|
||||||
|
export * from "./taskTemplate";
|
||||||
|
export * from "./taskTemplateCreateRequest";
|
||||||
|
export * from "./taskTemplateUpdateRequest";
|
||||||
|
export * from "./taskUpdateRequest";
|
||||||
|
export * from "./teacher";
|
||||||
|
export * from "./teacherCreateRequest";
|
||||||
|
export * from "./teacherDashboardResponse";
|
||||||
|
export * from "./teacherInfoResponse";
|
||||||
|
export * from "./teacherUpdateRequest";
|
||||||
|
export * from "./tenant";
|
||||||
|
export * from "./tenantCreateRequest";
|
||||||
|
export * from "./tenantQuotaUpdateRequest";
|
||||||
|
export * from "./tenantResponse";
|
||||||
|
export * from "./tenantStatsResponse";
|
||||||
|
export * from "./tenantStatusUpdateRequest";
|
||||||
|
export * from "./tenantStatusUpdateResponse";
|
||||||
|
export * from "./tenantUpdateRequest";
|
||||||
|
export * from "./theme";
|
||||||
|
export * from "./transferStudentRequest";
|
||||||
|
export * from "./trendDataPointResponse";
|
||||||
|
export * from "./trendDataResponse";
|
||||||
|
export * from "./updateCompletion1Params";
|
||||||
|
export * from "./updateCompletionParams";
|
||||||
|
export * from "./updateSettings1Body";
|
||||||
|
export * from "./updateSettingsBody";
|
||||||
|
export * from "./updateTenantQuotaBody";
|
||||||
|
export * from "./updateTenantStatusBody";
|
||||||
|
export * from "./uploadFileBody";
|
||||||
|
export * from "./userInfoResponse";
|
||||||
|
|||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课时活动响应
|
||||||
|
*/
|
||||||
|
export interface LessonActivityResponse {
|
||||||
|
/** 课时 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 课时标题 */
|
||||||
|
title?: string;
|
||||||
|
/** 课时日期 */
|
||||||
|
lessonDate?: string;
|
||||||
|
/** 课时状态 */
|
||||||
|
status?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课时反馈
|
||||||
|
*/
|
||||||
|
export interface LessonFeedback {
|
||||||
|
/** ID */
|
||||||
|
readonly id?: string;
|
||||||
|
/** 课时 ID */
|
||||||
|
lessonId?: string;
|
||||||
|
/** 教师 ID */
|
||||||
|
teacherId?: string;
|
||||||
|
/**
|
||||||
|
* 设计质量评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
designQuality?: number;
|
||||||
|
/**
|
||||||
|
* 参与度评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
participation?: number;
|
||||||
|
/**
|
||||||
|
* 目标达成度评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
goalAchievement?: number;
|
||||||
|
/** 环节反馈 JSON */
|
||||||
|
stepFeedbacks?: string;
|
||||||
|
/** 优点 */
|
||||||
|
pros?: string;
|
||||||
|
/** 建议 */
|
||||||
|
suggestions?: string;
|
||||||
|
/** 完成的活动 JSON */
|
||||||
|
activitiesDone?: string;
|
||||||
|
/** 创建人用户名 */
|
||||||
|
readonly createdBy?: string;
|
||||||
|
/** 创建时间 */
|
||||||
|
readonly createdAt?: string;
|
||||||
|
/** 更新时间 */
|
||||||
|
readonly updatedAt?: string;
|
||||||
|
/** 更新人用户名 */
|
||||||
|
readonly updatedBy?: string;
|
||||||
|
/** 是否删除 */
|
||||||
|
readonly deleted?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LessonFeedbackRequestStepFeedbacks } from './lessonFeedbackRequestStepFeedbacks';
|
||||||
|
import type { LessonFeedbackRequestActivitiesDone } from './lessonFeedbackRequestActivitiesDone';
|
||||||
|
|
||||||
|
export interface LessonFeedbackRequest {
|
||||||
|
designQuality?: number;
|
||||||
|
participation?: number;
|
||||||
|
goalAchievement?: number;
|
||||||
|
stepFeedbacks?: LessonFeedbackRequestStepFeedbacks;
|
||||||
|
pros?: string;
|
||||||
|
suggestions?: string;
|
||||||
|
activitiesDone?: LessonFeedbackRequestActivitiesDone;
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type LessonFeedbackRequestActivitiesDone = { [key: string]: unknown };
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type LessonFeedbackRequestStepFeedbacks = { [key: string]: unknown };
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface LessonFinishRequest {
|
||||||
|
actualDuration?: number;
|
||||||
|
overallRating?: string;
|
||||||
|
participationRating?: string;
|
||||||
|
completionNote?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程简单信息
|
||||||
|
*/
|
||||||
|
export interface LessonSimpleInfo {
|
||||||
|
/** 课程 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 课程状态 */
|
||||||
|
status?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课时简单信息响应
|
||||||
|
*/
|
||||||
|
export interface LessonSimpleResponse {
|
||||||
|
/** 课时 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 课时标题 */
|
||||||
|
title?: string;
|
||||||
|
/** 开始时间 */
|
||||||
|
startTime?: string;
|
||||||
|
/** 结束时间 */
|
||||||
|
endTime?: string;
|
||||||
|
/** 地点 */
|
||||||
|
location?: string;
|
||||||
|
/** 课时状态 */
|
||||||
|
status?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简单消息响应
|
||||||
|
*/
|
||||||
|
export interface MessageResponse {
|
||||||
|
/** 消息内容 */
|
||||||
|
message?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 月度任务统计响应
|
||||||
|
*/
|
||||||
|
export interface MonthlyTaskStatsResponse {
|
||||||
|
/** 月份 */
|
||||||
|
month?: string;
|
||||||
|
/** 任务数 */
|
||||||
|
tasks?: number;
|
||||||
|
/** 完成次数 */
|
||||||
|
completions?: number;
|
||||||
|
/** 已完成数量 */
|
||||||
|
completed?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StudentInfoResponse } from './studentInfoResponse';
|
||||||
|
|
||||||
|
export interface PageResultStudentInfoResponse {
|
||||||
|
total?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
items?: StudentInfoResponse[];
|
||||||
|
page?: number;
|
||||||
|
totalPages?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 近期活动响应
|
||||||
|
*/
|
||||||
|
export interface RecentActivityResponse {
|
||||||
|
/** 活动 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 活动类型/课时状态 */
|
||||||
|
type?: string;
|
||||||
|
/** 活动标题 */
|
||||||
|
title?: string;
|
||||||
|
/** 活动时间 */
|
||||||
|
time?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置密码响应
|
||||||
|
*/
|
||||||
|
export interface ResetPasswordResponse {
|
||||||
|
/** 临时密码 */
|
||||||
|
tempPassword?: string;
|
||||||
|
/** 提示信息 */
|
||||||
|
message?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { AdminStatsResponse } from './adminStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultAdminStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: AdminStatsResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { BatchSaveStudentRecordResponse } from './batchSaveStudentRecordResponse';
|
||||||
|
|
||||||
|
export interface ResultBatchSaveStudentRecordResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: BatchSaveStudentRecordResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ChildDetailResponse } from './childDetailResponse';
|
||||||
|
|
||||||
|
export interface ResultChildDetailResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ChildDetailResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ClassTeacher } from './classTeacher';
|
||||||
|
|
||||||
|
export interface ResultClassTeacher {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ClassTeacher;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { CommonPageResponseLesson } from './commonPageResponseLesson';
|
||||||
|
|
||||||
|
export interface ResultCommonPageResponseLesson {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: CommonPageResponseLesson;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { CommonPageResponseTaskCompletionInfoResponse } from './commonPageResponseTaskCompletionInfoResponse';
|
||||||
|
|
||||||
|
export interface ResultCommonPageResponseTaskCompletionInfoResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: CommonPageResponseTaskCompletionInfoResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { FileUploadResponse } from './fileUploadResponse';
|
||||||
|
|
||||||
|
export interface ResultFileUploadResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: FileUploadResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ImportTemplateResponse } from './importTemplateResponse';
|
||||||
|
|
||||||
|
export interface ResultImportTemplateResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ImportTemplateResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LessonFeedback } from './lessonFeedback';
|
||||||
|
|
||||||
|
export interface ResultLessonFeedback {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: LessonFeedback;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ActiveTeacherStatsResponse } from './activeTeacherStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultListActiveTeacherStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ActiveTeacherStatsResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ChildInfoResponse } from './childInfoResponse';
|
||||||
|
|
||||||
|
export interface ResultListChildInfoResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ChildInfoResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ClassInfoResponse } from './classInfoResponse';
|
||||||
|
|
||||||
|
export interface ResultListClassInfoResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ClassInfoResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ClassTeacher } from './classTeacher';
|
||||||
|
|
||||||
|
export interface ResultListClassTeacher {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ClassTeacher[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { Clazz } from './clazz';
|
||||||
|
|
||||||
|
export interface ResultListClazz {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: Clazz[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { CourseDistributionResponse } from './courseDistributionResponse';
|
||||||
|
|
||||||
|
export interface ResultListCourseDistributionResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: CourseDistributionResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { CourseStatsResponse } from './courseStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultListCourseStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: CourseStatsResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { CourseUsageStatsResponse } from './courseUsageStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultListCourseUsageStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: CourseUsageStatsResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LessonActivityResponse } from './lessonActivityResponse';
|
||||||
|
|
||||||
|
export interface ResultListLessonActivityResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: LessonActivityResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LessonSimpleResponse } from './lessonSimpleResponse';
|
||||||
|
|
||||||
|
export interface ResultListLessonSimpleResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: LessonSimpleResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { MonthlyTaskStatsResponse } from './monthlyTaskStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultListMonthlyTaskStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: MonthlyTaskStatsResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { RecentActivityResponse } from './recentActivityResponse';
|
||||||
|
|
||||||
|
export interface ResultListRecentActivityResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: RecentActivityResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { SchedulePlanResponse } from './schedulePlanResponse';
|
||||||
|
|
||||||
|
export interface ResultListSchedulePlanResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: SchedulePlanResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StudentTransferHistoryResponse } from './studentTransferHistoryResponse';
|
||||||
|
|
||||||
|
export interface ResultListStudentTransferHistoryResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: StudentTransferHistoryResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskStatsByClassResponse } from './taskStatsByClassResponse';
|
||||||
|
|
||||||
|
export interface ResultListTaskStatsByClassResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TaskStatsByClassResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskStatsByTypeResponse } from './taskStatsByTypeResponse';
|
||||||
|
|
||||||
|
export interface ResultListTaskStatsByTypeResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TaskStatsByTypeResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TeacherInfoResponse } from './teacherInfoResponse';
|
||||||
|
|
||||||
|
export interface ResultListTeacherInfoResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TeacherInfoResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TenantStatsResponse } from './tenantStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultListTenantStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TenantStatsResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TrendDataPointResponse } from './trendDataPointResponse';
|
||||||
|
|
||||||
|
export interface ResultListTrendDataPointResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TrendDataPointResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TrendDataResponse } from './trendDataResponse';
|
||||||
|
|
||||||
|
export interface ResultListTrendDataResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TrendDataResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { MessageResponse } from './messageResponse';
|
||||||
|
|
||||||
|
export interface ResultMessageResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: MessageResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { PageResultStudentInfoResponse } from './pageResultStudentInfoResponse';
|
||||||
|
|
||||||
|
export interface ResultPageResultStudentInfoResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: PageResultStudentInfoResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ResetPasswordResponse } from './resetPasswordResponse';
|
||||||
|
|
||||||
|
export interface ResultResetPasswordResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: ResetPasswordResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StatsResponse } from './statsResponse';
|
||||||
|
|
||||||
|
export interface ResultStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: StatsResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StudentRecord } from './studentRecord';
|
||||||
|
|
||||||
|
export interface ResultStudentRecord {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: StudentRecord;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { StudentRecordListResponse } from './studentRecordListResponse';
|
||||||
|
|
||||||
|
export interface ResultStudentRecordListResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: StudentRecordListResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { SystemSettingsResponse } from './systemSettingsResponse';
|
||||||
|
|
||||||
|
export interface ResultSystemSettingsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: SystemSettingsResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskFeedbackResponse } from './taskFeedbackResponse';
|
||||||
|
|
||||||
|
export interface ResultTaskFeedbackResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TaskFeedbackResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskStatsResponse } from './taskStatsResponse';
|
||||||
|
|
||||||
|
export interface ResultTaskStatsResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TaskStatsResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TeacherDashboardResponse } from './teacherDashboardResponse';
|
||||||
|
|
||||||
|
export interface ResultTeacherDashboardResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TeacherDashboardResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TenantStatusUpdateResponse } from './tenantStatusUpdateResponse';
|
||||||
|
|
||||||
|
export interface ResultTenantStatusUpdateResponse {
|
||||||
|
code?: number;
|
||||||
|
message?: string;
|
||||||
|
data?: TenantStatusUpdateResponse;
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LocalTime } from './localTime';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课表计划响应
|
||||||
|
*/
|
||||||
|
export interface SchedulePlanResponse {
|
||||||
|
/** 课表 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 课表名称 */
|
||||||
|
name?: string;
|
||||||
|
/** 班级 ID */
|
||||||
|
classId?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
className?: string;
|
||||||
|
/** 课程 ID */
|
||||||
|
courseId?: string;
|
||||||
|
/** 课程名称 */
|
||||||
|
courseName?: string;
|
||||||
|
/** 教师 ID */
|
||||||
|
teacherId?: string;
|
||||||
|
/** 教师姓名 */
|
||||||
|
teacherName?: string;
|
||||||
|
/** 星期几 (1-7) */
|
||||||
|
dayOfWeek?: number;
|
||||||
|
/** 节次 */
|
||||||
|
period?: number;
|
||||||
|
startTime?: LocalTime;
|
||||||
|
endTime?: LocalTime;
|
||||||
|
/** 开始日期 */
|
||||||
|
startDate?: string;
|
||||||
|
/** 结束日期 */
|
||||||
|
endDate?: string;
|
||||||
|
/** 地点 */
|
||||||
|
location?: string;
|
||||||
|
/** 备注 */
|
||||||
|
note?: string;
|
||||||
|
/** 状态 */
|
||||||
|
status?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LocalTime } from './localTime';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课表计划更新请求
|
||||||
|
*/
|
||||||
|
export interface SchedulePlanUpdateRequest {
|
||||||
|
/** 授课教师 ID */
|
||||||
|
teacherId?: string;
|
||||||
|
/** 开始日期 */
|
||||||
|
startDate?: string;
|
||||||
|
/** 结束日期 */
|
||||||
|
endDate?: string;
|
||||||
|
startTime?: LocalTime;
|
||||||
|
endTime?: LocalTime;
|
||||||
|
/** 状态 */
|
||||||
|
status?: string;
|
||||||
|
/** 备注 */
|
||||||
|
note?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学校设置更新请求
|
||||||
|
*/
|
||||||
|
export interface SchoolSettingsUpdateRequest {
|
||||||
|
/** 学校名称 */
|
||||||
|
schoolName?: string;
|
||||||
|
/** 学校 Logo */
|
||||||
|
schoolLogo?: string;
|
||||||
|
/** 地址 */
|
||||||
|
address?: string;
|
||||||
|
/** 课时通知启用 */
|
||||||
|
notifyOnLesson?: boolean;
|
||||||
|
/** 任务通知启用 */
|
||||||
|
notifyOnTask?: boolean;
|
||||||
|
/** 成长记录通知启用 */
|
||||||
|
notifyOnGrowth?: boolean;
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计数据响应
|
||||||
|
*/
|
||||||
|
export interface StatsResponse {
|
||||||
|
/** 学生总数 */
|
||||||
|
totalStudents?: number;
|
||||||
|
/** 教师总数 */
|
||||||
|
totalTeachers?: number;
|
||||||
|
/** 班级总数 */
|
||||||
|
totalClasses?: number;
|
||||||
|
/** 课程总数 */
|
||||||
|
totalCourses?: number;
|
||||||
|
/** 今日课时数 */
|
||||||
|
todayLessons?: number;
|
||||||
|
/** 本月任务数 */
|
||||||
|
monthTasks?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { ClassSimpleInfo } from './classSimpleInfo';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生信息响应
|
||||||
|
*/
|
||||||
|
export interface StudentInfoResponse {
|
||||||
|
/** 学生 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 学生姓名 */
|
||||||
|
name?: string;
|
||||||
|
/** 性别 */
|
||||||
|
gender?: string;
|
||||||
|
/** 出生日期 */
|
||||||
|
birthDate?: string;
|
||||||
|
/** 班级 ID */
|
||||||
|
classId?: string;
|
||||||
|
classInfo?: ClassSimpleInfo;
|
||||||
|
/** 家长姓名 */
|
||||||
|
parentName?: string;
|
||||||
|
/** 家长手机号 */
|
||||||
|
parentPhone?: string;
|
||||||
|
/** 课时数 */
|
||||||
|
lessonCount?: number;
|
||||||
|
/** 阅读次数 */
|
||||||
|
readingCount?: number;
|
||||||
|
/** 创建时间 */
|
||||||
|
createdAt?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生记录
|
||||||
|
*/
|
||||||
|
export interface StudentRecord {
|
||||||
|
/** 记录 ID */
|
||||||
|
readonly id?: string;
|
||||||
|
/** 课时 ID */
|
||||||
|
lessonId: string;
|
||||||
|
/** 学生 ID */
|
||||||
|
studentId: string;
|
||||||
|
/** 出勤状态 present/absent/late */
|
||||||
|
attendance?: string;
|
||||||
|
/** 课堂表现评价 */
|
||||||
|
performance?: string;
|
||||||
|
/** 备注说明 */
|
||||||
|
notes?: string;
|
||||||
|
/**
|
||||||
|
* 专注力评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
focus?: number;
|
||||||
|
/**
|
||||||
|
* 参与度评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
participation?: number;
|
||||||
|
/**
|
||||||
|
* 兴趣评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
interest?: number;
|
||||||
|
/**
|
||||||
|
* 理解度评分 (1-5)
|
||||||
|
* @minimum 1
|
||||||
|
* @maximum 5
|
||||||
|
*/
|
||||||
|
understanding?: number;
|
||||||
|
/** 创建人用户名 */
|
||||||
|
readonly createdBy?: string;
|
||||||
|
/** 更新人用户名 */
|
||||||
|
readonly updatedBy?: string;
|
||||||
|
/** 创建时间 */
|
||||||
|
readonly createdAt?: string;
|
||||||
|
/** 更新时间 */
|
||||||
|
readonly updatedAt?: string;
|
||||||
|
/** 是否删除 0-未删除 1-已删除 */
|
||||||
|
readonly deleted?: number;
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { LessonSimpleInfo } from './lessonSimpleInfo';
|
||||||
|
import type { StudentRecordResponse } from './studentRecordResponse';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生记录列表响应
|
||||||
|
*/
|
||||||
|
export interface StudentRecordListResponse {
|
||||||
|
lesson?: LessonSimpleInfo;
|
||||||
|
/** 学生记录列表 */
|
||||||
|
students?: StudentRecordResponse[];
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface StudentRecordRequest {
|
||||||
|
focus?: number;
|
||||||
|
participation?: number;
|
||||||
|
interest?: number;
|
||||||
|
understanding?: number;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生记录响应
|
||||||
|
*/
|
||||||
|
export interface StudentRecordResponse {
|
||||||
|
/** 记录 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 学生 ID */
|
||||||
|
studentId?: string;
|
||||||
|
/** 专注力评分 (1-5) */
|
||||||
|
focus?: number;
|
||||||
|
/** 参与度评分 (1-5) */
|
||||||
|
participation?: number;
|
||||||
|
/** 兴趣评分 (1-5) */
|
||||||
|
interest?: number;
|
||||||
|
/** 理解度评分 (1-5) */
|
||||||
|
understanding?: number;
|
||||||
|
/** 备注 */
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生调班历史响应
|
||||||
|
*/
|
||||||
|
export interface StudentTransferHistoryResponse {
|
||||||
|
/** 记录 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 班级 ID */
|
||||||
|
classId?: string;
|
||||||
|
/** 班级名称 */
|
||||||
|
className?: string;
|
||||||
|
/** 开始日期 */
|
||||||
|
startDate?: string;
|
||||||
|
/** 结束日期 */
|
||||||
|
endDate?: string;
|
||||||
|
/** 状态 */
|
||||||
|
status?: string;
|
||||||
|
/** 调班原因 */
|
||||||
|
reason?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置响应
|
||||||
|
*/
|
||||||
|
export interface SystemSettingsResponse {
|
||||||
|
/** 系统名称 */
|
||||||
|
systemName?: string;
|
||||||
|
/** 系统 Logo URL */
|
||||||
|
systemLogo?: string;
|
||||||
|
/** 登录页背景图 URL */
|
||||||
|
loginBackground?: string;
|
||||||
|
/** 系统公告 */
|
||||||
|
announcement?: string;
|
||||||
|
/** 联系方式 */
|
||||||
|
contactInfo?: string;
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Generated by orval v7.13.2 🍺
|
||||||
|
* Do not edit manually.
|
||||||
|
* Reading Platform API
|
||||||
|
* Reading Platform Backend Service API Documentation
|
||||||
|
* OpenAPI spec version: 1.0.0
|
||||||
|
*/
|
||||||
|
import type { TaskSimpleInfo } from './taskSimpleInfo';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务完成信息响应
|
||||||
|
*/
|
||||||
|
export interface TaskCompletionInfoResponse {
|
||||||
|
/** 完成记录 ID */
|
||||||
|
id?: string;
|
||||||
|
/** 任务 ID */
|
||||||
|
taskId?: string;
|
||||||
|
/** 学生 ID */
|
||||||
|
studentId?: string;
|
||||||
|
/** 状态 */
|
||||||
|
status?: string;
|
||||||
|
/** 完成时间 */
|
||||||
|
completedAt?: string;
|
||||||
|
/** 反馈 */
|
||||||
|
feedback?: string;
|
||||||
|
/** 家长反馈 */
|
||||||
|
parentFeedback?: string;
|
||||||
|
task?: TaskSimpleInfo;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user