Spaces:
Sleeping
Sleeping
update
Browse files- __pycache__/app.cpython-311.pyc +0 -0
- ai_edu.db +0 -0
- app.py +69 -0
- memory-bank/activeContext.md +6 -2
- memory-bank/progress.md +6 -0
- memory-bank/systemPatterns.md +3 -1
__pycache__/app.cpython-311.pyc
CHANGED
|
Binary files a/__pycache__/app.cpython-311.pyc and b/__pycache__/app.cpython-311.pyc differ
|
|
|
ai_edu.db
CHANGED
|
Binary files a/ai_edu.db and b/ai_edu.db differ
|
|
|
app.py
CHANGED
|
@@ -40,6 +40,16 @@ def init_db():
|
|
| 40 |
order_date TEXT NOT NULL
|
| 41 |
)
|
| 42 |
""")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
conn.commit()
|
| 44 |
|
| 45 |
# 在应用启动时初始化数据库
|
|
@@ -77,6 +87,13 @@ class EnrollmentIndividualRequest(BaseModel):
|
|
| 77 |
position: str
|
| 78 |
email: str
|
| 79 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
@api_router.post("/auth/register")
|
| 81 |
async def register_user(request: RegisterRequest):
|
| 82 |
user_id = str(uuid.uuid4())
|
|
@@ -214,6 +231,58 @@ async def get_individual_orders():
|
|
| 214 |
detail=f"获取个人报名订单失败: {str(e)}"
|
| 215 |
)
|
| 216 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
@api_router.delete("/enrollment/individual/{enrollment_id}")
|
| 218 |
async def delete_individual_enrollment(enrollment_id: str):
|
| 219 |
try:
|
|
|
|
| 40 |
order_date TEXT NOT NULL
|
| 41 |
)
|
| 42 |
""")
|
| 43 |
+
cursor.execute("""
|
| 44 |
+
CREATE TABLE IF NOT EXISTS courses (
|
| 45 |
+
course_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 46 |
+
title TEXT NOT NULL,
|
| 47 |
+
description TEXT,
|
| 48 |
+
price REAL NOT NULL,
|
| 49 |
+
duration_hours INTEGER,
|
| 50 |
+
level TEXT
|
| 51 |
+
)
|
| 52 |
+
""")
|
| 53 |
conn.commit()
|
| 54 |
|
| 55 |
# 在应用启动时初始化数据库
|
|
|
|
| 87 |
position: str
|
| 88 |
email: str
|
| 89 |
|
| 90 |
+
class Course(BaseModel):
|
| 91 |
+
title: str
|
| 92 |
+
description: str | None = None
|
| 93 |
+
price: float
|
| 94 |
+
duration_hours: int | None = None
|
| 95 |
+
level: str | None = None
|
| 96 |
+
|
| 97 |
@api_router.post("/auth/register")
|
| 98 |
async def register_user(request: RegisterRequest):
|
| 99 |
user_id = str(uuid.uuid4())
|
|
|
|
| 231 |
detail=f"获取个人报名订单失败: {str(e)}"
|
| 232 |
)
|
| 233 |
|
| 234 |
+
@api_router.post("/course/add")
|
| 235 |
+
async def add_course(course: Course):
|
| 236 |
+
try:
|
| 237 |
+
with sqlite3.connect(DATABASE_URL) as conn:
|
| 238 |
+
cursor = conn.cursor()
|
| 239 |
+
cursor.execute(
|
| 240 |
+
"INSERT INTO courses (title, description, price, duration_hours, level) VALUES (?, ?, ?, ?, ?)",
|
| 241 |
+
(course.title, course.description, course.price, course.duration_hours, course.level)
|
| 242 |
+
)
|
| 243 |
+
conn.commit()
|
| 244 |
+
course_id = cursor.lastrowid
|
| 245 |
+
return {
|
| 246 |
+
"code": 200,
|
| 247 |
+
"message": "课程添加成功",
|
| 248 |
+
"data": {
|
| 249 |
+
"course_id": course_id,
|
| 250 |
+
**course.dict()
|
| 251 |
+
}
|
| 252 |
+
}
|
| 253 |
+
except Exception as e:
|
| 254 |
+
raise HTTPException(
|
| 255 |
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
| 256 |
+
detail=f"添加课程失败: {str(e)}"
|
| 257 |
+
)
|
| 258 |
+
|
| 259 |
+
@api_router.get("/course/details/{course_id}")
|
| 260 |
+
async def get_course_details(course_id: int):
|
| 261 |
+
try:
|
| 262 |
+
with sqlite3.connect(DATABASE_URL) as conn:
|
| 263 |
+
conn.row_factory = sqlite3.Row
|
| 264 |
+
cursor = conn.cursor()
|
| 265 |
+
cursor.execute("SELECT * FROM courses WHERE course_id = ?", (course_id,))
|
| 266 |
+
course = cursor.fetchone()
|
| 267 |
+
if course:
|
| 268 |
+
return {
|
| 269 |
+
"code": 200,
|
| 270 |
+
"message": "获取课程详情成功",
|
| 271 |
+
"data": dict(course)
|
| 272 |
+
}
|
| 273 |
+
else:
|
| 274 |
+
raise HTTPException(
|
| 275 |
+
status_code=status.HTTP_404_NOT_FOUND,
|
| 276 |
+
detail="未找到该课程"
|
| 277 |
+
)
|
| 278 |
+
except HTTPException as e:
|
| 279 |
+
raise e
|
| 280 |
+
except Exception as e:
|
| 281 |
+
raise HTTPException(
|
| 282 |
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
| 283 |
+
detail=f"获取课程详情失败: {str(e)}"
|
| 284 |
+
)
|
| 285 |
+
|
| 286 |
@api_router.delete("/enrollment/individual/{enrollment_id}")
|
| 287 |
async def delete_individual_enrollment(enrollment_id: str):
|
| 288 |
try:
|
memory-bank/activeContext.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
| 6 |
- 实现了用户注册 (`/api/auth/register`) 和登录 (`/api/auth/login`) 接口。
|
| 7 |
- 配置了 CORS 中间件以处理跨域请求。
|
| 8 |
- 优化了登录接口的错误响应,使其返回自定义的业务错误码和信息。
|
|
|
|
|
|
|
| 9 |
|
| 10 |
## 最近的更改
|
| 11 |
- `app.py`:
|
|
@@ -19,9 +21,11 @@
|
|
| 19 |
- 添加 `CORSMiddleware` 处理跨域请求。
|
| 20 |
|
| 21 |
## 下一步计划
|
| 22 |
-
-
|
| 23 |
-
-
|
|
|
|
| 24 |
- **更多业务接口**: 根据 AI-EDU H5 的需求,逐步实现其他后端 API。
|
|
|
|
| 25 |
|
| 26 |
## 活跃决策和考虑
|
| 27 |
- 数据库选择:目前使用 SQLite 方便开发和演示,未来可考虑升级到 PostgreSQL 或 MySQL。
|
|
|
|
| 6 |
- 实现了用户注册 (`/api/auth/register`) 和登录 (`/api/auth/login`) 接口。
|
| 7 |
- 配置了 CORS 中间件以处理跨域请求。
|
| 8 |
- 优化了登录接口的错误响应,使其返回自定义的业务错误码和信息。
|
| 9 |
+
- **新增了课程管理功能,包括课程表的创建和课程详情查询接口 (`/api/course/details/{course_id}`)。**
|
| 10 |
+
- **新增了课程添加接口 (`/api/course/add`) 用于测试和数据初始化。**
|
| 11 |
|
| 12 |
## 最近的更改
|
| 13 |
- `app.py`:
|
|
|
|
| 21 |
- 添加 `CORSMiddleware` 处理跨域请求。
|
| 22 |
|
| 23 |
## 下一步计划
|
| 24 |
+
- **安全性增强**:
|
| 25 |
+
- **密码哈希**: 引入密码哈希(如 `passlib`)来加密存储用户密码,提高安全性。
|
| 26 |
+
- **会话管理/JWT**: 实现用户登录后的会话管理或 JWT 认证机制。
|
| 27 |
- **更多业务接口**: 根据 AI-EDU H5 的需求,逐步实现其他后端 API。
|
| 28 |
+
- **数据库抽象**: 考虑引入 ORM(如 SQLAlchemy)来更好地管理数据库操作。
|
| 29 |
|
| 30 |
## 活跃决策和考虑
|
| 31 |
- 数据库选择:目前使用 SQLite 方便开发和演示,未来可考虑升级到 PostgreSQL 或 MySQL。
|
memory-bank/progress.md
CHANGED
|
@@ -23,6 +23,12 @@
|
|
| 23 |
- **更多业务接口**: 根据 AI-EDU H5 的具体需求,逐步添加其他 API 接口。
|
| 24 |
- **数据库抽象**: 考虑引入 ORM(如 SQLAlchemy)来更好地管理数据库操作。
|
| 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
## 当前状态
|
| 27 |
- 基本的用户认证功能已实现并可运行。
|
| 28 |
- 数据库集成已完成。
|
|
|
|
| 23 |
- **更多业务接口**: 根据 AI-EDU H5 的具体需求,逐步添加其他 API 接口。
|
| 24 |
- **数据库抽象**: 考虑引入 ORM(如 SQLAlchemy)来更好地管理数据库操作。
|
| 25 |
|
| 26 |
+
## 已完成的工作
|
| 27 |
+
- **课程管理接口**:
|
| 28 |
+
- 实现了 `courses` 表的创建。
|
| 29 |
+
- 实现了 `/api/course/add` 接口,用于添加课程。
|
| 30 |
+
- 实现了 `/api/course/details/{course_id}` 接口,用于获取课程详情。
|
| 31 |
+
|
| 32 |
## 当前状态
|
| 33 |
- 基本的用户认证功能已实现并可运行。
|
| 34 |
- 数据库集成已完成。
|
memory-bank/systemPatterns.md
CHANGED
|
@@ -17,10 +17,12 @@
|
|
| 17 |
|
| 18 |
## 组件关系
|
| 19 |
- `app.py`: 包含 FastAPI 应用实例、CORS 配置、数据库初始化逻辑、API 路由定义。
|
| 20 |
-
- `api_router`: 负责定义 `/api/auth/register
|
| 21 |
- `sqlite3`: 用于与 `ai_edu.db` 数据库文件进行交互。
|
| 22 |
- `pydantic.BaseModel`: 用于定义请求体的模型(`RegisterRequest`, `LoginRequest`)。
|
| 23 |
|
| 24 |
## 关键实现路径
|
| 25 |
- **用户注册**: 接收 `username` 和 `password` -> 生成 `user_id` (UUID) -> 插入 `users` 表 -> 返回成功响应或错误。
|
| 26 |
- **用户登录**: 接收 `username` 和 `password` -> 查询 `users` 表验证凭据 -> 返回成功响应(包含 `user_id` 和 `username`)或错误。
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
## 组件关系
|
| 19 |
- `app.py`: 包含 FastAPI 应用实例、CORS 配置、数据库初始化逻辑、API 路由定义。
|
| 20 |
+
- `api_router`: 负责定义 `/api/auth/register`, `/api/auth/login`, `/api/course/add`, `/api/course/details/{course_id}` 等接口。
|
| 21 |
- `sqlite3`: 用于与 `ai_edu.db` 数据库文件进行交互。
|
| 22 |
- `pydantic.BaseModel`: 用于定义请求体的模型(`RegisterRequest`, `LoginRequest`)。
|
| 23 |
|
| 24 |
## 关键实现路径
|
| 25 |
- **用户注册**: 接收 `username` 和 `password` -> 生成 `user_id` (UUID) -> 插入 `users` 表 -> 返回成功响应或错误。
|
| 26 |
- **用户登录**: 接收 `username` 和 `password` -> 查询 `users` 表验证凭据 -> 返回成功响应(包含 `user_id` 和 `username`)或错误。
|
| 27 |
+
- **课程添加**: 接收课程详情 (`title`, `description`, `price`, `duration_hours`, `level`) -> 插入 `courses` 表 -> 返回成功响应。
|
| 28 |
+
- **课程详情查询**: 接收 `course_id` -> 查询 `courses` 表 -> 返回课程详情或 404 错误。
|