user.py 15 KB

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