user.py 14 KB

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