123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- #!/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
|