FAQController.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import os
  5. import shutil
  6. import time
  7. import traceback
  8. from django.http import HttpResponse
  9. from django.utils.decorators import method_decorator
  10. from django.views.decorators.csrf import csrf_exempt
  11. from django.views.generic.base import View
  12. from Ansjer.config import BASE_DIR, SERVER_TYPE
  13. from Ansjer.config_formal import SERVER_DOMAIN
  14. from Ansjer.config_test import SERVER_DOMAIN
  15. from Model.models import FAQModel
  16. from Object.RedisObject import RedisObject
  17. from Object.ResponseObject import ResponseObject
  18. from Object.TokenObject import TokenObject
  19. from var_dump import var_dump
  20. from Service.ModelService import ModelService
  21. class FAQUploadView(View):
  22. @method_decorator(csrf_exempt)
  23. def dispatch(self, request, *args, **kwargs):
  24. return super(FAQUploadView, self).dispatch(request, *args, **kwargs)
  25. def get(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. request_dict = request.GET
  28. fileName = request.FILES.get('fileName', None)
  29. return self.validate(fileName, request_dict)
  30. def post(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. request_dict = request.POST
  33. fileName = request.FILES.get('fileName', None)
  34. return self.validate(fileName, request_dict)
  35. def validate(self, fileName, request_dict):
  36. token = TokenObject(request_dict.get('token', None))
  37. response = ResponseObject()
  38. if token.code != 0:
  39. return response.json(token.code)
  40. own_permission = ModelService.check_perm(userID=token.userID, permID=120)
  41. if own_permission is not True:
  42. return response.json(404)
  43. try:
  44. redisObject = RedisObject()
  45. path = '/'.join((BASE_DIR, 'static/FAQImages/tmp')).replace('\\', '/') + '/'
  46. # path = '/'.join((BASE_DIR, 'static/{user}/FAQImages'.format(user=token.userID))).replace('\\', '/') + '/'
  47. if not os.path.exists(path):
  48. os.makedirs(path)
  49. # 先从redis中取出token对应的图片信息
  50. images = redisObject.get_data(key=token.token)
  51. if images is not False:
  52. images = json.loads(images)
  53. # 判断此次编辑是否已经存在对应的图片
  54. if images.__contains__(str(fileName)):
  55. file_name = images[str(fileName)]
  56. index = file_name.find('static/')
  57. filePath = file_name[index:]
  58. filePath = SERVER_DOMAIN + 'faq/image/' + filePath
  59. # filePath = "http://192.168.136.35:8000/" + 'faq/image/' + filePath
  60. return response.json(0, {'filePath': filePath})
  61. # redis中没有对应的图片信息
  62. tmp_name = str(fileName)
  63. suffix = tmp_name[tmp_name.find('.'):]
  64. tmp_file_name = int(time.time())
  65. tmp_file_name = '{file_name}{suffix}'.format(file_name=tmp_file_name, suffix=suffix)
  66. file_name = path + str(tmp_file_name)
  67. if os.path.exists(file_name):
  68. os.remove(file_name)
  69. destination = open(file_name, 'wb+')
  70. for chunk in fileName.chunks():
  71. destination.write(chunk)
  72. destination.close()
  73. # 把图片信息保存到redis中
  74. images = redisObject.get_data(token.token)
  75. if images is False:
  76. images = json.dumps({})
  77. images = json.loads(images)
  78. images[tmp_name] = file_name
  79. redisObject.set_data(key=token.token, val=json.dumps(images), expire=3600)
  80. except Exception as e:
  81. errorInfo = traceback.format_exc()
  82. print('上传文件错误: %s' % errorInfo)
  83. return response.json(700, {'details': repr(e)})
  84. else:
  85. index = file_name.find('static/')
  86. filePath = file_name[index:]
  87. filePath = SERVER_DOMAIN + 'faq/image/' + filePath
  88. # filePath = "http://192.168.136.35:8000/" + 'faq/image/' + filePath
  89. return response.json(0, {'filePath': filePath})
  90. class getFAQImage(View):
  91. def post(self, request, *args, **kwargs):
  92. request.encoding = 'utf-8'
  93. filePath = kwargs.get('filePath', None)
  94. filePath.encode(encoding='utf-8', errors='strict')
  95. response = ResponseObject()
  96. return self.getFile(filePath, response)
  97. def get(self, request, *args, **kwargs):
  98. request.encoding = 'gb2312'
  99. filePath = kwargs.get('filePath', None)
  100. response = ResponseObject()
  101. filePath.encode(encoding='gb2312', errors='strict')
  102. return self.getFile(filePath, response)
  103. def getFile(self, filePath, response):
  104. if filePath:
  105. pass
  106. else:
  107. return response.json(800)
  108. fullPath = os.path.join(BASE_DIR, filePath).replace('\\', '/')
  109. var_dump(fullPath)
  110. if os.path.isfile(fullPath):
  111. try:
  112. Imagedata = open(fullPath, 'rb').read()
  113. except Exception as e:
  114. return response.json(906, repr(e))
  115. else:
  116. return HttpResponse(Imagedata, content_type="image/jpeg")
  117. else:
  118. return response.json(907)
  119. class FAQView(View):
  120. @method_decorator(csrf_exempt)
  121. def dispatch(self, *args, **kwargs):
  122. return super(FAQView, self).dispatch(*args, **kwargs)
  123. def post(self, request, *args, **kwargs):
  124. request.encoding = 'utf-8'
  125. request_dict = request.POST
  126. operation = kwargs.get('operation', None)
  127. return self.validate(request_dict, operation)
  128. def get(self, request, *args, **kwargs):
  129. request.encoding = 'utf-8'
  130. request_dict = request.GET
  131. operation = kwargs.get('operation', None)
  132. return self.validate(request_dict, operation)
  133. def validate(self, request_dict, operation):
  134. token = TokenObject(request_dict.get('token', None))
  135. response = ResponseObject()
  136. if token.code != 0:
  137. return response.json(token.code)
  138. if operation == 'add':
  139. return self.do_add(token, request_dict, response)
  140. elif operation == 'query':
  141. return self.do_query(token.userID, request_dict, response)
  142. elif operation == 'update':
  143. return self.do_update(token, request_dict, response)
  144. elif operation == 'delete':
  145. return self.do_delete(token.userID, request_dict, response)
  146. else:
  147. return response.json(404)
  148. def do_add(self, token, request_dict, response):
  149. own_permission = ModelService.check_perm(userID=token.userID, permID=120)
  150. if own_permission is not True:
  151. return response.json(404)
  152. title = request_dict.get('title', None)
  153. content = request_dict.get('content', None)
  154. if title and content:
  155. try:
  156. # 对content中的图片路径进行修改
  157. content = str(content)
  158. content = content.replace('faq/image/static/FAQImages/tmp', 'faq/image/static/FAQImages')
  159. # 取出redis中保存的此次上传的图片信息
  160. redisObject = RedisObject()
  161. images = redisObject.get_data(key=token.token)
  162. if images is not False:
  163. images = json.loads(images)
  164. # 把图片从临时文件移动到FAQ资源文件夹下
  165. for k, v in images.items():
  166. start_index1 = v.find('tmp/')
  167. start_index2 = start_index1 + 4
  168. new_path = v[0:start_index1] + v[start_index2:]
  169. shutil.move(v, new_path)
  170. now_time = int(time.time())
  171. FAQModel.objects.create(**{
  172. 'title': title,
  173. 'content': content,
  174. 'add_time': now_time,
  175. 'update_time': now_time
  176. })
  177. # 删除redis中token对应的信息
  178. redisObject.del_data(key=token.token)
  179. except Exception as e:
  180. print(e)
  181. return response.json(174)
  182. return response.json(0)
  183. else:
  184. return response.json(444)
  185. def do_query(self, userID, request_dict, response):
  186. page = request_dict.get('page', None)
  187. line = request_dict.get('line', None)
  188. search_key = request_dict.get('search_key', None)
  189. if page and line:
  190. if search_key:
  191. own_permission = ModelService.check_perm(userID=userID, permID=110)
  192. if own_permission is not True:
  193. return response.json(404)
  194. faq_qs = FAQModel.objects.filter(title__contains=search_key)
  195. else:
  196. own_permission = ModelService.check_perm(userID=userID, permID=100)
  197. if own_permission is not True:
  198. return response.json(404)
  199. faq_qs = FAQModel.objects.filter()
  200. if not faq_qs.exists():
  201. return response.json(0, {'count': 0, 'data': []})
  202. count = faq_qs.count()
  203. page = int(page)
  204. line = int(line)
  205. start = (page - 1) * line
  206. end = start + line
  207. faq_qs = faq_qs.values()[start:end]
  208. return response.json(0, {'count': count, 'data': list(faq_qs)})
  209. else:
  210. return response.json(444)
  211. def do_update(self, token, request_dict, response):
  212. own_permission = ModelService.check_perm(userID=token.userID, permID=130)
  213. if own_permission is not True:
  214. return response.json(404)
  215. id = request_dict.get('id', None)
  216. title = request_dict.get('title', None)
  217. content = request_dict.get('content', None)
  218. if id:
  219. now_time = int(time.time())
  220. data = {
  221. 'update_time': now_time
  222. }
  223. if title:
  224. data['title'] = title
  225. if content:
  226. content = str(content)
  227. content = content.replace('faq/image/static/FAQImages/tmp', 'faq/image/static/FAQImages')
  228. # 取出redis中保存的此次上传的图片信息
  229. redisObject = RedisObject()
  230. images = redisObject.get_data(key=token.token)
  231. if images is not False:
  232. images = json.loads(images)
  233. # 把图片从临时文件移动到FAQ资源文件夹下
  234. for k, v in images.items():
  235. start_index1 = v.find('tmp/')
  236. start_index2 = start_index1 + 4
  237. new_path = v[0:start_index1] + v[start_index2:]
  238. shutil.move(v, new_path)
  239. # 删除redis中token对应的信息
  240. redisObject.del_data(key=token.token)
  241. data['content'] = content
  242. FAQModel.objects.filter(id=id).update(**data)
  243. return response.json(0)
  244. else:
  245. return response.json(444)
  246. def do_delete(self, userID, request_dict, response):
  247. own_permission = ModelService.check_perm(userID=userID, permID=140)
  248. if own_permission is not True:
  249. return response.json(404)
  250. id = request_dict.get('id', None)
  251. if id:
  252. try:
  253. faq_qs = FAQModel.objects.filter(id=id)
  254. faq_qs.delete()
  255. except Exception as e:
  256. print(e)
  257. return response.json(173)
  258. else:
  259. return response.json(0)
  260. else:
  261. return response.json(444)