kindergarten_java/reading-platform-backend/src/common/utils/json.util.ts
Claude Opus 4.6 2f5ad32820 refactor: 代码重构 - API规范化和文件路由配置
## 后端重构

### 新增基础设施
- src/common/dto/ - 统一响应格式和分页查询DTO基类
- src/common/interceptors/ - 响应转换拦截器
- src/common/utils/ - JSON解析和分页计算工具函数

### DTO规范化
- Course、Lesson、TeacherCourse、SchoolCourse、Tenant控制器添加Swagger装饰器
- 添加@ApiQuery、@ApiBody、@ApiOperation完善API文档
- 修复CourseLesson控制器路径参数问题

## 前端重构

### Orval API客户端生成
- 添加orval配置和生成脚本
- 生成完整的类型安全API客户端 (src/api/generated/)
- 导入56个参数类型文件

### API模块迁移
- src/api/course.ts - 迁移使用Orval生成API
- src/api/school-course.ts - 修复类型错误(number vs string)
- src/api/teacher.ts - 完整迁移教师端API
- src/api/client.ts - 重构API客户端统一入口
- src/api/lesson.ts - 修复未使用参数

### 文件路由配置
- 配置unplugin-vue-router插件
- 创建动态路由配置支持自动路由和传统路由切换
- 添加路由守卫保留原有权限逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:05:20 +08:00

78 lines
1.6 KiB
TypeScript

/**
* JSON 字段解析工具
*
* 用于安全解析数据库中存储的 JSON 字符串
*/
/**
* 解析 JSON 字段
*
* @param value - 数据库中的 JSON 字符串
* @param defaultValue - 解析失败时的默认值
* @returns 解析后的对象或默认值
*
* @example
* ```typescript
* const tags = parseJsonField(course.gradeTags, []);
* const settings = parseJsonField(user.settings, {});
* ```
*/
export function parseJsonField<T>(
value: string | null | undefined,
defaultValue: T,
): T {
if (!value) {
return defaultValue;
}
try {
return JSON.parse(value) as T;
} catch {
return defaultValue;
}
}
/**
* 安全地将对象转换为 JSON 字符串
*
* @param value - 要转换的对象
* @param defaultValue - 转换失败时的默认值
* @returns JSON 字符串或默认值
*/
export function stringifyJsonField(
value: any,
defaultValue: string = '{}',
): string {
if (value === null || value === undefined) {
return defaultValue;
}
try {
return JSON.stringify(value);
} catch {
return defaultValue;
}
}
/**
* 解析 JSON 数组字段
*
* @param value - 数据库中的 JSON 数组字符串
* @returns 解析后的数组或空数组
*/
export function parseJsonArray<T>(value: string | null | undefined): T[] {
return parseJsonField<T[]>(value, []);
}
/**
* 解析 JSON 对象字段
*
* @param value - 数据库中的 JSON 对象字符串
* @returns 解析后的对象或空对象
*/
export function parseJsonObject<T extends Record<string, any>>(
value: string | null | undefined,
): T {
return parseJsonField<T>(value, {} as T);
}