|
@@ -0,0 +1,257 @@
|
|
|
+#!/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 datetime
|
|
|
+import traceback
|
|
|
+import time
|
|
|
+import logging
|
|
|
+import jwt
|
|
|
+import simplejson
|
|
|
+import simplejson as json
|
|
|
+import requests
|
|
|
+from django.contrib.auth.hashers import make_password, check_password # 对密码加密模块
|
|
|
+from django.db.models import Q
|
|
|
+from django.http import HttpResponseRedirect
|
|
|
+from django.utils.decorators import method_decorator
|
|
|
+from django.utils.timezone import utc
|
|
|
+from django.views.decorators.csrf import csrf_exempt
|
|
|
+from django.views.generic import TemplateView
|
|
|
+from jwt.algorithms import RSAAlgorithm
|
|
|
+from ratelimit.decorators import ratelimit
|
|
|
+
|
|
|
+from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN
|
|
|
+from Controller.CheckUserData import DataValid, date_handler, RandomStr
|
|
|
+from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
|
|
|
+ UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, MenuModel
|
|
|
+from Object.AWS.SesClassObject import SesClassObject
|
|
|
+from Object.AliSmsObject import AliSmsObject
|
|
|
+from Object.RedisObject import RedisObject
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Service.CommonService import CommonService
|
|
|
+from Service.ModelService import ModelService
|
|
|
+from Service.TemplateService import TemplateService
|
|
|
+from django.views.generic import View
|
|
|
+import base64
|
|
|
+import random
|
|
|
+from io import BytesIO
|
|
|
+from PIL import Image, ImageDraw, ImageFont
|
|
|
+from django.shortcuts import HttpResponse
|
|
|
+from 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
|
|
|
+ #待补充逻辑
|
|
|
+ res={
|
|
|
+ "code": 200,
|
|
|
+ "msg": "success",
|
|
|
+ "data": {
|
|
|
+ "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
|
|
|
+ "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
|
|
|
+ "username": "admin", # 用户名,必须返回
|
|
|
+ "avatar": "https://i.gtimg.cn/club/item/face/img/8/15918_100.gif" # 头像,必须返回
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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
|
|
|
+ #待补充逻辑
|
|
|
+ menu_qs = MenuModel.objects.filter(parentId=0);
|
|
|
+ list = []
|
|
|
+ i = 0
|
|
|
+ for menu in menu_qs:
|
|
|
+ list.append(
|
|
|
+ {
|
|
|
+ 'id': menu.id,
|
|
|
+ '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.all()
|
|
|
+ menulist = self.menulist(menu_qs, list)
|
|
|
+
|
|
|
+ return response.json(0, {'list':menulist})
|
|
|
+
|
|
|
+ def menulist(self,menu_qs,list):
|
|
|
+ for menulist in list:
|
|
|
+ for menu in menu_qs:
|
|
|
+ if menulist['id'] == menu.parentId:
|
|
|
+ if 'children' not in menulist:
|
|
|
+ menulist['children'] = []
|
|
|
+ menulist['children'].append(
|
|
|
+ {
|
|
|
+ 'id': menu.id,
|
|
|
+ 'path': menu.path,
|
|
|
+ 'name': menu.name,
|
|
|
+ 'component': menu.component,
|
|
|
+ 'meta': {
|
|
|
+ 'hidden': CommonService.decode_data(menu.hidden),
|
|
|
+ 'levelHidden': CommonService.decode_data(menu.levelHidden),
|
|
|
+ 'title': menu.title,
|
|
|
+ 'icon': menu.icon,
|
|
|
+ 'isCustomSvg': CommonService.decode_data(menu.isCustomSvg),
|
|
|
+ 'noKeepAlive': CommonService.decode_data(menu.noKeepAlive),
|
|
|
+ 'noClosable': CommonService.decode_data(menu.noClosable),
|
|
|
+ 'badge': menu.badge,
|
|
|
+ 'tabHidden': CommonService.decode_data(menu.tabHidden),
|
|
|
+ 'activeMenu': menu.activeMenu,
|
|
|
+ 'dot': CommonService.decode_data(menu.dot),
|
|
|
+ 'dynamicNewTab': menu.dynamicNewTab,
|
|
|
+ 'sort': menu.sort
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ self.menulist(menu_qs,menulist['children'])
|
|
|
+
|
|
|
+ return list
|