UserManageController.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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. print('request_dict: ', request_dict)
  284. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  285. NickName = request_dict.get('NickName', '').strip()
  286. phone = request_dict.get('phone', '').strip()
  287. userEmail = request_dict.get('userEmail', '').strip()
  288. pageNo = request_dict.get('pageNo', None)
  289. pageSize = request_dict.get('pageSize', None)
  290. if not all([pageNo, pageSize]):
  291. return response.json(444)
  292. page = int(pageNo)
  293. line = int(pageSize)
  294. try:
  295. if username or NickName or phone or userEmail:
  296. # 条件查询
  297. if username:
  298. device_user_qs = Device_User.objects.filter(username__icontains=username)
  299. if NickName:
  300. device_user_qs = Device_User.objects.filter(NickName__icontains=NickName)
  301. if phone:
  302. device_user_qs = Device_User.objects.filter(phone__icontains=phone)
  303. if userEmail:
  304. device_user_qs = Device_User.objects.filter(userEmail__icontains=userEmail)
  305. if not device_user_qs.exists():
  306. return response.json(0)
  307. total = len(device_user_qs)
  308. device_users = device_user_qs[(page - 1) * line:page * line]
  309. else:
  310. total = Device_User.objects.filter().count()
  311. device_users = Device_User.objects.filter()[(page - 1) * line:page * line]
  312. user_list = []
  313. for device_user in device_users:
  314. role = device_user.role.first()
  315. rid = role.rid if role else 1 # 不存在角色默认分配为'Users'
  316. user_ex_qs = UserExModel.objects.filter(userID_id=device_user.userID).values('appBundleId')
  317. app_bundle_id = user_ex_qs[0]['appBundleId'] if user_ex_qs.exists() else ''
  318. country_qs = CountryModel.objects.filter(id=device_user.region_country).values('country_name')
  319. countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
  320. user_list.append({
  321. 'userID': device_user.userID,
  322. 'username': device_user.username,
  323. 'NickName': device_user.NickName,
  324. 'role': Role.objects.get(rid=rid).roleName,
  325. 'phone': device_user.phone,
  326. 'userEmail': device_user.userEmail,
  327. 'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
  328. 'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
  329. 'appBundleId': app_bundle_id,
  330. 'countryName': countryName
  331. })
  332. print('user_list: ', user_list)
  333. return response.json(0, {'list': user_list, 'total': total})
  334. except Exception as e:
  335. print(e)
  336. return response.json(500, repr(e))
  337. def AddOrEditAccount(self, userID, request_dict, response):
  338. # 添加/编辑用户
  339. print('request_dict: ', request_dict)
  340. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  341. userEmail = request_dict.get('userEmail', '').strip()
  342. roleName = request_dict.get('role', None)
  343. password = request_dict.get('password', None)
  344. isEdit = request_dict.get('isEdit', None)
  345. # 校验用户名,邮箱,密码是否符合规则
  346. dataValid = DataValid()
  347. if not username or not dataValid.name_validate(username):
  348. return response.json(444, {'Parameter error': 'username'})
  349. if userEmail and not dataValid.email_validate(userEmail):
  350. return response.json(444, {'Parameter error': 'userEmail'})
  351. if not isEdit: # 添加用户需要输入密码
  352. if not password or not dataValid.password_validate(password):
  353. return response.json(444, {'Parameter error': 'password'})
  354. try:
  355. if isEdit: # 编辑用户信息
  356. userID = request_dict.get('userID')
  357. user_data = {
  358. "username": username,
  359. "NickName": username,
  360. "userEmail": userEmail,
  361. "password": make_password(password),
  362. }
  363. device_user_qs = Device_User.objects.filter(userID=userID)
  364. device_user_qs.update(**user_data)
  365. # 如果角色改变,修改用户角色
  366. device_user_role = device_user_qs[0].role
  367. user_role = device_user_role.first()
  368. if not user_role or roleName != user_role.roleName:
  369. device_user_role.clear()
  370. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  371. device_user_qs[0].role.set(role_qs)
  372. else: # 添加用户
  373. # 查询邮箱是否已注册
  374. if Device_User.objects.filter(userEmail=userEmail).exists():
  375. return response.json(103)
  376. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  377. # 创建用户
  378. user_data = {
  379. "username": username,
  380. "NickName": username,
  381. "userEmail": userEmail,
  382. "password": make_password(password),
  383. "userID": CommonService.getUserID(μs=False, setOTAID=True),
  384. "is_active": True,
  385. "user_isValid": True,
  386. }
  387. Device_User.objects.create(**user_data).role.set(role_qs)
  388. return response.json(0)
  389. except Exception as e:
  390. print(e)
  391. return response.json(500, repr(e))
  392. def doDelete(self, request_dict, response):
  393. userID = request_dict.get('userID', '')
  394. if not userID:
  395. return response.json(444)
  396. try:
  397. Device_User.objects.filter(userID=userID).delete()
  398. return response.json(0)
  399. except Exception as e:
  400. print(e)
  401. return response.json(500, repr(e))
  402. def resetPassword(self, request_dict, response):
  403. userID = request_dict.get('userID', None)
  404. if not userID:
  405. return response.json(444)
  406. try:
  407. password = '123456'
  408. is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))
  409. if is_update:
  410. return response.json(0)
  411. else:
  412. return response.json(177)
  413. except Exception as e:
  414. print(e)
  415. return response.json(500, repr(e))
  416. def getFeedbackList(self, request_dict, response):
  417. status = request_dict.get('status', 0)
  418. username = request_dict.get('username', None)
  419. collectStatus = request_dict.get('collectStatus', None)
  420. pageNo = request_dict.get('pageNo', None)
  421. pageSize = request_dict.get('pageSize', None)
  422. if not all([pageNo, pageSize]):
  423. return response.json(444)
  424. page = int(pageNo)
  425. line = int(pageSize)
  426. try:
  427. filter_data = {}
  428. if status or username or collectStatus:
  429. if status:
  430. filter_data['status'] = int(status)
  431. if username:
  432. filter_data['userID_id'] = ModelService.get_userID_byname(username)
  433. if collectStatus:
  434. filter_data['collect_status'] = int(collectStatus)
  435. feed_back_qs = FeedBackModel.objects.filter()
  436. if filter_data:
  437. feed_back_qs = feed_back_qs.filter(**filter_data).values()
  438. total = feed_back_qs.count()
  439. feed_backs = feed_back_qs.values(
  440. 'id',
  441. 'userID__username',
  442. 'userID__phone',
  443. 'userID__userEmail',
  444. 'content',
  445. 'addTime',
  446. 'status',
  447. 'type',
  448. 'app',
  449. 'app_version',
  450. 'phone_model',
  451. 'os_version',
  452. 'uid',
  453. 'appBundleId',
  454. 'score',
  455. 'collect_status'
  456. )
  457. feed_backs = feed_backs[(page - 1) * line: page * line]
  458. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  459. stat_res_qs = StatResModel.objects.filter(
  460. feedbackmodel__id__in=feed_back_id_list).values(
  461. 'name', 'feedbackmodel__id')
  462. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  463. bucket = oss2.Bucket(
  464. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  465. feed_back_list = []
  466. for feed_back in feed_backs:
  467. feed_back['img_url'] = []
  468. for stat_res in stat_res_qs:
  469. if stat_res['feedbackmodel__id'] == feed_back['id']:
  470. obj = 'feedback/' + stat_res['name']
  471. img_url = bucket.sign_url('GET', obj, 3600)
  472. feed_back['img_url'].append(img_url)
  473. if not feed_back['userID__username']:
  474. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  475. 'userID__userEmail'] else feed_back['userID__phone']
  476. feed_back_list.append(feed_back)
  477. return response.json(0, {'list': feed_back_list, 'total': total})
  478. except Exception as e:
  479. print(e)
  480. return response.json(500, repr(e))
  481. def replyFeedBack(self, request_dict, response):
  482. feedBackID = request_dict.get('feedBackID', None)
  483. msg = request_dict.get('msg', None)
  484. uid = request_dict.get('uid', None)
  485. if not all([feedBackID, msg]):
  486. return response.json(444)
  487. try:
  488. nowTime = int(time.time())
  489. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID)
  490. if not feed_back_qs.exists():
  491. return response.json(173)
  492. with transaction.atomic():
  493. SysMsgModel.objects.create(userID_id=feed_back_qs.first().userID_id, msg=msg, uid=uid,
  494. addTime=nowTime, updTime=nowTime) # 创建系统消息
  495. feed_back_qs.update(status=1) # 更新状态为已回复
  496. return response.json(0)
  497. except Exception as e:
  498. print(e)
  499. return response.json(500, repr(e))
  500. def sendSysMsgToUser(self, request_dict, response):
  501. userID = request_dict.get('userID', None)
  502. msg = request_dict.get('msg', None)
  503. if not all([userID, msg]):
  504. return response.json(444)
  505. try:
  506. nowTime = int(time.time())
  507. SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime)
  508. return response.json(0)
  509. except Exception as e:
  510. print(e)
  511. return response.json(500, repr(e))
  512. def deleteFeedBack(self, request_dict, response):
  513. feedBackID = request_dict.get('feedBackID', None)
  514. if not feedBackID:
  515. return response.json(444)
  516. try:
  517. feed_back = FeedBackModel.objects.get(id=feedBackID)
  518. sr_id_list = feed_back.FS.values_list('id', flat=True)
  519. StatResModel.objects.filter(id__in=sr_id_list).delete()
  520. feed_back.delete()
  521. return response.json(0)
  522. except Exception as e:
  523. print(e)
  524. return response.json(500, repr(e))
  525. def getSysMessageList(self, request_dict, response):
  526. print('request_dict: ', request_dict)
  527. pageNo = request_dict.get('pageNo', None)
  528. pageSize = request_dict.get('pageSize', None)
  529. if not all([pageNo, pageSize]):
  530. return response.json(444)
  531. page = int(pageNo)
  532. line = int(pageSize)
  533. try:
  534. sys_mass_qs = SysMassModel.objects.filter()
  535. total = sys_mass_qs.count()
  536. sys_mass_qs = sys_mass_qs.values('id', 'sender__username', 'addTime', 'updTime', 'lang', 'recever', 'msg',
  537. 'platform')
  538. sys_mass_qs = sys_mass_qs[(page - 1) * line:page * line]
  539. return response.json(0, {'list': list(sys_mass_qs), 'total': total})
  540. except Exception as e:
  541. print(e)
  542. return response.json(500, repr(e))
  543. def getAppDataList(self, request_dict, response):
  544. print('request_dict: ', request_dict)
  545. platform = request_dict.get('platform', None)
  546. if platform == 'ios':
  547. app_type = [1]
  548. elif platform == 'android':
  549. app_type = [2]
  550. else:
  551. app_type = [1, 2]
  552. try:
  553. app_info_qs = App_Info.objects.filter(app_type__in=app_type).values('appBundleId', 'appName').distinct()
  554. appBundleId_list = []
  555. for app_info in app_info_qs:
  556. appBundleId_list.append(app_info['appBundleId'])
  557. return response.json(0, {'appBundleId_list': appBundleId_list})
  558. except Exception as e:
  559. print(e)
  560. return response.json(500, repr(e))
  561. def sendSysMessage(self, request_dict, response):
  562. print('request_dict: ', request_dict)
  563. lang = request_dict.get('lang', None)
  564. platform = request_dict.get('platform', None)
  565. recever = request_dict.get('app_list', None)
  566. msg = request_dict.get('msg', None)
  567. if not all([lang, platform, recever, msg]):
  568. return response.json(444)
  569. try:
  570. with transaction.atomic():
  571. # SysMassModel表创建群发消息记录数据
  572. nowTime = int(time.time())
  573. sender_id = Device_User.objects.filter(username='13800138001').values('userID').first()['userID']
  574. SysMassModel.objects.create(
  575. sender_id=sender_id,
  576. lang=lang,
  577. platform=platform,
  578. recever=recever,
  579. msg=msg,
  580. addTime=nowTime,
  581. updTime=nowTime,
  582. )
  583. # 根据UserExModel表的userID群发消息给用户
  584. region_list = lang.split(',')
  585. appBundleId_list = recever.split(',')
  586. userID_list = UserExModel.objects.filter(appBundleId__in=appBundleId_list, region__in=region_list) \
  587. .values_list('userID_id', flat=True)
  588. sys_msg_list = []
  589. for userID in userID_list:
  590. sys_msg_list.append(SysMsgModel(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime))
  591. if len(sys_msg_list) > 5000:
  592. SysMsgModel.objects.bulk_create(sys_msg_list)
  593. sys_msg_list = []
  594. SysMsgModel.objects.bulk_create(sys_msg_list)
  595. return response.json(0)
  596. except Exception as e:
  597. print(e)
  598. return response.json(500, repr(e))
  599. def collectFeedBack(self, request_dict, response):
  600. """收藏或取消收藏用户反馈信息"""
  601. feedBackID = request_dict.get('feedBackID', None)
  602. collect_status = request_dict.get('collectStatus', None)
  603. if not all([feedBackID, collect_status]):
  604. return response.json(444)
  605. feedBackID = int(feedBackID)
  606. collect_status = int(collect_status)
  607. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID, collect_status=collect_status)
  608. if feed_back_qs.exists(): # 判断是否已收藏
  609. feed_qs = feed_back_qs.first()
  610. feed_qs.collect_status = 0
  611. feed_qs.save()
  612. else:
  613. FeedBackModel.objects.filter(id=feedBackID).update(collect_status=collect_status)
  614. return response.json(0)
  615. def exportFeedBack(self, request_dict, response):
  616. status = request_dict.get('status', None)
  617. collectStatus = request_dict.get('collectStatus', None)
  618. try:
  619. with transaction.atomic():
  620. filter_data = {}
  621. if status or collectStatus:
  622. if status:
  623. filter_data['status'] = int(status)
  624. if collectStatus:
  625. filter_data['collect_status'] = int(collectStatus)
  626. feed_back_qs = FeedBackModel.objects.filter()
  627. if filter_data:
  628. feed_back_qs = feed_back_qs.filter(**filter_data)
  629. feed_backs = feed_back_qs.values(
  630. 'id',
  631. 'userID__username',
  632. 'userID__phone',
  633. 'userID__userEmail',
  634. 'content',
  635. 'addTime',
  636. 'status',
  637. 'type',
  638. 'app',
  639. 'app_version',
  640. 'phone_model',
  641. 'os_version',
  642. 'uid',
  643. 'appBundleId',
  644. 'score',
  645. 'collect_status'
  646. )
  647. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  648. stat_res_qs = StatResModel.objects.filter(
  649. feedbackmodel__id__in=feed_back_id_list).values(
  650. 'name', 'feedbackmodel__id')
  651. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  652. bucket = oss2.Bucket(
  653. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  654. feed_back_list = []
  655. for feed_back in feed_backs:
  656. feed_back['img_url'] = []
  657. for stat_res in stat_res_qs:
  658. if stat_res['feedbackmodel__id'] == feed_back['id']:
  659. obj = 'feedback/' + stat_res['name']
  660. img_url = bucket.sign_url('GET', obj, 3600)
  661. feed_back['img_url'].append(img_url)
  662. if not feed_back['userID__username']:
  663. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  664. 'userID__userEmail'] else feed_back['userID__phone']
  665. feed_back_list.append(feed_back)
  666. return response.json(0, {'list': feed_back_list})
  667. except Exception as e:
  668. print(e)