user.py 15 KB

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