|
@@ -4,16 +4,22 @@
|
|
|
@Time : 2023/07/13 11:30
|
|
|
@File :VseesController.py
|
|
|
"""
|
|
|
+import json
|
|
|
+import hashlib
|
|
|
import time
|
|
|
+import uuid
|
|
|
|
|
|
+import requests
|
|
|
from django.db import transaction
|
|
|
from django.views import View
|
|
|
|
|
|
from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION
|
|
|
-from Model.models import VseesDeviceType, vseesProductInfo
|
|
|
+from Model.models import VseesDeviceType, vseesProductInfo, EnterpriseUserInfo, LogModel
|
|
|
from Object.AWS.AmazonS3Util import AmazonS3Util
|
|
|
+from Object.RedisObject import RedisObject
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
from Object.TokenObject import TokenObject
|
|
|
+from Service.CommonService import CommonService
|
|
|
|
|
|
|
|
|
class VseesManagement(View):
|
|
@@ -29,10 +35,15 @@ class VseesManagement(View):
|
|
|
|
|
|
def validation(self, request_dict, operation, request):
|
|
|
response = ResponseObject()
|
|
|
- if operation == 'get-device-info': # 查询微瞳设备类型图标信息
|
|
|
+
|
|
|
+ if operation == 'get-state': # 获取sate值
|
|
|
+ return self.get_state(response)
|
|
|
+ elif operation == 'get-device-info': # 查询微瞳设备类型图标信息
|
|
|
return self.get_device_info(response)
|
|
|
elif operation == 'get-product-info': # 获取产品信息
|
|
|
return self.get_product_info(request_dict, request)
|
|
|
+ elif operation == 'get-user': # 获取用户
|
|
|
+ return self.get_user(request_dict, response)
|
|
|
else:
|
|
|
tko = TokenObject(
|
|
|
request.META.get('HTTP_AUTHORIZATION'),
|
|
@@ -41,16 +52,16 @@ class VseesManagement(View):
|
|
|
return response.json(tko.code)
|
|
|
response.lang = tko.lang
|
|
|
user_id = tko.userID
|
|
|
- if operation == 'get-info': # 获取信息
|
|
|
+ if operation == 'get-info': # 获取产品详细信息
|
|
|
return self.get_info(request_dict, response)
|
|
|
elif operation == 'add-info': # 新增信息
|
|
|
- return self.add_info(request_dict, request, response)
|
|
|
+ return self.add_info(request_dict, request, response, user_id)
|
|
|
elif operation == 'edit-status': # 修改状态
|
|
|
- return self.edit_status(request_dict, response)
|
|
|
+ return self.edit_status(request_dict, response, request, user_id)
|
|
|
elif operation == 'upload-file': # 更新文件
|
|
|
- return self.upload_file(request_dict, request, response)
|
|
|
+ return self.upload_file(request_dict, request, response, user_id)
|
|
|
elif operation == 'edit-info': # 修改信息
|
|
|
- return self.edit_info(request_dict, response)
|
|
|
+ return self.edit_info(request_dict, response, request, user_id)
|
|
|
else:
|
|
|
return response.json(404)
|
|
|
|
|
@@ -78,7 +89,7 @@ class VseesManagement(View):
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
|
|
@classmethod
|
|
|
- def add_info(cls, request_dict, request, response):
|
|
|
+ def add_info(cls, request_dict, request, response, user_id):
|
|
|
"""
|
|
|
新增微瞳产品信息
|
|
|
@request_dict product_id:产品信息id
|
|
@@ -86,7 +97,7 @@ class VseesManagement(View):
|
|
|
@request_dict vsees_id:设备类型id
|
|
|
@request_dict url:路径
|
|
|
@request_dict title:标题
|
|
|
- @request_dict device_type:0:视频, 1:说明书, 2:固件
|
|
|
+ @request_dict device_type:0:视频链接, 1:说明书, 2:固件
|
|
|
@request_dict status:状态0:已上架, 1: 已下架
|
|
|
return:
|
|
|
"""
|
|
@@ -98,7 +109,7 @@ class VseesManagement(View):
|
|
|
|
|
|
if not all([file or url, title, product_type, vsees_id]):
|
|
|
return response.json(444, 'error: file or url, title, type, vsees_id')
|
|
|
- nowTime = int(time.time())
|
|
|
+ now_time = int(time.time())
|
|
|
fileName = str(file)
|
|
|
device_type = int(product_type)
|
|
|
# 判断上架状态标题是否重复
|
|
@@ -112,9 +123,21 @@ class VseesManagement(View):
|
|
|
'title': title,
|
|
|
'type': device_type,
|
|
|
'status': 0,
|
|
|
- 'add_time': nowTime,
|
|
|
- 'upd_time': nowTime,
|
|
|
+ 'add_time': now_time,
|
|
|
+ 'upd_time': now_time,
|
|
|
}
|
|
|
+ # 记录操作日志
|
|
|
+ content = json.loads(json.dumps(request_dict))
|
|
|
+ log = {
|
|
|
+ 'ip': CommonService.get_ip_address(request),
|
|
|
+ 'user_id': user_id,
|
|
|
+ 'status': 200,
|
|
|
+ 'time': int(time.time()),
|
|
|
+ 'url': 'vsees/upload-file',
|
|
|
+ 'content': json.dumps(content),
|
|
|
+ 'operation': '{}新增{}-0:视频链接, 1:说明书, 2:固件'.format(user_id, device_type),
|
|
|
+ }
|
|
|
+ LogModel.objects.create(**log)
|
|
|
# 添加链接
|
|
|
if device_type == 0:
|
|
|
data['file_name'] = url
|
|
@@ -161,9 +184,9 @@ class VseesManagement(View):
|
|
|
return False
|
|
|
|
|
|
@classmethod
|
|
|
- def upload_file(cls, request_dict, request, response):
|
|
|
+ def upload_file(cls, request_dict, request, response, user_id):
|
|
|
"""
|
|
|
- 重新上传文件
|
|
|
+ 更新文件
|
|
|
@request_dict product_id:产品信息id
|
|
|
@request_dict file:文件
|
|
|
@request_dict device_type:0:视频, 1:说明书, 2:固件
|
|
@@ -173,9 +196,9 @@ class VseesManagement(View):
|
|
|
product_type = request_dict.get('type', None)
|
|
|
if not all([file, product_type, product_id]):
|
|
|
return response.json(444, 'error: file, type, product_id')
|
|
|
- nowTime = int(time.time())
|
|
|
+ now_time = int(time.time())
|
|
|
fileName = str(file)
|
|
|
- product_info_qs=vseesProductInfo.objects.filter(id=product_id, type=product_type, status=0)
|
|
|
+ product_info_qs = vseesProductInfo.objects.filter(id=product_id, type=product_type, status=0)
|
|
|
if not product_info_qs.exists():
|
|
|
return response.json(177)
|
|
|
try:
|
|
@@ -190,7 +213,20 @@ class VseesManagement(View):
|
|
|
key = file_key.format(fileName)
|
|
|
s3 = cls.upload(file, key)
|
|
|
if s3:
|
|
|
- vseesProductInfo.objects.filter(id=product_id).update(url=url, upd_time=nowTime, file_name=fileName)
|
|
|
+ vseesProductInfo.objects.filter(id=product_id).update(url=url, upd_time=now_time, file_name=fileName)
|
|
|
+ # 记录操作日志
|
|
|
+ ip = CommonService.get_ip_address(request)
|
|
|
+ content = json.loads(json.dumps(request_dict))
|
|
|
+ log = {
|
|
|
+ 'ip': ip,
|
|
|
+ 'user_id': user_id,
|
|
|
+ 'status': 200,
|
|
|
+ 'time': int(time.time()),
|
|
|
+ 'url': 'vsees/upload-file',
|
|
|
+ 'content': json.dumps(content),
|
|
|
+ 'operation': '{}更新文件'.format(user_id),
|
|
|
+ }
|
|
|
+ LogModel.objects.create(**log)
|
|
|
return response.json(0)
|
|
|
return response.json(177)
|
|
|
except Exception as e:
|
|
@@ -198,7 +234,7 @@ class VseesManagement(View):
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
|
|
@staticmethod
|
|
|
- def edit_status(request_dict, response):
|
|
|
+ def edit_status(request_dict, response, request, user_id):
|
|
|
"""
|
|
|
修改状态
|
|
|
@request_dict product_id:id
|
|
@@ -212,10 +248,22 @@ class VseesManagement(View):
|
|
|
if int(status) == 0:
|
|
|
return response.json(177)
|
|
|
vseesProductInfo.objects.filter(id=product_id).update(status=status)
|
|
|
+ # 记录操作日志
|
|
|
+ content = json.loads(json.dumps(request_dict))
|
|
|
+ log = {
|
|
|
+ 'ip': CommonService.get_ip_address(request),
|
|
|
+ 'user_id': user_id,
|
|
|
+ 'status': 200,
|
|
|
+ 'time': int(time.time()),
|
|
|
+ 'url': 'vsees/edit-status',
|
|
|
+ 'content': json.dumps(content),
|
|
|
+ 'operation': '{}修改资源状态'.format(user_id),
|
|
|
+ }
|
|
|
+ LogModel.objects.create(**log)
|
|
|
return response.json(0)
|
|
|
|
|
|
@staticmethod
|
|
|
- def edit_info(request_dict, response):
|
|
|
+ def edit_info(request_dict, response, request, user_id):
|
|
|
"""
|
|
|
修改信息
|
|
|
@request_dict product_id:id
|
|
@@ -234,6 +282,19 @@ class VseesManagement(View):
|
|
|
product_info_qs.update(title=title)
|
|
|
if url:
|
|
|
product_info_qs.update(url=url)
|
|
|
+ # 记录操作日志
|
|
|
+ ip = CommonService.get_ip_address(request)
|
|
|
+ content = json.loads(json.dumps(request_dict))
|
|
|
+ log = {
|
|
|
+ 'ip': ip,
|
|
|
+ 'user_id': user_id,
|
|
|
+ 'status': 200,
|
|
|
+ 'time': int(time.time()),
|
|
|
+ 'url': 'vsees/edit-info',
|
|
|
+ 'content': json.dumps(content),
|
|
|
+ 'operation': '{}修改资源信息'.format(user_id),
|
|
|
+ }
|
|
|
+ LogModel.objects.create(**log)
|
|
|
return response.json(0)
|
|
|
|
|
|
# 用户界面接口 -------------------------------------------------------------------------------------------------------
|
|
@@ -278,3 +339,118 @@ class VseesManagement(View):
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
+
|
|
|
+# -------------------企业微信扫码登录--------------------------------
|
|
|
+ @staticmethod
|
|
|
+ def get_state(response):
|
|
|
+ """
|
|
|
+ 获取state
|
|
|
+ @param response: 响应对象
|
|
|
+ @return: response
|
|
|
+ """
|
|
|
+ nwo_time = time.time()
|
|
|
+ redis_obj = RedisObject()
|
|
|
+ try:
|
|
|
+ state = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest()
|
|
|
+ state_statue = redis_obj.set_ex_data(state, 0, 300) # redis记录state
|
|
|
+ if state_statue:
|
|
|
+ return response.json(0, {'state': state})
|
|
|
+ else:
|
|
|
+ return response.json(120)
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ return response.json(500)
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def get_user(cls, request_dict, response):
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ state = request_dict.get('state', None)
|
|
|
+ if not all([code, state]):
|
|
|
+ return response.json(444, 'error: code, state')
|
|
|
+ # 验证state,获取token
|
|
|
+ access_token = cls.get_token(response, state)
|
|
|
+ if not access_token:
|
|
|
+ return response.json(120)
|
|
|
+ data = {
|
|
|
+ 'access_token': access_token,
|
|
|
+ 'code': code
|
|
|
+ }
|
|
|
+ try:
|
|
|
+ # 获取用户id
|
|
|
+ token_url = 'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo'
|
|
|
+ token_response = requests.get(token_url, params=data)
|
|
|
+ data = token_response.json()
|
|
|
+ userid = data.get("userid")
|
|
|
+ if userid:
|
|
|
+ enterprise_user_info_qs = EnterpriseUserInfo.objects.filter(userID=userid)
|
|
|
+ if not enterprise_user_info_qs.exists():
|
|
|
+ cls.get_user_info(access_token, userid, response)
|
|
|
+ tko = TokenObject()
|
|
|
+ rest = tko.generate(data={'userID': userid, 'user': 'come@on'})
|
|
|
+ return response.json(0, {'rest': rest})
|
|
|
+ else:
|
|
|
+ errcode = data.get('errcode')
|
|
|
+ errmsg = data.get('errmsg')
|
|
|
+ return response.json({'errcode': errcode, 'errmsg': errmsg})
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ return response.json(500, repr(e))
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def get_token(cls, response, state):
|
|
|
+ redis_client = RedisObject()
|
|
|
+ state_val = redis_client.get_data(state)
|
|
|
+ # 验证state
|
|
|
+ if state_val:
|
|
|
+ redis_client.del_data(state)
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+ access_token = redis_client.get_data(key='enterprise_wechat_access_token')
|
|
|
+ if access_token:
|
|
|
+ redis_client.del_data(state)
|
|
|
+ return access_token
|
|
|
+ data = {
|
|
|
+ 'corpid': 'ww467ec1685e8262e6',
|
|
|
+ 'corpsecret': 'IeUoaQ-0hEhEduCQq1zyfVXjfeZpMsThK1nklszRzUY'
|
|
|
+ }
|
|
|
+ # 获取access_token,redis中不存在该值时重新请求获取access_token(有效时长两小时)
|
|
|
+ token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
|
|
|
+ token_response = requests.get(token_url, params=data)
|
|
|
+ data = token_response.json()
|
|
|
+ if data.get('errcode') == 0:
|
|
|
+ access_token = data['access_token']
|
|
|
+ expires_in = data['expires_in']
|
|
|
+ redis_client.set_data('enterprise_wechat_access_token', access_token, expires_in)
|
|
|
+ return access_token
|
|
|
+ else:
|
|
|
+ errcode = data.get('errcode')
|
|
|
+ errmsg = data.get('errmsg')
|
|
|
+ return response.json({'errcode': errcode, 'errmsg': errmsg})
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def get_user_info(cls, access_token, userid, response):
|
|
|
+ now_time = int(time.time())
|
|
|
+ data = {
|
|
|
+ 'access_token': access_token,
|
|
|
+ 'userid': userid
|
|
|
+ }
|
|
|
+ # 获取用户信息
|
|
|
+ token_url = 'https://qyapi.weixin.qq.com/cgi-bin/user/get'
|
|
|
+ token_response = requests.get(token_url, params=data)
|
|
|
+ data = token_response.json()
|
|
|
+ userid = data.get("userid")
|
|
|
+ url_data = {
|
|
|
+ 'userID': userid,
|
|
|
+ 'name': data.get('name'),
|
|
|
+ 'position': data.get('position'),
|
|
|
+ 'status': data.get('status'),
|
|
|
+ 'add_time': now_time,
|
|
|
+ 'upd_time': now_time
|
|
|
+ }
|
|
|
+ if data.get('errcode') == 0:
|
|
|
+ EnterpriseUserInfo.objects.create(**url_data)
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ errcode = data.get('errcode')
|
|
|
+ errmsg = data.get('errmsg')
|
|
|
+ return response.json({'errcode': errcode, 'errmsg': errmsg})
|