feat: 完善 OpenAPI 注解和前端 API 客户端

主要变更:
1. 所有 Entity/DTO/VO 添加 @Schema 注解,完善 API 文档
2. 新增前端 API 封装模块 (src/apis),包含 fetch.ts 和 apis.ts
3. 生成完整的 TypeScript 类型定义(100+ 个模型)
4. pom.xml 添加 Maven 编译配置和 UTF-8 编码支持
5. 更新 CLAUDE.md 开发文档,新增接口规范和 Swagger 注解规范
6. 清理旧的文档文件和 Flyway 迁移脚本

技术细节:
- 后端:27 个实体类 + 所有 DTO/Response 添加 Swagger 注解
- 前端:新增 orval 生成的 API 客户端类型
- 构建:配置 Maven compiler plugin 和 Spring Boot 插件的 JVM 参数
- 数据库:新增 schema 导出文件,删除旧 Flyway 迁移脚本

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
En 2026-03-10 23:50:53 +08:00
parent 9204f9329e
commit 0d4275b235
354 changed files with 14674 additions and 1719 deletions

584
CLAUDE.md
View File

@ -87,8 +87,483 @@ Result<T> error(code, msg) // { code: xxx, message: "...", data: null }
```
### 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 中可添加类型检查步骤,类型不通过则构建失败。
## 开发命令
@ -142,3 +617,108 @@ npm run api:update
## API 文档
- 访问地址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

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

File diff suppressed because it is too large Load Diff

View File

@ -163,6 +163,42 @@ export interface AdminSettings {
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 = (params: TenantQueryParams) =>
@ -183,8 +219,8 @@ export const updateTenant = (id: number, data: UpdateTenantDto) =>
export const updateTenantQuota = (id: number, data: UpdateTenantQuotaDto) =>
http.put<Tenant>(`/admin/tenants/${id}/quota`, data);
export const updateTenantStatus = (id: number, status: string) =>
http.put<{ id: number; name: string; status: string }>(`/admin/tenants/${id}/status`, { status });
export const updateTenantStatus = (id: number, data: TenantStatusUpdateRequest) =>
http.put<{ id: number; name: string; status: string }>(`/admin/tenants/${id}/status`, data);
export const resetTenantPassword = (id: number) =>
http.post<{ tempPassword: string }>(`/admin/tenants/${id}/reset-password`);
@ -211,5 +247,5 @@ export const getPopularCourses = (limit?: number) =>
export const getAdminSettings = () =>
http.get<AdminSettings>('/admin/settings');
export const updateAdminSettings = (data: Record<string, any>) =>
export const updateAdminSettings = (data: AdminSettingsUpdateRequest) =>
http.put<AdminSettings>('/admin/settings', data);

View File

@ -16,10 +16,14 @@ import type {
CourseLesson,
CoursePackage,
CourseUpdateRequest,
CreateTaskFromTemplateRequest,
DeleteFileParams,
GetActiveTeachersParams,
GetActiveTenantsParams,
GetActivitiesParams,
GetClassPageParams,
GetCompletions1Params,
GetCompletionsParams,
GetCoursePage1Params,
GetCoursePageParams,
GetCourses1Params,
@ -28,16 +32,21 @@ import type {
GetGrowthRecordPageParams,
GetGrowthRecordsByStudentParams,
GetItemsParams,
GetLessonTrendParams,
GetLibrariesParams,
GetLogs1Params,
GetLogsParams,
GetMonthlyStats1Params,
GetMonthlyStatsParams,
GetMyLessonsParams,
GetMyNotifications1Params,
GetMyNotifications2Params,
GetMyNotificationsParams,
GetPackages1Params,
GetPackagesParams,
GetParentPageParams,
GetPopularCoursesParams,
GetRecentActivitiesParams,
GetRecentGrowthRecordsParams,
GetReviewCoursePageParams,
GetSchedulePlans1Params,
@ -48,8 +57,11 @@ import type {
GetTaskPageParams,
GetTasksByStudentParams,
GetTeacherPageParams,
GetTemplates1Params,
GetTemplatesParams,
GetTenantPageParams,
GetThemesParams,
GetTimetableParams,
GrowthRecordCreateRequest,
GrowthRecordUpdateRequest,
LessonCreateRequest,
@ -74,6 +86,7 @@ import type {
ResultListLesson,
ResultListMapStringObject,
ResultListResourceLibrary,
ResultListSchedulePlan,
ResultListStudent,
ResultListTenantResponse,
ResultListTheme,
@ -96,6 +109,8 @@ import type {
ResultPageResultSchoolCourse,
ResultPageResultStudent,
ResultPageResultTask,
ResultPageResultTaskCompletion,
ResultPageResultTaskTemplate,
ResultPageResultTeacher,
ResultPageResultTenant,
ResultParent,
@ -106,6 +121,8 @@ import type {
ResultSchoolCourse,
ResultStudent,
ResultTask,
ResultTaskCompletion,
ResultTaskTemplate,
ResultTeacher,
ResultTenant,
ResultTheme,
@ -113,17 +130,23 @@ import type {
ResultVoid,
ReviewPackageBody,
SchedulePlan,
SchedulePlanCreateRequest,
ScheduleTemplate,
ScheduleTemplateApplyRequest,
SchoolCourse,
StudentCreateRequest,
StudentUpdateRequest,
TaskCreateRequest,
TaskTemplateCreateRequest,
TaskTemplateUpdateRequest,
TaskUpdateRequest,
TeacherCreateRequest,
TeacherUpdateRequest,
TenantCreateRequest,
TenantUpdateRequest,
Theme,
UpdateCompletion1Params,
UpdateCompletionParams,
UpdateSettings1Body,
UpdateSettingsBody,
UpdateTenantQuotaBody,
@ -134,7 +157,22 @@ import type {
import { request } from '../request';
export const getReadingPlatformAPI = () => {
/**
* @summary ID获取任务
* @summary
*/
const updateCompletion = (
taskId: number,
studentId: number,
params: UpdateCompletionParams,
) => {
return request<ResultTaskCompletion>(
{url: `/api/v1/teacher/tasks/${taskId}/completions/${studentId}`, method: 'PUT',
params
},
);
}
/**
* @summary ID
*/
const getTask = (
id: number,
@ -278,7 +316,22 @@ const deleteTeacher = (
}
/**
* @summary ID获取任务
* @summary
*/
const updateCompletion1 = (
taskId: number,
studentId: number,
params: UpdateCompletion1Params,
) => {
return request<ResultTaskCompletion>(
{url: `/api/v1/school/tasks/${taskId}/completions/${studentId}`, method: 'PUT',
params
},
);
}
/**
* @summary ID
*/
const getTask1 = (
id: number,
@ -316,6 +369,45 @@ const deleteTask1 = (
);
}
/**
* @summary ID
*/
const getTemplate1 = (
id: number,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/school/tasks/task-templates/${id}`, method: 'GET'
},
);
}
/**
* @summary
*/
const updateTemplate = (
id: number,
taskTemplateUpdateRequest: TaskTemplateUpdateRequest,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/school/tasks/task-templates/${id}`, method: 'PUT',
headers: {'Content-Type': 'application/json', },
data: taskTemplateUpdateRequest
},
);
}
/**
* @summary
*/
const deleteTemplate = (
id: number,
) => {
return request<ResultVoid>(
{url: `/api/v1/school/tasks/task-templates/${id}`, method: 'DELETE'
},
);
}
/**
* @summary ID获取学生
*/
@ -421,7 +513,7 @@ const deleteCourse = (
}
/**
* @summary ID获取课表计划
* @summary ID
*/
const getSchedulePlan1 = (
id: number,
@ -459,6 +551,45 @@ const deleteSchedulePlan = (
);
}
/**
* @summary ID
*/
const getScheduleTemplate = (
id: number,
) => {
return request<ResultScheduleTemplate>(
{url: `/api/v1/school/schedules/templates/${id}`, method: 'GET'
},
);
}
/**
* @summary
*/
const updateScheduleTemplate = (
id: number,
scheduleTemplate: ScheduleTemplate,
) => {
return request<ResultScheduleTemplate>(
{url: `/api/v1/school/schedules/templates/${id}`, method: 'PUT',
headers: {'Content-Type': 'application/json', },
data: scheduleTemplate
},
);
}
/**
* @summary
*/
const deleteScheduleTemplate = (
id: number,
) => {
return request<ResultVoid>(
{url: `/api/v1/school/schedules/templates/${id}`, method: 'DELETE'
},
);
}
/**
* @summary Get parent by ID
*/
@ -950,6 +1081,20 @@ const createTask = (
);
}
/**
* @summary
*/
const createFromTemplate = (
createTaskFromTemplateRequest: CreateTaskFromTemplateRequest,
) => {
return request<ResultTask>(
{url: `/api/v1/teacher/tasks/from-template`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: createTaskFromTemplateRequest
},
);
}
/**
* @summary
*/
@ -1132,6 +1277,47 @@ const createTask1 = (
);
}
/**
* @summary
*/
const getTemplates1 = (
params?: GetTemplates1Params,
) => {
return request<ResultPageResultTaskTemplate>(
{url: `/api/v1/school/tasks/task-templates`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const createTemplate = (
taskTemplateCreateRequest: TaskTemplateCreateRequest,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/school/tasks/task-templates`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: taskTemplateCreateRequest
},
);
}
/**
* @summary
*/
const createFromTemplate1 = (
createTaskFromTemplateRequest: CreateTaskFromTemplateRequest,
) => {
return request<ResultTask>(
{url: `/api/v1/school/tasks/from-template`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: createTaskFromTemplateRequest
},
);
}
/**
* @summary
*/
@ -1159,6 +1345,20 @@ const createStudent = (
);
}
/**
* @summary
*/
const importStudents = (
studentCreateRequest: StudentCreateRequest[],
) => {
return request<ResultListStudent>(
{url: `/api/v1/school/students/import`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: studentCreateRequest
},
);
}
/**
* @summary
*/
@ -1203,12 +1403,12 @@ const getSchedulePlans1 = (
* @summary
*/
const createSchedulePlan = (
schedulePlan: SchedulePlan,
schedulePlanCreateRequest: SchedulePlanCreateRequest,
) => {
return request<ResultSchedulePlan>(
{url: `/api/v1/school/schedules`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: schedulePlan
data: schedulePlanCreateRequest
},
);
}
@ -1240,6 +1440,35 @@ const createScheduleTemplate = (
);
}
/**
* @summary
*/
const applyScheduleTemplate = (
id: number,
scheduleTemplateApplyRequest: ScheduleTemplateApplyRequest,
) => {
return request<ResultListSchedulePlan>(
{url: `/api/v1/school/schedules/templates/${id}/apply`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: scheduleTemplateApplyRequest
},
);
}
/**
* @summary
*/
const batchCreateSchedules = (
schedulePlanCreateRequest: SchedulePlanCreateRequest[],
) => {
return request<ResultListSchedulePlan>(
{url: `/api/v1/school/schedules/batch`, method: 'POST',
headers: {'Content-Type': 'application/json', },
data: schedulePlanCreateRequest
},
);
}
/**
* @summary
*/
@ -1309,6 +1538,30 @@ const resetPassword1 = (
);
}
/**
* @summary
*/
const markAsRead1 = (
id: number,
) => {
return request<ResultVoid>(
{url: `/api/v1/school/notifications/${id}/read`, method: 'POST'
},
);
}
/**
* @summary
*/
const markAllAsRead1 = (
) => {
return request<ResultVoid>(
{url: `/api/v1/school/notifications/read-all`, method: 'POST'
},
);
}
/**
* @summary
*/
@ -1410,7 +1663,7 @@ const completeTask = (
/**
* @summary
*/
const markAsRead1 = (
const markAsRead2 = (
id: number,
) => {
return request<ResultVoid>(
@ -1422,7 +1675,7 @@ const markAsRead1 = (
/**
* @summary
*/
const markAllAsRead1 = (
const markAllAsRead2 = (
) => {
return request<ResultVoid>(
@ -1862,6 +2115,106 @@ const createLesson1 = (
);
}
/**
* @summary
*/
const getCompletions = (
id: number,
params?: GetCompletionsParams,
) => {
return request<ResultPageResultTaskCompletion>(
{url: `/api/v1/teacher/tasks/${id}/completions`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const getTemplates = (
params?: GetTemplatesParams,
) => {
return request<ResultPageResultTaskTemplate>(
{url: `/api/v1/teacher/tasks/task-templates`, method: 'GET',
params
},
);
}
/**
* @summary ID
*/
const getTemplate = (
id: number,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/teacher/tasks/task-templates/${id}`, method: 'GET'
},
);
}
/**
* @summary
*/
const getDefaultTemplate = (
taskType: string,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/teacher/tasks/task-templates/default/${taskType}`, method: 'GET'
},
);
}
/**
* @summary
*/
const getStats = (
) => {
return request<ResultMapStringObject>(
{url: `/api/v1/teacher/tasks/stats`, method: 'GET'
},
);
}
/**
* @summary
*/
const getMonthlyStats = (
params?: GetMonthlyStatsParams,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/teacher/tasks/stats/monthly`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const getStatsByType = (
) => {
return request<ResultMapStringObject>(
{url: `/api/v1/teacher/tasks/stats/by-type`, method: 'GET'
},
);
}
/**
* @summary
*/
const getStatsByClass = (
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/teacher/tasks/stats/by-class`, method: 'GET'
},
);
}
/**
* @summary
*/
@ -2059,10 +2412,97 @@ const getAllCourses = (
);
}
/**
* @summary
*/
const getCompletions1 = (
id: number,
params?: GetCompletions1Params,
) => {
return request<ResultPageResultTaskCompletion>(
{url: `/api/v1/school/tasks/${id}/completions`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const getDefaultTemplate1 = (
taskType: string,
) => {
return request<ResultTaskTemplate>(
{url: `/api/v1/school/tasks/task-templates/default/${taskType}`, method: 'GET'
},
);
}
/**
* @summary
*/
const getStats1 = (
) => {
return request<ResultMapStringObject>(
{url: `/api/v1/school/tasks/stats`, method: 'GET'
},
);
}
/**
* @summary
*/
const getMonthlyStats1 = (
params?: GetMonthlyStats1Params,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/tasks/stats/monthly`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const getStatsByType1 = (
) => {
return request<ResultMapStringObject>(
{url: `/api/v1/school/tasks/stats/by-type`, method: 'GET'
},
);
}
/**
* @summary
*/
const getStatsByClass1 = (
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/tasks/stats/by-class`, method: 'GET'
},
);
}
/**
* @summary
*/
const getImportTemplate = (
) => {
return request<ResultMapStringObject>(
{url: `/api/v1/school/students/import/template`, method: 'GET'
},
);
}
/**
* @summary
*/
const getStats = (
const getStats2 = (
) => {
return request<ResultMapStringObject>(
@ -2071,6 +2511,82 @@ const getStats = (
);
}
/**
* @summary
*/
const getActiveTeachers = (
params?: GetActiveTeachersParams,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/stats/teachers`, method: 'GET',
params
},
);
}
/**
* @summary N
*/
const getLessonTrend = (
params?: GetLessonTrendParams,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/stats/lesson-trend`, method: 'GET',
params
},
);
}
/**
* @summary 使
*/
const getCourseUsageStats = (
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/stats/courses`, method: 'GET'
},
);
}
/**
* @summary
*/
const getCourseDistribution = (
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/stats/course-distribution`, method: 'GET'
},
);
}
/**
* @summary
*/
const getRecentActivities = (
params?: GetRecentActivitiesParams,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/stats/activities`, method: 'GET',
params
},
);
}
/**
* @summary
*/
const getTimetable = (
params?: GetTimetableParams,
) => {
return request<ResultListMapStringObject>(
{url: `/api/v1/school/schedules/timetable`, method: 'GET',
params
},
);
}
/**
* @summary
*/
@ -2084,6 +2600,43 @@ const getLogs = (
);
}
/**
* @summary
*/
const getMyNotifications1 = (
params?: GetMyNotifications1Params,
) => {
return request<ResultPageResultNotification>(
{url: `/api/v1/school/notifications`, method: 'GET',
params
},
);
}
/**
* @summary ID
*/
const getNotification1 = (
id: number,
) => {
return request<ResultNotification>(
{url: `/api/v1/school/notifications/${id}`, method: 'GET'
},
);
}
/**
* @summary
*/
const getUnreadCount1 = (
) => {
return request<ResultLong>(
{url: `/api/v1/school/notifications/unread-count`, method: 'GET'
},
);
}
/**
* @summary Excel
*/
@ -2186,8 +2739,8 @@ const getTasksByStudent = (
/**
* @summary
*/
const getMyNotifications1 = (
params?: GetMyNotifications1Params,
const getMyNotifications2 = (
params?: GetMyNotifications2Params,
) => {
return request<ResultPageResultNotification>(
{url: `/api/v1/parent/notifications`, method: 'GET',
@ -2199,7 +2752,7 @@ const getMyNotifications1 = (
/**
* @summary ID获取通知
*/
const getNotification1 = (
const getNotification2 = (
id: number,
) => {
return request<ResultNotification>(
@ -2211,7 +2764,7 @@ const getNotification1 = (
/**
* @summary
*/
const getUnreadCount1 = (
const getUnreadCount2 = (
) => {
return request<ResultLong>(
@ -2299,7 +2852,7 @@ const getAllActiveTenants = (
/**
* @summary
*/
const getStats1 = (
const getStats3 = (
) => {
return request<ResultMapStringObject>(
@ -2386,13 +2939,27 @@ const getReviewCoursePage = (
}
/**
* @summary
* @summary
*/
const deleteScheduleTemplate = (
const removeTeacher = (
id: number,
teacherId: number,
) => {
return request<ResultVoid>(
{url: `/api/v1/school/schedules/templates/${id}`, method: 'DELETE'
{url: `/api/v1/school/classes/${id}/teachers/${teacherId}`, method: 'DELETE'
},
);
}
/**
* @summary
*/
const removeStudent = (
id: number,
studentId: number,
) => {
return request<ResultVoid>(
{url: `/api/v1/school/classes/${id}/students/${studentId}`, method: 'DELETE'
},
);
}
@ -2410,7 +2977,8 @@ const deleteFile = (
);
}
return {getTask,updateTask,deleteTask,getLesson,updateLesson,getGrowthRecord,updateGrowthRecord,deleteGrowthRecord,getTeacher,updateTeacher,deleteTeacher,getTask1,updateTask1,deleteTask1,getStudent,updateStudent,deleteStudent,getSettings,updateSettings,getCourse2,updateCourse,deleteCourse,getSchedulePlan1,updateSchedulePlan,deleteSchedulePlan,getParent,updateParent,deleteParent,getGrowthRecord1,updateGrowthRecord1,deleteGrowthRecord1,getClass,updateClass,deleteClass,getGrowthRecord2,updateGrowthRecord2,deleteGrowthRecord2,getTheme,updateTheme,deleteTheme,getTenant,updateTenant,deleteTenant,updateTenantStatus,updateTenantQuota,getSettings1,updateSettings1,updateLibrary,deleteLibrary,updateItem,deleteItem,getPackage1,updatePackage,deletePackage,getCourse3,updateCourse1,deleteCourse1,getLesson2,updateLesson1,deleteLesson,getTaskPage,createTask,markAsRead,markAllAsRead,getMyLessons,createLesson,startLesson,completeLesson,cancelLesson,getGrowthRecordPage,createGrowthRecord,getTeacherPage,createTeacher,resetPassword,getTaskPage1,createTask1,getStudentPage,createStudent,getCourses1,createCourse,getSchedulePlans1,createSchedulePlan,getScheduleTemplates,createScheduleTemplate,getParentPage,createParent,bindStudent,unbindStudent,resetPassword1,getGrowthRecordPage1,createGrowthRecord1,getClassPage,createClass,assignTeachers,assignStudents,completeTask,markAsRead1,markAllAsRead1,createGrowthRecord2,uploadFile,logout,login,changePassword,getThemes,createTheme,getTenantPage,createTenant,resetTenantPassword,getLibraries,createLibrary,getItems,createItem,getPackages1,createPackage,submitPackage,reviewPackage,publishPackage,offlinePackage,getCoursePage1,createCourse1,withdrawCourse,unpublishCourse,submitCourse,republishCourse,rejectCourse,publishCourse,directPublishCourse,archiveCourse,approveCourse,getLessons1,createLesson1,getCourses,getCourse,getSchedulePlans,getSchedulePlan,getMyNotifications,getNotification,getUnreadCount,getTodayLessons,getDashboard,getWeeklyLessons,getTodayLessons1,getCoursePage,getCourse1,getLessons,getLesson1,getAllCourses,getStats,getLogs,exportTeachers,exportStudents,exportLessons,exportGrowthRecords,getPackages,getPackage,getTask2,getTasksByStudent,getMyNotifications1,getNotification1,getUnreadCount1,getGrowthRecordsByStudent,getRecentGrowthRecords,getMyChildren,getChild,getCurrentUser,getAllActiveTenants,getStats1,getTrendData,getActiveTenants,getPopularCourses,getActivities,getLogs1,getReviewCoursePage,deleteScheduleTemplate,deleteFile}};
return {updateCompletion,getTask,updateTask,deleteTask,getLesson,updateLesson,getGrowthRecord,updateGrowthRecord,deleteGrowthRecord,getTeacher,updateTeacher,deleteTeacher,updateCompletion1,getTask1,updateTask1,deleteTask1,getTemplate1,updateTemplate,deleteTemplate,getStudent,updateStudent,deleteStudent,getSettings,updateSettings,getCourse2,updateCourse,deleteCourse,getSchedulePlan1,updateSchedulePlan,deleteSchedulePlan,getScheduleTemplate,updateScheduleTemplate,deleteScheduleTemplate,getParent,updateParent,deleteParent,getGrowthRecord1,updateGrowthRecord1,deleteGrowthRecord1,getClass,updateClass,deleteClass,getGrowthRecord2,updateGrowthRecord2,deleteGrowthRecord2,getTheme,updateTheme,deleteTheme,getTenant,updateTenant,deleteTenant,updateTenantStatus,updateTenantQuota,getSettings1,updateSettings1,updateLibrary,deleteLibrary,updateItem,deleteItem,getPackage1,updatePackage,deletePackage,getCourse3,updateCourse1,deleteCourse1,getLesson2,updateLesson1,deleteLesson,getTaskPage,createTask,createFromTemplate,markAsRead,markAllAsRead,getMyLessons,createLesson,startLesson,completeLesson,cancelLesson,getGrowthRecordPage,createGrowthRecord,getTeacherPage,createTeacher,resetPassword,getTaskPage1,createTask1,getTemplates1,createTemplate,createFromTemplate1,getStudentPage,createStudent,importStudents,getCourses1,createCourse,getSchedulePlans1,createSchedulePlan,getScheduleTemplates,createScheduleTemplate,applyScheduleTemplate,batchCreateSchedules,getParentPage,createParent,bindStudent,unbindStudent,resetPassword1,markAsRead1,markAllAsRead1,getGrowthRecordPage1,createGrowthRecord1,getClassPage,createClass,assignTeachers,assignStudents,completeTask,markAsRead2,markAllAsRead2,createGrowthRecord2,uploadFile,logout,login,changePassword,getThemes,createTheme,getTenantPage,createTenant,resetTenantPassword,getLibraries,createLibrary,getItems,createItem,getPackages1,createPackage,submitPackage,reviewPackage,publishPackage,offlinePackage,getCoursePage1,createCourse1,withdrawCourse,unpublishCourse,submitCourse,republishCourse,rejectCourse,publishCourse,directPublishCourse,archiveCourse,approveCourse,getLessons1,createLesson1,getCompletions,getTemplates,getTemplate,getDefaultTemplate,getStats,getMonthlyStats,getStatsByType,getStatsByClass,getCourses,getCourse,getSchedulePlans,getSchedulePlan,getMyNotifications,getNotification,getUnreadCount,getTodayLessons,getDashboard,getWeeklyLessons,getTodayLessons1,getCoursePage,getCourse1,getLessons,getLesson1,getAllCourses,getCompletions1,getDefaultTemplate1,getStats1,getMonthlyStats1,getStatsByType1,getStatsByClass1,getImportTemplate,getStats2,getActiveTeachers,getLessonTrend,getCourseUsageStats,getCourseDistribution,getRecentActivities,getTimetable,getLogs,getMyNotifications1,getNotification1,getUnreadCount1,exportTeachers,exportStudents,exportLessons,exportGrowthRecords,getPackages,getPackage,getTask2,getTasksByStudent,getMyNotifications2,getNotification2,getUnreadCount2,getGrowthRecordsByStudent,getRecentGrowthRecords,getMyChildren,getChild,getCurrentUser,getAllActiveTenants,getStats3,getTrendData,getActiveTenants,getPopularCourses,getActivities,getLogs1,getReviewCoursePage,removeTeacher,removeStudent,deleteFile}};
export type UpdateCompletionResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateCompletion']>>>
export type GetTaskResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTask']>>>
export type UpdateTaskResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateTask']>>>
export type DeleteTaskResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteTask']>>>
@ -2422,9 +2990,13 @@ export type DeleteGrowthRecordResult = NonNullable<Awaited<ReturnType<ReturnType
export type GetTeacherResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTeacher']>>>
export type UpdateTeacherResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateTeacher']>>>
export type DeleteTeacherResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteTeacher']>>>
export type UpdateCompletion1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateCompletion1']>>>
export type GetTask1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTask1']>>>
export type UpdateTask1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateTask1']>>>
export type DeleteTask1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteTask1']>>>
export type GetTemplate1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTemplate1']>>>
export type UpdateTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateTemplate']>>>
export type DeleteTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteTemplate']>>>
export type GetStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStudent']>>>
export type UpdateStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateStudent']>>>
export type DeleteStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteStudent']>>>
@ -2436,6 +3008,9 @@ export type DeleteCourseResult = NonNullable<Awaited<ReturnType<ReturnType<typeo
export type GetSchedulePlan1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getSchedulePlan1']>>>
export type UpdateSchedulePlanResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateSchedulePlan']>>>
export type DeleteSchedulePlanResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteSchedulePlan']>>>
export type GetScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getScheduleTemplate']>>>
export type UpdateScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateScheduleTemplate']>>>
export type DeleteScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteScheduleTemplate']>>>
export type GetParentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getParent']>>>
export type UpdateParentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['updateParent']>>>
export type DeleteParentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteParent']>>>
@ -2473,6 +3048,7 @@ export type UpdateLesson1Result = NonNullable<Awaited<ReturnType<ReturnType<type
export type DeleteLessonResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteLesson']>>>
export type GetTaskPageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTaskPage']>>>
export type CreateTaskResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createTask']>>>
export type CreateFromTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createFromTemplate']>>>
export type MarkAsReadResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAsRead']>>>
export type MarkAllAsReadResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAllAsRead']>>>
export type GetMyLessonsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMyLessons']>>>
@ -2487,19 +3063,27 @@ export type CreateTeacherResult = NonNullable<Awaited<ReturnType<ReturnType<type
export type ResetPasswordResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['resetPassword']>>>
export type GetTaskPage1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTaskPage1']>>>
export type CreateTask1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createTask1']>>>
export type GetTemplates1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTemplates1']>>>
export type CreateTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createTemplate']>>>
export type CreateFromTemplate1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createFromTemplate1']>>>
export type GetStudentPageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStudentPage']>>>
export type CreateStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createStudent']>>>
export type ImportStudentsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['importStudents']>>>
export type GetCourses1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCourses1']>>>
export type CreateCourseResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createCourse']>>>
export type GetSchedulePlans1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getSchedulePlans1']>>>
export type CreateSchedulePlanResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createSchedulePlan']>>>
export type GetScheduleTemplatesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getScheduleTemplates']>>>
export type CreateScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createScheduleTemplate']>>>
export type ApplyScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['applyScheduleTemplate']>>>
export type BatchCreateSchedulesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['batchCreateSchedules']>>>
export type GetParentPageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getParentPage']>>>
export type CreateParentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createParent']>>>
export type BindStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['bindStudent']>>>
export type UnbindStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['unbindStudent']>>>
export type ResetPassword1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['resetPassword1']>>>
export type MarkAsRead1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAsRead1']>>>
export type MarkAllAsRead1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAllAsRead1']>>>
export type GetGrowthRecordPage1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getGrowthRecordPage1']>>>
export type CreateGrowthRecord1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createGrowthRecord1']>>>
export type GetClassPageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getClassPage']>>>
@ -2507,8 +3091,8 @@ export type CreateClassResult = NonNullable<Awaited<ReturnType<ReturnType<typeof
export type AssignTeachersResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['assignTeachers']>>>
export type AssignStudentsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['assignStudents']>>>
export type CompleteTaskResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['completeTask']>>>
export type MarkAsRead1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAsRead1']>>>
export type MarkAllAsRead1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAllAsRead1']>>>
export type MarkAsRead2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAsRead2']>>>
export type MarkAllAsRead2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['markAllAsRead2']>>>
export type CreateGrowthRecord2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createGrowthRecord2']>>>
export type UploadFileResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['uploadFile']>>>
export type LogoutResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['logout']>>>
@ -2542,6 +3126,14 @@ export type ArchiveCourseResult = NonNullable<Awaited<ReturnType<ReturnType<type
export type ApproveCourseResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['approveCourse']>>>
export type GetLessons1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLessons1']>>>
export type CreateLesson1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['createLesson1']>>>
export type GetCompletionsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCompletions']>>>
export type GetTemplatesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTemplates']>>>
export type GetTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTemplate']>>>
export type GetDefaultTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getDefaultTemplate']>>>
export type GetStatsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats']>>>
export type GetMonthlyStatsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMonthlyStats']>>>
export type GetStatsByTypeResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStatsByType']>>>
export type GetStatsByClassResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStatsByClass']>>>
export type GetCoursesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCourses']>>>
export type GetCourseResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCourse']>>>
export type GetSchedulePlansResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getSchedulePlans']>>>
@ -2558,8 +3150,24 @@ export type GetCourse1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof
export type GetLessonsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLessons']>>>
export type GetLesson1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLesson1']>>>
export type GetAllCoursesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getAllCourses']>>>
export type GetStatsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats']>>>
export type GetCompletions1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCompletions1']>>>
export type GetDefaultTemplate1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getDefaultTemplate1']>>>
export type GetStats1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats1']>>>
export type GetMonthlyStats1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMonthlyStats1']>>>
export type GetStatsByType1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStatsByType1']>>>
export type GetStatsByClass1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStatsByClass1']>>>
export type GetImportTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getImportTemplate']>>>
export type GetStats2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats2']>>>
export type GetActiveTeachersResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getActiveTeachers']>>>
export type GetLessonTrendResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLessonTrend']>>>
export type GetCourseUsageStatsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCourseUsageStats']>>>
export type GetCourseDistributionResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCourseDistribution']>>>
export type GetRecentActivitiesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getRecentActivities']>>>
export type GetTimetableResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTimetable']>>>
export type GetLogsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLogs']>>>
export type GetMyNotifications1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMyNotifications1']>>>
export type GetNotification1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getNotification1']>>>
export type GetUnreadCount1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getUnreadCount1']>>>
export type ExportTeachersResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['exportTeachers']>>>
export type ExportStudentsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['exportStudents']>>>
export type ExportLessonsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['exportLessons']>>>
@ -2568,21 +3176,22 @@ export type GetPackagesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof
export type GetPackageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getPackage']>>>
export type GetTask2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTask2']>>>
export type GetTasksByStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTasksByStudent']>>>
export type GetMyNotifications1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMyNotifications1']>>>
export type GetNotification1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getNotification1']>>>
export type GetUnreadCount1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getUnreadCount1']>>>
export type GetMyNotifications2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMyNotifications2']>>>
export type GetNotification2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getNotification2']>>>
export type GetUnreadCount2Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getUnreadCount2']>>>
export type GetGrowthRecordsByStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getGrowthRecordsByStudent']>>>
export type GetRecentGrowthRecordsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getRecentGrowthRecords']>>>
export type GetMyChildrenResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getMyChildren']>>>
export type GetChildResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getChild']>>>
export type GetCurrentUserResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getCurrentUser']>>>
export type GetAllActiveTenantsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getAllActiveTenants']>>>
export type GetStats1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats1']>>>
export type GetStats3Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getStats3']>>>
export type GetTrendDataResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getTrendData']>>>
export type GetActiveTenantsResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getActiveTenants']>>>
export type GetPopularCoursesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getPopularCourses']>>>
export type GetActivitiesResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getActivities']>>>
export type GetLogs1Result = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getLogs1']>>>
export type GetReviewCoursePageResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['getReviewCoursePage']>>>
export type DeleteScheduleTemplateResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteScheduleTemplate']>>>
export type RemoveTeacherResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['removeTeacher']>>>
export type RemoveStudentResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['removeStudent']>>>
export type DeleteFileResult = NonNullable<Awaited<ReturnType<ReturnType<typeof getReadingPlatformAPI>['deleteFile']>>>

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,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 CreateTaskFromTemplateRequest {
/** 模板 ID */
templateId?: number;
/** 目标 ID 列表(班级 ID 或学生 ID */
targetIds: number[];
/** 目标类型CLASS-班级STUDENT-学生 */
targetType?: string;
/** 任务开始日期 */
startDate?: string;
/** 任务截止日期 */
endDate?: 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 FileUploadResponse {
/** 文件 URL */
fileUrl?: string;
/** 文件名称 */
fileName?: string;
/** 文件大小 */
fileSize?: number;
}

View File

@ -0,0 +1,11 @@
/**
* 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 GetActiveTeachersParams = {
limit?: 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 GetCompletions1Params = {
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 GetCompletionsParams = {
page?: number;
pageSize?: number;
status?: string;
};

View File

@ -0,0 +1,11 @@
/**
* 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 GetLessonTrendParams = {
months?: number;
};

View File

@ -0,0 +1,11 @@
/**
* 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 GetMonthlyStats1Params = {
months?: number;
};

View File

@ -0,0 +1,11 @@
/**
* 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 GetMonthlyStatsParams = {
months?: 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 GetMyNotifications2Params = {
page?: number;
pageSize?: number;
isRead?: number;
};

View File

@ -0,0 +1,11 @@
/**
* 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 GetRecentActivitiesParams = {
limit?: number;
};

View File

@ -10,4 +10,6 @@ export type GetSchedulePlans1Params = {
pageNum?: number;
pageSize?: number;
classId?: number;
startDate?: string;
endDate?: 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,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 type GetTemplates1Params = {
page?: number;
pageSize?: number;
keyword?: string;
type?: 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
*/
export type GetTemplatesParams = {
page?: number;
pageSize?: number;
keyword?: string;
type?: 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,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 GetTimetableParams = {
startDate?: string;
endDate?: string;
classId?: 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 ImportTemplateResponse {
/** 表头 */
headers?: string[];
/** 示例数据 */
example?: string[];
}

View File

@ -6,22 +6,50 @@
* OpenAPI spec version: 1.0.0
*/
export * from './activeTeacherStatsResponse';
export * from './adminSettingsUpdateRequest';
export * from './adminStatsResponse';
export * from './approveCourseParams';
export * from './batchSaveStudentRecordResponse';
export * from './batchStudentRecordRequest';
export * from './batchStudentRecordRequestRecordsItem';
export * from './bindStudentParams';
export * from './changePasswordParams';
export * from './childDetailResponse';
export * from './childInfoResponse';
export * from './childStats';
export * from './classCreateRequest';
export * from './classInfo';
export * from './classInfoResponse';
export * from './classSimpleInfo';
export * from './classTeacher';
export * from './classTeacherRequest';
export * from './classUpdateRequest';
export * from './clazz';
export * from './commonPageResponseLesson';
export * from './commonPageResponseTaskCompletionInfoResponse';
export * from './completeTaskParams';
export * from './course';
export * from './courseCreateRequest';
export * from './courseDistributionResponse';
export * from './courseLesson';
export * from './coursePackage';
export * from './courseStatsResponse';
export * from './courseUpdateRequest';
export * from './courseUsageStatsResponse';
export * from './createTaskFromTemplateRequest';
export * from './deleteFileParams';
export * from './fileUploadResponse';
export * from './getActiveTeachersParams';
export * from './getActiveTenantsParams';
export * from './getActivitiesParams';
export * from './getChildLessonsParams';
export * from './getChildTasksParams';
export * from './getClassPageParams';
export * from './getClassStudents1Params';
export * from './getClassStudentsParams';
export * from './getCompletions1Params';
export * from './getCompletionsParams';
export * from './getCoursePage1Params';
export * from './getCoursePageParams';
export * from './getCourses1Params';
@ -30,16 +58,21 @@ export * from './getGrowthRecordPage1Params';
export * from './getGrowthRecordPageParams';
export * from './getGrowthRecordsByStudentParams';
export * from './getItemsParams';
export * from './getLessonTrendParams';
export * from './getLibrariesParams';
export * from './getLogs1Params';
export * from './getLogsParams';
export * from './getMonthlyStats1Params';
export * from './getMonthlyStatsParams';
export * from './getMyLessonsParams';
export * from './getMyNotifications1Params';
export * from './getMyNotifications2Params';
export * from './getMyNotificationsParams';
export * from './getPackages1Params';
export * from './getPackagesParams';
export * from './getParentPageParams';
export * from './getPopularCoursesParams';
export * from './getRecentActivitiesParams';
export * from './getRecentGrowthRecordsParams';
export * from './getReviewCoursePageParams';
export * from './getSchedulePlans1Params';
@ -50,17 +83,33 @@ export * from './getTaskPage1Params';
export * from './getTaskPageParams';
export * from './getTasksByStudentParams';
export * from './getTeacherPageParams';
export * from './getTeacherStudentsParams';
export * from './getTemplates1Params';
export * from './getTemplatesParams';
export * from './getTenantPageParams';
export * from './getThemesParams';
export * from './getTimetable1Params';
export * from './getTimetableParams';
export * from './growthRecord';
export * from './growthRecordCreateRequest';
export * from './growthRecordUpdateRequest';
export * from './importTemplateResponse';
export * from './lesson';
export * from './lessonActivityResponse';
export * from './lessonCreateRequest';
export * from './lessonFeedback';
export * from './lessonFeedbackRequest';
export * from './lessonFeedbackRequestActivitiesDone';
export * from './lessonFeedbackRequestStepFeedbacks';
export * from './lessonFinishRequest';
export * from './lessonSimpleInfo';
export * from './lessonSimpleResponse';
export * from './lessonUpdateRequest';
export * from './localTime';
export * from './loginRequest';
export * from './loginResponse';
export * from './messageResponse';
export * from './monthlyTaskStatsResponse';
export * from './notification';
export * from './operationLog';
export * from './pageResultClazz';
@ -76,39 +125,75 @@ export * from './pageResultSchedulePlan';
export * from './pageResultScheduleTemplate';
export * from './pageResultSchoolCourse';
export * from './pageResultStudent';
export * from './pageResultStudentInfoResponse';
export * from './pageResultTask';
export * from './pageResultTaskCompletion';
export * from './pageResultTaskTemplate';
export * from './pageResultTeacher';
export * from './pageResultTenant';
export * from './parent';
export * from './parentCreateRequest';
export * from './parentUpdateRequest';
export * from './recentActivityResponse';
export * from './rejectCourseParams';
export * from './resetPassword1Params';
export * from './resetPasswordParams';
export * from './resetPasswordResponse';
export * from './resourceItem';
export * from './resourceLibrary';
export * from './resultAdminStatsResponse';
export * from './resultBatchSaveStudentRecordResponse';
export * from './resultChildDetailResponse';
export * from './resultClassTeacher';
export * from './resultClazz';
export * from './resultCommonPageResponseLesson';
export * from './resultCommonPageResponseTaskCompletionInfoResponse';
export * from './resultCourse';
export * from './resultCourseLesson';
export * from './resultCoursePackage';
export * from './resultFileUploadResponse';
export * from './resultGrowthRecord';
export * from './resultImportTemplateResponse';
export * from './resultLesson';
export * from './resultLessonFeedback';
export * from './resultListActiveTeacherStatsResponse';
export * from './resultListChildInfoResponse';
export * from './resultListClassInfoResponse';
export * from './resultListClassTeacher';
export * from './resultListClazz';
export * from './resultListCourse';
export * from './resultListCourseDistributionResponse';
export * from './resultListCourseLesson';
export * from './resultListCourseStatsResponse';
export * from './resultListCourseUsageStatsResponse';
export * from './resultListGrowthRecord';
export * from './resultListLesson';
export * from './resultListLessonActivityResponse';
export * from './resultListLessonSimpleResponse';
export * from './resultListMapStringObject';
export * from './resultListMapStringObjectDataItem';
export * from './resultListMonthlyTaskStatsResponse';
export * from './resultListRecentActivityResponse';
export * from './resultListResourceLibrary';
export * from './resultListSchedulePlan';
export * from './resultListSchedulePlanResponse';
export * from './resultListStudent';
export * from './resultListStudentTransferHistoryResponse';
export * from './resultListTaskStatsByClassResponse';
export * from './resultListTaskStatsByTypeResponse';
export * from './resultListTeacherInfoResponse';
export * from './resultListTenantResponse';
export * from './resultListTenantStatsResponse';
export * from './resultListTheme';
export * from './resultListTrendDataPointResponse';
export * from './resultListTrendDataResponse';
export * from './resultLoginResponse';
export * from './resultLong';
export * from './resultMapStringObject';
export * from './resultMapStringObjectData';
export * from './resultMapStringString';
export * from './resultMapStringStringData';
export * from './resultMessageResponse';
export * from './resultNotification';
export * from './resultPageResultClazz';
export * from './resultPageResultCourse';
@ -123,41 +208,90 @@ 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';

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,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 { TaskCompletion } from './taskCompletion';
export interface PageResultTaskCompletion {
total?: number;
pageSize?: number;
items?: TaskCompletion[];
page?: number;
totalPages?: 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 { TaskTemplate } from './taskTemplate';
export interface PageResultTaskTemplate {
total?: number;
pageSize?: number;
items?: TaskTemplate[];
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 { SchedulePlan } from './schedulePlan';
export interface ResultListSchedulePlan {
code?: number;
message?: string;
data?: SchedulePlan[];
}

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 { PageResultTaskCompletion } from './pageResultTaskCompletion';
export interface ResultPageResultTaskCompletion {
code?: number;
message?: string;
data?: PageResultTaskCompletion;
}

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 { PageResultTaskTemplate } from './pageResultTaskTemplate';
export interface ResultPageResultTaskTemplate {
code?: number;
message?: string;
data?: PageResultTaskTemplate;
}

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

Some files were not shown because too many files have changed in this diff Show More