细节优化

This commit is contained in:
amb
2026-09-02 18:32:56 +08:00
parent 8ec7856bfc
commit bfb7a1a8a2
7 changed files with 69 additions and 53 deletions
+5 -6
View File
@@ -1,6 +1,7 @@
"""文档服务:上传、删除、配额管理。"""
import hashlib
from datetime import datetime
from pathlib import Path
import filetype
@@ -153,16 +154,14 @@ class DocumentService:
return self._doc_repo.list_by_knowledge_base(kb_id, category_id=category_id, page=page, page_size=page_size)
def delete(self, doc_id: str, user: User) -> None:
"""删除文档 → 进回收站(3 天后自动彻底删除)。文件暂保留以支持恢复。"""
doc = self.get_or_404(doc_id, user)
file_size = doc.file_size
self._doc_repo.delete(doc)
self._delete_doc_files(doc)
# 回补配额
self._restore_quota(user, file_size)
doc.deleted_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self._session.commit()
def _delete_doc_files(self, doc: Document) -> None:
"""物理删除文档的原始文件与 Markdown 文件(软删后调用)。"""
def purge_files(self, doc: Document) -> None:
"""物理删除文档的原始文件与 Markdown 文件(彻底删除时调用)。"""
from app.storage.local_storage import get_storage
storage = get_storage()
+12 -30
View File
@@ -1,5 +1,7 @@
"""知识库服务:CRUD + Token 管理 + 默认目录树。"""
from datetime import datetime
from app.core.errors import NotFoundError, PermissionDeniedError
from app.core.logging import get_logger
from app.models.document_category import DocumentCategory
@@ -33,6 +35,10 @@ class KnowledgeBaseService:
token_encrypted=token_encrypted,
token_hint=token_hint,
)
# AI 链接默认 30 分钟有效期
from datetime import datetime, timedelta
kb.token_expires_at = (datetime.now() + timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S")
self._seed_default_categories(kb.id)
self._session.commit()
return kb, token
@@ -40,7 +46,7 @@ class KnowledgeBaseService:
def _seed_default_categories(self, kb_id: str) -> None:
"""创建默认目录树结构。"""
default_tree = [
("01 公司层", ["公司基本信息", "经营理念", "四大价值", "A/M/B三态"]),
("01 公司层", ["公司基本信息", "经营理念", "四大价值"]),
("02 战略层", ["公司战略", "客户战略", "AI战略", "产品战略"]),
("03 部门层", ["企划", "技术", "交付", "市场"]),
("04 岗位/AI角色", []),
@@ -97,39 +103,14 @@ class KnowledgeBaseService:
return kb
def delete(self, kb_id: str, user: User) -> None:
"""删除知识库 → 进回收站(3 天后自动彻底删除)。"""
kb = self.get_or_404(kb_id, user)
self._kb_repo.delete(kb)
self._cleanup_kb_files(kb)
kb.deleted_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self._session.commit()
def _cleanup_kb_files(self, kb: KnowledgeBase) -> None:
"""物理删除知识库下所有文档的原始文件与 Markdown 文件(软删后调用)。
文件删除失败不阻塞删除流程(记录日志,可由后续清理兜底)。
"""
from sqlalchemy import select
from app.models.document import Document
from app.storage.local_storage import get_storage
stmt = select(Document).where(Document.knowledge_base_id == kb.id)
docs = list(self._session.scalars(stmt).all())
storage = get_storage()
removed = 0
for doc in docs:
for key in (doc.storage_path, doc.markdown_path):
if not key:
continue
try:
storage.delete(key)
removed += 1
except Exception as exc: # noqa: BLE001
logger.warning("清理文件失败 key=%s: %s", key, exc)
if removed:
logger.info("KB %s 软删,已物理清理 %d 个文件", kb.id, removed)
def regenerate_token(self, kb_id: str, user: User) -> tuple[KnowledgeBase, str]:
"""重新生成 Token。旧链接立即失效。"""
"""重新生成 Token。旧链接立即失效,新链接默认 30 分钟有效期"""
kb = self.get_or_404(kb_id, user)
token, token_hash, token_encrypted, token_hint = self._token_svc.create_token_pair()
self._kb_repo.update(
@@ -138,6 +119,7 @@ class KnowledgeBaseService:
token_encrypted=token_encrypted,
token_hint=token_hint,
)
kb.token_expires_at = (datetime.now() + timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S")
self._session.commit()
return kb, token
@@ -149,7 +131,7 @@ class KnowledgeBaseService:
def set_expiry(self, kb_id: str, user: User, expires_in_minutes: int | None) -> KnowledgeBase:
"""设置链接有效期。None = 长期有效;负数表示已过期(测试用)。"""
from datetime import datetime, timedelta
from datetime import timedelta
kb = self.get_or_404(kb_id, user)
if expires_in_minutes is None: