FAQController.py 11 KB

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