Browse Source

企业微信扫码登录

guanhailong 2 years ago
parent
commit
1d99a7674e
2 changed files with 211 additions and 21 deletions
  1. 195 19
      Controller/VseesWeb/VseesController.py
  2. 16 2
      Model/models.py

+ 195 - 19
Controller/VseesWeb/VseesController.py

@@ -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})

+ 16 - 2
Model/models.py

@@ -3712,7 +3712,7 @@ class vseesProductInfo(models.Model):
     file_name = models.CharField(max_length=120, default='', verbose_name='文件名')
     vsees = models.ForeignKey(VseesDeviceType, to_field='id', on_delete=models.CASCADE, verbose_name='关联微瞳设备类型表')
     title = models.CharField(max_length=32, default='', verbose_name='标题')
-    type = models.SmallIntegerField(default=0, verbose_name='类型{0:视频, 1:说明书, 2:固件}')
+    type = models.SmallIntegerField(default=0, verbose_name='类型{0:视频链接, 1:说明书, 2:固件}')
     url = models.CharField(max_length=200, default='', verbose_name='路径')
     add_time = models.IntegerField(verbose_name='添加时间', default=0)
     upd_time = models.IntegerField(verbose_name='更新时间', default=0)
@@ -3729,6 +3729,20 @@ class vseesProductInfo(models.Model):
         ordering = ('-id',)
 
 
+class EnterpriseUserInfo(models.Model):
+    userID = models.IntegerField(primary_key=True, verbose_name=u'企业用户ID', unique=True)
+    name = models.CharField(blank=True, max_length=32, verbose_name=u'名字')
+    position = models.CharField(blank=True, max_length=64, verbose_name=u'岗位')
+    status = models.SmallIntegerField(default=0, verbose_name='用户状态')  # 1:已激活,2:已禁用,4:未激活,5:退出企业
+    add_time = models.IntegerField(default=0, verbose_name='创建时间')
+    upd_time = models.IntegerField(default=0, verbose_name='修改时间')
+
+    class Meta:
+        db_table = 'enterprise_user_info'
+        verbose_name = '企业用户信息'
+        verbose_name_plural = verbose_name
+
+
 class IotCardUsageHistory(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='列表主键')
     iccid = models.CharField(default='', max_length=32, verbose_name=u'ICCID号')
@@ -3745,4 +3759,4 @@ class IotCardUsageHistory(models.Model):
     class Meta:
         db_table = 'iot_card_usage_history'
         verbose_name = '物联网卡用量历史'
-        verbose_name_plural = verbose_name
+        verbose_name_plural = verbose_name