mistpe commited on
Commit
478e8bf
·
verified ·
1 Parent(s): 1fb5b60

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -34
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
- 'total': data['total'],
240
- 'status': 'pending',
241
- 'created_at': datetime.utcnow(),
242
- 'updated_at': datetime.utcnow()
 
 
 
 
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
- @app.route('/api/auth/logout', methods=['POST'])
285
- @token_required
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)