user.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  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 APPUserLogin(APIView):
  82. permission_classes = []
  83. authentication_classes = []
  84. def post(self, request, format=None):
  85. # 用户登录
  86. request_data = request.data
  87. username = request_data.get("username")
  88. password = request_data.get("password")
  89. user = authenticate(username=username, password=password)
  90. if user:
  91. return Response({"msg": "success", "code": 0})
  92. else:
  93. return Response({"msg": "success", "code": 2})
  94. class LoginAPIView(APIView):
  95. permission_classes = []
  96. authentication_classes = []
  97. def post(self, request, format=None):
  98. # 用户登录
  99. request_data = request.data
  100. code_str = request_data.get("code_str")
  101. captcha = request_data.get("captcha")
  102. username = request_data.get("username")
  103. password = request_data.get("password")
  104. captcha_low = ""
  105. if not (code_str or captcha):
  106. msg = "请输入验证码"
  107. return Response({"msg": msg, "code": 2})
  108. else:
  109. captcha_low = captcha.lower()
  110. key = f"{code_str}_{captcha_low}"
  111. redis_tools = RedisPool().get_redis_pool(settings.redis_db["captcha"])
  112. is_captcha = redis_tools.get(key)
  113. if is_captcha:
  114. if captcha_low == captcha_low:
  115. pass
  116. else:
  117. return Response({"msg": "验证码校验失败", "code": 2})
  118. else:
  119. return Response({"msg": "验证码已过期或验证码错误", "code": 2})
  120. user = authenticate(username=username, password=password)
  121. if user:
  122. redis_tools.delete(key)
  123. device_user = DeviceUser.objects.filter(uid=user.id, state=1)
  124. device_user = device_user.first() if device_user else None
  125. msg = ""
  126. if not device_user:
  127. msg = "用户不存在或已被禁止登录"
  128. else:
  129. ip = request.META.get('HTTP_X_FORWARDED_FOR', "")
  130. if not ip:
  131. ip = request.META.get('REMOTE_ADDR', "")
  132. now_time = int(time.time())
  133. device_user.login_time = now_time
  134. request.session["user_id"] = user.id
  135. request.session.save()
  136. MongoUserLoginLog(uid=user.id, ip=ip,addtime=now_time).save()
  137. en_text = PrAes.aesencrypt(request.session.session_key)
  138. myuser_type = device_user.user_type
  139. username = device_user.real_name
  140. data = {
  141. "username":username,
  142. "myuser_type":myuser_type,
  143. "user_login_time":now_time,
  144. "myuid":user.id
  145. }
  146. return Response({"session_key":en_text,"status":True,"data":data, "code": 0})
  147. else:
  148. msg = "用户名或密码错误"
  149. return Response({"msg": msg, "code": 2})
  150. class CaptchaView(APIView):
  151. permission_classes = []
  152. authentication_classes = []
  153. def post(self, request, *args, **kwargs):
  154. """刷新验证码接口"""
  155. prefix = str(int(time.time()*1000))
  156. code_str, img_data = get_captcha()
  157. key = f"{prefix}_{code_str}"
  158. key_lower = key.lower()
  159. redis_tools = RedisPool().get_redis_pool(settings.redis_db["captcha"])
  160. redis_tools.set(key_lower, code_str, 300)
  161. return Response({'code_str': prefix, 'img_data': img_data, 'code': 0})
  162. class LoginInfoAPIView(APIView):
  163. def post(self, request, format=None):
  164. # 获取登录信息
  165. try:
  166. device_user = request.myuser
  167. perm_list, mark = get_perm_list(device_user)
  168. user = User.objects.get(id=device_user.uid)
  169. username = user.username
  170. if not perm_list:
  171. return Response({"code": 2, "msg": "请为用户分配角色"})
  172. real_name = device_user.real_name
  173. data = {
  174. "username":real_name if real_name else username,
  175. "children":perm_list,
  176. "mark": mark,
  177. "myuser_type":device_user.user_type,
  178. "user_login_time":int(time.time()),
  179. "myuid":device_user.uid
  180. }
  181. return Response({"code": 0, "msg": "success", "data":data})
  182. except Exception as e:
  183. print(e)
  184. return Response({"code": 3, "msg": "获取权限列表失败"})
  185. class UserListAPIView(APIView):
  186. def post(self, request):
  187. # 用户列表
  188. request_data = request.data
  189. search = request_data.get("search")
  190. page_num = int(request_data.get("pagenum", 1))
  191. page_size = int(request_data.get("pagesize", 10))
  192. uids = []
  193. if search:
  194. device_user = DeviceUser.objects.filter(Q(real_name__icontains=search) | Q(mobile__icontains=search))
  195. uids = [i.uid for i in device_user]
  196. if uids:
  197. users = User.objects.filter(id__in = uids, is_active=1).values("id", "username", "date_joined").order_by("-date_joined")
  198. else:
  199. users = User.objects.filter(is_active=1).values("id", "username", "date_joined").order_by("-date_joined")
  200. user_lst = []
  201. try:
  202. for user in users:
  203. user["add_time"] = int(user.get("date_joined").timestamp()) if user.get("date_joined", "") else int(time.time())
  204. device_user = DeviceUser.objects.filter(uid=user.get("id"), state=1).values("real_name", "mobile", "state", "remark", "role_id")
  205. if device_user:
  206. user.update(device_user[0])
  207. user["role_name"] = Role.objects.get(id=user.get("role_id")).role_name
  208. user_lst.append(user)
  209. else:
  210. user.update(
  211. {
  212. "real_name": "",
  213. "mobile": 0,
  214. "state": 0,
  215. "remark": "",
  216. "role_name": ""
  217. }
  218. )
  219. user_tp = user_lst[(page_num - 1) * page_size: page_num * page_size]
  220. return Response({"code": 0, "msg": "success", "data":user_tp, "count": len(user_lst)})
  221. except Exception as e:
  222. print(e)
  223. return Response({"code": 2, "msg": "用户列表失败"})
  224. class UserAddAPIView(APIView):
  225. def post(self, request):
  226. # 新增用户
  227. request_data = request.data
  228. username = request_data.get("username")
  229. password = request_data.get("password")
  230. real_name = request_data.get("real_name")
  231. mobile = request_data.get("mobile")
  232. role_id = request_data.get("role_id")
  233. state = request_data.get("state") # 1 正常
  234. user = User.objects.filter(username=username)
  235. if user:
  236. return Response({"code": 2, "msg": "该用户已存在"})
  237. user = User.objects.create_user(username=username, password=password)
  238. device_user = DeviceUser.objects.create(
  239. uid = user.id,
  240. real_name = real_name,
  241. mobile = mobile,
  242. role_id = role_id,
  243. state = state
  244. )
  245. if user and device_user:
  246. return Response({"code": 0, "msg": "success"})
  247. else:
  248. return Response({"code": 2, "msg": "创建用户失败"})
  249. class UserUpdateAPIView(APIView):
  250. def post(self, request):
  251. # 修改用户
  252. request_data = request.data
  253. uid = request_data.get("uid")
  254. password = request_data.get("password")
  255. real_name = request_data.get("real_name")
  256. mobile = request_data.get("mobile")
  257. role_id = request_data.get("role_id")
  258. state = request_data.get("state")
  259. try:
  260. if not uid:
  261. return Response({"code": 2, "msg": "请输入用户ID"})
  262. if password:
  263. user = User.objects.filter(id=uid).first()
  264. user.set_password(password)
  265. user.save()
  266. DeviceUser.objects.filter(uid=uid).update(
  267. real_name = real_name,
  268. mobile = mobile,
  269. role_id = role_id,
  270. state = state
  271. )
  272. return Response({"code": 0, "msg": "success"})
  273. except Exception as e:
  274. return Response({"code": 2, "msg": "修改用户失败"})
  275. class UserDeleteAPIView(APIView):
  276. def post(self, request):
  277. # 删除用户
  278. request_data = request.data
  279. uid = request_data.get("uid")
  280. try:
  281. User.objects.filter(id=uid).update(is_active=0)
  282. DeviceUser.objects.filter(uid=uid).update(state=4)
  283. return Response({"code": 0, "msg": "success"})
  284. except Exception as e:
  285. return Response({"code": 2, "msg": "修改用户失败"})
  286. class PerAPIView(APIView):
  287. def post(self, request):
  288. # 权限列表
  289. data = get_all_pers()
  290. return Response({"code": 0, "data": data})
  291. class LoginOutAPIView(APIView):
  292. def post(self, request):
  293. # 退出登录
  294. request.session.flush()
  295. return Response({"code": 0, "msg": "success"})
  296. class HomeThemeModelAPIView(APIView):
  297. def post(self, request):
  298. # 修改主题
  299. request_data = request.data
  300. logo_url = request_data.get("logo_url")
  301. title_name = request_data.get("title_name")
  302. copyright = request_data.get("copyright")
  303. theme = HomeThemeModel.objects.filter(id=1).update(
  304. logo_url=logo_url,
  305. title_name=title_name,
  306. copyright=copyright
  307. )
  308. if theme:
  309. return Response({"code": 0, "msg": "success"})
  310. else:
  311. return Response({"code": 2, "msg": "保存主题失败"})
  312. class HomeThemeModelListAPIView(APIView):
  313. def post(self, request):
  314. # 展示主题信息
  315. try:
  316. query = HomeThemeModel.objects.all().first()
  317. serializer = HomeThemeModelSerializers(query)
  318. return Response({"code": 0, "msg": "success", "data": serializer.data})
  319. except Exception as e:
  320. print(e)
  321. return Response({"code": 2, "msg": "请联系管理员初始化主题"})