data_routes.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from flask import Blueprint, render_template, request, jsonify
  2. from flask_login import login_required
  3. from app import db
  4. from app.models import SpiderResult, DeepCollection
  5. from sqlalchemy import or_
  6. bp = Blueprint('data', __name__, url_prefix='/data')
  7. @bp.route('/dashboard')
  8. @login_required
  9. def dashboard():
  10. return render_template('data_management.html')
  11. @bp.route('/api/list', methods=['GET'])
  12. @login_required
  13. def get_data_list():
  14. page = request.args.get('page', 1, type=int)
  15. per_page = request.args.get('per_page', 10, type=int)
  16. keyword = request.args.get('keyword', '', type=str)
  17. # Query SpiderResult with a dynamic flag for deep collection existence
  18. query = db.session.query(
  19. SpiderResult,
  20. (DeepCollection.id != None).label('has_deep')
  21. ).outerjoin(
  22. DeepCollection,
  23. SpiderResult.link == DeepCollection.url
  24. )
  25. if keyword:
  26. search = f"%{keyword}%"
  27. query = query.filter(or_(
  28. SpiderResult.title.like(search),
  29. SpiderResult.source.like(search),
  30. SpiderResult.abstract.like(search)
  31. ))
  32. pagination = query.order_by(SpiderResult.created_at.desc()).paginate(
  33. page=page, per_page=per_page, error_out=False
  34. )
  35. return jsonify({
  36. 'items': [{
  37. 'id': item.id,
  38. 'title': item.title,
  39. 'source': item.source,
  40. 'link': item.link,
  41. 'cover': item.cover,
  42. 'published_at': item.published_at,
  43. 'has_deep_collection': has_deep,
  44. 'created_at': item.created_at.strftime('%Y-%m-%d %H:%M:%S')
  45. } for item, has_deep in pagination.items],
  46. 'total': pagination.total,
  47. 'pages': pagination.pages,
  48. 'current_page': page
  49. })
  50. @bp.route('/api/delete', methods=['POST'])
  51. @login_required
  52. def delete_data():
  53. ids = request.json.get('ids', [])
  54. if not ids:
  55. return jsonify({'error': 'No IDs provided'}), 400
  56. try:
  57. SpiderResult.query.filter(SpiderResult.id.in_(ids)).delete(synchronize_session=False)
  58. db.session.commit()
  59. return jsonify({'message': 'Deleted successfully', 'count': len(ids)})
  60. except Exception as e:
  61. db.session.rollback()
  62. return jsonify({'error': str(e)}), 500
  63. @bp.route('/api/deep_collect', methods=['POST'])
  64. @login_required
  65. def deep_collect():
  66. ids = request.json.get('ids', [])
  67. if not ids:
  68. return jsonify({'error': 'No IDs provided'}), 400
  69. # Placeholder logic
  70. return jsonify({'message': 'Deep collection task started', 'count': len(ids)})