__init__.py 19 KB

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