user.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. from . import aidog_request_tools,aidog_tools
  2. from django.http import HttpResponse,JsonResponse
  3. from datetime import datetime, timedelta
  4. import jwt
  5. import os
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "aiDogProject.settings")
  7. import django
  8. django.setup()
  9. from aiDogApp.models import *
  10. from django.views.decorators.csrf import csrf_exempt
  11. import json
  12. from django.core import serializers
  13. import hashlib
  14. SECRET_KEY='#tdfnrcn1s610h4*csa2-p+=lfqz-ol+=uo$+n2sa'
  15. # 获取用户信息接口
  16. # 使用access_token登录 请求参数:access_token、user_id
  17. # 返回格式:result、message、user_info
  18. # 2025-2-19 author Feng
  19. # 2025-3-27 新增返回道具列表
  20. @csrf_exempt
  21. def get_user_info(request):
  22. try:
  23. # 获取请求参数
  24. params = aidog_request_tools.handle_post_request_parameters(request, ["access_token","user_id"])
  25. access_token,user_id = params["access_token"],params["user_id"]
  26. res = None
  27. date_now = datetime.strftime(datetime.today(), '%Y-%m-%d %H:%M:%S')
  28. if not access_token or not user_id:
  29. raise ValueError("Invalid input parameters: mobile_number or password or UUID is empty")
  30. # 验证access_token是否有效
  31. try:
  32. decoded_token = jwt.decode(access_token, SECRET_KEY, algorithms=['HS256'])
  33. user_id = decoded_token['user_id']
  34. print(user_id)
  35. # 判断数据库uid是否有效
  36. except jwt.ExpiredSignatureError:
  37. # 旧access_token已过期,返回失败信息
  38. return JsonResponse({
  39. "status": "error",
  40. "code": 400,
  41. "message": "AccessToken expired, please refresh!"
  42. })
  43. # 取出数据库的uid:
  44. try:
  45. user = User.objects.get(uid=user_id)
  46. except User.DoesNotExist:
  47. return {"status": "error", "message": f"No user found with uid={user_id}"}
  48. # 处理isRegUser的布尔值转换
  49. isRegUser = True if getattr(user, 'isRegUser', 0) == 1 else False
  50. dog_info = Doginfo.objects.filter(owner_id=user_id)
  51. # 获取用户道具库存
  52. user_inventory = UserInventory.objects.filter(owner_id=user_id)
  53. # 返回用户名下的道具数量
  54. # props_list = []
  55. # for prop in user_inventory:
  56. # prop_serialized = serializers.serialize('json', [prop])
  57. # prop_data = json.loads(prop_serialized)[0]['fields']
  58. # props_list.append(prop_data)
  59. props_dict = {
  60. "food": {},
  61. "toy": {},
  62. "other": {}
  63. }
  64. for prop in user_inventory:
  65. prop_serialized = serializers.serialize('json', [prop])
  66. prop_data = json.loads(prop_serialized)[0]['fields']
  67. if prop_data['quantity']>0:
  68. # Determine the category based on item_id prefix
  69. if prop_data['item_id'].startswith('food_') or prop_data['item_id'].startswith('water_'):
  70. category = 'food'
  71. elif prop_data['item_id'].startswith('toy_'):
  72. category = 'toy'
  73. else:
  74. category = 'other'
  75. # Add to the corresponding category dictionary
  76. props_dict[category][prop_data['item_id']] = prop_data['quantity']
  77. # print(dog_info)
  78. dog_list = []
  79. dog_id_list=[]
  80. for dog in dog_info:
  81. dog_serialized = serializers.serialize('json', [dog])
  82. dog_data = json.loads(dog_serialized)[0]['fields']
  83. dog_id = dog_data['d_id']
  84. # 获取狗的信息并转换为字典
  85. # 获取狗的信息并转换为字典
  86. new_dog_status = aidog_tools.model_to_dict_without_id(DogStatus.objects.filter(d_id=dog_id).first())
  87. new_dog_training = aidog_tools.model_to_dict_without_id(DogTrainingNew.objects.filter(d_id=dog_id).first())
  88. new_dog_body_attributes = aidog_tools.model_to_dict_without_id(DogBodyAttributes.objects.filter(d_id=dog_id).first())
  89. new_dog_personality_relationship = aidog_tools.model_to_dict_without_id(DogPersonalityRelationship.objects.filter(d_id=dog_id).first())
  90. # new_dog_status = DogStatus.objects.filter(d_id=dog_id).first()
  91. # new_dog_training = DogTraining.objects.filter(d_id=dog_id).first()
  92. # new_dog_body_attributes = DogBodyAttributes.objects.filter(d_id=dog_id).first()
  93. # new_dog_personality_relationship = DogPersonalityRelationship.objects.filter(d_id=dog_id).first()
  94. # 合并所有相关信息
  95. # dog_info_combined = {
  96. # **dog_data,
  97. # **(new_dog_status.__dict__ if new_dog_status else {}),
  98. # **(new_dog_training.__dict__ if new_dog_training else {}),
  99. # **(new_dog_body_attributes.__dict__ if new_dog_body_attributes else {}),
  100. # **(new_dog_personality_relationship.__dict__ if new_dog_personality_relationship else {}),
  101. # }
  102. # 合并所有相关信息
  103. dog_info_combined = {
  104. **dog_data,
  105. **new_dog_status,
  106. **new_dog_training,
  107. **new_dog_body_attributes,
  108. **new_dog_personality_relationship,
  109. }
  110. # 只保留字段而不是数据库内部的元数据(如 '_state')
  111. dog_info_clean = {key: value for key, value in dog_info_combined.items() if not key.startswith('_')}
  112. dog_list.append(dog_info_clean)
  113. res = {
  114. "status": "success",
  115. "message": "request UserInfo successful!",
  116. "user_info": {
  117. "user_name":user.user_name,
  118. "coin": user.coin,
  119. "isRegUser": isRegUser,
  120. "mobile": user.mobile,
  121. "email": user.email,
  122. "level": user.level,
  123. "uuid":user.uuid,
  124. "registration_time": user.registration_time,
  125. },
  126. "dogs": dog_list,
  127. "props":props_dict,
  128. }
  129. return JsonResponse(res)
  130. except Exception as e:
  131. import traceback
  132. traceback.print_exc()
  133. return JsonResponse({"status": "error", "message": str(e)}, status=500)
  134. # 更新用户信息接口
  135. # 使用access_token登录 请求参数:access_token、user_id
  136. # 返回格式:result、message、user_info
  137. # 2025-3-31 author Feng
  138. @csrf_exempt
  139. def update_user_info(request):
  140. try:
  141. # 获取请求参数
  142. required_params = ["mobile_number", "email", "password", "access_token",
  143. "user_name", "user_id", "client_language"]
  144. params = aidog_request_tools.handle_post_request_has_empty_parameters(request, required_params)
  145. client_language = params["client_language"]
  146. user_id = params["user_id"]
  147. password = params["password"]
  148. access_token = params["access_token"]
  149. user_name = params["user_name"]
  150. mobile_number = params["mobile_number"]
  151. email = params["email"]
  152. # 参数验证
  153. if not client_language:
  154. return JsonResponse({
  155. "status": "error",
  156. "code": 400,
  157. "message": "Invalid input parameters: client_language is empty"
  158. })
  159. # 根据系统语言判断必填参数
  160. if client_language == "zh-cn" and (not mobile_number or not password or not user_name or not user_id):
  161. # 使用mobile_number登录
  162. return JsonResponse({
  163. "status": "error",
  164. "code": 400,
  165. "message": "Invalid input parameters: mobile_number or password or username or user_id is empty"
  166. })
  167. elif client_language != "zh-cn" and (not email or not password or not user_name or not user_id):
  168. # 使用Email登录
  169. return JsonResponse({
  170. "status": "error",
  171. "code": 400,
  172. "message": "Invalid input parameters: Email or password or username or user_id is empty"
  173. })
  174. # 验证access_token是否有效
  175. try:
  176. decoded_token = jwt.decode(access_token, SECRET_KEY, algorithms=['HS256'])
  177. token_user_id = decoded_token['user_id']
  178. if token_user_id != user_id:
  179. return JsonResponse({
  180. "status": "error",
  181. "code": 400,
  182. "message": "AccessToken doesn't match!"
  183. })
  184. except jwt.ExpiredSignatureError:
  185. return JsonResponse({
  186. "status": "error",
  187. "code": 400,
  188. "message": "AccessToken expired, please refresh!"
  189. })
  190. except jwt.InvalidTokenError:
  191. return JsonResponse({
  192. "status": "error",
  193. "code": 400,
  194. "message": "Invalid access token"
  195. })
  196. # 取出数据库的uid:
  197. try:
  198. user = User.objects.get(uid=user_id)
  199. # 处理密码 - 如果是 ******** 则保留原密码,否则更新
  200. if password != '********':
  201. password = hashlib.sha256(password.encode()).hexdigest()
  202. else:
  203. password = user.password
  204. # 更新用户信息
  205. user.mobile = mobile_number
  206. user.user_name = user_name
  207. user.email = email
  208. user.password = password
  209. user.save()
  210. res = {
  211. "status": "success",
  212. "message": "User updated successfully!",
  213. "user_id": user_id,
  214. "user_name": user_name,
  215. "mobile_number": mobile_number,
  216. "email": email,
  217. }
  218. return JsonResponse(res)
  219. except User.DoesNotExist:
  220. return JsonResponse({
  221. "status": "error",
  222. "code": 404,
  223. "message": f"No user found with uid={user_id}"
  224. }, status=404)
  225. except Exception as e:
  226. import traceback
  227. traceback.print_exc()
  228. return JsonResponse({"status": "error", "message": str(e)}, status=500)
  229. # 用户反馈接口
  230. # 使用access_token登录 请求参数:access_token、user_id,feedback,date_time,type(bug/comment),log(file)
  231. # 返回格式:result、message、user_info
  232. # 2025-3-31 author Feng
  233. @csrf_exempt
  234. def feedback(request):
  235. try:
  236. current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  237. # 获取请求参数
  238. required_params = ["access_token", "user_id","feedback", "date_time", "type"]
  239. params = aidog_request_tools.handle_post_request_has_empty_parameters(request, required_params)
  240. access_token = params["access_token"]
  241. user_id = params["user_id"]
  242. feedback=params["feedback"]
  243. # date_time = params["date_time"]
  244. type = params["type"]
  245. # 尝试从FILES获取文件(multipart/form-data方式)
  246. file_stream = request.FILES.get("log") or request.FILES.get("file")
  247. # 如果FILES中没有找到文件,并且Content-Type是application/octet-stream,
  248. # 则从请求体中读取二进制数据
  249. if not file_stream and request.content_type == 'application/octet-stream':
  250. from django.core.files.uploadedfile import SimpleUploadedFile
  251. file_stream = SimpleUploadedFile("log.zip", request.body, content_type="application/octet-stream")
  252. # 验证请求参数
  253. # 验证文件是否存在
  254. # if not file_stream:
  255. # return JsonResponse({
  256. # "status": "error",
  257. # "message": "log file was not uploaded",
  258. # "date": current_time
  259. # })
  260. # if type not in ["comment", "bug"]:
  261. # return JsonResponse({
  262. # "status": "error",
  263. # "date": current_time,
  264. # "message": "Please ensure type field is correctly provided!",
  265. # "end_time": current_time
  266. # })
  267. if not all([user_id,type, access_token,feedback]):
  268. return JsonResponse({
  269. "status": "error",
  270. "date": current_time,
  271. "message": "Please ensure all required fields are provided!",
  272. "end_time": current_time
  273. })
  274. # 验证access_token是否有效
  275. try:
  276. decoded_token = jwt.decode(access_token, SECRET_KEY, algorithms=['HS256'])
  277. token_user_id = decoded_token['user_id']
  278. if token_user_id != user_id:
  279. return JsonResponse({
  280. "status": "error",
  281. "code": 400,
  282. "message": "AccessToken doesn't match!"
  283. })
  284. except jwt.ExpiredSignatureError:
  285. return JsonResponse({
  286. "status": "error",
  287. "code": 400,
  288. "message": "AccessToken expired, please refresh!"
  289. })
  290. except jwt.InvalidTokenError:
  291. return JsonResponse({
  292. "status": "error",
  293. "code": 400,
  294. "message": "Invalid access token"
  295. })
  296. # 取出数据库的uid:
  297. try:
  298. raining_log = AidogFeedbacks.objects.create(
  299. uid=user_id,
  300. create_time=current_time,
  301. feedback_type=type,
  302. feedback_content=feedback,
  303. )
  304. res = {
  305. "status": "success",
  306. "message": "feedback successfully!",
  307. }
  308. return JsonResponse(res)
  309. except AidogFeedbacks.DoesNotExist:
  310. return JsonResponse({
  311. "status": "error",
  312. "code": 404,
  313. "message": f"No user found with uid={user_id}"
  314. }, status=404)
  315. except Exception as e:
  316. import traceback
  317. traceback.print_exc()
  318. return JsonResponse({"status": "error", "message": str(e)}, status=500)