diff --git a/platform/backend/app/api/search_providers.py b/platform/backend/app/api/search_providers.py index 9adef35..e9f6c28 100644 --- a/platform/backend/app/api/search_providers.py +++ b/platform/backend/app/api/search_providers.py @@ -9,20 +9,20 @@ from datetime import datetime, timezone from ..database import get_db from ..models import SearchProvider -from .auth import get_current_user +from .auth import get_current_admin logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/search-providers", tags=["search_providers"]) @router.get("") -def list_providers(db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def list_providers(db: Session = Depends(get_db), current_user=Depends(get_current_admin)): providers = db.query(SearchProvider).order_by(SearchProvider.priority).all() return [p.to_dict() for p in providers] @router.post("") -def create_provider(data: dict, db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def create_provider(data: dict, db: Session = Depends(get_db), current_user=Depends(get_current_admin)): p = SearchProvider( name=data.get("name", ""), provider_type=data.get("provider_type", ""), @@ -41,7 +41,7 @@ def create_provider(data: dict, db: Session = Depends(get_db), current_user=Depe @router.put("/{provider_id}") -def update_provider(provider_id: int, data: dict, db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def update_provider(provider_id: int, data: dict, db: Session = Depends(get_db), current_user=Depends(get_current_admin)): p = db.query(SearchProvider).filter(SearchProvider.id == provider_id).first() if not p: raise HTTPException(status_code=404, detail="Provider not found") @@ -57,7 +57,7 @@ def update_provider(provider_id: int, data: dict, db: Session = Depends(get_db), @router.delete("/{provider_id}") -def delete_provider(provider_id: int, db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def delete_provider(provider_id: int, db: Session = Depends(get_db), current_user=Depends(get_current_admin)): p = db.query(SearchProvider).filter(SearchProvider.id == provider_id).first() if not p: raise HTTPException(status_code=404, detail="Provider not found") @@ -67,7 +67,7 @@ def delete_provider(provider_id: int, db: Session = Depends(get_db), current_use @router.post("/{provider_id}/test") -def test_provider(provider_id: int, data: dict = {}, db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def test_provider(provider_id: int, data: dict = {}, db: Session = Depends(get_db), current_user=Depends(get_current_admin)): p = db.query(SearchProvider).filter(SearchProvider.id == provider_id).first() if not p: raise HTTPException(status_code=404, detail="Provider not found") @@ -125,7 +125,7 @@ def test_provider(provider_id: int, data: dict = {}, db: Session = Depends(get_d @router.post("/reset-usage") -def reset_usage(db: Session = Depends(get_db), current_user=Depends(get_current_user)): +def reset_usage(db: Session = Depends(get_db), current_user=Depends(get_current_admin)): db.query(SearchProvider).update({SearchProvider.usage_today: 0}) db.commit() return {"ok": True} diff --git a/scripts/collector.py b/scripts/collector.py index c692243..9b1e651 100644 --- a/scripts/collector.py +++ b/scripts/collector.py @@ -749,7 +749,7 @@ class SustainabilityCollector: try: with open(main_cases_file, 'r', encoding='utf-8') as f: existing_cases = json.load(f) - except: + except Exception: existing_cases = [] all_cases = existing_cases + [asdict(case) for case in self.new_cases] # 去重 @@ -949,7 +949,7 @@ def main(): except Exception as e: try: logger.error(f"收集任务失败: {e}") - except: pass + except Exception: pass print(f"ERROR: {e}") sys.exit(1) diff --git a/scripts/compliance_checker.py b/scripts/compliance_checker.py index b8a57b6..8eff281 100644 --- a/scripts/compliance_checker.py +++ b/scripts/compliance_checker.py @@ -5,6 +5,7 @@ """ import re +import json from typing import Dict, List, Tuple SENSITIVE_WORDS = { @@ -125,7 +126,7 @@ def _load_platform_rules(): for r in rows: try: cfg = json.loads(r.config_data) if r.config_data else {} - except: + except Exception: cfg = {} if cfg: result[r.platform] = cfg @@ -511,7 +512,7 @@ class ComplianceChecker: }) def _check_timeliness(self, text: str): - years = re.findall(r'(19\d{2}|20[0-4]\d)', text) + years = re.findall(r'\b(19\d{2}|20[0-4]\d)\b', text) outdated = {y for y in years if int(y) < 2025} if outdated: self.issues.append({ diff --git a/scripts/db_helper.py b/scripts/db_helper.py index e624759..798ca59 100644 --- a/scripts/db_helper.py +++ b/scripts/db_helper.py @@ -6,7 +6,7 @@ import sys import os from pathlib import Path -from datetime import datetime, date, timedelta +from datetime import datetime, date, timedelta, timezone from typing import Optional, Dict, List # 加载 .env(在 scripts/ 目录下运行时需要) @@ -84,17 +84,17 @@ def update_topic_status(topic_id: str, status: str, compliance_score: Optional[i if not topic: return False topic.status = status - topic.updated_at = datetime.now() + topic.updated_at = datetime.now(timezone.utc) if compliance_score is not None: topic.compliance_score = compliance_score if reviewed_at is not None: topic.reviewed_at = reviewed_at if status == 'review' and topic.generated_at is None: - topic.generated_at = datetime.now() - topic.reviewed_at = topic.reviewed_at or datetime.now() + topic.generated_at = datetime.now(timezone.utc) + topic.reviewed_at = topic.reviewed_at or datetime.now(timezone.utc) if status == 'ready': topic.ready_at = datetime.now().date() - topic.reviewed_at = topic.reviewed_at or datetime.now() + topic.reviewed_at = topic.reviewed_at or datetime.now(timezone.utc) if status == 'published': topic.published_at = datetime.now().date() db.commit() @@ -198,14 +198,14 @@ def save_topics_to_db(topics_data: List[Dict]): if t.get('ready_at'): try: existing.ready_at = datetime.strptime(t['ready_at'], '%Y-%m-%d').date() - except: + except Exception: pass if t.get('published_at'): try: existing.published_at = datetime.strptime(t['published_at'], '%Y-%m-%d').date() - except: + except Exception: pass - existing.updated_at = datetime.now() + existing.updated_at = datetime.now(timezone.utc) else: new_topic = Topic( id=t['id'], @@ -225,8 +225,8 @@ def save_topics_to_db(topics_data: List[Dict]): published_at=datetime.strptime(t['published_at'], '%Y-%m-%d').date() if t.get('published_at') else None, compliance_score=t.get('compliance_score', 100), platform_urls=t.get('platform_urls', {}), - created_at=datetime.now(), - updated_at=datetime.now() + created_at=datetime.now(timezone.utc), + updated_at=datetime.now(timezone.utc) ) db.add(new_topic) db.commit() @@ -246,7 +246,6 @@ def save_article(topic_id: str, platform: str, html_content: str, *, title: str from app.models import Article article_id = f"{platform}_{topic_id}" existing = db.query(Article).filter(Article.id == article_id).first() - now = datetime.now() if existing: existing.html_content = html_content if title: diff --git a/scripts/trends.py b/scripts/trends.py index 1ce42dc..b6d0543 100644 --- a/scripts/trends.py +++ b/scripts/trends.py @@ -274,7 +274,7 @@ def load_trends() -> List[Dict]: data = json.loads(TRENDS_FILE.read_text(encoding='utf-8')) if data.get("date") == TODAY: return data.get("trends", []) - except: + except Exception: pass return [] diff --git a/tests/test_new_features.py b/tests/test_new_features.py index 5e6f142..5667948 100644 --- a/tests/test_new_features.py +++ b/tests/test_new_features.py @@ -46,14 +46,17 @@ def start_server(): t = threading.Thread(target=start_server, daemon=True) t.start() -time.sleep(4) - base = "http://127.0.0.1:18503" -try: - r = requests.get(f"{base}/api/system/status", timeout=5) - test("服务可访问", r.status_code == 200) -except Exception as e: - test("服务可访问", False, str(e)) +for _ in range(8): + time.sleep(1.5) + try: + r = requests.get(f"{base}/api/system/status", timeout=3) + test("服务可访问", True) + break + except Exception: + continue +else: + test("服务可访问", False, "Server did not start within 12s") exit(1) # 3. Login