| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 | #!/usr/bin/env python3# -*- coding: utf-8 -*-"""@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.@AUTHOR: ASJRD018@NAME: AnsjerFormal@software: PyCharm@DATE: 2018/9/11 15:08@Version: python3.6@MODIFY DECORD:ansjer dev@file: UserController.py@Contact: chanjunkai@163.com"""import datetimeimport tracebackimport timeimport loggingimport jwtimport oss2import simplejsonimport simplejson as jsonimport requestsfrom django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块from django.db import transactionfrom django.db.models import Qfrom django.http import HttpResponseRedirectfrom django.utils.decorators import method_decoratorfrom django.utils.timezone import utcfrom django.views.decorators.csrf import csrf_exemptfrom django.views.generic import TemplateViewfrom jwt.algorithms import RSAAlgorithmfrom ratelimit.decorators import ratelimitfrom Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN, \    OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRETfrom Controller.CheckUserData import DataValid, date_handler, RandomStrfrom Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \    UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, MenuModel, FeedBackModel, StatResModel, \    SysMassModel, App_Info, SysMsgModelfrom Object.AWS.SesClassObject import SesClassObjectfrom Object.AliSmsObject import AliSmsObjectfrom Object.RedisObject import RedisObjectfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Service.CommonService import CommonServicefrom Service.ModelService import ModelServicefrom Service.TemplateService import TemplateServicefrom django.views.generic import Viewimport base64import randomfrom io import BytesIOfrom PIL import Image, ImageDraw, ImageFontfrom django.shortcuts import HttpResponsefrom Ansjer.config import BASE_DIR# 登录class LoginView(TemplateView):    @method_decorator(csrf_exempt)  # @csrf_exempt    def dispatch(self, *args, **kwargs):        return super(LoginView, self).dispatch(*args, **kwargs)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.POST        language = request_dict.get('language', 'en')        response = ResponseObject(language,'pc')        return self.validates(request_dict, response)    def validates(self, request_dict, response):        username = request_dict.get('username', None)        password = request_dict.get('password', None)        if not username or not password:            return response.json(111)        username = username.strip()        password = password.strip()        data_valid = DataValid()        if data_valid.email_validate(username):            return self.do_email_login(username, password, response)        elif data_valid.mobile_validate(username):            return self.do_phone_login(username, password, response)        elif data_valid.name_validate(username):            return self.do_name_login(username, password, response)        else:            return response.json(107)    def do_email_login(self, email, password, response):        user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))        return self.valid_login(user_qs, password, response)    def do_phone_login(self, phone, password, response):        user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)        return self.valid_login(user_qs, password, response)    def do_name_login(self, username, password, response):        user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),                                             is_active=True, user_isValid=True)        return self.valid_login(user_qs, password, response)    def valid_login(self, user_qs, password, response):        if not user_qs.exists():            return response.json(104)        # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',        #                        'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]        users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',                               'phone', 'password', 'userIconPath')[0]        if not check_password(password, users['password']):            return response.json(111)        userID = users['userID']        tko = TokenObject(returntpye='pc')        res = tko.generate(            data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})        if tko.code == 0:            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)            user_qs.update(last_login=now_time, language=response.lang)            res['rid'] = users['role__rid']            res['roleName'] = users['role__roleName']            res['permList'] = ModelService.own_permission(userID)            res['userID'] = userID            # 昵称,邮箱,电话,刷新,头像            userIconPath = str(users['userIconPath'])            if userIconPath and userIconPath.find('static/') != -1:                userIconPath = userIconPath.replace('static/', '').replace('\\', '/')                res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath            else:                res['userIconUrl'] = ''            res['NickName'] = users['NickName'] if users['NickName'] is not None else ''            res['username'] = users['username'] if users['username'] is not None else ''            res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''            res['phone'] = users['phone'] if users['phone'] is not None else ''            return response.json(0, res)        else:            return response.json(tko.code)# 获取登录权限class GetPermissions(TemplateView):    @method_decorator(csrf_exempt)  # @csrf_exempt    def dispatch(self, *args, **kwargs):        return super(GetPermissions, self).dispatch(*args, **kwargs)    def get(self, request, *args, **kwargs):        token = request.META.get('HTTP_AUTHORIZATION')        request.encoding = 'utf-8'        request_dict = request.GET        language = request_dict.get('language', 'en')        response = ResponseObject(language, 'pc')        return self.validates(request_dict,token, response)    def validates(self, request_dict,token, response):        tko = TokenObject(token,returntpye='pc')        response.lang = tko.lang        if tko.code != 0:            return response.json(tko.code)        userID = tko.userID        user_qs = Device_User.objects.filter(userID=userID)        if not user_qs.exists():            return response.json(104)        #待补充逻辑        username = user_qs[0].username        userIconPath = user_qs[0].userIconPath.url        if userIconPath:            if userIconPath.find('static/') != -1:                userIconPath = userIconPath.replace('static/', '').replace('\\', '/')                userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath        role_qs = Role.objects.filter(device_user=userID)        menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=2);        perms = []        for menu in menu_qs:            perms.append(menu.menu_code)        res={          "code": 200,          "msg": "success",          "data": {            "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]            "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回            "username": username, # 用户名,必须返回            "avatar": userIconUrl,# 头像,必须返回            "perms": perms          }        }        return response.json(0, res)# 获取菜单class GetList(TemplateView):    @method_decorator(csrf_exempt)  # @csrf_exempt    def dispatch(self, *args, **kwargs):        return super(GetList, self).dispatch(*args, **kwargs)    def get(self, request, *args, **kwargs):        token = request.META.get('HTTP_AUTHORIZATION')        request.encoding = 'utf-8'        request_dict = request.GET        language = request_dict.get('language', 'en')        response = ResponseObject(language, 'pc')        return self.validates(request_dict,token, response)    def validates(self, request_dict,token, response):        tko = TokenObject(token,returntpye='pc')        response.lang = tko.lang        if tko.code != 0:            return response.json(tko.code)        userID = tko.userID        role_qs =Role.objects.filter(device_user=userID)        menu_qs = MenuModel.objects.filter(parentId=0,role__in=role_qs,menutype=1);        list = []        for menu in menu_qs:            list.append(                {                'id': menu.id,                'parentId': menu.parentId,                'path': menu.path,                'name': menu.name,                'component': menu.component,                'meta': {                        'hidden': menu.hidden,                        'levelHidden': menu.levelHidden,                        'title': menu.title,                        'icon': menu.icon,                        'isCustomSvg':menu.isCustomSvg,                        'noKeepAlive': menu.noKeepAlive,                        'noClosable':menu.noClosable,                        'badge': menu.badge,                        'tabHidden': menu.tabHidden,                        'activeMenu': menu.activeMenu,                        'dot':menu.dot,                        'dynamicNewTab': menu.dynamicNewTab,                        'sort': menu.sort                    }                }            )        menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=1)        menulist = []        for objlist in list:            menulist.append(self.menulist(menu_qs, objlist))        return response.json(0, {'list': menulist})    def menulist(self, menu_qs, objlist):        if objlist is None:            return        for menu in menu_qs:            if objlist['id'] == menu.parentId:                if 'children' not in objlist:                    objlist['children'] = []                obj = {                    'id': menu.id,                    'parentId': menu.parentId,                    'path': menu.path,                    'name': menu.name,                    'component': menu.component,                    'menutype': menu.menutype,                    'menu_code': menu.menu_code,                    'meta': {                        'hidden': menu.hidden,                        'levelHidden': menu.levelHidden,                        'title': menu.title,                        'icon': menu.icon,                        'isCustomSvg': menu.isCustomSvg,                        'noKeepAlive': menu.noKeepAlive,                        'noClosable': menu.noClosable,                        'badge': menu.badge,                        'tabHidden': menu.tabHidden,                        'activeMenu': menu.activeMenu,                        'dot': menu.dot,                        'dynamicNewTab': menu.dynamicNewTab,                        'sort': menu.sort                    }                }                objlist['children'].append(                    obj                )                self.menulist(menu_qs, obj)        return objlistclass UserManagement(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def validation(self, request_dict, request, operation):        language = request_dict.get('language', 'en')        response = ResponseObject(language, 'pc')        if operation == 'sendSysMessage':            return self.sendSysMessage(request_dict, response)        elif operation == 'getAppDataList':            return self.getAppDataList(request_dict, response)        elif operation == 'replyFeedBack':            return self.replyFeedBack(request_dict, response)        elif operation == 'sendSysMsgToUser':            return self.sendSysMsgToUser(request_dict, response)        else:            tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')            if tko.code != 0:                return response.json(tko.code)            response.lang = tko.lang            userID = tko.userID            if operation == 'getUserInfo':                return self.getUserInfo(userID, request_dict, response)            elif operation == 'AddOrEditAccount':                return self.AddOrEditAccount(userID, request_dict, response)            elif operation == 'doDelete':                return self.doDelete(request_dict, response)            elif operation == 'resetPassword':                return self.resetPassword(request_dict, response)            elif operation == 'getFeedbackList':                return self.getFeedbackList(request_dict, response)            elif operation == 'deleteFeedBack':                return self.deleteFeedBack(request_dict, response)            elif operation == 'getSysMessageList':                return self.getSysMessageList(request_dict, response)            else:                return response.json(404)    def getUserInfo(self, userID, request_dict, response):        print('request_dict: ', request_dict)        username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格        NickName = request_dict.get('NickName', '').strip()        phone = request_dict.get('phone', '').strip()        userEmail = request_dict.get('userEmail', '').strip()        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            if username or NickName or phone or userEmail:                # 条件查询                if username:                    device_user_qs = Device_User.objects.filter(username__contains=username)                if NickName:                    device_user_qs = Device_User.objects.filter(NickName__contains=NickName)                if phone:                    device_user_qs = Device_User.objects.filter(phone__contains=phone)                if userEmail:                    device_user_qs = Device_User.objects.filter(userEmail__contains=userEmail)                if not device_user_qs.exists():                    return response.json(0)                total = len(device_user_qs)                device_users = device_user_qs[(page - 1) * line:page * line]            else:                total = Device_User.objects.filter().count()                device_users = Device_User.objects.filter()[(page - 1) * line:page * line]            user_list = []            for device_user in device_users:                role = device_user.role.first()                rid = role.rid if role else 1   # 不存在角色默认分配为'Users'                user_list.append({                    'userID': device_user.userID,                    'username': device_user.username,                    'NickName': device_user.NickName,                    'role': Role.objects.get(rid=rid).roleName,                    'phone': device_user.phone,                    'userEmail': device_user.userEmail,                    'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),                    'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),                    'online': device_user.online,                })            print('user_list: ', user_list)            return response.json(0, {'list': user_list, 'total': total})        except Exception as e:            print(e)            return response.json(500, repr(e))    def AddOrEditAccount(self, userID, request_dict, response):        # 添加/编辑用户        print('request_dict: ', request_dict)        username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格        userEmail = request_dict.get('userEmail', '').strip()        roleName = request_dict.get('role', None)        password = request_dict.get('password', None)        isEdit = request_dict.get('isEdit', None)        # 校验用户名,邮箱,密码是否符合规则        dataValid = DataValid()        if not username or not dataValid.name_validate(username):            return response.json(444, {'Parameter error': 'username'})        if userEmail and not dataValid.email_validate(userEmail):            return response.json(444, {'Parameter error': 'userEmail'})        if not isEdit:  # 添加用户需要输入密码            if not password or not dataValid.password_validate(password):                return response.json(444, {'Parameter error': 'password'})        try:            if isEdit:  # 编辑用户信息                userID = request_dict.get('userID')                user_data = {                    "username": username,                    "NickName": username,                    "userEmail": userEmail,                    "password": make_password(password),                }                device_user_qs = Device_User.objects.filter(userID=userID)                device_user_qs.update(**user_data)                # 如果角色改变,修改用户角色                device_user_role = device_user_qs[0].role                user_role = device_user_role.first()                if not user_role or roleName != user_role.roleName:                    device_user_role.clear()                    role_qs = Role.objects.filter(roleName=roleName)  # 账号角色                    device_user_qs[0].role.set(role_qs)            else:   # 添加用户                # 查询邮箱是否已注册                if Device_User.objects.filter(userEmail=userEmail).exists():                    return response.json(103)                role_qs = Role.objects.filter(roleName=roleName)    # 账号角色                # 创建用户                user_data = {                    "username": username,                    "NickName": username,                    "userEmail": userEmail,                    "password": make_password(password),                    "userID": CommonService.getUserID(μs=False, setOTAID=True),                    "is_active": True,                    "user_isValid": True,                }                Device_User.objects.create(**user_data).role.set(role_qs)            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))    def doDelete(self, request_dict, response):        userID = request_dict.get('userID', '')        if not userID:            return response.json(444)        try:            Device_User.objects.filter(userID=userID).delete()            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))    def resetPassword(self, request_dict, response):        userID = request_dict.get('userID', None)        if not userID:            return response.json(444)        try:            password = '123456'            is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))            if is_update:                return response.json(0)            else:                return response.json(177)        except Exception as e:            print(e)            return response.json(500, repr(e))    def getFeedbackList(self, request_dict, response):        status = request_dict.get('status', 0)        username = request_dict.get('username', None)        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            filter_data = {}            if status or username:                if status:                    filter_data['status'] = int(status)                if username:                    filter_data['userID_id'] = ModelService.get_userID_byname(username)            feed_back_qs = FeedBackModel.objects.filter()            if filter_data:                feed_back_qs = feed_back_qs.filter(**filter_data)            total = feed_back_qs.count()            feed_backs = feed_back_qs[(page - 1) * line:page * line]. values(                'id',                'userID__username',                'userID__phone',                'userID__userEmail',                'content',                'addTime',                'status',                'type',                'app',                'app_version',                'phone_model',                'os_version',                'uid',                'appBundleId',                'score')            feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]            stat_res_qs = StatResModel.objects.filter(                feedbackmodel__id__in=feed_back_id_list).values(                'name', 'feedbackmodel__id')            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)            bucket = oss2.Bucket(                auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')            feed_back_list = []            for feed_back in feed_backs:                feed_back['img_url'] = []                for stat_res in stat_res_qs:                    if stat_res['feedbackmodel__id'] == feed_back['id']:                        obj = 'feedback/' + stat_res['name']                        img_url = bucket.sign_url('GET', obj, 3600)                        feed_back['img_url'].append(img_url)                        if not feed_back['userID__username']:                            feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[                                'userID__userEmail'] else feed_back['userID__phone']                feed_back_list.append(feed_back)            return response.json(0, {'list': feed_back_list, 'total': total})        except Exception as e:            print(e)            return response.json(500, repr(e))    def replyFeedBack(self, request_dict, response):        feedBackID = request_dict.get('feedBackID', None)        msg = request_dict.get('msg', None)        uid = request_dict.get('uid', None)        if not all([feedBackID, msg]):            return response.json(444)        try:            nowTime = int(time.time())            feed_back_qs = FeedBackModel.objects.filter(id=feedBackID)            if not feed_back_qs.exists():                return response.json(173)            with transaction.atomic():                SysMsgModel.objects.create(userID_id=feed_back_qs.first().userID_id, msg=msg, uid=uid,                                           addTime=nowTime, updTime=nowTime)   # 创建系统消息                feed_back_qs.update(status=1)   # 更新状态为已回复            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))    def sendSysMsgToUser(self, request_dict, response):        userID = request_dict.get('userID', None)        msg = request_dict.get('msg', None)        if not all([userID, msg]):            return response.json(444)        try:            nowTime = int(time.time())            SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime)            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))    def deleteFeedBack(self, request_dict, response):        feedBackID = request_dict.get('feedBackID', None)        if not feedBackID:            return response.json(444)        try:            feed_back = FeedBackModel.objects.get(id=feedBackID)            sr_id_list = feed_back.FS.values_list('id', flat=True)            StatResModel.objects.filter(id__in=sr_id_list).delete()            feed_back.delete()            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))    def getSysMessageList(self, request_dict, response):        print('request_dict: ', request_dict)        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            sys_mass_qs = SysMassModel.objects.filter()            total = sys_mass_qs.count()            sys_mass_qs = sys_mass_qs.values('id', 'sender__username', 'addTime', 'updTime', 'lang', 'recever', 'msg',                                             'platform')            sys_mass_qs = sys_mass_qs[(page - 1) * line:page * line]            return response.json(0, {'list': list(sys_mass_qs), 'total': total})        except Exception as e:            print(e)            return response.json(500, repr(e))    def getAppDataList(self, request_dict, response):        print('request_dict: ', request_dict)        platform = request_dict.get('platform', None)        if platform == 'ios':            app_type = [1]        elif platform == 'android':            app_type = [2]        else:            app_type = [1, 2]        try:            app_info_qs = App_Info.objects.filter(app_type__in=app_type).values('appBundleId', 'appName').distinct()            appBundleId_list = []            for app_info in app_info_qs:                appBundleId_list.append(app_info['appBundleId'])            return response.json(0, {'appBundleId_list': appBundleId_list})        except Exception as e:            print(e)            return response.json(500, repr(e))    def sendSysMessage(self, request_dict, response):        print('request_dict: ', request_dict)        lang = request_dict.get('lang', None)        platform = request_dict.get('platform', None)        recever = request_dict.get('app_list', None)        msg = request_dict.get('msg', None)        if not all([lang, platform, recever, msg]):            return response.json(444)        try:            with transaction.atomic():                # SysMassModel表创建群发消息记录数据                nowTime = int(time.time())                sender_id = Device_User.objects.filter(username='13800138001').values('userID').first()['userID']                SysMassModel.objects.create(                    sender_id=sender_id,                    lang=lang,                    platform=platform,                    recever=recever,                    msg=msg,                    addTime=nowTime,                    updTime=nowTime,                )                # 根据UserExModel表的userID群发消息给用户                region_list = lang.split(',')                appBundleId_list = recever.split(',')                userID_list = UserExModel.objects.filter(appBundleId__in=appBundleId_list, region__in=region_list)\                    .values_list('userID_id', flat=True)                sys_msg_list = []                for userID in userID_list:                    sys_msg_list.append(SysMsgModel(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime))                    if len(sys_msg_list) > 5000:                        SysMsgModel.objects.bulk_create(sys_msg_list)                        sys_msg_list = []                SysMsgModel.objects.bulk_create(sys_msg_list)            return response.json(0)        except Exception as e:            print(e)            return response.json(500, repr(e))
 |