You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.9 KiB

4 weeks ago
import asyncio
4 weeks ago
import logging
4 weeks ago
from contextlib import asynccontextmanager
4 weeks ago
from logging.handlers import RotatingFileHandler
4 weeks ago
4 weeks ago
import uvicorn
4 weeks ago
from fastapi import FastAPI, UploadFile, File
4 weeks ago
from Dao.KbDao import KbDao
from Util.MySQLUtil import init_mysql_pool
4 weeks ago
# 初始化日志
4 weeks ago
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
4 weeks ago
handler = RotatingFileHandler('Logs/start.log', maxBytes=1024*1024, backupCount=5)
4 weeks ago
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)
4 weeks ago
@asynccontextmanager
async def lifespan(app: FastAPI):
4 weeks ago
# 初始化数据库连接池
4 weeks ago
app.state.kb_dao = KbDao(await init_mysql_pool())
4 weeks ago
4 weeks ago
# 启动文档处理任务
4 weeks ago
async def document_processor():
while True:
try:
# 获取未处理文档
# 处理文档
# 保存到ES
await asyncio.sleep(10)
except Exception as e:
logger.error(f"文档处理出错: {e}")
await asyncio.sleep(10)
task = asyncio.create_task(document_processor())
4 weeks ago
yield
4 weeks ago
# 关闭时取消任务
task.cancel()
4 weeks ago
# 关闭数据库连接池
4 weeks ago
await app.state.kb_dao.mysql_pool.close()
app = FastAPI(lifespan=lifespan)
4 weeks ago
# 知识库CRUD接口
4 weeks ago
@app.post("/kb")
4 weeks ago
async def create_kb(kb: dict):
"""创建知识库"""
4 weeks ago
return await app.state.kb_dao.create_kb(kb)
4 weeks ago
@app.get("/kb/{kb_id}")
async def read_kb(kb_id: int):
4 weeks ago
"""获取知识库详情"""
return await app.state.kb_dao.get_kb(kb_id)
4 weeks ago
4 weeks ago
@app.post("/kb/update/{kb_id}")
4 weeks ago
async def update_kb(kb_id: int, kb: dict):
"""更新知识库信息"""
return await app.state.kb_dao.update_kb(kb_id, kb)
4 weeks ago
@app.delete("/kb/{kb_id}")
async def delete_kb(kb_id: int):
4 weeks ago
"""删除知识库"""
return await app.state.kb_dao.delete_kb(kb_id)
4 weeks ago
# 知识库文件CRUD接口
4 weeks ago
@app.post("/kb_file")
4 weeks ago
async def create_kb_file(file: dict):
"""创建知识库文件记录"""
return await app.state.kb_dao.create_kb_file(file)
4 weeks ago
@app.get("/kb_files/{file_id}")
async def read_kb_file(file_id: int):
4 weeks ago
"""获取文件详情"""
return await app.state.kb_dao.get_kb_file(file_id)
4 weeks ago
4 weeks ago
@app.post("/kb_files/update/{file_id}")
4 weeks ago
async def update_kb_file(file_id: int, file: dict):
"""更新文件信息"""
return await app.state.kb_dao.update_kb_file(file_id, file)
4 weeks ago
@app.delete("/kb_files/{file_id}")
async def delete_kb_file(file_id: int):
4 weeks ago
"""删除文件记录"""
return await app.state.kb_dao.delete_kb_file(file_id)
4 weeks ago
4 weeks ago
# 文件上传接口
4 weeks ago
@app.post("/upload")
4 weeks ago
async def upload_file(kb_id: int, file: UploadFile = File(...)):
"""文件上传接口"""
return await app.state.kb_dao.handle_upload(kb_id, file)
4 weeks ago
4 weeks ago
if __name__ == "__main__":
4 weeks ago
uvicorn.run(app, host="0.0.0.0", port=8000)