user.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. from django.contrib.auth import authenticate
  2. from rest_framework.views import APIView
  3. from smartfarming.models.user import DeviceUser, MongoUserLoginLog, Role, HomeThemeModel
  4. import time
  5. from kedong.utils import PrAes
  6. from smartfarming.utils import get_perm_list, get_all_pers, get_captcha
  7. from rest_framework.response import Response
  8. from django.contrib.auth.models import User
  9. from smartfarming.serializers.user_serializers import RoleSerializers, HomeThemeModelSerializers
  10. from django.core.paginator import Paginator
  11. from kedong import settings
  12. from django.db.models import Q
  13. from kedong.tools import RedisPool
  14. class RoleAPIView(APIView):
  15. def post(self, request):
  16. # 获取角色列表
  17. request_data = request.data
  18. page_num = int(request_data.get("pagenum", 1))
  19. page_size = int(request_data.get("pagesize", 10))
  20. role_name = request_data.get("role_name")
  21. if role_name:
  22. queryset = Role.objects.filter(role_status=1, role_name__icontains=role_name).order_by("-id")
  23. else:
  24. queryset = Role.objects.filter(role_status=1).order_by("-id")
  25. try:
  26. total_obj = queryset.count()
  27. paginator = Paginator(queryset, page_size)
  28. page_obj = paginator.get_page(page_num)
  29. serializer = RoleSerializers(page_obj, many=True)
  30. return Response({"code": 0, "data": serializer.data, "count": total_obj})
  31. except Exception as e:
  32. return Response({"code": 2, "msg": "获取角色列表失败"})
  33. class RoleAddAPIView(APIView):
  34. def post(self, request):
  35. # 新增角色
  36. request_data = request.data
  37. role_name = request_data.get("role_name")
  38. role_perm = request_data.get("role_perm")
  39. mark = request_data.get("mark")
  40. if not role_name or not role_perm:
  41. return Response({"code": 2, "msg": "请输入角色名称与权限"})
  42. role = Role.objects.create(
  43. role_name=role_name,
  44. role_message=request_data.get("role_message"),
  45. role_perm=role_perm,
  46. mark=mark,
  47. addtime=int(time.time()),
  48. uptime=int(time.time())
  49. )
  50. if role:
  51. return Response({"code": 0, "msg": "success"})
  52. else:
  53. return Response({"code": 2, "msg": "创建角色失败"})
  54. class RoleDelAPIView(APIView):
  55. def post(self, request):
  56. # 删除角色
  57. request_data = request.data
  58. role_id = request_data.get("role_id")
  59. device_user = DeviceUser.objects.filter(role_id=role_id)
  60. if device_user:
  61. return Response({"code": 2, "msg": "该角色下存在用户,请删除该角色下的用户后再删除该角色"})
  62. else:
  63. Role.objects.filter(id=role_id).update(role_status=0)
  64. return Response({"code": 0, "msg": "success"})
  65. class RoleUpdateAPIView(APIView):
  66. def post(self, request):
  67. # 更新角色
  68. request_data = request.data
  69. role_id=request_data.get("role_id")
  70. try:
  71. update = Role.objects.filter(id=role_id).update(
  72. role_name=request_data.get("role_name"),
  73. role_message=request_data.get("role_message"),
  74. role_perm=request_data.get("role_perm"),
  75. mark=request_data.get("mark"),
  76. uptime=int(time.time())
  77. )
  78. return Response({"code": 0, "msg": "success"})
  79. except Exception as e:
  80. return Response({"code": 2, "msg": "更新角色失败"})
  81. class LoginAPIView(APIView):
  82. permission_classes = []
  83. authentication_classes = []
  84. def post(self, request, format=None):
  85. # 用户登录
  86. request_data = request.data
  87. code_str = request_data.get("code_str")
  88. captcha = request_data.get("captcha")
  89. username = request_data.get("username")
  90. password = request_data.get("password")
  91. captcha_low = ""
  92. if not (code_str or captcha):
  93. msg = "请输入验证码"
  94. return Response({"msg": msg, "code": 2})
  95. else:
  96. captcha_low = captcha.lower()
  97. key = f"{code_str}_{captcha_low}"
  98. redis_tools = RedisPool().get_redis_pool(settings.redis_db["captcha"])
  99. is_captcha = redis_tools.get(key)
  100. if is_captcha:
  101. if captcha_low == captcha_low:
  102. pass
  103. else:
  104. return Response({"msg": "验证码校验失败", "code": 2})
  105. else:
  106. return Response({"msg": "验证码已过期或验证码错误", "code": 2})
  107. user = authenticate(username=username, password=password)
  108. if user:
  109. redis_tools.delete(key)
  110. device_user = DeviceUser.objects.filter(uid=user.id, state=1)
  111. device_user = device_user.first() if device_user else None
  112. msg = ""
  113. if not device_user:
  114. msg = "用户不存在或已被禁止登录"
  115. else:
  116. ip = request.META.get('HTTP_X_FORWARDED_FOR', "")
  117. if not ip:
  118. ip = request.META.get('REMOTE_ADDR', "")
  119. now_time = int(time.time())
  120. device_user.login_time = now_time
  121. request.session["user_id"] = user.id
  122. request.session.save()
  123. MongoUserLoginLog(uid=user.id, ip=ip,addtime=now_time).save()
  124. en_text = PrAes.aesencrypt(request.session.session_key)
  125. myuser_type = device_user.user_type
  126. username = device_user.real_name
  127. data = {
  128. "username":username,
  129. "myuser_type":myuser_type,
  130. "user_login_time":now_time,
  131. "myuid":user.id
  132. }
  133. return Response({"session_key":en_text,"status":True,"data":data, "code": 0})
  134. else:
  135. msg = "用户名或密码错误"
  136. return Response({"msg": msg, "code": 2})
  137. class CaptchaView(APIView):
  138. permission_classes = []
  139. authentication_classes = []
  140. def post(self, request, *args, **kwargs):
  141. """刷新验证码接口"""
  142. prefix = str(int(time.time()*1000))
  143. code_str, img_data = get_captcha()
  144. key = f"{prefix}_{code_str}"
  145. key_lower = key.lower()
  146. redis_tools = RedisPool().get_redis_pool(settings.redis_db["captcha"])
  147. redis_tools.set(key_lower, code_str, 300)
  148. return Response({'code_str': prefix, 'img_data': img_data, 'code': 0})
  149. class LoginInfoAPIView(APIView):
  150. def post(self, request, format=None):
  151. # 获取登录信息
  152. try:
  153. device_user = request.myuser
  154. perm_list, mark = get_perm_list(device_user)
  155. user = User.objects.get(id=device_user.uid)
  156. username = user.username
  157. if not perm_list:
  158. return Response({"code": 2, "msg": "请为用户分配角色"})
  159. real_name = device_user.real_name
  160. data = {
  161. "username":real_name if real_name else username,
  162. "children":perm_list,
  163. "mark": mark,
  164. "myuser_type":device_user.user_type,
  165. "user_login_time":int(time.time()),
  166. "myuid":device_user.uid
  167. }
  168. return Response({"code": 0, "msg": "success", "data":data})
  169. except Exception as e:
  170. print(e)
  171. return Response({"code": 3, "msg": "获取权限列表失败"})
  172. class UserListAPIView(APIView):
  173. def post(self, request):
  174. # 用户列表
  175. request_data = request.data
  176. search = request_data.get("search")
  177. page_num = int(request_data.get("pagenum", 1))
  178. page_size = int(request_data.get("pagesize", 10))
  179. uids = []
  180. if search:
  181. device_user = DeviceUser.objects.filter(Q(real_name__icontains=search) | Q(mobile__icontains=search))
  182. uids = [i.uid for i in device_user]
  183. if uids:
  184. users = User.objects.filter(id__in = uids, is_active=1).values("id", "username", "date_joined").order_by("-date_joined")
  185. else:
  186. users = User.objects.filter(is_active=1).values("id", "username", "date_joined").order_by("-date_joined")
  187. user_lst = []
  188. try:
  189. for user in users:
  190. user["add_time"] = int(user.get("date_joined").timestamp()) if user.get("date_joined", "") else int(time.time())
  191. device_user = DeviceUser.objects.filter(uid=user.get("id"), state=1).values("real_name", "mobile", "state", "remark", "role_id")
  192. if device_user:
  193. user.update(device_user[0])
  194. user["role_name"] = Role.objects.get(id=user.get("role_id")).role_name
  195. user_lst.append(user)
  196. else:
  197. user.update(
  198. {
  199. "real_name": "",
  200. "mobile": 0,
  201. "state": 0,
  202. "remark": "",
  203. "role_name": ""
  204. }
  205. )
  206. user_tp = user_lst[(page_num - 1) * page_size: page_num * page_size]
  207. return Response({"code": 0, "msg": "success", "data":user_tp, "count": len(user_lst)})
  208. except Exception as e:
  209. print(e)
  210. return Response({"code": 2, "msg": "用户列表失败"})
  211. class UserAddAPIView(APIView):
  212. def post(self, request):
  213. # 新增用户
  214. request_data = request.data
  215. username = request_data.get("username")
  216. password = request_data.get("password")
  217. real_name = request_data.get("real_name")
  218. mobile = request_data.get("mobile")
  219. role_id = request_data.get("role_id")
  220. state = request_data.get("state") # 1 正常
  221. user = User.objects.filter(username=username)
  222. if user:
  223. return Response({"code": 2, "msg": "该用户已存在"})
  224. user = User.objects.create_user(username=username, password=password)
  225. device_user = DeviceUser.objects.create(
  226. uid = user.id,
  227. real_name = real_name,
  228. mobile = mobile,
  229. role_id = role_id,
  230. state = state
  231. )
  232. if user and device_user:
  233. return Response({"code": 0, "msg": "success"})
  234. else:
  235. return Response({"code": 2, "msg": "创建用户失败"})
  236. class UserUpdateAPIView(APIView):
  237. def post(self, request):
  238. # 修改用户
  239. request_data = request.data
  240. uid = request_data.get("uid")
  241. password = request_data.get("password")
  242. real_name = request_data.get("real_name")
  243. mobile = request_data.get("mobile")
  244. role_id = request_data.get("role_id")
  245. state = request_data.get("state")
  246. try:
  247. if not uid:
  248. return Response({"code": 2, "msg": "请输入用户ID"})
  249. if password:
  250. user = User.objects.filter(id=uid).first()
  251. user.set_password(password)
  252. user.save()
  253. DeviceUser.objects.filter(uid=uid).update(
  254. real_name = real_name,
  255. mobile = mobile,
  256. role_id = role_id,
  257. state = state
  258. )
  259. return Response({"code": 0, "msg": "success"})
  260. except Exception as e:
  261. return Response({"code": 2, "msg": "修改用户失败"})
  262. class UserDeleteAPIView(APIView):
  263. def post(self, request):
  264. # 删除用户
  265. request_data = request.data
  266. uid = request_data.get("uid")
  267. try:
  268. User.objects.filter(id=uid).update(is_active=0)
  269. DeviceUser.objects.filter(uid=uid).update(state=4)
  270. return Response({"code": 0, "msg": "success"})
  271. except Exception as e:
  272. return Response({"code": 2, "msg": "修改用户失败"})
  273. class PerAPIView(APIView):
  274. def post(self, request):
  275. # 权限列表
  276. data = get_all_pers()
  277. return Response({"code": 0, "data": data})
  278. class LoginOutAPIView(APIView):
  279. def post(self, request):
  280. # 退出登录
  281. request.session.flush()
  282. return Response({"code": 0, "msg": "success"})
  283. class HomeThemeModelAPIView(APIView):
  284. def post(self, request):
  285. # 修改主题
  286. request_data = request.data
  287. logo_url = request_data.get("logo_url")
  288. title_name = request_data.get("title_name")
  289. copyright = request_data.get("copyright")
  290. theme = HomeThemeModel.objects.filter(id=1).update(
  291. logo_url=logo_url,
  292. title_name=title_name,
  293. copyright=copyright
  294. )
  295. if theme:
  296. return Response({"code": 0, "msg": "success"})
  297. else:
  298. return Response({"code": 2, "msg": "保存主题失败"})
  299. class HomeThemeModelListAPIView(APIView):
  300. def post(self, request):
  301. # 展示主题信息
  302. try:
  303. query = HomeThemeModel.objects.all().first()
  304. serializer = HomeThemeModelSerializers(query)
  305. return Response({"code": 0, "msg": "success", "data": serializer.data})
  306. except Exception as e:
  307. print(e)
  308. return Response({"code": 2, "msg": "请联系管理员初始化主题"})