Compare commits

..

No commits in common. "de264d329812768b0f7a2cac6b0d1ca895daff25" and "5f55aadb757047b053527246987623b3c43f0c01" have entirely different histories.

1323 changed files with 9649 additions and 2395 deletions

View File

@ -31,11 +31,11 @@ export VITE_APP_PORT=5174
# 方式二:分别启动
# 后端(端口 8481
export SERVER_PORT=8481
cd lesingle-edu-reading-platform-backend && mvn spring-boot:run
cd reading-platform-java && mvn spring-boot:run
# 前端(端口 5174新终端
export PORT=5174
cd lesingle-edu-reading-platform-frontend && npm run dev
cd reading-platform-frontend && npm run dev
```
### 启动服务
@ -51,7 +51,7 @@ cd lesingle-edu-reading-platform-frontend && npm run dev
./stop-all.sh
```
### 前端命令 (lesingle-edu-reading-platform-frontend/)
### 前端命令 (reading-platform-frontend/)
```bash
npm run dev # 开发服务器
@ -61,7 +61,7 @@ npm run test:e2e # 端到端测试 (Playwright)
npm run api:update # 从 OpenAPI 生成 TypeScript 类型
```
### 后端命令 (lesingle-edu-reading-platform-backend/)
### 后端命令 (reading-platform-java/)
```bash
# 运行后端(使用 JDK 17
@ -107,7 +107,7 @@ javac -version
### 配置文件目录结构
```
lesingle-edu-reading-platform-backend/src/main/resources/
reading-platform-java/src/main/resources/
├── application.yml # 主配置文件(共用配置)
├── application-dev.yml # 开发环境配置
├── application-test.yml # 测试环境配置
@ -136,17 +136,17 @@ lesingle-edu-reading-platform-backend/src/main/resources/
```bash
# Linux/Mac
export SPRING_PROFILES_ACTIVE=prod
java -jar lesingle-edu-reading-platform-backend.jar
java -jar reading-platform.jar
# Windows (Git Bash)
export SPRING_PROFILES_ACTIVE=prod
java -jar lesingle-edu-reading-platform-backend.jar
java -jar reading-platform.jar
```
#### 方式二:命令行参数
```bash
java -jar lesingle-edu-reading-platform-backend.jar --spring.profiles.active=prod
java -jar reading-platform.jar --spring.profiles.active=prod
```
#### 方式三Maven 启动
@ -219,7 +219,7 @@ mvn spring-boot:run -Dspring-boot.run.profiles=prod
## 核心原则
1. **后端只写 Java** - ⚠️ **所有后端开发必须基于 `lesingle-edu-reading-platform-backend/` (Spring Boot),严禁使用 Node.js/NestJS**
1. **后端只写 Java** - ⚠️ **所有后端开发必须基于 `reading-platform-java/` (Spring Boot),严禁使用 Node.js/NestJS**
2. **OpenAPI 规范驱动** - 前后端通过接口规范对齐,零沟通成本
3. **类型安全优先** - TypeScript 强制类型校验,早发现早修复
4. **约定大于配置** - 统一代码风格和目录结构,降低认知负担
@ -242,9 +242,9 @@ kindergarten_java/
│ │ ├── teacher/ # 教师端测试
│ │ └── parent/ # 家长端测试
│ └── design/ # 设计文档
├── lesingle-edu-reading-platform-frontend/ # 前端项目 (Vue 3)
├── lesingle-edu-reading-platform-backend/ # 后端项目 (Spring Boot) ← 唯一后端
├── reading-platform-backend/ # ⚠️ 已弃用 (NestJS不再维护)
├── reading-platform-frontend/ # 前端项目 (Vue 3)
├── reading-platform-java/ # 后端项目 (Spring Boot) ← 唯一后端
├── reading-platform-backend/ # ⚠️ 已弃用 (NestJS不再维护)
├── start-all.sh # 统一启动
└── stop-all.sh # 统一停止
```
@ -252,8 +252,8 @@ kindergarten_java/
### 后端目录结构Spring Boot
```
lesingle-edu-reading-platform-backend/
├── src/main/java/com/lesingle/edu/
reading-platform-java/
├── src/main/java/com/reading/platform/
│ ├── ReadingPlatformApplication.java # 启动类
│ ├── common/ # 公共模块
│ │ ├── config/ # 配置类
@ -302,7 +302,7 @@ lesingle-edu-reading-platform-backend/
### 前端目录结构Vue 3
```
lesingle-edu-reading-platform-frontend/
reading-platform-frontend/
├── src/
│ ├── main.ts # 入口文件
│ ├── App.vue # 根组件
@ -683,7 +683,7 @@ taskkill //F //PID <PID>
## 变更边界(必须遵守)
> ⚠️ **最高优先级**: 所有后端开发必须基于 `lesingle-edu-reading-platform-backend/` (Spring Boot + Java 17)
> ⚠️ **最高优先级**: 所有后端开发必须基于 `reading-platform-java/` (Spring Boot + Java 17)
- **不做无关重构** - 只改与需求相关的文件
- **不引入新依赖** - 除非需求明确且必要
@ -765,18 +765,18 @@ taskkill //F //PID <PID>
|------|---------|------|
| 测试框架 | **Playwright Test** | 端到端浏览器自动化测试 |
| 浏览器 | **Chromium** | 可自动打开浏览器模拟用户操作 |
| 配置文件 | `lesingle-edu-reading-platform-frontend/playwright.config.ts` | Playwright 配置 |
| 测试文件 | `lesingle-edu-reading-platform-frontend/tests/` | E2E 测试脚本 |
| 配置文件 | `reading-platform-frontend/playwright.config.ts` | Playwright 配置 |
| 测试文件 | `reading-platform-frontend/tests/` | E2E 测试脚本 |
### 快速开始
```bash
# 1. 启动后端服务
cd lesingle-edu-reading-platform-backend
cd reading-platform-java
mvn spring-boot:run
# 2. 启动前端服务(新终端窗口)
cd lesingle-edu-reading-platform-frontend
cd reading-platform-frontend
npm run dev
# 3. 运行 E2E 测试(无头模式 - 不显示浏览器)
@ -823,9 +823,9 @@ npm run test:e2e:ui
| 文件/目录 | 路径 |
|----------|------|
| 前端 E2E 测试 | `lesingle-edu-reading-platform-frontend/tests/` |
| Playwright 配置 | `lesingle-edu-reading-platform-frontend/playwright.config.ts` |
| 后端测试(待创建) | `lesingle-edu-reading-platform-backend/src/test/` |
| 前端 E2E 测试 | `reading-platform-frontend/tests/` |
| Playwright 配置 | `reading-platform-frontend/playwright.config.ts` |
| 后端测试(待创建) | `reading-platform-java/src/test/` |
| 启动脚本 | `start-all.sh` |
*本规范最后更新于 2026-03-18*

View File

@ -54,7 +54,7 @@ export REMOTE_USER=root
```bash
# 本地构建
cd /f/LesingleProject/lesingle-kindergarten-course/kindergarten_java/lesingle-edu-reading-platform-backend
cd /f/LesingleProject/lesingle-kindergarten-course/kindergarten_java/reading-platform-java
mvn clean package -DskipTests
# 上传到服务器
@ -122,7 +122,7 @@ tail -f logs/app.log
### 4.1 本地构建
```bash
cd /f/LesingleProject/lesingle-kindergarten-course/kindergarten_java/lesingle-edu-reading-platform-frontend
cd /f/LesingleProject/lesingle-kindergarten-course/kindergarten_java/reading-platform-frontend
npm run build
```
@ -225,7 +225,7 @@ ps aux | grep reading-platform
```bash
# 本地重新构建并上传
cd lesingle-edu-reading-platform-frontend
cd reading-platform-frontend
npm run build
scp -r dist/* root@你的 IP:/www/wwwroot/你的域名/
```

View File

@ -1,4 +1,4 @@
# 少儿智慧阅读 - 服务启动指南
# 幼儿阅读教学服务平台 - 服务启动指南
## 📋 概述
@ -25,10 +25,10 @@
```bash
# 启动后端
./lesingle-edu-reading-platform-backend/start-backend.sh
./reading-platform-backend/start-backend.sh
# 启动前端
./lesingle-edu-reading-platform-frontend/start-frontend.sh
./reading-platform-frontend/start-frontend.sh
```
## 🛑 停止服务
@ -63,13 +63,13 @@ lsof -ti:5173 | xargs kill -9
```bash
# 实时查看后端日志
tail -f /tmp/lesingle-edu-reading-platform-backend.log
tail -f /tmp/reading-platform-backend.log
# 实时查看前端日志
tail -f /tmp/lesingle-edu-reading-platform-frontend.log
tail -f /tmp/reading-platform-frontend.log
# 查看所有日志
tail -f /tmp/lesingle-edu-reading-platform-*.log
tail -f /tmp/reading-platform-*.log
```
## 🔍 检查服务状态
@ -91,11 +91,11 @@ curl http://localhost:3000/api/v1/courses
/Users/retirado/ccProgram/
├── start-all.sh # 统一启动脚本 ⭐
├── stop-all.sh # 统一停止脚本 ⭐
├── lesingle-edu-reading-platform-backend/ # 后端目录
├── reading-platform-backend/ # 后端目录
│ ├── start-backend.sh # 后端启动脚本
│ ├── package.json
│ └── src/
└── lesingle-edu-reading-platform-frontend/ # 前端目录
└── reading-platform-frontend/ # 前端目录
├── start-frontend.sh # 前端启动脚本
├── package.json
└── src/
@ -112,8 +112,8 @@ A: 先运行 `./stop-all.sh` 停止服务,再运行 `./start-all.sh` 启动。
### Q: 服务启动失败怎么办?
A: 查看日志文件排查问题:
```bash
tail -f /tmp/lesingle-edu-reading-platform-backend.log
tail -f /tmp/lesingle-edu-reading-platform-frontend.log
tail -f /tmp/reading-platform-backend.log
tail -f /tmp/reading-platform-frontend.log
```
### Q: 如何在开发模式下启动?

View File

@ -15,7 +15,7 @@ set -e
# 配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$SCRIPT_DIR/lesingle-edu-reading-platform-backend"
BACKEND_DIR="$SCRIPT_DIR/reading-platform-java"
REMOTE_BASE_DIR="/www/wwwroot/reading-platform"
# SSH 配置

View File

@ -15,7 +15,7 @@ set -e
# 配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FRONTEND_DIR="$SCRIPT_DIR/lesingle-edu-reading-platform-frontend"
FRONTEND_DIR="$SCRIPT_DIR/reading-platform-frontend"
REMOTE_DIR="/www/wwwroot/reading.ycapp.cn"
# SSH 配置(可通过环境变量覆盖)

View File

@ -1,7 +1,7 @@
#!/bin/bash
#===============================================================================
# 少儿智慧阅读 - 一键部署到宝塔面板
# 幼儿阅读教学服务平台 - 一键部署到宝塔面板
#
# 使用前请配置:
# 1. 远程服务器信息IP、用户名、密码/密钥)
@ -77,14 +77,14 @@ check_config() {
fi
# 检查本地是否有 JAR 包
JAR_FILE="lesingle-edu-reading-platform-backend/target/reading-platform-1.0.0.jar"
JAR_FILE="reading-platform-java/target/reading-platform-1.0.0.jar"
if [ ! -f "$JAR_FILE" ]; then
log_warn "未找到 JAR 包,将先执行构建..."
BUILD_NEEDED=true
fi
# 检查前端是否有 dist
if [ ! -d "lesingle-edu-reading-platform-frontend/dist" ]; then
if [ ! -d "reading-platform-frontend/dist" ]; then
log_warn "未找到前端构建文件,将先执行构建..."
BUILD_FRONTEND_NEEDED=true
fi
@ -97,7 +97,7 @@ build_backend() {
fi
log_step "构建后端服务..."
cd "lesingle-edu-reading-platform-backend"
cd "reading-platform-java"
# 检查 JDK 版本
if command -v java &> /dev/null; then
@ -151,7 +151,7 @@ build_frontend() {
cd ..
if [ -d "lesingle-edu-reading-platform-frontend/dist" ]; then
if [ -d "reading-platform-frontend/dist" ]; then
log_info "前端构建成功"
else
log_error "前端构建失败"
@ -190,7 +190,7 @@ ENDSSH
# 上传 JAR 包
log_info "上传后端 JAR 包..."
scp -o StrictHostKeyChecking=no -P "$REMOTE_PORT" \
"lesingle-edu-reading-platform-backend/target/reading-platform-1.0.0.jar" \
"reading-platform-java/target/reading-platform-1.0.0.jar" \
"$REMOTE_USER@$REMOTE_HOST:/www/wwwroot/reading-platform/app.jar"
# 上传启动脚本
@ -299,7 +299,7 @@ upload_frontend() {
# 上传 dist 目录
log_info "上传前端构建文件..."
scp -o StrictHostKeyChecking=no -r -P "$REMOTE_PORT" \
"lesingle-edu-reading-platform-frontend/dist/" \
"reading-platform-frontend/dist/" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_FRONTEND_DIR/"
log_info "前端文件上传完成"
@ -389,7 +389,7 @@ show_deploy_info() {
main() {
echo ""
echo "=============================================="
echo " 少儿智慧阅读"
echo " 幼儿阅读教学服务平台"
echo " 一键部署到宝塔面板"
echo "=============================================="
echo ""

View File

@ -1,7 +1,7 @@
#!/bin/bash
#===============================================================================
# 少儿智慧阅读 - 一键部署到宝塔面板
# 幼儿阅读教学服务平台 - 一键部署到宝塔面板
#
# 使用方法:
# ./deploy.sh your-server-ip
@ -29,7 +29,7 @@ log_step() { echo -e "${BLUE}[STEP]${NC} $1"; }
if [ -z "$1" ]; then
echo ""
echo "=============================================="
echo " 少儿智慧阅读"
echo " 幼儿阅读教学服务平台"
echo " 一键部署到宝塔面板"
echo "=============================================="
echo ""

View File

@ -1,245 +0,0 @@
# Logback 日志配置说明
## 配置位置
- **配置文件**: `reading-platform-java/src/main/resources/logback-spring.xml`
- **日志目录**: `logs/`(应用启动时自动创建)
---
## 日志滚动策略
### 保留策略
| 配置项 | 值 | 说明 |
|--------|-----|------|
| 保留天数 | 30 天 | 自动删除 30 天前的日志 |
| 单文件大小 | 100MB | 单个日志文件最大 100MB |
| 总大小上限 | 2GB | 所有日志文件总计不超过 2GB |
### 滚动规则
1. **按天滚动**: 每天生成一个新的日志文件
2. **按大小滚动**: 当单个文件超过 100MB 时自动切分
3. **自动清理**: 超过 30 天的日志自动删除
4. **总量控制**: 当日志总量达到 2GB 时,删除最旧的日志
---
## 日志文件分类
| 日志类型 | 文件名 | 说明 | 大小上限 |
|---------|--------|------|---------|
| 主日志 | `reading-platform.log` | 业务日志、系统日志 | 2GB |
| 错误日志 | `reading-platform-error.log` | 仅记录 ERROR 级别日志 | 500MB |
| 请求日志 | `reading-platform-request.log` | 所有 API 请求日志 | 500MB |
| SQL 日志 | `reading-platform-sql.log` | 仅记录慢 SQL 和错误 SQL | 300MB |
### 日志文件命名示例
```
logs/
├── reading-platform.log # 当前主日志
├── reading-platform.2026-03-26.1.log # 按天滚动
├── reading-platform.2026-03-26.2.log # 按大小滚动
├── reading-platform-error.log # 当前错误日志
├── reading-platform-error.2026-03-26.1.log
├── reading-platform-request.log # 当前请求日志
├── reading-platform-request.2026-03-26.1.log
└── reading-platform-sql.log # 当前 SQL 日志
```
---
## 日志级别配置
### 生产环境 (prod)
| 日志类别 | 日志级别 | 输出目标 | 说明 |
|---------|---------|---------|------|
| 根日志 | INFO | FILE, ERROR_FILE | 基础日志级别 |
| 业务日志 | INFO | FILE | `com.reading.platform` 包 |
| **请求日志** | **INFO** | **REQUEST_FILE** | **所有 API 请求单独输出** |
| **SQL 日志** | **WARN** | **SQL_FILE** | **仅记录慢 SQL 和错误 SQL** |
| Spring 框架 | WARN | - | 框架日志 |
### 开发环境 (dev)
| 日志类别 | 日志级别 | 说明 |
|---------|---------|------|
| 业务日志 | DEBUG | 详细业务日志 |
| 请求日志 | INFO | 所有 API 请求单独输出 |
| SQL 日志 | DEBUG | 全量 SQL 日志 |
---
## 请求日志格式
每个 API 请求会记录以下信息:
```
===== 请求开始 =====
接口地址POST /api/v1/teacher/courses
请求方法com.reading.platform.controller.teacher.CourseController.createCourse
请求参数:{"name":"新课程","gradeId":1}
响应时间156ms
响应结果:{"code":"SUCCESS","data":123}
===== 请求结束 =====
```
异常请求:
```
===== 请求异常 =====
接口地址POST /api/v1/teacher/courses
执行时间45ms
异常信息:参数校验失败
异常类型com.reading.platform.common.exception.BusinessException
堆栈信息:...
===== 请求异常结束 =====
```
---
## SQL 日志策略
### 生产环境(推荐)
**只记录慢 SQL 和错误 SQL**,通过设置 `WARN` 级别实现:
- `DEBUG` 级别:所有 SQL开发环境
- `INFO` 级别SQL 摘要(测试环境)
- `WARN` 级别:**仅慢 SQL 和错误 SQL**(生产环境)
- `ERROR` 级别:仅错误 SQL
### 慢 SQL 配置(可选)
如需记录执行时间超过指定阈值的 SQL可在 MyBatis-Plus 配置中设置:
```yaml
# application-prod.yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
```
---
## 常用命令
### 查看实时请求日志
```bash
tail -f logs/reading-platform-request.log
```
### 查看实时错误日志
```bash
tail -f logs/reading-platform-error.log
```
### 查看实时 SQL 日志
```bash
tail -f logs/reading-platform-sql.log
```
### 查看指定日期的日志
```bash
cat logs/reading-platform-request.2026-03-26.1.log
```
### 搜索特定接口日志
```bash
grep "/api/v1/teacher/courses" logs/reading-platform-request.*.log
```
### 搜索错误日志
```bash
grep "ERROR" logs/reading-platform-error.log
```
### 查看日志目录大小
```bash
du -sh logs/
```
### 手动清理日志(可选)
```bash
# 删除 7 天前的日志
find logs/ -name "*.log" -mtime +7 -delete
```
---
## 配置修改
### 调整日志保留天数
修改 `logback-spring.xml`
```xml
<property name="LOG_MAX_HISTORY" value="30"/> <!-- 修改这里的数字 -->
```
### 调整单个文件大小限制
```xml
<property name="LOG_MAX_FILE_SIZE" value="100MB"/> <!-- 修改文件大小 -->
```
### 调整总日志大小上限
```xml
<property name="LOG_TOTAL_CAP" value="2GB"/> <!-- 修改总大小 -->
```
### 修改后重启服务
```bash
cd /www/wwwroot/reading-platform
./stop.sh
./start.sh
```
---
## 环境切换
### 开发环境
```bash
export SPRING_PROFILES_ACTIVE=dev
java -jar reading-platform.jar
```
### 生产环境
```bash
export SPRING_PROFILES_ACTIVE=prod
java -jar reading-platform.jar
```
---
## 注意事项
1. **请求日志独立输出**: 所有 API 请求日志输出到 `request.log`,不影响主日志
2. **SQL 日志精简**: 生产环境仅记录 WARN 和 ERROR 级别 SQL避免日志爆炸
3. **错误日志单独记录**: 所有 ERROR 级别日志输出到 `error.log`,便于问题排查
4. **日志目录权限**: 确保 `logs` 目录有写权限chmod 755
5. **磁盘空间监控**: 建议设置磁盘告警,当日志目录接近总上限时收到通知
---
## 故障排查
### 请求日志不输出
- 检查 `RequestLogAspect` 切面是否生效
- 确认日志级别配置为 `INFO`
- 检查 `additivity="false"` 是否配置
### SQL 日志不输出
- 生产环境只记录 WARN 和 ERROR 级别(慢 SQL 和错误 SQL
- 如需查看全量 SQL临时改为 `DEBUG` 级别
### 日志文件丢失
- 检查是否达到 `maxHistory`30 天)
- 检查是否达到 `totalSizeCap`(总大小上限)
---
**配置日期**: 2026-03-26
**最后更新**: 2026-03-26

View File

@ -1,4 +1,4 @@
# 少儿智慧阅读
# 幼儿阅读教学服务平台
> 面向幼儿园的B2B2C阅读教学服务平台将优质绘本资源包装成教学课程帮助幼儿园老师更好地完成教学工作。

View File

@ -1,17 +1,17 @@
# 少儿智慧阅读 - 项目概览
# 幼儿阅读教学服务平台 - 项目概览
> 创建时间2025-01-29
> 最后更新2025-01-29
## 项目定位
面向幼儿园客户提供的一站式少儿智慧阅读,将优质绘本资源包装成教学课程,帮助幼儿园老师更好地完成教学工作。
面向幼儿园客户提供的一站式幼儿阅读教学服务平台,将优质绘本资源包装成教学课程,帮助幼儿园老师更好地完成教学工作。
## 平台架构
```
┌─────────────────────────────────────────────────────────────┐
少儿智慧阅读
幼儿阅读教学服务平台
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ │

View File

@ -988,7 +988,7 @@ FRONTEND_URL="http://localhost:5173"
```bash
# frontend/.env.development
VITE_API_BASE_URL=http://localhost:3000/api/v1
VITE_APP_TITLE=少儿智慧阅读
VITE_APP_TITLE=幼儿阅读教学服务平台
```
---

View File

@ -1,4 +1,4 @@
# 少儿智慧阅读 - 项目总览
# 幼儿阅读教学服务平台 - 项目总览
> 更新时间2026-02-27
> 项目状态:需求重构中 - 课程包与套餐结构重构
@ -23,7 +23,7 @@
## 📋 项目简介
**少儿智慧阅读**是一个面向幼儿园的B2B2C阅读教学服务平台将优质绘本资源包装成教学课程帮助幼儿园老师更好地完成教学工作。
**幼儿阅读教学服务平台**是一个面向幼儿园的B2B2C阅读教学服务平台将优质绘本资源包装成教学课程帮助幼儿园老师更好地完成教学工作。
### 核心价值

View File

@ -108,7 +108,7 @@ const doc = new Document({
headers: {
default: new Header({ children: [new Paragraph({
alignment: AlignmentType.RIGHT,
children: [new TextRun({ text: "少儿智慧阅读 - 产品介绍", size: 20, color: "888888" })]
children: [new TextRun({ text: "幼儿阅读教学服务平台 - 产品介绍", size: 20, color: "888888" })]
})] })
},
footers: {
@ -124,7 +124,7 @@ const doc = new Document({
new Paragraph({ spacing: { before: 2000 } }),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "少儿智慧阅读", size: 72, bold: true, color: "1E3A5F", font: "Microsoft YaHei" })]
children: [new TextRun({ text: "幼儿阅读教学服务平台", size: 72, bold: true, color: "1E3A5F", font: "Microsoft YaHei" })]
}),
new Paragraph({ spacing: { before: 400 } }),
new Paragraph({
@ -154,7 +154,7 @@ const doc = new Document({
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("1.1 产品定位")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun({ text: "少儿智慧阅读是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。" })]
children: [new TextRun({ text: "幼儿阅读教学服务平台是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。" })]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("1.2 目标用户")] }),
@ -399,7 +399,7 @@ const doc = new Document({
// 生成文档
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/Users/retirado/ccProgram/docs/少儿智慧阅读-产品介绍与功能说明.docx", buffer);
fs.writeFileSync("/Users/retirado/ccProgram/docs/幼儿阅读教学服务平台-产品介绍与功能说明.docx", buffer);
console.log("文档生成成功!");
}).catch(err => {
console.error("生成文档失败:", err);

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
少儿智慧阅读 - 产品介绍与功能说明 PDF生成脚本
幼儿阅读教学服务平台 - 产品介绍与功能说明 PDF生成脚本
"""
from reportlab.lib.pagesizes import A4
@ -196,7 +196,7 @@ def add_image_with_caption(story, image_path, caption, styles, max_width=15*cm,
def build_document():
"""构建PDF文档"""
output_path = '/Users/retirado/ccProgram/docs/少儿智慧阅读-产品介绍与功能说明.pdf'
output_path = '/Users/retirado/ccProgram/docs/幼儿阅读教学服务平台-产品介绍与功能说明.pdf'
screenshots_dir = '/Users/retirado/ccProgram/docs/screenshots'
doc = SimpleDocTemplate(
@ -213,7 +213,7 @@ def build_document():
# ===== 封面 =====
story.append(Spacer(1, 4*cm))
story.append(Paragraph('少儿智慧阅读', styles['CoverTitle']))
story.append(Paragraph('幼儿阅读教学服务平台', styles['CoverTitle']))
story.append(Paragraph('产品介绍与功能说明', styles['CoverSubtitle']))
story.append(Spacer(1, 3*cm))
story.append(Paragraph('版本v1.0', styles['CoverSubtitle']))
@ -225,7 +225,7 @@ def build_document():
story.append(Paragraph('1.1 产品定位', styles['SectionTitle']))
story.append(Paragraph(
'少儿智慧阅读是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。',
'幼儿阅读教学服务平台是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。',
styles['ChineseBody']
))

View File

@ -79,8 +79,8 @@
### 2.1 基本设置
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 加载设置 | 显示已有设置值 | 成功加载"少儿智慧阅读"等默认值 | ✅ |
| 修改系统名称 | 保存成功 | 修改为"少儿智慧阅读 - 测试"PUT 200成功 | ✅ |
| 加载设置 | 显示已有设置值 | 成功加载"幼儿阅读教学服务平台"等默认值 | ✅ |
| 修改系统名称 | 保存成功 | 修改为"幼儿阅读教学服务平台 - 测试"PUT 200成功 | ✅ |
| 修改联系信息 | 保存成功 | 未详细测试 | ⏳ |
### 2.2 安全设置

View File

@ -1,4 +1,4 @@
# 少儿智慧阅读 - 系统测试方案
# 幼儿阅读教学服务平台 - 系统测试方案
> 版本: v1.0
> 创建时间: 2026-02-24
@ -10,7 +10,7 @@
### 1.1 项目背景
少儿智慧阅读是一个面向幼儿园客户提供的一站式少儿智慧阅读,包含四个端:
幼儿阅读教学服务平台是一个面向幼儿园客户提供的一站式幼儿阅读教学服务平台,包含四个端:
- **超管端**:平台运营管理、课程包制作发布、租户数据监控
- **学校端**:幼儿园管理(园长/教务管理员/教学主管)
- **教师端**:一线教师完成日常阅读教学

View File

@ -1,10 +1,10 @@
# 少儿智慧阅读 - 产品介绍与功能说明
# 幼儿阅读教学服务平台 - 产品介绍与功能说明
## 一、产品概述
### 1.1 产品定位
**少儿智慧阅读**是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。
**幼儿阅读教学服务平台**是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。
### 1.2 目标用户

View File

@ -1,4 +1,4 @@
# 少儿智慧阅读
# 幼儿阅读教学服务平台
## 产品简介

View File

@ -1,103 +0,0 @@
package com.lesingle.edu.common.aspect;
import com.alibaba.fastjson2.JSON;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* 请求日志切面
* 记录所有 Controller 层的请求信息
*/
@Slf4j
@Aspect
@Component
public class RequestLogAspect {
/**
* 定义切点Controller 层所有方法
*/
@Pointcut("execution(* com.lesingle.edu.controller..*.*(..))")
public void controllerPointcut() {
}
/**
* 环绕通知记录请求日志
*/
@Around("controllerPointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取请求信息
ServletRequestAttributes attributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
// 获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 记录请求开始
long startTime = System.currentTimeMillis();
String requestURI = request.getRequestURI();
String methodType = request.getMethod();
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
String params = JSON.toJSONString(getRequestParams(joinPoint));
log.info("===== 请求开始 =====");
log.info("接口地址:{} {}", methodType, requestURI);
log.info("请求方法:{}.{}", className, methodName);
log.info("请求参数:{}", params);
try {
// 执行目标方法
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
// 记录响应结果
log.info("响应时间:{}ms", duration);
log.info("响应结果:{}", JSON.toJSONString(result));
log.info("===== 请求结束 =====");
return result;
} catch (Throwable e) {
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
// 记录异常信息
log.error("===== 请求异常 =====");
log.error("接口地址:{} {}", methodType, requestURI);
log.error("执行时间:{}ms", duration);
log.error("异常信息:{}", e.getMessage());
log.error("异常类型:{}", e.getClass().getName());
log.error("堆栈信息:", e);
log.error("===== 请求异常结束 =====");
throw e;
}
}
/**
* 获取请求参数
*/
private Object getRequestParams(ProceedingJoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
if (args.length == 0) {
return null;
} else if (args.length == 1) {
return args[0];
} else {
return args;
}
}
}

View File

@ -1,184 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- ==================== 变量定义 ==================== -->
<!-- 日志保留天数 -->
<property name="LOG_MAX_HISTORY" value="30"/>
<!-- 单个日志文件最大大小 -->
<property name="LOG_MAX_FILE_SIZE" value="100MB"/>
<!-- 总日志大小上限 -->
<property name="LOG_TOTAL_CAP" value="2GB"/>
<!-- 日志存储目录 -->
<property name="LOG_HOME" value="logs"/>
<!-- 应用名称 -->
<property name="APP_NAME" value="reading-platform"/>
<!-- ==================== 控制台输出 ==================== -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ==================== 文件滚动输出 - 主日志 ==================== -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式:按天滚动 -->
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 保留 30 天日志 -->
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<!-- 按大小滚动(单个文件最大 100MB -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 总日志大小上限 2GB -->
<totalSizeCap>${LOG_TOTAL_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ==================== 错误日志单独输出 ==================== -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}-error.log</file>
<!-- 只记录 ERROR 级别日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ==================== 请求日志单独输出 ==================== -->
<appender name="REQUEST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}-request.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}-request.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ==================== SQL 日志 - 只记录慢 SQL 和错误 SQL ==================== -->
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}-sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}-sql.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ==================== 开发环境配置 ==================== -->
<springProfile name="dev">
<!-- 根日志级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- 业务日志输出 DEBUG 级别 -->
<logger name="com.lesingle.edu" level="DEBUG"/>
<!-- 请求日志(单独输出到 request.log -->
<logger name="com.lesingle.edu.common.aspect.RequestLogAspect" level="INFO" additivity="false">
<appender-ref ref="REQUEST_FILE"/>
</logger>
<!-- MyBatis SQL 日志(开发环境全量记录) -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<logger name="com.lesingle.edu.mapper" level="DEBUG"/>
</springProfile>
<!-- ==================== 测试环境配置 ==================== -->
<springProfile name="test">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<!-- 请求日志 -->
<logger name="com.lesingle.edu.common.aspect.RequestLogAspect" level="INFO" additivity="false">
<appender-ref ref="REQUEST_FILE"/>
</logger>
<!-- 业务日志 -->
<logger name="com.lesingle.edu" level="INFO"/>
<!-- MyBatis SQL 日志(只记录 DEBUG 及以上) -->
<logger name="com.baomidou.mybatisplus" level="INFO"/>
<logger name="com.lesingle.edu.mapper" level="INFO"/>
</springProfile>
<!-- ==================== 生产环境配置 ==================== -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<!-- 业务日志 INFO 级别 -->
<logger name="com.lesingle.edu" level="INFO"/>
<!-- 请求日志(单独输出到 request.log -->
<logger name="com.lesingle.edu.common.aspect.RequestLogAspect" level="INFO" additivity="false">
<appender-ref ref="REQUEST_FILE"/>
</logger>
<!-- MyBatis SQL 日志(生产环境只记录 WARN 和 ERROR即慢 SQL 和错误 SQL -->
<logger name="com.baomidou.mybatisplus" level="WARN" additivity="false">
<appender-ref ref="SQL_FILE"/>
</logger>
<logger name="com.lesingle.edu.mapper" level="WARN" additivity="false">
<appender-ref ref="SQL_FILE"/>
</logger>
<!-- Spring 框架日志 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
</springProfile>
</configuration>

View File

@ -1,4 +1,4 @@
# Nginx 配置 - 少儿智慧阅读
# Nginx 配置 - 幼儿阅读教学服务平台
# 在宝塔面板中配置此反向代理
#==============================

BIN
reading-platform-frontend/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,4 +1,4 @@
VITE_API_BASE_URL=
VITE_APP_TITLE=少儿智慧阅读
VITE_APP_TITLE=幼儿阅读教学服务平台
VITE_SERVER_BASE_URL=
VITE_ENABLE_DEFAULT_ACCOUNT=true

View File

@ -1,4 +1,4 @@
VITE_API_BASE_URL=
VITE_APP_TITLE=少儿智慧阅读
VITE_APP_TITLE=幼儿阅读教学服务平台
VITE_SERVER_BASE_URL=
VITE_ENABLE_DEFAULT_ACCOUNT=false

View File

View File

@ -6,7 +6,7 @@
<!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
<link rel="icon" href="/logo/logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>少儿智慧阅读</title>
<title>幼儿阅读教学服务平台</title>
<!-- 阿里云IMM -->
<script src="https://g.alicdn.com/IMM/office-js/1.1.19/aliyun-web-office-sdk.min.js"></script>
<link rel="stylesheet"

7785
reading-platform-frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{
"name": "lesingle-edu-reading-platform-frontend",
"name": "reading-platform-frontend",
"version": "1.0.0",
"private": true,
"type": "module",

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
reading-platform-frontend/src/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

View File

@ -1,7 +1,7 @@
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* API
* API
* API
* OpenAPI spec version: 2.0
*/

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