FAQController.py 12 KB

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