下载地址:www.pan38.com/dow/share.p… 提取密码:2981
这个抢单插件系统包含三个主要模块:订单系统核心逻辑、模拟器和API服务。核心模块实现了用户注册、订单创建和抢单等基本功能,使用SQLite数据库存储数据。模拟器可以模拟多个用户同时抢单的场景,API服务提供了RESTful接口供外部调用。
import threading import time import random import sqlite3 from datetime import datetime
class OrderSystem: def init(self): self.orders = [] self.users = [] self.lock = threading.Lock() self.db_conn = sqlite3.connect('order_system.db', check_same_thread=False) self._init_db()
def _init_db(self):
cursor = self.db_conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
balance REAL DEFAULT 0.0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
price REAL NOT NULL,
status TEXT DEFAULT 'pending',
creator_id INTEGER,
worker_id INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(creator_id) REFERENCES users(id),
FOREIGN KEY(worker_id) REFERENCES users(id)
)
''')
self.db_conn.commit()
def register_user(self, username, password):
try:
cursor = self.db_conn.cursor()
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)',
(username, password))
self.db_conn.commit()
return True
except sqlite3.IntegrityError:
return False
def login(self, username, password):
cursor = self.db_conn.cursor()
cursor.execute('SELECT id FROM users WHERE username=? AND password=?',
(username, password))
result = cursor.fetchone()
return result[0] if result else None
def create_order(self, user_id, title, description, price):
cursor = self.db_conn.cursor()
cursor.execute('''
INSERT INTO orders (title, description, price, creator_id)
VALUES (?, ?, ?, ?)
''', (title, description, price, user_id))
self.db_conn.commit()
return cursor.lastrowid
def grab_order(self, user_id, order_id):
with self.lock:
cursor = self.db_conn.cursor()
cursor.execute('SELECT status FROM orders WHERE id=?', (order_id,))
result = cursor.fetchone()
if not result or result[0] != 'pending':
return False
cursor.execute('''
UPDATE orders
SET status='taken', worker_id=?
WHERE id=? AND status='pending'
''', (user_id, order_id))
self.db_conn.commit()
return cursor.rowcount > 0
def get_available_orders(self):
cursor = self.db_conn.cursor()
cursor.execute('''
SELECT o.id, o.title, o.description, o.price, u.username
FROM orders o
JOIN users u ON o.creator_id = u.id
WHERE o.status='pending'
''')
return cursor.fetchall()
def complete_order(self, order_id):
cursor = self.db_conn.cursor()
cursor.execute('''
UPDATE orders SET status='completed'
WHERE id=? AND status='taken'
''', (order_id,))
self.db_conn.commit()
return cursor.rowcount > 0
def transfer_payment(self, order_id):
cursor = self.db_conn.cursor()
cursor.execute('''
SELECT price, creator_id, worker_id
FROM orders
WHERE id=? AND status='completed'
''', (order_id,))
result = cursor.fetchone()
if not result:
return False
price, creator_id, worker_id = result
try:
cursor.execute('UPDATE users SET balance=balance-? WHERE id=?',
(price, creator_id))
cursor.execute('UPDATE users SET balance=balance+? WHERE id=?',
(price, worker_id))
cursor.execute('UPDATE orders SET status='paid' WHERE id=?',
(order_id,))
self.db_conn.commit()
return True
except:
self.db_conn.rollback()
return False
order_system import OrderSystem import random import threading import time
class OrderSimulator: def init(self, order_system): self.system = order_system self.user_count = 10 self.order_count = 20 self.users = []
def setup(self):
# 创建测试用户
for i in range(self.user_count):
username = f'user{i}'
password = 'password'
self.system.register_user(username, password)
user_id = self.system.login(username, password)
self.users.append(user_id)
# 创建测试订单
for i in range(self.order_count):
creator = random.choice(self.users)
title = f'订单{i}'
description = f'这是第{i}个测试订单的描述'
price = round(random.uniform(10, 100), 2)
self.system.create_order(creator, title, description, price)
def simulate_grab(self, user_id):
while True:
orders = self.system.get_available_orders()
if not orders:
time.sleep(1)
continue
order_id = random.choice(orders)[0]
if self.system.grab_order(user_id, order_id):
print(f'用户{user_id}成功抢到订单{order_id}')
# 模拟工作完成
time.sleep(random.uniform(0.5, 2))
self.system.complete_order(order_id)
self.system.transfer_payment(order_id)
else:
print(f'用户{user_id}抢单{order_id}失败')
time.sleep(random.uniform(0.1, 0.5))
def run(self, worker_count=5):
self.setup()
threads = []
for i in range(worker_count):
user_id = random.choice(self.users)
t = threading.Thread(target=self.simulate_grab, args=(user_id,))
t.daemon = True
threads.append(t)
t.start()
for t in threads:
t.join()
if name == 'main': system = OrderSystem() simulator = OrderSimulator(system) simulator.run(worker_count=8) from flask import Flask, request, jsonify from order_system import OrderSystem import json
app = Flask(name) system = OrderSystem()
@app.route('/register', methods=['POST']) def register(): data = request.get_json() if not data or 'username' not in data or 'password' not in data: return jsonify({'error': 'Invalid data'}), 400
success = system.register_user(data['username'], data['password'])
return jsonify({'success': success}), 200 if success else 400
@app.route('/login', methods=['POST']) def login(): data = request.get_json() if not data or 'username' not in data or 'password' not in data: return jsonify({'error': 'Invalid data'}), 400
user_id = system.login(data['username'], data['password'])
return jsonify({'user_id': user_id}), 200 if user_id else 401
@app.route('/orders', methods=['GET']) def get_orders(): orders = system.get_available_orders() return jsonify({'orders': [ { 'id': o[0], 'title': o[1], 'description': o[2], 'price': o[3], 'creator': o[4] } for o in orders ]}), 200
@app.route('/orders', methods=['POST']) def create_order(): data = request.get_json() if not data or 'user_id' not in data or 'title' not in data or 'price' not in data: return jsonify({'error': 'Invalid data'}), 400
order_id = system.create_order(
data['user_id'],
data['title'],
data.get('description', ''),
data['price']
)
return jsonify({'order_id': order_id}), 201
@app.route('/orders/int:order_id/grab', methods=['POST']) def grab_order(order_id): data = request.get_json() if not data or 'user_id' not in data: return jsonify({'error': 'Invalid data'}), 400
success = system.grab_order(data['user_id'], order_id)
return jsonify({'success': success}), 200 if success else 400
if name == 'main': app.run(debug=True, port=5000)