__init__.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException
  4. from database import get_db
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import not_
  7. from fastapi.responses import JSONResponse
  8. from models import *
  9. from utils import *
  10. from utils.ry_system_util import *
  11. from common.security import valid_access_token
  12. import traceback
  13. router = APIRouter()
  14. @router.post('')
  15. async def rolecreate(
  16. db: Session = Depends(get_db),
  17. user_id: int = Depends(valid_access_token),
  18. body = Depends(remove_xss_json)
  19. ):
  20. try:
  21. menuCheckStrictly = body['menuCheckStrictly']
  22. if menuCheckStrictly:
  23. menu_check_strictly = 1
  24. else:
  25. menu_check_strictly = 0
  26. role_key = body['roleKey']
  27. role_name = body['roleName']
  28. role_sort = body['roleSort']
  29. status = body['status']
  30. remark = body['remark']
  31. menuIds = body['menuIds']
  32. new_role = SysRole(
  33. menu_check_strictly=menu_check_strictly,
  34. role_key=role_key,
  35. role_name=role_name,
  36. role_sort=role_sort,
  37. status=status,
  38. remark=remark
  39. )
  40. db.add(new_role)
  41. db.commit()
  42. db.refresh(new_role)
  43. # 创建新的用户角色关联
  44. new_role_menus = [SysRoleMenu(role_id=new_role.role_id, menu_id=menu_id) for menu_id in menuIds]
  45. db.add_all(new_role_menus)
  46. db.commit()
  47. return {"code": 200, "msg": "创建成功", "data": None}
  48. except Exception as e:
  49. traceback.print_exc()
  50. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  51. @router.put('')
  52. async def roleupdate(
  53. db: Session = Depends(get_db),
  54. user_id: int = Depends(valid_access_token),
  55. body = Depends(remove_xss_json)
  56. ):
  57. try:
  58. roleId = body['roleId']
  59. query = db.query(SysRole)
  60. query = query.filter(SysRole.del_flag != '2')
  61. query = query.filter(SysRole.role_id == roleId)
  62. role = query.first()
  63. if not role :
  64. return JSONResponse(status_code=410, content={
  65. 'errcode': 410,
  66. 'errmsg': f'角色{roleId}不存在'
  67. })
  68. role.role_key = body['roleKey']
  69. role.role_name = body['roleName']
  70. role.role_sort = body['roleSort']
  71. role.status = body['status']
  72. role.remark = body['remark']
  73. menuCheckStrictly = body['menuCheckStrictly']
  74. if menuCheckStrictly:
  75. role.menu_check_strictly = 1
  76. else:
  77. role.menu_check_strictly = 0
  78. menuIds = body['menuIds']
  79. # 清除当前用户的所有角色关联
  80. db.query(SysRoleMenu).filter(SysRoleMenu.role_id == roleId).delete()
  81. # 创建新的用户角色关联
  82. new_role_menus = [SysRoleMenu(role_id=roleId, menu_id=menu_id) for menu_id in menuIds]
  83. db.add_all(new_role_menus)
  84. db.commit()
  85. return {"code": 200, "msg": "更新成功", "data": None}
  86. except Exception as e:
  87. traceback.print_exc()
  88. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  89. @router.put('/dataScope')
  90. async def roleupdate(
  91. db: Session = Depends(get_db),
  92. user_id: int = Depends(valid_access_token),
  93. body = Depends(remove_xss_json)
  94. ):
  95. try:
  96. roleId = body['roleId']
  97. query = db.query(SysRole)
  98. query = query.filter(SysRole.del_flag != '2')
  99. query = query.filter(SysRole.role_id == roleId)
  100. role = query.first()
  101. if not role :
  102. return JSONResponse(status_code=410, content={
  103. 'errcode': 410,
  104. 'errmsg': f'角色{roleId}不存在'
  105. })
  106. role.data_scope = body['dataScope']
  107. deptIds = body['deptIds']
  108. # 清除当前用户的所有角色关联
  109. db.query(SysRoleMenu).filter(SysRoleMenu.role_id == roleId).delete()
  110. # 创建新的用户角色关联
  111. new_role_depts = [SysRoleDept(role_id=roleId, dept_id=dept_id) for dept_id in deptIds]
  112. db.add_all(new_role_depts)
  113. db.commit()
  114. return {"code": 200, "msg": "更新成功", "data": None}
  115. except Exception as e:
  116. traceback.print_exc()
  117. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  118. @router.put('/changeStatus')
  119. async def roleupdate(
  120. db: Session = Depends(get_db),
  121. user_id: int = Depends(valid_access_token),
  122. body = Depends(remove_xss_json)
  123. ):
  124. try:
  125. roleId = body['roleId']
  126. query = db.query(SysRole)
  127. query = query.filter(SysRole.del_flag != '2')
  128. query = query.filter(SysRole.role_id == roleId)
  129. role = query.first()
  130. if not role :
  131. return JSONResponse(status_code=410, content={
  132. 'errcode': 410,
  133. 'errmsg': f'角色{roleId}不存在'
  134. })
  135. role.status = body['status']
  136. db.commit()
  137. return {"code": 200, "msg": "更新成功", "data": None}
  138. except Exception as e:
  139. traceback.print_exc()
  140. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  141. #deptTree
  142. @router.get('/deptTree/{roleId}')
  143. async def getmunutreeselect(request: Request,roleId:int,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  144. def build_dept_tree(depts, parent_dept):
  145. dept_tree = []
  146. for dept_info in depts:
  147. dept = {
  148. "id": dept_info.dept_id,
  149. "label": dept_info.dept_name,
  150. "parentId": dept_info.parent_id,
  151. "weight": dept_info.order_num
  152. }
  153. # print(dept_info.dept_id)
  154. children = parent_id_get_dept_info(db, dept_info.dept_id)
  155. if len(children) > 0:
  156. children_depts = build_dept_tree(children, dept)
  157. dept["children"] = children_depts
  158. dept_tree.append(dept)
  159. return dept_tree
  160. checkedKeys = role_id_get_role_depts(db, roleId)
  161. result = build_dept_tree(parent_id_get_dept_info(db, 0), None)
  162. return {
  163. "code": 200,
  164. "msg": "操作成功",
  165. "data": {"depts":result,"checkedKeys":checkedKeys}
  166. }
  167. @router.get('/authUser/allocatedList')
  168. async def userlist(
  169. userName:str = Query(None,description='用户名称'),
  170. phonenumber:str= Query(None,description='用户手机号'),
  171. roleId: int = Query(None ,description='部门id'),
  172. page: int = Query(1, gt=0, description='页码'),
  173. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  174. db: Session = Depends(get_db),
  175. user_id: int = Depends(valid_access_token)):
  176. try:
  177. query = db.query(SysUserRole)
  178. # query = query.filter(SysUserRole.del_flag != '2')
  179. query = query.filter(SysUserRole.role_id == roleId)
  180. resutl = query.all()
  181. users = [i.user_id for i in resutl]
  182. # 构建查询
  183. query = db.query(SysUser)
  184. query = query.filter(SysUser.del_flag != '2')
  185. # 应用查询条件
  186. query = query.filter(SysUser.user_id.in_(users))
  187. if userName is not None:
  188. query = query.filter(SysUser.user_name.like(f'%{userName}%'))
  189. if phonenumber is not None:
  190. query = query.filter(SysUser.phonenumber.like(f'%{phonenumber}%'))
  191. #
  192. # print(query)
  193. # 计算总条目数
  194. total_items = query.count()
  195. # 排序
  196. query = query.order_by(SysUser.create_time.desc())
  197. # 执行分页查询
  198. users = query.offset((page - 1) * pageSize).limit(pageSize).all()
  199. # 将查询结果转换为列表形式的字典
  200. user_list = []
  201. for user in users:
  202. roleIds = []#user_id_get_user_roleIds(db, user.user_id)
  203. user_roles = []#role_id_list_get_user_role(db,roleIds)
  204. user_info = {
  205. "userId": user.user_id,
  206. "tenantId": user.tenant_id,
  207. "deptId": user.dept_id,
  208. "userName": user.user_name,
  209. "nickName": user.nick_name,
  210. "userType": user.user_type,
  211. "email": user.email,
  212. "phonenumber": user.phonenumber,
  213. "sex": user.sex,
  214. "avatar": user.avatar,
  215. "status": user.status,
  216. "loginIp": user.login_ip,
  217. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  218. "remark": user.remark,
  219. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  220. "deptName": user.dept_name,
  221. "roles": user_roles,
  222. "roleIds": roleIds,
  223. "postIds": None,
  224. "roleId": None
  225. }
  226. user_list.append(user_info)
  227. # 返回结果
  228. return {
  229. "code": 200,
  230. "msg": "成功用户列表",
  231. "rows": user_list,
  232. "total": total_items,
  233. "page": page,
  234. "pageSize": pageSize,
  235. "totalPages": (total_items + pageSize - 1) // pageSize
  236. }
  237. except Exception as e:
  238. traceback.print_exc()
  239. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  240. @router.get('/authUser/unallocatedList')
  241. async def userlist(
  242. userName:str = Query(None,description='用户名称'),
  243. phonenumber:str= Query(None,description='用户手机号'),
  244. roleId: int = Query(None ,description='部门id'),
  245. page: int = Query(1, gt=0, description='页码'),
  246. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  247. db: Session = Depends(get_db),
  248. user_id: int = Depends(valid_access_token)):
  249. try:
  250. query = db.query(SysUserRole)
  251. # query = query.filter(SysUserRole.del_flag != '2')
  252. query = query.filter(SysUserRole.role_id == roleId)
  253. resutl = query.all()
  254. users = [i.user_id for i in resutl]
  255. # 构建查询
  256. query = db.query(SysUser)
  257. query = query.filter(SysUser.del_flag != '2')
  258. # 应用查询条件
  259. query = query.filter(not_(SysUser.user_id.in_(users)))
  260. if userName is not None:
  261. query = query.filter(SysUser.user_name.like(f'%{userName}%'))
  262. if phonenumber is not None:
  263. query = query.filter(SysUser.phonenumber.like(f'%{phonenumber}%'))
  264. #
  265. # print(query)
  266. # 计算总条目数
  267. total_items = query.count()
  268. # 排序
  269. query = query.order_by(SysUser.create_time.desc())
  270. # 执行分页查询
  271. users = query.offset((page - 1) * pageSize).limit(pageSize).all()
  272. # 将查询结果转换为列表形式的字典
  273. user_list = []
  274. for user in users:
  275. roleIds = []#user_id_get_user_roleIds(db, user.user_id)
  276. user_roles = []#role_id_list_get_user_role(db,roleIds)
  277. user_info = {
  278. "userId": user.user_id,
  279. "tenantId": user.tenant_id,
  280. "deptId": user.dept_id,
  281. "userName": user.user_name,
  282. "nickName": user.nick_name,
  283. "userType": user.user_type,
  284. "email": user.email,
  285. "phonenumber": user.phonenumber,
  286. "sex": user.sex,
  287. "avatar": user.avatar,
  288. "status": user.status,
  289. "loginIp": user.login_ip,
  290. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  291. "remark": user.remark,
  292. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  293. "deptName": user.dept_name,
  294. "roles": user_roles,
  295. "roleIds": roleIds,
  296. "postIds": None,
  297. "roleId": None
  298. }
  299. user_list.append(user_info)
  300. # 返回结果
  301. return {
  302. "code": 200,
  303. "msg": "成功用户列表",
  304. "rows": user_list,
  305. "total": total_items,
  306. "page": page,
  307. "pageSize": pageSize,
  308. "totalPages": (total_items + pageSize - 1) // pageSize
  309. }
  310. except Exception as e:
  311. traceback.print_exc()
  312. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  313. @router.put('/authUser/selectAll')
  314. async def cancel_user_role(
  315. roleId: str = Query(None),
  316. userIds:str=Query(None),
  317. db: Session = Depends(get_db),
  318. user_id: int = Depends(valid_access_token),
  319. body = Depends(remove_xss_json)
  320. ):
  321. try:
  322. userIdList=userIds.split(',')
  323. new_roles = [SysUserRole(user_id=user_id, role_id=roleId) for user_id in userIdList]
  324. db.add_all(new_roles)
  325. db.commit()
  326. return {
  327. "code": 200,
  328. "msg": "成功",
  329. "data": None}
  330. except Exception as e:
  331. traceback.print_exc()
  332. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  333. @router.put('/authUser/cancel')
  334. async def cancel_user_role(
  335. db: Session = Depends(get_db),
  336. user_id: int = Depends(valid_access_token),
  337. body = Depends(remove_xss_json)
  338. ):
  339. try:
  340. roleId=body['roleId']
  341. userId=body['userId']
  342. query = db.query(SysUserRole).filter(SysUserRole.role_id==roleId)
  343. query = query.filter(SysUserRole.role_id==roleId)
  344. query = query.filter(SysUserRole.user_id==userId)
  345. query.delete()
  346. db.commit()
  347. return {
  348. "code": 200,
  349. "msg": "成功",
  350. "data": None}
  351. except Exception as e:
  352. traceback.print_exc()
  353. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  354. @router.put('/authUser/cancelAll')
  355. async def cancel_user_role(
  356. roleId: str = Query(None),
  357. userIds:str=Query(None),
  358. db: Session = Depends(get_db),
  359. user_id: int = Depends(valid_access_token),
  360. body = Depends(remove_xss_json)
  361. ):
  362. try:
  363. userIdList=userIds.split(',')
  364. query = db.query(SysUserRole).filter(SysUserRole.role_id==roleId)
  365. query = query.filter(SysUserRole.role_id==roleId)
  366. query = query.filter(SysUserRole.user_id.in_(userIdList))
  367. query.delete()
  368. db.commit()
  369. return {
  370. "code": 200,
  371. "msg": "成功",
  372. "data": None}
  373. except Exception as e:
  374. traceback.print_exc()
  375. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  376. @router.get('/list')
  377. async def rolelist( roleName: int = Query(None ,description='角色名称'),
  378. roleKey: str = Query(None, description='权限字符'),
  379. status: int = Query(None, description='角色状态'),
  380. # beginTime: str = Depends(get_time_params),
  381. # endTime: str = Depends(get_time_params),
  382. page: int = Query(1, gt=0, description='页码'),
  383. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  384. db: Session = Depends(get_db),
  385. user_id: int = Depends(valid_access_token)):
  386. try:
  387. # 构建查询
  388. query = db.query(SysRole)
  389. query = query.filter(SysRole.del_flag != '2')
  390. # 应用查询条件
  391. # if beginTime:
  392. # query = query.filter(SysUser.create_time >= beginTime)
  393. # if endTime:
  394. # query = query.filter(SysUser.create_time <= endTime)
  395. # if params:
  396. # query = query.filter(SysUser.create_time >= params.get("beginTime"))
  397. # query = query.filter(SysUser.create_time <= params.get("endTime"))
  398. if roleName:
  399. query =query.filter(SysRole.role_name.like(f'%{roleName}%'))
  400. if status:
  401. query =query.filter(SysRole.status==status)
  402. if roleKey:
  403. query =query.filter(SysRole.role_key.like(f'%{roleKey}%'))
  404. # 计算总条目数
  405. total_items = query.count()
  406. # 排序
  407. query = query.order_by(SysRole.create_time.desc())
  408. # 执行分页查询
  409. roles = query.offset((page - 1) * pageSize).limit(pageSize).all()
  410. # 将查询结果转换为列表形式的字典
  411. role_list = role_list_to_dict(roles,[])
  412. # 返回结果
  413. return {
  414. "code": 200,
  415. "msg": "成功",
  416. "rows": role_list,
  417. "total": total_items,
  418. "page": page,
  419. "pageSize": pageSize,
  420. "totalPages": (total_items + pageSize - 1) // pageSize
  421. }
  422. except Exception as e:
  423. traceback.print_exc()
  424. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  425. @router.get('/{roleId}')
  426. async def rolelist( roleId:int,
  427. db: Session = Depends(get_db),
  428. user_id: int = Depends(valid_access_token)):
  429. try:
  430. # 构建查询
  431. query = db.query(SysRole)
  432. query = query.filter(SysRole.del_flag != '2')
  433. # 应用查询条件
  434. query = query.filter(SysRole.role_id==roleId)
  435. roles = query.all()
  436. # 将查询结果转换为列表形式的字典
  437. role_list = role_list_to_dict(roles,[])
  438. # 返回结果
  439. return {
  440. "code": 200,
  441. "msg": "成功",
  442. "data": role_list[0]
  443. }
  444. except Exception as e:
  445. traceback.print_exc()
  446. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")