views.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. import os
  2. import pandas as pd
  3. from fastapi import APIRouter, Request, Depends, Query, File, UploadFile
  4. from sqlalchemy.orm import Session
  5. from utils.encrypt import get_uuid
  6. from .models import Users
  7. from .schemas import *
  8. from apps.user.schemas.user_info_schemas import UserCreateSchema
  9. from apps.system.models import ConfigSettings
  10. from apps.permission.models.role import Roles
  11. from apps.system.curd.curd_config_setting import curd_config_setting
  12. from utils.tools import get_md5
  13. from .curd.curd_user import curd_user
  14. from .curd.curd_role import curd_role
  15. from .curd.curd_menu import curd_menu
  16. from .curd.curd_perm_label import curd_perm_label
  17. from common import deps, error_code
  18. from common.resp import respSuccessJson, respErrorJson
  19. from core import constants
  20. router = APIRouter()
  21. @router.get("/user/{user_id}", summary="获取用户信息")
  22. async def getUser(*,
  23. db: Session = Depends(deps.get_db),
  24. u: Users = Depends(deps.user_perm(["perm:user:get", "perm:user:put"])),
  25. user_id: int,
  26. ):
  27. return respSuccessJson(curd_user.get(db, user_id))
  28. @router.get("/user", summary="获取用户列表")
  29. async def listUser(*,
  30. db: Session = Depends(deps.get_db),
  31. u: Users = Depends(deps.user_perm(["perm:user:get"])),
  32. id: int = Query(None, gt=0),
  33. username: str = Query(""),
  34. nickname: str = Query(""),
  35. email: str = Query(""),
  36. phone: str = Query(""),
  37. status: int = Query(None),
  38. created_after_ts: int = None,
  39. created_before_ts: int = None,
  40. page: int = Query(1, gt=0),
  41. page_size: int = Query(20, gt=0),
  42. ):
  43. return respSuccessJson(
  44. curd_user.search(db, _id=id, username=username, nickname=nickname, email=email, phone=phone, status=status,
  45. created_after_ts=created_after_ts, created_before_ts=created_before_ts,
  46. page=page, page_size=page_size))
  47. @router.post("/user", summary="添加用户")
  48. async def addUser(*,
  49. db: Session = Depends(deps.get_db),
  50. u: Users = Depends(deps.user_perm(["perm:user:post"])),
  51. obj: UserSchema,
  52. ):
  53. curd_user.create(db, obj_in=obj, creator_id=u['id'])
  54. return respSuccessJson()
  55. @router.post("/user/file/avatar", summary="上传头像照片")
  56. async def uploadAvatar(img: UploadFile):
  57. img_data = img.file.read()
  58. img_name = img.filename # type: str
  59. new_img_name = f"{get_uuid()}.{img_name.split('.')[-1]}"
  60. path = constants.MEDIA_AVATAR_BASE_DIR + new_img_name
  61. with open(os.path.join(constants.MEDIA_BASE_PATH, path), 'wb') as f:
  62. f.write(img_data)
  63. return respSuccessJson({'path': path})
  64. @router.post("/user/file/importData", summary="上传导入数据")
  65. async def uploadImportData(*,
  66. db: Session = Depends(deps.get_db),
  67. request: Request,
  68. file: UploadFile,
  69. u: Users = Depends(deps.user_perm(["perm:user:post"])),
  70. ):
  71. updateSupport = request.query_params.get("updateSupport", "true") == 'true'
  72. print('updateSupport:', updateSupport)
  73. up_data = file.file.read()
  74. up_name = file.filename # type: str
  75. new_img_name = f"{get_uuid()}.{up_name.split('.')[-1]}"
  76. path = constants.MEDIA_EXCEL_BASE_DIR + new_img_name
  77. file_path = os.path.join(constants.MEDIA_BASE_PATH, path)
  78. with open(file_path, 'wb') as f:
  79. f.write(up_data)
  80. names = ['id', 'username', 'nickname', 'email', 'phone', 'sex', 'status', 'created_time']
  81. data = pd.read_excel(file_path, sheet_name=0, names=names)
  82. records = data.to_dict(orient='records')
  83. print(records)
  84. # 设置初始角色为id=2的普通用户
  85. roles = [2]
  86. # 查询系统参数表的用户初始角色
  87. init_roles = db.query(ConfigSettings.value).filter(
  88. ConfigSettings.key == 'user_init_roles', ConfigSettings.is_deleted == 0, ConfigSettings.status == 0
  89. ).first()
  90. # 如果查到了值,就拿值按逗号分割后去查询对应的数据库角色对象。列表推导式将对象的id拿出来重新赋值给roles
  91. if init_roles:
  92. init_roles_key = init_roles.value.split(',')
  93. user_role = db.query(Roles).filter(Roles.key.in_(init_roles_key), Roles.is_deleted == 0).all()
  94. roles = [role.id for role in user_role]
  95. # 获取初始密码
  96. default_password = curd_config_setting.getByKey(db, key='default_password').get('value') or '123456'
  97. for record in records:
  98. user = curd_user.getByUserName(db, username=record['username'])
  99. obj_in = {
  100. 'username': record['username'],
  101. 'nickname': record['nickname'],
  102. 'password': get_md5(default_password),
  103. 'email': record['email'],
  104. 'phone': record['phone'],
  105. 'sex': record['sex'],
  106. 'status': record['status'],
  107. 'roles': roles,
  108. 'is_active': True,
  109. }
  110. if not user:
  111. # user_in = UserCreateSchema(
  112. # username=obj_in['username'],
  113. # nickname=obj_in['nickname'],
  114. # password=get_md5('123456'),
  115. # is_superuser=False,
  116. # email=obj_in['email'],
  117. # phone=obj_in['phone'],
  118. # sex=obj_in['sex'],
  119. # status=obj_in['status'],
  120. # )
  121. # user = curd_user.create(db=db, obj_in=user_in)
  122. user = curd_user.create(db=db, obj_in=obj_in)
  123. print('新建用户ID:', user.id)
  124. else:
  125. if updateSupport:
  126. curd_user.update(db=db, _id=user.id, obj_in=obj_in)
  127. print('更新用户ID:', user.id)
  128. else:
  129. print('跳过更新用户ID:', user.id)
  130. os.remove(file_path)
  131. return respSuccessJson(data={'path': path, 'file_path': file_path}, msg='导入成功')
  132. @router.put("/user/{user_id}/password", summary="修改指定用户的密码")
  133. async def setPassword(*,
  134. user_id: int,
  135. db: Session = Depends(deps.get_db),
  136. u: Users = Depends(deps.user_perm(["perm:user:put"])),
  137. obj: UserSetPasswordSchema
  138. ):
  139. curd_user.changePassword(db, _id=user_id, new_password=obj.password, updater_id=u['id'])
  140. return respSuccessJson()
  141. @router.put("/user/{user_id}/active", summary="修改用户是否活跃的状态")
  142. async def setIsActive(*,
  143. user_id: int,
  144. db: Session = Depends(deps.get_db),
  145. u: Users = Depends(deps.user_perm(["perm:user:put"])),
  146. obj: UserIsActiveSchema
  147. ):
  148. curd_user.setUserIsActive(db, user_id=user_id, is_active=obj.is_active, modifier_id=u['id'])
  149. return respSuccessJson()
  150. @router.put("/user/{user_id}", summary="修改用户信息")
  151. async def setUser(*,
  152. db: Session = Depends(deps.get_db),
  153. u: Users = Depends(deps.user_perm(["perm:user:put"])),
  154. obj: UserSchema,
  155. user_id: int,
  156. ):
  157. curd_user.update(db, _id=user_id, obj_in=obj, updater_id=u['id'])
  158. return respSuccessJson()
  159. @router.delete("/user/{_ids}", summary="删除用户")
  160. async def delUser(*,
  161. db: Session = Depends(deps.get_db),
  162. u: Users = Depends(deps.user_perm(["perm:user:delete"])),
  163. _ids: str,
  164. ):
  165. _ids = list(map(lambda x: int(x), _ids.split(',')))
  166. curd_user.deletes(db, _ids=_ids, deleter_id=u['id'])
  167. return respSuccessJson()
  168. @router.get("/role", summary="获取所有权限角色")
  169. async def listRole(*,
  170. db: Session = Depends(deps.get_db),
  171. u: Users = Depends(deps.user_perm(["perm:role:get"])),
  172. key: str = Query(""),
  173. name: str = Query(""),
  174. status: int = Query(None),
  175. page: int = Query(1, gt=0),
  176. page_size: int = Query(25, gt=0),
  177. ):
  178. return respSuccessJson(curd_role.search(db, name=name, key=key, status=status, page=page, page_size=page_size))
  179. @router.get("/role/select/list", summary="获取权限角色选择列表")
  180. async def getRoleSelectList(*,
  181. db: Session = Depends(deps.get_db)
  182. ):
  183. return respSuccessJson({'roles': curd_role.getSelectList(db)})
  184. @router.get("/role/max-order-num", summary="获取权限最大排序")
  185. async def getRoleMaxOrderNum(*,
  186. db: Session = Depends(deps.get_db)
  187. ):
  188. return respSuccessJson({'max_order_num': curd_role.getMaxOrderNum(db)})
  189. @router.get("/role/{role_id}", summary="查看单个权限角色")
  190. async def getRole(*,
  191. db: Session = Depends(deps.get_db),
  192. u: Users = Depends(deps.user_perm(["perm:role:get"])),
  193. role_id: int
  194. ):
  195. return respSuccessJson(curd_role.get(db, _id=role_id))
  196. @router.post("/role", summary="添加权限角色")
  197. async def addRole(*,
  198. db: Session = Depends(deps.get_db),
  199. u: Users = Depends(deps.user_perm(["perm:role:post"])),
  200. obj: RoleSchema
  201. ):
  202. curd_role.create(db, obj_in=obj, creator_id=u['id'])
  203. return respSuccessJson()
  204. @router.put("/role/{role_id}", summary="修改角色权限")
  205. async def setRole(*,
  206. db: Session = Depends(deps.get_db),
  207. u: Users = Depends(deps.user_perm(["perm:role:put"])),
  208. role_id: int,
  209. obj: RoleSchema
  210. ):
  211. curd_role.update(db, _id=role_id, obj_in=obj, modifier_id=u['id'])
  212. return respSuccessJson()
  213. @router.delete("/role/{role_id}", summary="删除角色权限")
  214. async def delRole(*,
  215. db: Session = Depends(deps.get_db),
  216. u: Users = Depends(deps.user_perm(["perm:role:delete"])),
  217. role_id: int
  218. ):
  219. curd_role.delete(db, _id=role_id, deleter_id=u['id'])
  220. return respSuccessJson()
  221. @router.get("/menu", summary="菜单列表")
  222. async def listMenus(*,
  223. db: Session = Depends(deps.get_db),
  224. u: Users = Depends(deps.user_perm(["perm:menu:get"])),
  225. title: str = Query(""),
  226. status: int = Query(None)
  227. ):
  228. return respSuccessJson({'menus': curd_menu.queryMenus(db, status, title)})
  229. @router.get("/menu/simple/list", summary="获取简易结构的菜单列表")
  230. async def getMenuSimpleList(*,
  231. db: Session = Depends(deps.get_db),
  232. u: Users = Depends(deps.user_perm(["perm:menu:get"])),
  233. ):
  234. return respSuccessJson({'menus': curd_menu.getSimpleList(db)})
  235. @router.get("/menu/simple/tree", summary="获取简易结构的菜单树状列表")
  236. async def getMenuSimpleList(*,
  237. db: Session = Depends(deps.get_db),
  238. u: Users = Depends(deps.user_perm(["perm:menu:get"])),
  239. ):
  240. return respSuccessJson({'menus': curd_menu.getSimpleTree(db)})
  241. @router.get("/menu/{menu_id}", summary="单个菜单")
  242. async def getMenu(*,
  243. menu_id: int,
  244. u: Users = Depends(deps.user_perm(["perm:menu:get", "perm:menu:gut"])),
  245. db: Session = Depends(deps.get_db)
  246. ):
  247. return respSuccessJson(curd_menu.get(db, _id=menu_id))
  248. @router.post("/menu", summary="添加菜单")
  249. async def addMenu(*,
  250. db: Session = Depends(deps.get_db),
  251. u: Users = Depends(deps.user_perm(["perm:menu:post"])),
  252. obj: MenuSchema
  253. ):
  254. curd_menu.create(db, obj_in=obj, creator_id=u['id'])
  255. return respSuccessJson()
  256. @router.put("/menu/{menu_id}", summary="修改菜单")
  257. async def setMenu(*,
  258. menu_id: int,
  259. db: Session = Depends(deps.get_db),
  260. u: Users = Depends(deps.user_perm(["perm:menu:put"])),
  261. obj: MenuSchema
  262. ):
  263. curd_menu.update(db, _id=menu_id, obj_in=obj, modifier_id=u['id'])
  264. return respSuccessJson()
  265. @router.delete("/menu/{menu_id}", summary="删除菜单")
  266. async def delMenu(*,
  267. menu_id: int,
  268. u: Users = Depends(deps.user_perm(["perm:menu:delete"])),
  269. db: Session = Depends(deps.get_db)
  270. ):
  271. curd_menu.delete(db, _id=menu_id, deleter_id=u['id'])
  272. return respSuccessJson()
  273. @router.get("/menu/{parent_menu_id}/max-order-num", summary="获取菜单最大排序")
  274. async def getMenuMaxOrderNum(*,
  275. parent_menu_id: int,
  276. db: Session = Depends(deps.get_db)
  277. ):
  278. return respSuccessJson({'max_order_num': curd_menu.get_max_order_num(db, parent_id=parent_menu_id)})
  279. @router.put("/role/{role_id}/menu", summary="修改权限对应的菜单")
  280. async def setRoleMenu(*,
  281. role_id: int,
  282. db: Session = Depends(deps.get_db),
  283. u: Users = Depends(deps.user_perm(["perm:menu:put", "perm:role:put"])),
  284. obj: RoleMenuSchema
  285. ):
  286. curd_role.setRoleMenu(db, role_id, obj.menu_ids, ctl_id=u['id'])
  287. return respSuccessJson()
  288. @router.get("/perm-label", summary="获取权限标识")
  289. async def listPermLabel(*,
  290. db: Session = Depends(deps.get_db),
  291. u: Users = Depends(deps.user_perm(["perm:label:get"])),
  292. status: int = Query(None),
  293. label: str = Query(None),
  294. remark: str = Query(None),
  295. page: int = Query(1, gt=0),
  296. page_size: int = Query(20, gt=0),
  297. ):
  298. res = curd_perm_label.search(db, label=label, remark=remark, status=status, page=page, page_size=page_size)
  299. return respSuccessJson(res)
  300. @router.get("/perm-label/{_id}", summary="通过ID获取权限标识")
  301. async def getPermLabel(*,
  302. db: Session = Depends(deps.get_db),
  303. u: Users = Depends(deps.user_perm(["perm:label:get", "perm:label:put"])),
  304. _id: int,
  305. ):
  306. return respSuccessJson(curd_perm_label.get(db, _id=_id))
  307. @router.post("/perm-label", summary="添加权限标识")
  308. async def addPermLabel(*,
  309. db: Session = Depends(deps.get_db),
  310. u: Users = Depends(deps.user_perm(["perm:label:post"])),
  311. obj: PremLabelSchema,
  312. ):
  313. res = curd_perm_label.create(db, obj_in=obj, creator_id=u['id'])
  314. if res:
  315. return respSuccessJson()
  316. return respErrorJson(error=error_code.ERROR_USER_PREM_ADD_ERROR)
  317. @router.put("/perm-label/{_id}", summary="修改权限标识")
  318. async def setPermLabel(*,
  319. db: Session = Depends(deps.get_db),
  320. u: Users = Depends(deps.user_perm(["perm:label:put"])),
  321. _id: int,
  322. obj: PremLabelSchema,
  323. ):
  324. curd_perm_label.update(db, _id=_id, obj_in=obj, updater_id=u['id'])
  325. return respSuccessJson()
  326. @router.delete("/perm-label/{_id}", summary="删除权限标识")
  327. async def delPermLabel(*,
  328. db: Session = Depends(deps.get_db),
  329. u: Users = Depends(deps.user_perm(["perm:label:delete"])),
  330. _id: int,
  331. ):
  332. curd_perm_label.delete(db, _id=_id, deleter_id=u['id'])
  333. return respSuccessJson()