Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -44,24 +44,17 @@ def token_required(f):
|
|
| 44 |
def decorated(*args, **kwargs):
|
| 45 |
token = request.headers.get('Authorization')
|
| 46 |
if not token:
|
| 47 |
-
print("No token provided")
|
| 48 |
return jsonify({'message': 'Token is missing!'}), 401
|
| 49 |
try:
|
| 50 |
token = token.split(" ")[1] if token.startswith("Bearer ") else token
|
| 51 |
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
|
| 52 |
current_user = db.users.find_one({'_id': ObjectId(data['user_id'])})
|
| 53 |
if not current_user:
|
| 54 |
-
print(f"User not found for id: {data['user_id']}")
|
| 55 |
raise jwt.InvalidTokenError
|
| 56 |
except jwt.ExpiredSignatureError:
|
| 57 |
-
print("Token has expired")
|
| 58 |
return jsonify({'message': 'Token has expired!'}), 401
|
| 59 |
except jwt.InvalidTokenError:
|
| 60 |
-
print("Invalid token")
|
| 61 |
return jsonify({'message': 'Invalid token!'}), 401
|
| 62 |
-
except Exception as e:
|
| 63 |
-
print(f"Unexpected error: {str(e)}")
|
| 64 |
-
return jsonify({'message': 'Token verification failed!'}), 401
|
| 65 |
return f(current_user, *args, **kwargs)
|
| 66 |
return decorated
|
| 67 |
|
|
@@ -100,6 +93,12 @@ def login():
|
|
| 100 |
def verify_token(current_user):
|
| 101 |
return jsonify({'user': {'id': str(current_user['_id']), 'username': current_user['username'], 'email': current_user['email']}}), 200
|
| 102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
@app.route('/api/products', methods=['GET'])
|
| 104 |
def get_products():
|
| 105 |
product_type = request.args.get('type', 'all')
|
|
@@ -234,39 +233,68 @@ def remove_from_cart(current_user, item_id):
|
|
| 234 |
def create_order(current_user):
|
| 235 |
data = request.json
|
| 236 |
order = {
|
| 237 |
-
'user_id': current_user['_id'],
|
|
|
|
| 238 |
'items': data['items'],
|
| 239 |
-
'
|
| 240 |
-
'
|
| 241 |
-
'
|
| 242 |
-
'
|
|
|
|
|
|
|
|
|
|
|
|
|
| 243 |
}
|
| 244 |
result = db.orders.insert_one(order)
|
| 245 |
return jsonify({'message': 'Order created successfully', 'order_id': str(result.inserted_id)}), 201
|
| 246 |
|
| 247 |
-
@app.route('/api/orders', methods=['GET'])
|
| 248 |
-
@token_required
|
| 249 |
-
def get_orders(current_user):
|
| 250 |
-
orders = list(db.orders.find({'user_id': current_user['_id']}))
|
| 251 |
-
for order in orders:
|
| 252 |
-
order['_id'] = str(order['_id'])
|
| 253 |
-
order['user_id'] = str(order['user_id'])
|
| 254 |
-
for item in order['items']:
|
| 255 |
-
item['product_id'] = str(item['product_id'])
|
| 256 |
-
return jsonify({'data': orders}), 200
|
| 257 |
-
|
| 258 |
@app.route('/api/orders/<order_id>', methods=['GET'])
|
| 259 |
@token_required
|
| 260 |
def get_order_details(current_user, order_id):
|
| 261 |
-
order = db.orders.find_one({'_id': ObjectId(order_id), 'user_id': current_user['_id']})
|
| 262 |
if order:
|
| 263 |
order['_id'] = str(order['_id'])
|
| 264 |
-
order['user_id'] = str(order['user_id'])
|
| 265 |
-
for item in order['items']:
|
| 266 |
-
item['product_id'] = str(item['product_id'])
|
| 267 |
return jsonify({'data': order}), 200
|
| 268 |
return jsonify({'message': 'Order not found'}), 404
|
| 269 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 270 |
@app.route('/api/upload', methods=['POST'])
|
| 271 |
@token_required
|
| 272 |
def upload_image(current_user):
|
|
@@ -281,13 +309,8 @@ def upload_image(current_user):
|
|
| 281 |
url = f"https://{bucket_name}.{endpoint}/{filename}"
|
| 282 |
return jsonify({'message': 'File uploaded successfully', 'url': url}), 200
|
| 283 |
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
def logout(current_user):
|
| 287 |
-
# 在这里,我们实际上不需要做太多事情,因为 JWT 是无状态的
|
| 288 |
-
# 客户端只需要删除本地存储的 token 即可
|
| 289 |
-
# 但是,我们可以在这里添加一些额外的逻辑,比如记录用户登出时间等
|
| 290 |
-
return jsonify({'message': 'Successfully logged out'}), 200
|
| 291 |
|
| 292 |
if __name__ == '__main__':
|
| 293 |
app.run(host='0.0.0.0', port=7860, debug=True)
|
|
|
|
| 44 |
def decorated(*args, **kwargs):
|
| 45 |
token = request.headers.get('Authorization')
|
| 46 |
if not token:
|
|
|
|
| 47 |
return jsonify({'message': 'Token is missing!'}), 401
|
| 48 |
try:
|
| 49 |
token = token.split(" ")[1] if token.startswith("Bearer ") else token
|
| 50 |
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
|
| 51 |
current_user = db.users.find_one({'_id': ObjectId(data['user_id'])})
|
| 52 |
if not current_user:
|
|
|
|
| 53 |
raise jwt.InvalidTokenError
|
| 54 |
except jwt.ExpiredSignatureError:
|
|
|
|
| 55 |
return jsonify({'message': 'Token has expired!'}), 401
|
| 56 |
except jwt.InvalidTokenError:
|
|
|
|
| 57 |
return jsonify({'message': 'Invalid token!'}), 401
|
|
|
|
|
|
|
|
|
|
| 58 |
return f(current_user, *args, **kwargs)
|
| 59 |
return decorated
|
| 60 |
|
|
|
|
| 93 |
def verify_token(current_user):
|
| 94 |
return jsonify({'user': {'id': str(current_user['_id']), 'username': current_user['username'], 'email': current_user['email']}}), 200
|
| 95 |
|
| 96 |
+
@app.route('/api/auth/logout', methods=['POST'])
|
| 97 |
+
@token_required
|
| 98 |
+
def logout(current_user):
|
| 99 |
+
# 由于使用JWT,服务器端不需要做特殊处理
|
| 100 |
+
return jsonify({'message': 'Successfully logged out'}), 200
|
| 101 |
+
|
| 102 |
@app.route('/api/products', methods=['GET'])
|
| 103 |
def get_products():
|
| 104 |
product_type = request.args.get('type', 'all')
|
|
|
|
| 233 |
def create_order(current_user):
|
| 234 |
data = request.json
|
| 235 |
order = {
|
| 236 |
+
'user_id': str(current_user['_id']),
|
| 237 |
+
'orderNumber': generate_order_number(),
|
| 238 |
'items': data['items'],
|
| 239 |
+
'subtotal': sum(item['price'] * item['quantity'] for item in data['items']),
|
| 240 |
+
'shippingFee': 10, # 固定运费,您可以根据需要修改
|
| 241 |
+
'total': sum(item['price'] * item['quantity'] for item in data['items']) + 10,
|
| 242 |
+
'status': 'unpaid',
|
| 243 |
+
'createdAt': datetime.utcnow(),
|
| 244 |
+
'updatedAt': datetime.utcnow(),
|
| 245 |
+
'paymentMethod': 'Pending',
|
| 246 |
+
'shippingAddress': data.get('shippingAddress', {})
|
| 247 |
}
|
| 248 |
result = db.orders.insert_one(order)
|
| 249 |
return jsonify({'message': 'Order created successfully', 'order_id': str(result.inserted_id)}), 201
|
| 250 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
@app.route('/api/orders/<order_id>', methods=['GET'])
|
| 252 |
@token_required
|
| 253 |
def get_order_details(current_user, order_id):
|
| 254 |
+
order = db.orders.find_one({'_id': ObjectId(order_id), 'user_id': str(current_user['_id'])})
|
| 255 |
if order:
|
| 256 |
order['_id'] = str(order['_id'])
|
|
|
|
|
|
|
|
|
|
| 257 |
return jsonify({'data': order}), 200
|
| 258 |
return jsonify({'message': 'Order not found'}), 404
|
| 259 |
|
| 260 |
+
@app.route('/api/orders/<order_id>/status', methods=['PUT'])
|
| 261 |
+
@token_required
|
| 262 |
+
def update_order_status(current_user, order_id):
|
| 263 |
+
data = request.json
|
| 264 |
+
new_status = data.get('status')
|
| 265 |
+
if not new_status:
|
| 266 |
+
return jsonify({'message': 'Status is required'}), 400
|
| 267 |
+
|
| 268 |
+
order = db.orders.find_one({'_id': ObjectId(order_id), 'user_id': str(current_user['_id'])})
|
| 269 |
+
if not order:
|
| 270 |
+
return jsonify({'message': 'Order not found'}), 404
|
| 271 |
+
|
| 272 |
+
update_data = {
|
| 273 |
+
'status': new_status,
|
| 274 |
+
'updatedAt': datetime.utcnow()
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
if new_status == 'unshipped':
|
| 278 |
+
update_data['paymentMethod'] = data.get('paymentMethod', 'Not specified')
|
| 279 |
+
|
| 280 |
+
db.orders.update_one({'_id': ObjectId(order_id)}, {'$set': update_data})
|
| 281 |
+
|
| 282 |
+
return jsonify({'message': 'Order status updated successfully'}), 200
|
| 283 |
+
|
| 284 |
+
@app.route('/api/orders', methods=['GET'])
|
| 285 |
+
@token_required
|
| 286 |
+
def get_user_orders(current_user):
|
| 287 |
+
status = request.args.get('status')
|
| 288 |
+
query = {'user_id': str(current_user['_id'])}
|
| 289 |
+
if status:
|
| 290 |
+
query['status'] = status
|
| 291 |
+
|
| 292 |
+
orders = list(db.orders.find(query).sort('createdAt', -1))
|
| 293 |
+
for order in orders:
|
| 294 |
+
order['_id'] = str(order['_id'])
|
| 295 |
+
|
| 296 |
+
return jsonify({'data': orders}), 200
|
| 297 |
+
|
| 298 |
@app.route('/api/upload', methods=['POST'])
|
| 299 |
@token_required
|
| 300 |
def upload_image(current_user):
|
|
|
|
| 309 |
url = f"https://{bucket_name}.{endpoint}/{filename}"
|
| 310 |
return jsonify({'message': 'File uploaded successfully', 'url': url}), 200
|
| 311 |
|
| 312 |
+
def generate_order_number():
|
| 313 |
+
return f"ORD{datetime.utcnow().strftime('%Y%m%d%H%M%S')}{random.randint(1000, 9999)}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 314 |
|
| 315 |
if __name__ == '__main__':
|
| 316 |
app.run(host='0.0.0.0', port=7860, debug=True)
|