uniapp,h5

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #user.py
  2. from app.libs.redprint import Redprint
  3. from flask import jsonify, request
  4. from app.app import mongo
  5. from app.app import jwt
  6. from bson.json_util import dumps
  7. from bson.objectid import ObjectId
  8. from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
  9. import bcrypt
  10. from pymongo.errors import DuplicateKeyError
  11. from werkzeug.exceptions import BadRequest
  12. # 初始化红图
  13. api = Redprint('user')
  14. @api.route('/get')
  15. def get_user2():
  16. return "I am user get method"
  17. def check_password(username, password):
  18. # 找到用户
  19. user = mongo.db.users.find_one({"username": username})
  20. if user is None:
  21. # 返回一个更泛化的错误信息
  22. return {"error": "此用户名不存在."}, 404
  23. # 验证密码
  24. if bcrypt.checkpw(password.encode('utf-8'), user['password_hash']):
  25. return {"message": "Password correct"}, 200
  26. else:
  27. return {"error": "密码错误."}, 401
  28. def make_jwt_info(user):
  29. # 使用flask_jwt_extended的create_access_token函数创建JWT
  30. access_token = create_access_token(identity=str(user['_id']), additional_claims={
  31. 'email': user['email'],
  32. 'username': user['username'],
  33. 'avatar_url': user['avatar_url'],
  34. 'bio': user['bio']
  35. })
  36. return access_token
  37. @api.route('/pwdlogin', methods=['POST'])
  38. def user_pwd_login():
  39. username = request.json.get('username')
  40. password = request.json.get('password')
  41. result, status_code = check_password(username, password) # 解包元组
  42. # 根据check_password的返回结果处理
  43. if result.get('message') == "Password correct":
  44. # access_token = create_access_token(identity=username)
  45. user = mongo.db.users.find_one({"username": username})
  46. access_token = make_jwt_info(user)
  47. return jsonify({'token': access_token}), 200
  48. else:
  49. return jsonify(result), status_code # 使用从check_password返回的状态码
  50. def InitUserInfo(user_info):
  51. user_info["avatar_url"] = "https://afanai.top:8088/imgs/default_avatar_1.jpeg"
  52. user_info["bio"] = "永远不要降低心灵飞翔的高度"
  53. user_info["password_hash"] = bcrypt.hashpw(user_info["password"].encode('utf-8'), bcrypt.gensalt())
  54. @api.route('/register', methods=['POST'])
  55. def user_pwd_register():
  56. user_info = request.get_json()
  57. InitUserInfo(user_info)
  58. try:
  59. mongo.db.users.insert_one(user_info)
  60. username = user_info["username"]
  61. return jsonify({"message": f"User {username} registered successfully."}), 201
  62. except DuplicateKeyError as e:
  63. # 处理DuplicateKeyError
  64. # 从异常信息中解析出冲突的字段
  65. error_message = str(e)
  66. if 'username' in error_message:
  67. return jsonify({"error": "此用户名已存在."}), 409
  68. if 'email' in error_message:
  69. return jsonify({"error": "此邮箱已被注册."}), 409
  70. # 如果异常信息中没有明确的字段信息,可以考虑更详细的异常处理或日志记录
  71. return jsonify({"error": "未知错误."}), 500
  72. @api.route('/getall')
  73. def get_all_user():
  74. user_infos = list(mongo.db.users.find())
  75. # 将ObjectId转换为字符串,以便于JSON序列化
  76. # 使用bson的json_util来序列化包含ObjectId的对象
  77. # json_string = dumps(user_infos)
  78. for user_info in user_infos:
  79. user_info["_id"] = str(user_info["_id"])
  80. user_info["password_hash"] = "******"
  81. return jsonify(user_infos)
  82. @api.route('/modify/<user_id>', methods=['PUT'])
  83. def modify_specify_user(user_id):
  84. try:
  85. item = request.get_json()
  86. # print(item)
  87. if not item:
  88. raise BadRequest("请求体为空")
  89. # 将user_id转换为ObjectId
  90. user_id_obj = ObjectId(user_id)
  91. result = mongo.db.users.update_one({"_id": user_id_obj}, {"$set": item})
  92. # 如果没有找到或修改任何文档
  93. if result.modified_count == 0:
  94. return jsonify({"error": "未找到用户或没有数据被修改"}), 404
  95. user = mongo.db.users.find_one({"_id": user_id_obj})
  96. access_token = make_jwt_info(user)
  97. return jsonify({'token': access_token}), 201
  98. except BadRequest as e:
  99. return jsonify({"error": str(e)}), 400
  100. except Exception as e:
  101. return jsonify({"error": "内部服务器错误"}), 500
  102. @api.route('/search', methods=['GET'])
  103. def search_specify_user():
  104. try:
  105. # 从查询字符串中获取参数
  106. query = request.args.get('query')
  107. print(query)
  108. if not query:
  109. raise BadRequest("查询参数为空")
  110. # 搜索用户名
  111. user = mongo.db.users.find_one({"username": query})
  112. # print(user)
  113. queryUser = {}
  114. queryRes = []
  115. if user:
  116. queryUser["userId"] = str(user["_id"])
  117. queryUser["username"] = user["username"]
  118. queryUser["avatar_url"] = user["avatar_url"]
  119. queryUser["bio"] = user["bio"]
  120. queryRes.append(queryUser)
  121. print(queryRes)
  122. if len(queryRes):
  123. return jsonify({'queryRes': queryRes}), 200
  124. else:
  125. return jsonify({'queryRes': "None Result"}), 404
  126. except BadRequest as e:
  127. return jsonify({"error": str(e)}), 400
  128. except Exception as e:
  129. return jsonify({"error": "内部服务器错误"}), 500
  130. # @api.route('/items', methods=['POST'])
  131. # def add_item():
  132. # item = request.get_json()
  133. # result = db.items.insert_one(item)
  134. # return jsonify({"_id": str(result.inserted_id)})
  135. # @api.route('/items/<item_id>', methods=['PUT'])
  136. # def update_item(item_id):
  137. # item = request.get_json()
  138. # result = db.items.update_one({"_id": ObjectId(item_id)}, {"$set": item})
  139. # return jsonify({"modified_count": result.modified_count})
  140. # @api.route('/items/<item_id>', methods=['DELETE'])
  141. # def delete_item(item_id):
  142. # result = db.items.delete_one({"_id": ObjectId(item_id)})
  143. # return jsonify({"deleted_count": result.deleted_count})
  144. # @app.route('/login', methods=['GET', 'POST'])
  145. # def login_page():
  146. # if request.method == 'POST':
  147. # username = request.form['username']
  148. # password = request.form['password']
  149. # # 在此处验证用户凭据
  150. # user = User()
  151. # user.id = username
  152. # login_user(user)
  153. # return redirect(url_for('protected_page'))
  154. # return render_template('login.html')
  155. # @app.route('/logout')
  156. # def logout_page():
  157. # if current_user.is_active:
  158. # logout_user()
  159. # return 'Logged out'
  160. # else:
  161. # return "you aren't login"