UserManageController.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  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 time
  16. import oss2
  17. from django.contrib.auth.hashers import make_password, check_password # 对密码加密模块
  18. from django.db import transaction
  19. from django.db.models import Q
  20. from django.utils.decorators import method_decorator
  21. from django.utils.timezone import utc
  22. from django.views.decorators.csrf import csrf_exempt
  23. from django.views.generic import TemplateView
  24. from Ansjer.config import SERVER_DOMAIN, OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
  25. from Controller.CheckUserData import DataValid
  26. from Model.models import Device_User, Role, UserExModel, CountryModel, MenuModel, FeedBackModel, StatResModel, \
  27. SysMassModel, App_Info, SysMsgModel
  28. from Object.ResponseObject import ResponseObject
  29. from Object.TokenObject import TokenObject
  30. from Service.CommonService import CommonService
  31. from Service.ModelService import ModelService
  32. from django.views.generic import View
  33. # 登录
  34. class LoginView(TemplateView):
  35. @method_decorator(csrf_exempt) # @csrf_exempt
  36. def dispatch(self, *args, **kwargs):
  37. return super(LoginView, self).dispatch(*args, **kwargs)
  38. def post(self, request, *args, **kwargs):
  39. request.encoding = 'utf-8'
  40. request_dict = request.POST
  41. language = request_dict.get('language', 'en')
  42. response = ResponseObject(language, 'pc')
  43. return self.validates(request_dict, response)
  44. def validates(self, request_dict, response):
  45. username = request_dict.get('username', None)
  46. password = request_dict.get('password', None)
  47. if not username or not password:
  48. return response.json(111)
  49. username = username.strip()
  50. password = password.strip()
  51. data_valid = DataValid()
  52. if data_valid.email_validate(username):
  53. return self.do_email_login(username, password, response)
  54. elif data_valid.mobile_validate(username):
  55. return self.do_phone_login(username, password, response)
  56. elif data_valid.name_validate(username):
  57. return self.do_name_login(username, password, response)
  58. else:
  59. return response.json(107)
  60. def do_email_login(self, email, password, response):
  61. user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
  62. return self.valid_login(user_qs, password, response)
  63. def do_phone_login(self, phone, password, response):
  64. user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)
  65. return self.valid_login(user_qs, password, response)
  66. def do_name_login(self, username, password, response):
  67. user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
  68. is_active=True, user_isValid=True)
  69. return self.valid_login(user_qs, password, response)
  70. def valid_login(self, user_qs, password, response):
  71. if not user_qs.exists():
  72. return response.json(104)
  73. # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
  74. # 'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
  75. users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
  76. 'phone', 'password', 'userIconPath')[0]
  77. if not check_password(password, users['password']):
  78. return response.json(111)
  79. userID = users['userID']
  80. tko = TokenObject(returntpye='pc')
  81. res = tko.generate(
  82. data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})
  83. if tko.code == 0:
  84. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  85. user_qs.update(last_login=now_time, language=response.lang)
  86. res['rid'] = users['role__rid']
  87. res['roleName'] = users['role__roleName']
  88. res['permList'] = ModelService.own_permission(userID)
  89. res['userID'] = userID
  90. # 昵称,邮箱,电话,刷新,头像
  91. userIconPath = str(users['userIconPath'])
  92. if userIconPath and userIconPath.find('static/') != -1:
  93. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  94. res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  95. else:
  96. res['userIconUrl'] = ''
  97. res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
  98. res['username'] = users['username'] if users['username'] is not None else ''
  99. res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
  100. res['phone'] = users['phone'] if users['phone'] is not None else ''
  101. return response.json(0, res)
  102. else:
  103. return response.json(tko.code)
  104. # 获取登录权限
  105. class GetPermissions(TemplateView):
  106. @method_decorator(csrf_exempt) # @csrf_exempt
  107. def dispatch(self, *args, **kwargs):
  108. return super(GetPermissions, self).dispatch(*args, **kwargs)
  109. def get(self, request, *args, **kwargs):
  110. token = request.META.get('HTTP_AUTHORIZATION')
  111. request.encoding = 'utf-8'
  112. request_dict = request.GET
  113. language = request_dict.get('language', 'en')
  114. response = ResponseObject(language, 'pc')
  115. return self.validates(request_dict, token, response)
  116. def validates(self, request_dict, token, response):
  117. tko = TokenObject(token, returntpye='pc')
  118. response.lang = tko.lang
  119. if tko.code != 0:
  120. return response.json(tko.code)
  121. userID = tko.userID
  122. user_qs = Device_User.objects.filter(userID=userID)
  123. if not user_qs.exists():
  124. return response.json(104)
  125. # 待补充逻辑
  126. username = user_qs[0].username
  127. userIconPath = user_qs[0].userIconPath.url
  128. if userIconPath:
  129. if userIconPath.find('static/') != -1:
  130. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  131. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  132. role_qs = Role.objects.filter(device_user=userID)
  133. menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=2);
  134. perms = []
  135. for menu in menu_qs:
  136. perms.append(menu.menu_code)
  137. res = {
  138. "code": 200,
  139. "msg": "success",
  140. "data": {
  141. "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
  142. "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
  143. "username": username, # 用户名,必须返回
  144. "avatar": userIconUrl, # 头像,必须返回
  145. "perms": perms
  146. }
  147. }
  148. return response.json(0, res)
  149. # 获取菜单
  150. class GetList(TemplateView):
  151. @method_decorator(csrf_exempt) # @csrf_exempt
  152. def dispatch(self, *args, **kwargs):
  153. return super(GetList, self).dispatch(*args, **kwargs)
  154. def get(self, request, *args, **kwargs):
  155. token = request.META.get('HTTP_AUTHORIZATION')
  156. request.encoding = 'utf-8'
  157. request_dict = request.GET
  158. language = request_dict.get('language', 'en')
  159. response = ResponseObject(language, 'pc')
  160. return self.validates(request_dict, token, response)
  161. def validates(self, request_dict, token, response):
  162. tko = TokenObject(token, returntpye='pc')
  163. response.lang = tko.lang
  164. if tko.code != 0:
  165. return response.json(tko.code)
  166. userID = tko.userID
  167. role_qs = Role.objects.filter(device_user=userID)
  168. menu_qs = MenuModel.objects.filter(parentId=0, role__in=role_qs, menutype=1);
  169. list = []
  170. for menu in menu_qs:
  171. list.append(
  172. {
  173. 'id': menu.id,
  174. 'parentId': menu.parentId,
  175. 'path': menu.path,
  176. 'name': menu.name,
  177. 'component': menu.component,
  178. 'meta': {
  179. 'hidden': menu.hidden,
  180. 'levelHidden': menu.levelHidden,
  181. 'title': menu.title,
  182. 'icon': menu.icon,
  183. 'isCustomSvg': menu.isCustomSvg,
  184. 'noKeepAlive': menu.noKeepAlive,
  185. 'noClosable': menu.noClosable,
  186. 'badge': menu.badge,
  187. 'tabHidden': menu.tabHidden,
  188. 'activeMenu': menu.activeMenu,
  189. 'dot': menu.dot,
  190. 'dynamicNewTab': menu.dynamicNewTab,
  191. 'sort': menu.sort
  192. }
  193. }
  194. )
  195. menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=1)
  196. menulist = []
  197. for objlist in list:
  198. menulist.append(self.menulist(menu_qs, objlist))
  199. return response.json(0, {'list': menulist})
  200. def menulist(self, menu_qs, objlist):
  201. if objlist is None:
  202. return
  203. for menu in menu_qs:
  204. if objlist['id'] == menu.parentId:
  205. if 'children' not in objlist:
  206. objlist['children'] = []
  207. obj = {
  208. 'id': menu.id,
  209. 'parentId': menu.parentId,
  210. 'path': menu.path,
  211. 'name': menu.name,
  212. 'component': menu.component,
  213. 'menutype': menu.menutype,
  214. 'menu_code': menu.menu_code,
  215. 'meta': {
  216. 'hidden': menu.hidden,
  217. 'levelHidden': menu.levelHidden,
  218. 'title': menu.title,
  219. 'icon': menu.icon,
  220. 'isCustomSvg': menu.isCustomSvg,
  221. 'noKeepAlive': menu.noKeepAlive,
  222. 'noClosable': menu.noClosable,
  223. 'badge': menu.badge,
  224. 'tabHidden': menu.tabHidden,
  225. 'activeMenu': menu.activeMenu,
  226. 'dot': menu.dot,
  227. 'dynamicNewTab': menu.dynamicNewTab,
  228. 'sort': menu.sort
  229. }
  230. }
  231. objlist['children'].append(
  232. obj
  233. )
  234. self.menulist(menu_qs, obj)
  235. return objlist
  236. class UserManagement(View):
  237. def get(self, request, *args, **kwargs):
  238. request.encoding = 'utf-8'
  239. operation = kwargs.get('operation')
  240. return self.validation(request.GET, request, operation)
  241. def post(self, request, *args, **kwargs):
  242. request.encoding = 'utf-8'
  243. operation = kwargs.get('operation')
  244. return self.validation(request.POST, request, operation)
  245. def validation(self, request_dict, request, operation):
  246. language = request_dict.get('language', 'en')
  247. response = ResponseObject(language, 'pc')
  248. if operation == 'sendSysMessage':
  249. return self.sendSysMessage(request_dict, response)
  250. elif operation == 'getAppDataList':
  251. return self.getAppDataList(request_dict, response)
  252. elif operation == 'replyFeedBack':
  253. return self.replyFeedBack(request_dict, response)
  254. elif operation == 'sendSysMsgToUser':
  255. return self.sendSysMsgToUser(request_dict, response)
  256. else:
  257. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
  258. if tko.code != 0:
  259. return response.json(tko.code)
  260. response.lang = tko.lang
  261. userID = tko.userID
  262. if operation == 'getUserInfo':
  263. return self.getUserInfo(userID, request_dict, response)
  264. elif operation == 'AddOrEditAccount':
  265. return self.AddOrEditAccount(userID, request_dict, response)
  266. elif operation == 'doDelete':
  267. return self.doDelete(request_dict, response)
  268. elif operation == 'resetPassword':
  269. return self.resetPassword(request_dict, response)
  270. elif operation == 'getFeedbackList':
  271. return self.getFeedbackList(request_dict, response)
  272. elif operation == 'deleteFeedBack':
  273. return self.deleteFeedBack(request_dict, response)
  274. elif operation == 'getSysMessageList':
  275. return self.getSysMessageList(request_dict, response)
  276. elif operation == 'collectFeedBack':
  277. return self.collectFeedBack(request_dict, response)
  278. elif operation == 'exportFeedBack':
  279. return self.exportFeedBack(request_dict, response)
  280. else:
  281. return response.json(404)
  282. def getUserInfo(self, userID, request_dict, response):
  283. """
  284. @param userID:用户ID
  285. @param request_dict:请求参数
  286. @param response:响应对象
  287. @param username:用户名
  288. @param NickName:用户昵称
  289. @param phone:电话号
  290. @param userEmail:用户邮箱
  291. @return:
  292. """
  293. print('request_dict: ', request_dict)
  294. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  295. NickName = request_dict.get('NickName', '').strip()
  296. phone = request_dict.get('phone', '').strip()
  297. userEmail = request_dict.get('userEmail', '').strip()
  298. pageNo = request_dict.get('pageNo', None)
  299. pageSize = request_dict.get('pageSize', None)
  300. if not all([pageNo, pageSize]):
  301. return response.json(444)
  302. page = int(pageNo)
  303. line = int(pageSize)
  304. try:
  305. if username or NickName or phone or userEmail:
  306. # 条件查询
  307. if username:
  308. device_user_qs = Device_User.objects.filter(username__icontains=username)
  309. if NickName:
  310. device_user_qs = Device_User.objects.filter(NickName__icontains=NickName)
  311. if phone:
  312. device_user_qs = Device_User.objects.filter(phone__icontains=phone)
  313. if userEmail:
  314. device_user_qs = Device_User.objects.filter(userEmail__icontains=userEmail)
  315. if not device_user_qs.exists():
  316. return response.json(0)
  317. total = len(device_user_qs)
  318. device_users = device_user_qs[(page - 1) * line:page * line]
  319. else:
  320. total = Device_User.objects.filter().count()
  321. device_users = Device_User.objects.filter()[(page - 1) * line:page * line]
  322. user_list = []
  323. for device_user in device_users:
  324. role = device_user.role.first()
  325. rid = role.rid if role else 1 # 不存在角色默认分配为'Users'
  326. user_ex_qs = UserExModel.objects.filter(userID_id=device_user.userID).values('appBundleId')
  327. app_bundle_id = user_ex_qs[0]['appBundleId'] if user_ex_qs.exists() else ''
  328. country_qs = CountryModel.objects.filter(id=device_user.region_country).values('country_name')
  329. countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
  330. user_list.append({
  331. 'userID': device_user.userID,
  332. 'username': device_user.username,
  333. 'NickName': device_user.NickName,
  334. 'role': Role.objects.get(rid=rid).roleName,
  335. 'phone': device_user.phone,
  336. 'userEmail': device_user.userEmail,
  337. 'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
  338. 'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
  339. 'appBundleId': app_bundle_id,
  340. 'countryName': countryName
  341. })
  342. print('user_list: ', user_list)
  343. return response.json(0, {'list': user_list, 'total': total})
  344. except Exception as e:
  345. print(e)
  346. return response.json(500, repr(e))
  347. def AddOrEditAccount(self, userID, request_dict, response):
  348. """
  349. 添加/编辑用户
  350. @param userID:用户ID
  351. @param request_dict:请求参数
  352. @param response:响应对象
  353. @param roleName:用户角色
  354. @param isEdit:添加用户需要输入密码
  355. @return:
  356. """
  357. print('request_dict: ', request_dict)
  358. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  359. userEmail = request_dict.get('userEmail', '').strip()
  360. roleName = request_dict.get('role', None)
  361. password = request_dict.get('password', None)
  362. isEdit = request_dict.get('isEdit', None)
  363. # 校验用户名,邮箱,密码是否符合规则
  364. dataValid = DataValid()
  365. if not username or not dataValid.name_validate(username):
  366. return response.json(444, {'Parameter error': 'username'})
  367. if userEmail and not dataValid.email_validate(userEmail):
  368. return response.json(444, {'Parameter error': 'userEmail'})
  369. if not isEdit: # 添加用户需要输入密码
  370. if not password or not dataValid.password_validate(password):
  371. return response.json(444, {'Parameter error': 'password'})
  372. try:
  373. if isEdit: # 编辑用户信息
  374. userID = request_dict.get('userID')
  375. user_data = {
  376. "username": username,
  377. "NickName": username,
  378. "userEmail": userEmail,
  379. "password": make_password(password),
  380. }
  381. device_user_qs = Device_User.objects.filter(userID=userID)
  382. device_user_qs.update(**user_data)
  383. # 如果角色改变,修改用户角色
  384. device_user_role = device_user_qs[0].role
  385. user_role = device_user_role.first()
  386. if not user_role or roleName != user_role.roleName:
  387. device_user_role.clear()
  388. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  389. device_user_qs[0].role.set(role_qs)
  390. else: # 添加用户
  391. # 查询邮箱是否已注册
  392. if Device_User.objects.filter(userEmail=userEmail).exists():
  393. return response.json(103)
  394. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  395. # 创建用户
  396. user_data = {
  397. "username": username,
  398. "NickName": username,
  399. "userEmail": userEmail,
  400. "password": make_password(password),
  401. "userID": CommonService.getUserID(μs=False, setOTAID=True),
  402. "is_active": True,
  403. "user_isValid": True,
  404. }
  405. Device_User.objects.create(**user_data).role.set(role_qs)
  406. return response.json(0)
  407. except Exception as e:
  408. print(e)
  409. return response.json(500, repr(e))
  410. def doDelete(self, request_dict, response):
  411. userID = request_dict.get('userID', '')
  412. if not userID:
  413. return response.json(444)
  414. try:
  415. Device_User.objects.filter(userID=userID).delete()
  416. return response.json(0)
  417. except Exception as e:
  418. print(e)
  419. return response.json(500, repr(e))
  420. def resetPassword(self, request_dict, response):
  421. userID = request_dict.get('userID', None)
  422. if not userID:
  423. return response.json(444)
  424. try:
  425. password = '123456'
  426. is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))
  427. if is_update:
  428. return response.json(0)
  429. else:
  430. return response.json(177)
  431. except Exception as e:
  432. print(e)
  433. return response.json(500, repr(e))
  434. def getFeedbackList(self, request_dict, response):
  435. """
  436. 用户反馈查询
  437. @param request_dict:请求参数
  438. @param response:响应对象
  439. @param status:回复状态
  440. @param collectStatus:收藏状态1
  441. @return:
  442. """
  443. status = request_dict.get('status', 0)
  444. username = request_dict.get('username', None)
  445. collectStatus = request_dict.get('collectStatus', None)
  446. pageNo = request_dict.get('pageNo', None)
  447. pageSize = request_dict.get('pageSize', None)
  448. if not all([pageNo, pageSize]):
  449. return response.json(444)
  450. page = int(pageNo)
  451. line = int(pageSize)
  452. try:
  453. filter_data = {}
  454. if status or username or collectStatus:
  455. if status:
  456. filter_data['status'] = int(status)
  457. if username:
  458. filter_data['userID_id'] = ModelService.get_userID_byname(username)
  459. if collectStatus:
  460. filter_data['collect_status'] = int(collectStatus)
  461. feed_back_qs = FeedBackModel.objects.filter()
  462. if filter_data:
  463. feed_back_qs = feed_back_qs.filter(**filter_data).values()
  464. total = feed_back_qs.count()
  465. feed_backs = feed_back_qs.values(
  466. 'id',
  467. 'userID__username',
  468. 'userID__phone',
  469. 'userID__userEmail',
  470. 'content',
  471. 'addTime',
  472. 'status',
  473. 'type',
  474. 'app',
  475. 'app_version',
  476. 'phone_model',
  477. 'os_version',
  478. 'uid',
  479. 'appBundleId',
  480. 'score',
  481. 'collect_status'
  482. )
  483. feed_backs = feed_backs[(page - 1) * line: page * line]
  484. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  485. stat_res_qs = StatResModel.objects.filter(
  486. feedbackmodel__id__in=feed_back_id_list).values(
  487. 'name', 'feedbackmodel__id')
  488. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  489. bucket = oss2.Bucket(
  490. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  491. feed_back_list = []
  492. for feed_back in feed_backs:
  493. feed_back['img_url'] = []
  494. for stat_res in stat_res_qs:
  495. if stat_res['feedbackmodel__id'] == feed_back['id']:
  496. obj = 'feedback/' + stat_res['name']
  497. img_url = bucket.sign_url('GET', obj, 3600)
  498. feed_back['img_url'].append(img_url)
  499. if not feed_back['userID__username']:
  500. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  501. 'userID__userEmail'] else feed_back['userID__phone']
  502. feed_back_list.append(feed_back)
  503. return response.json(0, {'list': feed_back_list, 'total': total})
  504. except Exception as e:
  505. print(e)
  506. return response.json(500, repr(e))
  507. def replyFeedBack(self, request_dict, response):
  508. feedBackID = request_dict.get('feedBackID', None)
  509. msg = request_dict.get('msg', None)
  510. uid = request_dict.get('uid', None)
  511. if not all([feedBackID, msg]):
  512. return response.json(444)
  513. try:
  514. nowTime = int(time.time())
  515. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID)
  516. if not feed_back_qs.exists():
  517. return response.json(173)
  518. with transaction.atomic():
  519. SysMsgModel.objects.create(userID_id=feed_back_qs.first().userID_id, msg=msg, uid=uid,
  520. addTime=nowTime, updTime=nowTime) # 创建系统消息
  521. feed_back_qs.update(status=1) # 更新状态为已回复
  522. return response.json(0)
  523. except Exception as e:
  524. print(e)
  525. return response.json(500, repr(e))
  526. def sendSysMsgToUser(self, request_dict, response):
  527. """
  528. 发送系统消息至用户
  529. @param request_dict:请求参数
  530. @param response:响应对象
  531. @param userID:用户ID
  532. @param msg:发送内容
  533. @return:
  534. """
  535. userID = request_dict.get('userID', None)
  536. msg = request_dict.get('msg', None)
  537. if not all([userID, msg]):
  538. return response.json(444)
  539. try:
  540. nowTime = int(time.time())
  541. SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime)
  542. return response.json(0)
  543. except Exception as e:
  544. print(e)
  545. return response.json(500, repr(e))
  546. def deleteFeedBack(self, request_dict, response):
  547. feedBackID = request_dict.get('feedBackID', None)
  548. if not feedBackID:
  549. return response.json(444)
  550. try:
  551. feed_back = FeedBackModel.objects.get(id=feedBackID)
  552. sr_id_list = feed_back.FS.values_list('id', flat=True)
  553. StatResModel.objects.filter(id__in=sr_id_list).delete()
  554. feed_back.delete()
  555. return response.json(0)
  556. except Exception as e:
  557. print(e)
  558. return response.json(500, repr(e))
  559. def getSysMessageList(self, request_dict, response):
  560. # 功能群发查询
  561. print('request_dict: ', request_dict)
  562. pageNo = request_dict.get('pageNo', None)
  563. pageSize = request_dict.get('pageSize', None)
  564. if not all([pageNo, pageSize]):
  565. return response.json(444)
  566. page = int(pageNo)
  567. line = int(pageSize)
  568. try:
  569. sys_mass_qs = SysMassModel.objects.filter()
  570. total = sys_mass_qs.count()
  571. sys_mass_qs = sys_mass_qs.values('id', 'sender__username', 'addTime', 'updTime', 'lang', 'recever', 'msg',
  572. 'platform')
  573. sys_mass_qs = sys_mass_qs[(page - 1) * line:page * line]
  574. return response.json(0, {'list': list(sys_mass_qs), 'total': total})
  575. except Exception as e:
  576. print(e)
  577. return response.json(500, repr(e))
  578. def getAppDataList(self, request_dict, response):
  579. print('request_dict: ', request_dict)
  580. platform = request_dict.get('platform', None)
  581. if platform == 'ios':
  582. app_type = [1]
  583. elif platform == 'android':
  584. app_type = [2]
  585. else:
  586. app_type = [1, 2]
  587. try:
  588. app_info_qs = App_Info.objects.filter(app_type__in=app_type).values('appBundleId', 'appName').distinct()
  589. appBundleId_list = []
  590. for app_info in app_info_qs:
  591. appBundleId_list.append(app_info['appBundleId'])
  592. return response.json(0, {'appBundleId_list': appBundleId_list})
  593. except Exception as e:
  594. print(e)
  595. return response.json(500, repr(e))
  596. def sendSysMessage(self, request_dict, response):
  597. print('request_dict: ', request_dict)
  598. lang = request_dict.get('lang', None)
  599. platform = request_dict.get('platform', None)
  600. recever = request_dict.get('app_list', None)
  601. msg = request_dict.get('msg', None)
  602. if not all([lang, platform, recever, msg]):
  603. return response.json(444)
  604. try:
  605. with transaction.atomic():
  606. # SysMassModel表创建群发消息记录数据
  607. nowTime = int(time.time())
  608. sender_id = Device_User.objects.filter(username='13800138001').values('userID').first()['userID']
  609. SysMassModel.objects.create(
  610. sender_id=sender_id,
  611. lang=lang,
  612. platform=platform,
  613. recever=recever,
  614. msg=msg,
  615. addTime=nowTime,
  616. updTime=nowTime,
  617. )
  618. # 根据UserExModel表的userID群发消息给用户
  619. region_list = lang.split(',')
  620. appBundleId_list = recever.split(',')
  621. userID_list = UserExModel.objects.filter(appBundleId__in=appBundleId_list, region__in=region_list) \
  622. .values_list('userID_id', flat=True)
  623. sys_msg_list = []
  624. for userID in userID_list:
  625. sys_msg_list.append(SysMsgModel(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime))
  626. if len(sys_msg_list) > 5000:
  627. SysMsgModel.objects.bulk_create(sys_msg_list)
  628. sys_msg_list = []
  629. SysMsgModel.objects.bulk_create(sys_msg_list)
  630. return response.json(0)
  631. except Exception as e:
  632. print(e)
  633. return response.json(500, repr(e))
  634. def collectFeedBack(self, request_dict, response):
  635. """收藏或取消收藏用户反馈信息"""
  636. feedBackID = request_dict.get('feedBackID', None)
  637. collect_status = request_dict.get('collectStatus', None)
  638. if not all([feedBackID, collect_status]):
  639. return response.json(444)
  640. feedBackID = int(feedBackID)
  641. collect_status = int(collect_status)
  642. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID, collect_status=collect_status)
  643. if feed_back_qs.exists(): # 判断是否已收藏
  644. feed_qs = feed_back_qs.first()
  645. feed_qs.collect_status = 0
  646. feed_qs.save()
  647. else:
  648. FeedBackModel.objects.filter(id=feedBackID).update(collect_status=collect_status)
  649. return response.json(0)
  650. def exportFeedBack(self, request_dict, response):
  651. status = request_dict.get('status', None)
  652. collectStatus = request_dict.get('collectStatus', None)
  653. try:
  654. with transaction.atomic():
  655. filter_data = {}
  656. if status or collectStatus:
  657. if status:
  658. filter_data['status'] = int(status)
  659. if collectStatus:
  660. filter_data['collect_status'] = int(collectStatus)
  661. feed_back_qs = FeedBackModel.objects.filter()
  662. if filter_data:
  663. feed_back_qs = feed_back_qs.filter(**filter_data)
  664. feed_backs = feed_back_qs.values(
  665. 'id',
  666. 'userID__username',
  667. 'userID__phone',
  668. 'userID__userEmail',
  669. 'content',
  670. 'addTime',
  671. 'status',
  672. 'type',
  673. 'app',
  674. 'app_version',
  675. 'phone_model',
  676. 'os_version',
  677. 'uid',
  678. 'appBundleId',
  679. 'score',
  680. 'collect_status'
  681. )
  682. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  683. stat_res_qs = StatResModel.objects.filter(
  684. feedbackmodel__id__in=feed_back_id_list).values(
  685. 'name', 'feedbackmodel__id')
  686. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  687. bucket = oss2.Bucket(
  688. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  689. feed_back_list = []
  690. for feed_back in feed_backs:
  691. feed_back['img_url'] = []
  692. for stat_res in stat_res_qs:
  693. if stat_res['feedbackmodel__id'] == feed_back['id']:
  694. obj = 'feedback/' + stat_res['name']
  695. img_url = bucket.sign_url('GET', obj, 3600)
  696. feed_back['img_url'].append(img_url)
  697. if not feed_back['userID__username']:
  698. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  699. 'userID__userEmail'] else feed_back['userID__phone']
  700. feed_back_list.append(feed_back)
  701. return response.json(0, {'list': feed_back_list})
  702. except Exception as e:
  703. print(e)