web.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. from flask import Flask, render_template, request, jsonify
  2. import sqlite3
  3. import json
  4. app = Flask(__name__)
  5. # 汇率缓存(前端传入后保存在内存)
  6. exchange_rate = 7.2 # 默认汇率
  7. def get_db():
  8. """获取数据库连接"""
  9. conn = sqlite3.connect('buff_prices.db')
  10. conn.row_factory = sqlite3.Row
  11. return conn
  12. @app.route('/')
  13. def index():
  14. """首页"""
  15. return render_template('index.html')
  16. @app.route('/api/products')
  17. def get_products():
  18. """获取商品列表,支持排序和搜索"""
  19. conn = get_db()
  20. cursor = conn.cursor()
  21. # 获取参数
  22. sort_by = request.args.get('sort', 'updated_at')
  23. sort_order = request.args.get('order', 'desc')
  24. search = request.args.get('search', '')
  25. page = int(request.args.get('page', 1))
  26. per_page = int(request.args.get('per_page', 50))
  27. # 构建搜索条件
  28. where_clause = ""
  29. params = []
  30. if search:
  31. where_clause = "WHERE p.market_hash_name LIKE ? OR p.name LIKE ?"
  32. search_pattern = f"%{search}%"
  33. params = [search_pattern, search_pattern]
  34. # 构建排序
  35. order_clause = "ORDER BY "
  36. if sort_by == 'buff_price':
  37. order_clause += "buff_price"
  38. elif sort_by == 'steam_price':
  39. order_clause += "steam_price"
  40. elif sort_by == 'csfloat_price':
  41. order_clause += "csfloat_price"
  42. elif sort_by == 'dmarket_price':
  43. order_clause += "dmarket_price"
  44. else:
  45. order_clause += "p.updated_at"
  46. order_clause += f" {sort_order}"
  47. # 获取总数
  48. count_query = f"SELECT COUNT(*) as total FROM products p {where_clause}"
  49. cursor.execute(count_query, params)
  50. total = cursor.fetchone()['total']
  51. # 分页查询
  52. offset = (page - 1) * per_page
  53. query = f'''
  54. SELECT
  55. p.id,
  56. p.buff_id,
  57. p.name,
  58. p.market_hash_name,
  59. p.type,
  60. p.rarity,
  61. p.icon_url,
  62. p.updated_at,
  63. pp_buff.min_price as buff_price,
  64. pp_buff.currency as buff_currency,
  65. pp_steam.min_price as steam_price,
  66. pp_steam.currency as steam_currency,
  67. pp_csfloat.min_price as csfloat_price,
  68. pp_csfloat.currency as csfloat_currency,
  69. pp_dmarket.min_price as dmarket_price,
  70. pp_dmarket.currency as dmarket_currency
  71. FROM products p
  72. LEFT JOIN platform_prices pp_buff ON p.id = pp_buff.product_id AND pp_buff.platform_code = 'buff'
  73. LEFT JOIN platform_prices pp_steam ON p.id = pp_steam.product_id AND pp_steam.platform_code = 'steam'
  74. LEFT JOIN platform_prices pp_csfloat ON p.id = pp_csfloat.product_id AND pp_csfloat.platform_code = 'csfloat'
  75. LEFT JOIN platform_prices pp_dmarket ON p.id = pp_dmarket.product_id AND pp_dmarket.platform_code = 'dmarket'
  76. {where_clause}
  77. {order_clause}
  78. LIMIT ? OFFSET ?
  79. '''
  80. params.extend([per_page, offset])
  81. cursor.execute(query, params)
  82. products = cursor.fetchall()
  83. conn.close()
  84. # 转换为字典列表并应用汇率
  85. result = []
  86. for p in products:
  87. product_dict = dict(p)
  88. # 应用汇率换算
  89. if product_dict.get('buff_currency') == 'USD' and product_dict.get('buff_price'):
  90. product_dict['buff_price_cny'] = round(product_dict['buff_price'] * exchange_rate, 2)
  91. else:
  92. product_dict['buff_price_cny'] = product_dict.get('buff_price')
  93. if product_dict.get('steam_currency') == 'USD' and product_dict.get('steam_price'):
  94. product_dict['steam_price_cny'] = round(product_dict['steam_price'] * exchange_rate, 2)
  95. else:
  96. product_dict['steam_price_cny'] = product_dict.get('steam_price')
  97. if product_dict.get('csfloat_currency') == 'USD' and product_dict.get('csfloat_price'):
  98. product_dict['csfloat_price_cny'] = round(product_dict['csfloat_price'] * exchange_rate, 2)
  99. else:
  100. product_dict['csfloat_price_cny'] = product_dict.get('csfloat_price')
  101. if product_dict.get('dmarket_currency') == 'USD' and product_dict.get('dmarket_price'):
  102. product_dict['dmarket_price_cny'] = round(product_dict['dmarket_price'] * exchange_rate, 2)
  103. else:
  104. product_dict['dmarket_price_cny'] = product_dict.get('dmarket_price')
  105. result.append(product_dict)
  106. return jsonify({
  107. 'products': result,
  108. 'total': total,
  109. 'page': page,
  110. 'per_page': per_page,
  111. 'total_pages': (total + per_page - 1) // per_page,
  112. 'exchange_rate': exchange_rate
  113. })
  114. @app.route('/api/set_exchange_rate', methods=['POST'])
  115. def set_exchange_rate():
  116. """设置汇率"""
  117. global exchange_rate
  118. data = request.get_json()
  119. exchange_rate = float(data.get('rate', 7.2))
  120. return jsonify({'success': True, 'rate': exchange_rate})
  121. @app.route('/api/statistics')
  122. def get_statistics():
  123. """获取统计信息"""
  124. conn = get_db()
  125. cursor = conn.cursor()
  126. # 商品总数
  127. cursor.execute('SELECT COUNT(*) as total FROM products')
  128. total_products = cursor.fetchone()['total']
  129. # 各平台价格数量
  130. stats = {'total_products': total_products}
  131. for platform in ['buff', 'steam', 'csfloat', 'dmarket']:
  132. cursor.execute('''
  133. SELECT COUNT(DISTINCT product_id) as count
  134. FROM platform_prices
  135. WHERE platform_code = ?
  136. ''', (platform,))
  137. stats[f'{platform}_count'] = cursor.fetchone()['count']
  138. conn.close()
  139. return jsonify(stats)
  140. if __name__ == '__main__':
  141. app.run(debug=True, host='0.0.0.0', port=5001)