下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1982
项目包含三个主要模块:快递单号生成器核心逻辑、Flask Web应用程序和前端HTML页面。核心模块可以生成符合各大快递公司格式的虚拟单号,并模拟完整的物流信息流转过程。Web应用提供了API接口,前端页面则提供了友好的用户交互界面。
import randomimport timeimport hashlibfrom 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, jsonifyfrom express_generator import ExpressGeneratorimport 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)