This commit is contained in:
zhonghua 2026-03-11 13:53:48 +08:00
commit 7d86fb08c5
330 changed files with 11317 additions and 2647 deletions

View File

@ -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
View File

@ -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 语句

View File

@ -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 模式

View 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. 教师端的班级、学生过滤逻辑需要根据实际业务场景优化

View 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. 更新项目文档中的表名引用(如有)

View 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 | 最大请求数 |

View File

@ -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());

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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 }};

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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[];
}

View File

@ -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";

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 };

View File

@ -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 };

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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[];
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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[];
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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