VseesController.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : Rocky
  4. @Time : 2023/07/13 11:30
  5. @File :VseesController.py
  6. """
  7. import json
  8. import hashlib
  9. import time
  10. import uuid
  11. import requests
  12. from django.db import transaction
  13. from django.views import View
  14. from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION
  15. from Model.models import VseesDeviceType, vseesProductInfo, EnterpriseUserInfo, LogModel
  16. from Object.AWS.AmazonS3Util import AmazonS3Util
  17. from Object.RedisObject import RedisObject
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. from Service.CommonService import CommonService
  21. class VseesManagement(View):
  22. def get(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.GET, operation, request)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.POST, operation, request)
  30. def validation(self, request_dict, operation, request):
  31. response = ResponseObject()
  32. if operation == 'get-state': # 获取sate值
  33. return self.get_state(response)
  34. elif operation == 'get-device-info': # 查询微瞳设备类型图标信息
  35. return self.get_device_info(response)
  36. elif operation == 'get-product-info': # 获取产品信息
  37. return self.get_product_info(request_dict, response)
  38. elif operation == 'get-user': # 获取用户
  39. return self.get_user(request_dict, response)
  40. else:
  41. tko = TokenObject(
  42. request.META.get('HTTP_AUTHORIZATION'),
  43. returntpye='pc')
  44. if tko.code != 0:
  45. return response.json(tko.code)
  46. response.lang = tko.lang
  47. user_id = tko.userID
  48. if operation == 'get-info': # 获取产品详细信息
  49. return self.get_info(request_dict, response)
  50. elif operation == 'add-info': # 新增信息
  51. return self.add_info(request_dict, request, response, user_id)
  52. elif operation == 'edit-status': # 修改状态
  53. return self.edit_status(request_dict, response, request, user_id)
  54. elif operation == 'upload-file': # 更新文件
  55. return self.upload_file(request_dict, request, response, user_id)
  56. elif operation == 'edit-info': # 修改信息
  57. return self.edit_info(request_dict, response, request, user_id)
  58. else:
  59. return response.json(404)
  60. @staticmethod
  61. def get_info(request_dict, response):
  62. """
  63. 获取微瞳产品信息
  64. @request_dict vsees_id:设备类型id
  65. @request_dict type:0:视频, 1:说明书, 2:固件
  66. return:
  67. """
  68. vsees_id = request_dict.get('vsees_id', None)
  69. product_type = request_dict.get('type', None)
  70. if not all([vsees_id, product_type]):
  71. return response.json(444, 'vsees_id, type')
  72. try:
  73. product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, type=product_type,
  74. status=0).values('title', 'file_name', 'status').order_by(
  75. '-add_time')
  76. if not product_info_qs.exists():
  77. return response.json(173)
  78. return response.json(0, list(product_info_qs))
  79. except Exception as e:
  80. print(e)
  81. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  82. @classmethod
  83. def add_info(cls, request_dict, request, response, user_id):
  84. """
  85. 新增微瞳产品信息
  86. @request_dict product_id:产品信息id
  87. @request_dict file:文件
  88. @request_dict vsees_id:设备类型id
  89. @request_dict url:路径
  90. @request_dict title:标题
  91. @request_dict device_type:0:视频链接, 1:说明书, 2:固件
  92. @request_dict status:状态0:已上架, 1: 已下架
  93. return:
  94. """
  95. file = request.FILES.get('file', None)
  96. vsees_id = request_dict.get('vsees_id', None)
  97. url = request_dict.get('url', None)
  98. title = request_dict.get('title', None)
  99. product_type = request_dict.get('type', None)
  100. if not all([file or url, title, product_type, vsees_id]):
  101. return response.json(444, 'error: file or url, title, type, vsees_id')
  102. now_time = int(time.time())
  103. fileName = str(file)
  104. device_type = int(product_type)
  105. # 判断上架状态标题是否重复
  106. product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, title=title, type=product_type, status=0)
  107. if product_info_qs.exists():
  108. return response.json(174)
  109. try:
  110. with transaction.atomic():
  111. data = {
  112. 'vsees_id': vsees_id,
  113. 'title': title,
  114. 'type': device_type,
  115. 'status': 0,
  116. 'add_time': now_time,
  117. 'upd_time': now_time,
  118. }
  119. # 记录操作日志
  120. content = json.loads(json.dumps(request_dict))
  121. log = {
  122. 'ip': CommonService.get_ip_address(request),
  123. 'user_id': 2,
  124. 'status': 200,
  125. 'time': int(time.time()),
  126. 'url': 'vsees/upload-file',
  127. 'content': json.dumps(content),
  128. 'operation': '{}新增{}-0:视频链接, 1:说明书, 2:固件'.format(user_id, device_type),
  129. }
  130. LogModel.objects.create(**log)
  131. # 添加链接
  132. if device_type == 0:
  133. data['file_name'] = url
  134. data['url'] = url
  135. vseesProductInfo.objects.create(**data)
  136. return response.json(0)
  137. # 添加说明书
  138. elif device_type == 1:
  139. url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification/{}'.format(fileName)
  140. file_key = 'vsees/clarification/{}'
  141. # 添加固件
  142. elif device_type == 2:
  143. url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware/{}'.format(fileName)
  144. file_key = 'vsees/firmware/{}'
  145. key = file_key.format(fileName)
  146. s3 = cls.upload(file, key)
  147. if s3:
  148. data['file_name'] = fileName
  149. data['url'] = url
  150. vseesProductInfo.objects.create(**data)
  151. return response.json(0)
  152. return response.json(178)
  153. except Exception as e:
  154. print(e)
  155. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  156. @classmethod
  157. def upload(cls, file, key):
  158. """
  159. 上传
  160. @request_dict file:文件
  161. @request_dict key:需要上传文件路径+文件名
  162. """
  163. bucket_name = 'ansjerfilemanager'
  164. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
  165. s3 = s3.upload_file_obj(
  166. bucket_name,
  167. key,
  168. file,
  169. {'ContentType': file.content_type, 'ACL': 'public-read'})
  170. if s3:
  171. return True
  172. else:
  173. return False
  174. @classmethod
  175. def upload_file(cls, request_dict, request, response, user_id):
  176. """
  177. 更新文件
  178. @request_dict product_id:产品信息id
  179. @request_dict file:文件
  180. @request_dict device_type:0:视频, 1:说明书, 2:固件
  181. """
  182. file = request.FILES.get('file', None)
  183. product_id = request_dict.get('product_id', None)
  184. product_type = request_dict.get('type', None)
  185. if not all([file, product_type, product_id]):
  186. return response.json(444, 'error: file, type, product_id')
  187. now_time = int(time.time())
  188. fileName = str(file)
  189. product_info_qs = vseesProductInfo.objects.filter(id=product_id, type=product_type, status=0)
  190. if not product_info_qs.exists():
  191. return response.json(177)
  192. try:
  193. # 说明
  194. if product_type == 1:
  195. url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification/{}'.format(fileName)
  196. file_key = 'vsees/clarification/{}'
  197. # 固件
  198. else:
  199. url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware/{}'.format(fileName)
  200. file_key = 'vsees/firmware/{}'
  201. key = file_key.format(fileName)
  202. s3 = cls.upload(file, key)
  203. if s3:
  204. vseesProductInfo.objects.filter(id=product_id).update(url=url, upd_time=now_time, file_name=fileName)
  205. # 记录操作日志
  206. ip = CommonService.get_ip_address(request)
  207. content = json.loads(json.dumps(request_dict))
  208. log = {
  209. 'ip': ip,
  210. 'user_id': 2,
  211. 'status': 200,
  212. 'time': int(time.time()),
  213. 'url': 'vsees/upload-file',
  214. 'content': json.dumps(content),
  215. 'operation': '{}更新文件'.format(user_id),
  216. }
  217. LogModel.objects.create(**log)
  218. return response.json(0)
  219. return response.json(177)
  220. except Exception as e:
  221. print(e)
  222. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  223. @staticmethod
  224. def edit_status(request_dict, response, request, user_id):
  225. """
  226. 修改状态
  227. @request_dict product_id:id
  228. @request_dict status:状态0:已上架, 1: 已下架
  229. """
  230. product_id = request_dict.get('product_id', None)
  231. status = request_dict.get('status', None)
  232. if not all([status, product_id]):
  233. return response.json(444, 'error: status, product_id')
  234. # 只下架
  235. if int(status) == 0:
  236. return response.json(177)
  237. try:
  238. vseesProductInfo.objects.filter(id=product_id).update(status=status)
  239. # 记录操作日志
  240. content = json.loads(json.dumps(request_dict))
  241. log = {
  242. 'ip': CommonService.get_ip_address(request),
  243. 'user_id': 2,
  244. 'status': 200,
  245. 'time': int(time.time()),
  246. 'url': 'vsees/edit-status',
  247. 'content': json.dumps(content),
  248. 'operation': '{}修改资源状态'.format(user_id),
  249. }
  250. LogModel.objects.create(**log)
  251. return response.json(0)
  252. except Exception as e:
  253. print(e)
  254. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  255. @staticmethod
  256. def edit_info(request_dict, response, request, user_id):
  257. """
  258. 修改信息
  259. @request_dict product_id:id
  260. @request_dict url:路径
  261. @request_dict title:标题
  262. """
  263. product_id = request_dict.get('product_id', None)
  264. url = request_dict.get('url', None)
  265. title = request_dict.get('title')
  266. if not product_id:
  267. return response.json(444, 'error: product_id')
  268. product_info_qs = vseesProductInfo.objects.filter(id=product_id, title=title, status=0)
  269. if product_info_qs.exists():
  270. return response.json(174)
  271. if title:
  272. product_info_qs.update(title=title)
  273. if url:
  274. product_info_qs.update(url=url)
  275. # 记录操作日志
  276. ip = CommonService.get_ip_address(request)
  277. content = json.loads(json.dumps(request_dict))
  278. log = {
  279. 'ip': ip,
  280. 'user_id': 2,
  281. 'status': 200,
  282. 'time': int(time.time()),
  283. 'url': 'vsees/edit-info',
  284. 'content': json.dumps(content),
  285. 'operation': '{}修改资源信息'.format(user_id),
  286. }
  287. LogModel.objects.create(**log)
  288. return response.json(0)
  289. # 用户界面接口 -------------------------------------------------------------------------------------------------------
  290. @staticmethod
  291. def get_device_info(response):
  292. """
  293. 获取微瞳图标信息
  294. """
  295. try:
  296. device_type_qs = VseesDeviceType.objects.all().values().order_by('id')
  297. return response.json(0, list(device_type_qs))
  298. except Exception as e:
  299. print(e)
  300. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  301. @staticmethod
  302. def get_product_info(request_dict, response):
  303. """
  304. 获取微瞳产品信息
  305. @request_dict deviceTypeId:设备类型id
  306. @request_dict type:0:视频, 1:说明书, 2:固件
  307. @request_dict title:标题
  308. return:
  309. """
  310. vsees_id = request_dict.get('vsees_id', None)
  311. title = request_dict.get('title', None)
  312. product_type = request_dict.get('type', None)
  313. if not vsees_id:
  314. return response.json(444, 'vsees_id')
  315. try:
  316. product_info_qs = vseesProductInfo.objects.all()
  317. if not (title and product_type):
  318. product_info_qs = product_info_qs.filter(vsees_id=vsees_id, status=0).values('title').order_by(
  319. '-add_time')
  320. return response.json(0, list(product_info_qs))
  321. else:
  322. product_info_qs = product_info_qs.filter(vsees__id=vsees_id, title=title, type=product_type,
  323. status=0).values('url').order_by('-add_time')
  324. if not product_info_qs.exists():
  325. return response.json(173)
  326. return response.json(0, {'url': product_info_qs[0]['url']})
  327. except Exception as e:
  328. print(e)
  329. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  330. # -------------------企业微信扫码登录--------------------------------
  331. @staticmethod
  332. def get_state(response):
  333. """
  334. 获取state
  335. @param response: 响应对象
  336. @return: response
  337. """
  338. nwo_time = time.time()
  339. redis_obj = RedisObject()
  340. try:
  341. state = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest()
  342. state_statue = redis_obj.set_ex_data(state, 0, 300) # redis记录state
  343. if state_statue:
  344. return response.json(0, {'state': state})
  345. else:
  346. return response.json(120)
  347. except Exception as e:
  348. print(e)
  349. return response.json(500)
  350. @classmethod
  351. def get_user(cls, request_dict, response):
  352. """
  353. 获取用户信息
  354. @request_dict code:唯一标识
  355. @request_dict state:唯一标识
  356. return:
  357. """
  358. code = request_dict.get('code', None)
  359. state = request_dict.get('state', None)
  360. if not all([code, state]):
  361. return response.json(444, 'error: code, state')
  362. # 验证state,获取token
  363. access_token = cls.get_token(response, state)
  364. if not access_token:
  365. return response.json(120)
  366. data = {
  367. 'access_token': access_token,
  368. 'code': code
  369. }
  370. try:
  371. # 获取用户id
  372. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo'
  373. token_response = requests.get(token_url, params=data)
  374. data = token_response.json()
  375. userid = data.get("userid")
  376. if userid:
  377. enterprise_user_info_qs = EnterpriseUserInfo.objects.filter(userID=userid)
  378. if not enterprise_user_info_qs.exists():
  379. cls.get_user_info(access_token, userid, response)
  380. tko = TokenObject()
  381. rest = tko.generate(data={'userID': userid, 'user': 'come@on'})
  382. return response.json(0, rest)
  383. else:
  384. errcode = data.get('errcode')
  385. errmsg = data.get('errmsg')
  386. return response.json({'errcode': errcode, 'errmsg': errmsg})
  387. except Exception as e:
  388. print(e)
  389. return response.json(500, repr(e))
  390. @classmethod
  391. def get_token(cls, response, state):
  392. redis_client = RedisObject()
  393. state_val = redis_client.get_data(state)
  394. # 验证state
  395. if state_val:
  396. redis_client.del_data(state)
  397. else:
  398. return False
  399. access_token = redis_client.get_data(key='enterprise_wechat_access_token')
  400. if access_token:
  401. redis_client.del_data(state)
  402. return access_token
  403. data = {
  404. 'corpid': 'ww467ec1685e8262e6',
  405. 'corpsecret': 'IeUoaQ-0hEhEduCQq1zyfVXjfeZpMsThK1nklszRzUY'
  406. }
  407. # 获取access_token,redis中不存在该值时重新请求获取access_token(有效时长两小时)
  408. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  409. token_response = requests.get(token_url, params=data)
  410. data = token_response.json()
  411. if data.get('errcode') == 0:
  412. access_token = data['access_token']
  413. expires_in = data['expires_in']
  414. redis_client.set_data('enterprise_wechat_access_token', access_token, expires_in)
  415. return access_token
  416. else:
  417. errcode = data.get('errcode')
  418. errmsg = data.get('errmsg')
  419. return response.json({'errcode': errcode, 'errmsg': errmsg})
  420. @classmethod
  421. def get_user_info(cls, access_token, userid, response):
  422. now_time = int(time.time())
  423. data = {
  424. 'access_token': access_token,
  425. 'userid': userid
  426. }
  427. # 获取用户信息
  428. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/user/get'
  429. token_response = requests.get(token_url, params=data)
  430. data = token_response.json()
  431. userid = data.get("userid")
  432. url_data = {
  433. 'userID': userid,
  434. 'name': data.get('name'),
  435. 'position': data.get('position'),
  436. 'status': data.get('status'),
  437. 'add_time': now_time,
  438. 'upd_time': now_time
  439. }
  440. if data.get('errcode') == 0:
  441. EnterpriseUserInfo.objects.create(**url_data)
  442. return True
  443. else:
  444. errcode = data.get('errcode')
  445. errmsg = data.get('errmsg')
  446. return response.json({'errcode': errcode, 'errmsg': errmsg})