__init__.py 20 KB

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