UserManageController.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2018/9/11 15:08
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: UserController.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import datetime
  15. import traceback
  16. import time
  17. import logging
  18. import jwt
  19. import simplejson
  20. import simplejson as json
  21. import requests
  22. from django.contrib.auth.hashers import make_password, check_password # 对密码加密模块
  23. from django.db.models import Q
  24. from django.http import HttpResponseRedirect
  25. from django.utils.decorators import method_decorator
  26. from django.utils.timezone import utc
  27. from django.views.decorators.csrf import csrf_exempt
  28. from django.views.generic import TemplateView
  29. from jwt.algorithms import RSAAlgorithm
  30. from ratelimit.decorators import ratelimit
  31. from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN
  32. from Controller.CheckUserData import DataValid, date_handler, RandomStr
  33. from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
  34. UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, MenuModel
  35. from Object.AWS.SesClassObject import SesClassObject
  36. from Object.AliSmsObject import AliSmsObject
  37. from Object.RedisObject import RedisObject
  38. from Object.ResponseObject import ResponseObject
  39. from Object.TokenObject import TokenObject
  40. from Service.CommonService import CommonService
  41. from Service.ModelService import ModelService
  42. from Service.TemplateService import TemplateService
  43. from django.views.generic import View
  44. import base64
  45. import random
  46. from io import BytesIO
  47. from PIL import Image, ImageDraw, ImageFont
  48. from django.shortcuts import HttpResponse
  49. from Ansjer.config import BASE_DIR
  50. # 登录
  51. class LoginView(TemplateView):
  52. @method_decorator(csrf_exempt) # @csrf_exempt
  53. def dispatch(self, *args, **kwargs):
  54. return super(LoginView, self).dispatch(*args, **kwargs)
  55. def post(self, request, *args, **kwargs):
  56. request.encoding = 'utf-8'
  57. request_dict = request.POST
  58. language = request_dict.get('language', 'en')
  59. response = ResponseObject(language,'pc')
  60. return self.validates(request_dict, response)
  61. def validates(self, request_dict, response):
  62. username = request_dict.get('username', None)
  63. password = request_dict.get('password', None)
  64. if not username or not password:
  65. return response.json(111)
  66. username = username.strip()
  67. password = password.strip()
  68. data_valid = DataValid()
  69. if data_valid.email_validate(username):
  70. return self.do_email_login(username, password, response)
  71. elif data_valid.mobile_validate(username):
  72. return self.do_phone_login(username, password, response)
  73. elif data_valid.name_validate(username):
  74. return self.do_name_login(username, password, response)
  75. else:
  76. return response.json(107)
  77. def do_email_login(self, email, password, response):
  78. user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
  79. return self.valid_login(user_qs, password, response)
  80. def do_phone_login(self, phone, password, response):
  81. user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)
  82. return self.valid_login(user_qs, password, response)
  83. def do_name_login(self, username, password, response):
  84. user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
  85. is_active=True, user_isValid=True)
  86. return self.valid_login(user_qs, password, response)
  87. def valid_login(self, user_qs, password, response):
  88. if not user_qs.exists():
  89. return response.json(104)
  90. # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
  91. # 'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
  92. users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
  93. 'phone', 'password', 'userIconPath')[0]
  94. if not check_password(password, users['password']):
  95. return response.json(111)
  96. userID = users['userID']
  97. tko = TokenObject(returntpye='pc')
  98. res = tko.generate(
  99. data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})
  100. if tko.code == 0:
  101. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  102. user_qs.update(last_login=now_time, language=response.lang)
  103. res['rid'] = users['role__rid']
  104. res['roleName'] = users['role__roleName']
  105. res['permList'] = ModelService.own_permission(userID)
  106. res['userID'] = userID
  107. # 昵称,邮箱,电话,刷新,头像
  108. userIconPath = str(users['userIconPath'])
  109. if userIconPath and userIconPath.find('static/') != -1:
  110. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  111. res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  112. else:
  113. res['userIconUrl'] = ''
  114. res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
  115. res['username'] = users['username'] if users['username'] is not None else ''
  116. res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
  117. res['phone'] = users['phone'] if users['phone'] is not None else ''
  118. return response.json(0, res)
  119. else:
  120. return response.json(tko.code)
  121. # 登录
  122. class noPasslogin(TemplateView):
  123. @method_decorator(csrf_exempt) # @csrf_exempt
  124. def dispatch(self, *args, **kwargs):
  125. return super(noPasslogin, self).dispatch(*args, **kwargs)
  126. def post(self, request, *args, **kwargs):
  127. request.encoding = 'utf-8'
  128. request_dict = request.POST
  129. language = request_dict.get('language', 'en')
  130. response = ResponseObject(language,'pc')
  131. return self.validates(request_dict, response)
  132. def validates(self, request_dict, response):
  133. username = request_dict.get('username', None)
  134. if not username:
  135. return response.json(111)
  136. username = username.strip()
  137. data_valid = DataValid()
  138. if data_valid.email_validate(username):
  139. return self.do_email_login(username, response)
  140. elif data_valid.mobile_validate(username):
  141. return self.do_phone_login(username, response)
  142. elif data_valid.name_validate(username):
  143. return self.do_name_login(username, response)
  144. else:
  145. return response.json(107)
  146. def do_email_login(self, email, response):
  147. user_qs = Device_User.objects.filter(Q(username=email))
  148. return self.valid_login(user_qs, response)
  149. def do_phone_login(self, phone, response):
  150. user_qs = Device_User.objects.filter(Q(phone=phone), is_active=True, user_isValid=True)
  151. return self.valid_login(user_qs, response)
  152. def do_name_login(self, username, response):
  153. user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
  154. is_active=True, user_isValid=True)
  155. return self.valid_login(user_qs, response)
  156. def valid_login(self, user_qs, response):
  157. if not user_qs.exists():
  158. return response.json(104)
  159. # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
  160. # 'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
  161. users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
  162. 'phone', 'password', 'userIconPath')[0]
  163. userID = users['userID']
  164. tko = TokenObject(returntpye='pc')
  165. res = tko.generate(
  166. data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})
  167. if tko.code == 0:
  168. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  169. user_qs.update(last_login=now_time, language=response.lang)
  170. res['rid'] = users['role__rid']
  171. res['roleName'] = users['role__roleName']
  172. res['permList'] = ModelService.own_permission(userID)
  173. res['userID'] = userID
  174. # 昵称,邮箱,电话,刷新,头像
  175. userIconPath = str(users['userIconPath'])
  176. if userIconPath and userIconPath.find('static/') != -1:
  177. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  178. res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  179. else:
  180. res['userIconUrl'] = ''
  181. res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
  182. res['username'] = users['username'] if users['username'] is not None else ''
  183. res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
  184. res['phone'] = users['phone'] if users['phone'] is not None else ''
  185. return response.json(0, res)
  186. else:
  187. return response.json(tko.code)
  188. # 获取登录权限
  189. class GetPermissions(TemplateView):
  190. @method_decorator(csrf_exempt) # @csrf_exempt
  191. def dispatch(self, *args, **kwargs):
  192. return super(GetPermissions, self).dispatch(*args, **kwargs)
  193. def get(self, request, *args, **kwargs):
  194. token = request.META.get('HTTP_AUTHORIZATION')
  195. request.encoding = 'utf-8'
  196. request_dict = request.GET
  197. language = request_dict.get('language', 'en')
  198. response = ResponseObject(language, 'pc')
  199. return self.validates(request_dict,token, response)
  200. def validates(self, request_dict,token, response):
  201. tko = TokenObject(token,returntpye='pc')
  202. response.lang = tko.lang
  203. if tko.code != 0:
  204. return response.json(tko.code)
  205. userID = tko.userID
  206. user_qs = Device_User.objects.filter(userID=userID)
  207. if not user_qs.exists():
  208. return response.json(104)
  209. #待补充逻辑
  210. username = user_qs[0].username
  211. userIconPath = user_qs[0].userIconPath.url
  212. if userIconPath:
  213. if userIconPath.find('static/') != -1:
  214. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  215. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  216. role_qs = Role.objects.filter(device_user=userID)
  217. menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=2);
  218. perms = []
  219. for menu in menu_qs:
  220. perms.append(menu.menu_code)
  221. res={
  222. "code": 200,
  223. "msg": "success",
  224. "data": {
  225. "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
  226. "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
  227. "username": username, # 用户名,必须返回
  228. "avatar": userIconUrl,# 头像,必须返回
  229. "perms": perms
  230. }
  231. }
  232. return response.json(0, res)
  233. # 获取菜单
  234. class GetList(TemplateView):
  235. @method_decorator(csrf_exempt) # @csrf_exempt
  236. def dispatch(self, *args, **kwargs):
  237. return super(GetList, self).dispatch(*args, **kwargs)
  238. def get(self, request, *args, **kwargs):
  239. token = request.META.get('HTTP_AUTHORIZATION')
  240. request.encoding = 'utf-8'
  241. request_dict = request.GET
  242. language = request_dict.get('language', 'en')
  243. response = ResponseObject(language, 'pc')
  244. return self.validates(request_dict,token, response)
  245. def validates(self, request_dict,token, response):
  246. tko = TokenObject(token,returntpye='pc')
  247. response.lang = tko.lang
  248. if tko.code != 0:
  249. return response.json(tko.code)
  250. userID = tko.userID
  251. role_qs =Role.objects.filter(device_user=userID)
  252. menu_qs = MenuModel.objects.filter(parentId=0,role__in=role_qs,menutype=1);
  253. list = []
  254. i = 0
  255. for menu in menu_qs:
  256. list.append(
  257. {
  258. 'id': menu.id,
  259. 'parentId': menu.parentId,
  260. 'path': menu.path,
  261. 'name': menu.name,
  262. 'component': menu.component,
  263. 'meta': {
  264. 'hidden': menu.hidden,
  265. 'levelHidden': menu.levelHidden,
  266. 'title': menu.title,
  267. 'icon': menu.icon,
  268. 'isCustomSvg':menu.isCustomSvg,
  269. 'noKeepAlive': menu.noKeepAlive,
  270. 'noClosable':menu.noClosable,
  271. 'badge': menu.badge,
  272. 'tabHidden': menu.tabHidden,
  273. 'activeMenu': menu.activeMenu,
  274. 'dot':menu.dot,
  275. 'dynamicNewTab': menu.dynamicNewTab,
  276. 'sort': menu.sort
  277. }
  278. }
  279. )
  280. menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=1)
  281. menulist = self.menulist(menu_qs, list)
  282. return response.json(0, {'list':menulist})
  283. def menulist(self,menu_qs,list):
  284. for menulist in list:
  285. for menu in menu_qs:
  286. if menulist['id'] == menu.parentId:
  287. if 'children' not in menulist:
  288. menulist['children'] = []
  289. menulist['children'].append(
  290. {
  291. 'id': menu.id,
  292. 'parentId': menu.parentId,
  293. 'path': menu.path,
  294. 'name': menu.name,
  295. 'component': menu.component,
  296. 'meta': {
  297. 'hidden': menu.hidden,
  298. 'levelHidden': menu.levelHidden,
  299. 'title': menu.title,
  300. 'icon': menu.icon,
  301. 'isCustomSvg': menu.isCustomSvg,
  302. 'noKeepAlive': menu.noKeepAlive,
  303. 'noClosable': menu.noClosable,
  304. 'badge': menu.badge,
  305. 'tabHidden': menu.tabHidden,
  306. 'activeMenu': menu.activeMenu,
  307. 'dot': menu.dot,
  308. 'dynamicNewTab': menu.dynamicNewTab,
  309. 'sort': menu.sort
  310. }
  311. }
  312. )
  313. self.menulist(menu_qs,menulist['children'])
  314. return list
  315. class UserManagement(View):
  316. def get(self, request, *args, **kwargs):
  317. request.encoding = 'utf-8'
  318. operation = kwargs.get('operation')
  319. return self.validation(request.GET, request, operation)
  320. def post(self, request, *args, **kwargs):
  321. request.encoding = 'utf-8'
  322. operation = kwargs.get('operation')
  323. return self.validation(request.POST, request, operation)
  324. def validation(self, request_dict, request, operation):
  325. language = request_dict.get('language', 'en')
  326. response = ResponseObject(language, 'pc')
  327. if operation == '??':
  328. return 0
  329. else:
  330. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
  331. if tko.code != 0:
  332. return response.json(tko.code)
  333. response.lang = tko.lang
  334. userID = tko.userID
  335. if operation == 'getUserInfo':
  336. return self.getUserInfo(userID, request_dict, response)
  337. elif operation == 'AddOrEditAccount':
  338. return self.AddOrEditAccount(userID, request_dict, response)
  339. elif operation == 'doDelete':
  340. return self.doDelete(userID, request_dict, response)
  341. else:
  342. return response.json(404)
  343. def getUserInfo(self, userID, request_dict, response):
  344. print('request_dict: ', request_dict)
  345. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  346. pageNo = request_dict.get('pageNo', None)
  347. pageSize = request_dict.get('pageSize', None)
  348. if not all([pageNo, pageSize]):
  349. return response.json(444)
  350. page = int(pageNo)
  351. line = int(pageSize)
  352. try:
  353. if username: # 查询
  354. # 校验查询输入数据是否匹配用户名,手机或邮箱正则
  355. dataValid = DataValid()
  356. if not (dataValid.name_validate(username) or dataValid.mobile_validate(username) \
  357. or dataValid.email_validate(username)):
  358. return response.json(444)
  359. device_user_qs = Device_User.objects.filter(username=username)
  360. if not device_user_qs.exists():
  361. device_user_qs = Device_User.objects.filter(phone=username)
  362. if not device_user_qs.exists():
  363. device_user_qs = Device_User.objects.filter(userEmail=username)
  364. if not device_user_qs.exists():
  365. return response.json(104)
  366. else:
  367. device_user_qs = Device_User.objects.filter() # 查询全部
  368. total = len(device_user_qs)
  369. device_users = device_user_qs[(page - 1) * line:page * line]
  370. user_list = []
  371. for device_user in device_users:
  372. role = device_user.role.first()
  373. rid = role.rid if role else 1 # 不存在角色默认分配为'Users'
  374. user_list.append({
  375. 'userID': device_user.userID,
  376. 'username': device_user.username,
  377. 'NickName': device_user.NickName,
  378. 'role': Role.objects.get(rid=rid).roleName,
  379. 'phone': device_user.phone,
  380. 'userEmail': device_user.userEmail,
  381. 'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
  382. 'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
  383. 'online': device_user.online,
  384. })
  385. print('user_list: ', user_list)
  386. return response.json(0, {'list': user_list, 'total': total})
  387. except Exception as e:
  388. print(e)
  389. return response.json(500, repr(e))
  390. def AddOrEditAccount(self, userID, request_dict, response):
  391. # 添加/编辑用户
  392. print('request_dict: ', request_dict)
  393. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  394. userEmail = request_dict.get('userEmail', '').strip()
  395. roleName = request_dict.get('role', None)
  396. password = request_dict.get('password', None)
  397. isEdit = request_dict.get('isEdit', None)
  398. if not all([username, userEmail, roleName, password]):
  399. return response.json(444)
  400. # 校验用户名,邮箱,密码是否符合规则
  401. dataValid = DataValid()
  402. if not dataValid.name_validate(username) or not dataValid.email_validate(userEmail) \
  403. or not dataValid.password_validate(password):
  404. return response.json(444)
  405. try:
  406. if isEdit: # 编辑用户信息
  407. userID = request_dict.get('userID')
  408. user_data = {
  409. "username": username,
  410. "NickName": username,
  411. "userEmail": userEmail,
  412. "password": make_password(password),
  413. }
  414. device_user_qs = Device_User.objects.filter(userID=userID)
  415. device_user_qs.update(**user_data)
  416. # 如果角色改变,修改用户角色
  417. device_user_role = device_user_qs[0].role
  418. user_role = device_user_role.first()
  419. if not user_role or roleName != user_role.roleName:
  420. device_user_role.clear()
  421. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  422. device_user_qs[0].role.set(role_qs)
  423. else: # 添加用户
  424. # 查询邮箱是否已注册
  425. if Device_User.objects.filter(userEmail=userEmail).exists():
  426. return response.json(103)
  427. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  428. # 创建用户
  429. user_data = {
  430. "username": username,
  431. "NickName": username,
  432. "userEmail": userEmail,
  433. "password": make_password(password),
  434. "userID": CommonService.getUserID(μs=False, setOTAID=True),
  435. "is_active": True,
  436. "user_isValid": True,
  437. }
  438. Device_User.objects.create(**user_data).role.set(role_qs)
  439. return response.json(0)
  440. except Exception as e:
  441. print(e)
  442. return response.json(500, repr(e))
  443. def doDelete(self, userID, request_dict, response):
  444. userID = request_dict.get('userID', '')
  445. Device_User.objects.filter(userID=userID).delete()
  446. return response.json(0)