__init__.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
  4. from common.security import valid_access_token
  5. from pydantic import BaseModel
  6. from database import get_db
  7. from sqlalchemy.orm import Session
  8. from typing import List
  9. from models import *
  10. from utils import *
  11. from utils.ry_system_util import *
  12. import json
  13. from sqlalchemy.sql import func
  14. from common.auth_user import *
  15. router = APIRouter()
  16. # 定义 Meta 和 Child 模型用于嵌套结构
  17. class Meta(BaseModel):
  18. title: str
  19. icon: str
  20. noCache: bool
  21. link: str = None
  22. class Child(BaseModel):
  23. name: str
  24. path: str
  25. hidden: bool
  26. component: str
  27. meta: Meta
  28. children: List['Child'] = []
  29. class Router(BaseModel):
  30. name: str
  31. path: str
  32. hidden: bool
  33. redirect: str = 'noRedirect'
  34. component: str
  35. alwaysShow: bool = True
  36. meta: Meta
  37. children: List[Child] = []
  38. class Router_frame(BaseModel):
  39. component:str
  40. hidden: bool
  41. meta:Meta
  42. name: str
  43. path: str
  44. redirect: str = 'noRedirect'
  45. children: List[Child] = []
  46. alwaysShow: bool = True
  47. # checkedKeys roleMenuTreeselect
  48. @router.get('/roleMenuTreeselect/{roleId}')
  49. async def getmunutreeselect(request: Request,roleId:int,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  50. def build_dept_tree(menus, parent_dept):
  51. menu_tree = []
  52. for menu_info in menus:
  53. menu = {
  54. "id": menu_info.menu_id,
  55. "label": menu_info.menu_name,
  56. "parentId": menu_info.parent_id,
  57. "weight": menu_info.order_num
  58. }
  59. # print(dept_info.dept_id)
  60. children = parent_id_get_menu_info(db, menu_info.menu_id)
  61. if len(children) > 0:
  62. children_depts = build_dept_tree(children, menu)
  63. menu["children"] = children_depts
  64. menu_tree.append(menu)
  65. return menu_tree
  66. checkedKeys = role_id_get_role_menus(db,roleId)
  67. menus = build_dept_tree(parent_id_get_menu_info(db, 0), None)
  68. return {
  69. "code": 200,
  70. "msg": "操作成功",
  71. "data": {"menus":menus,"checkedKeys":checkedKeys}
  72. }
  73. @router.get('/treeselect')
  74. async def getmunutreeselect(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  75. def build_dept_tree(menus, parent_dept):
  76. menu_tree = []
  77. for menu_info in menus:
  78. menu = {
  79. "id": menu_info.menu_id,
  80. "label": menu_info.menu_name,
  81. "parentId": menu_info.parent_id,
  82. "weight": menu_info.order_num
  83. }
  84. # print(dept_info.dept_id)
  85. children = parent_id_get_menu_info(db, menu_info.menu_id)
  86. if len(children) > 0:
  87. children_depts = build_dept_tree(children, menu)
  88. menu["children"] = children_depts
  89. menu_tree.append(menu)
  90. return menu_tree
  91. result = build_dept_tree(parent_id_get_menu_info(db, 0), None)
  92. return {
  93. "code": 200,
  94. "msg": "操作成功",
  95. "data": result
  96. }
  97. @router.get('/getRouters')
  98. async def getRouters(request: Request, db: Session = Depends(get_db),
  99. body = Depends(remove_xss_json),
  100. user_id = Depends(valid_access_token)):
  101. try:
  102. # 查询数据库中的所有菜单项,根据 parent_id 排序以构建树形结构
  103. query = db.query(SysMenu)
  104. query = query.filter_by(parent_id=0)
  105. query = query.filter(SysMenu.menu_id!=11655)
  106. query = query.filter(SysMenu.del_flag != '2')
  107. menus =query.all() # 顶级菜单
  108. # 递归函数用于构建树形结构
  109. def build_menu_tree(menus, parent_menu):
  110. menu_tree = [] # 初始化一个列表来存储菜单树结构
  111. for menu in menus:
  112. if menu.is_frame==0:
  113. menu_data = Router_frame(
  114. component=menu.component or 'Layout',
  115. hidden=menu.visible == '1',
  116. name=menu.path,
  117. path='/'+menu.path,
  118. meta = Meta(
  119. title=menu.menu_name,
  120. icon=menu.icon,
  121. noCache=menu.is_cache == '1',
  122. link = menu.path
  123. ),
  124. children=[]
  125. )
  126. else:
  127. menu_data = Router(
  128. name=menu.path,#menu.menu_name,
  129. path='/'+menu.path,
  130. hidden=menu.visible == '1',
  131. component=menu.component or 'Layout',
  132. meta=Meta(
  133. title=menu.menu_name,
  134. icon=menu.icon,
  135. noCache=menu.is_cache == '1'
  136. ),
  137. children=[] # 初始化 children 列表,即使没有子菜单
  138. )
  139. # 如果菜单有子菜单,则递归构建子菜单
  140. if menu.menu_type == 'M': # 假设 'M' 表示目录类型
  141. query = db.query(SysMenu)
  142. query = query.filter_by(parent_id=menu.menu_id)
  143. query = query.filter(SysMenu.del_flag != '2')
  144. # children_menus = db.query(SysMenu).filter_by(parent_id=menu.menu_id).all()
  145. children_menus = query.all()
  146. menu_data.children = build_menu_tree(children_menus, menu)
  147. else:
  148. del menu_data.children #没有子菜单,删除children 列表
  149. del menu_data.redirect
  150. del menu_data.alwaysShow
  151. menu_data.path = menu_data.path[1:]
  152. print(menu_data)
  153. menu_tree.append(menu_data) # 将当前菜单数据添加到菜单树列表
  154. return menu_tree
  155. # 构建顶级菜单的树形结构
  156. routers = build_menu_tree(menus, None)
  157. # routers_dict = [router.dict() for router in routers]
  158. routers_dict = []
  159. for router in routers:
  160. router_info = router.dict()
  161. if len(router_info['children'])==0:
  162. del router_info['children']
  163. del router_info['redirect']
  164. del router_info['alwaysShow']
  165. router_info['path'] = router_info['path'] #[1:]
  166. routers_dict.append(router_info)
  167. # 返回构建好的路由数据
  168. return {
  169. "code": 200,
  170. "msg": "操作成功",
  171. "data": routers_dict #[router.dict() for router in routers] # 如果没有顶级菜单,返回空列表
  172. }
  173. except Exception as e:
  174. # 处理异常,返回错误信息
  175. raise HTTPException(status_code=500, detail=str(e))
  176. @router.get('/qydt/getRouters')
  177. async def getRouters(request: Request, db: Session = Depends(get_db),
  178. body = Depends(remove_xss_json),
  179. user_id = Depends(valid_access_token)):
  180. try:
  181. # 查询数据库中的所有菜单项,根据 parent_id 排序以构建树形结构
  182. query = db.query(SysMenu)
  183. query = query.filter_by(parent_id=0)
  184. query = query.filter(SysMenu.menu_id==11655)
  185. query = query.filter(SysMenu.del_flag != '2')
  186. menus =query.all() # 顶级菜单
  187. # 递归函数用于构建树形结构
  188. def build_menu_tree(menus, parent_menu):
  189. menu_tree = [] # 初始化一个列表来存储菜单树结构
  190. for menu in menus:
  191. if menu.is_frame==0:
  192. menu_data = Router_frame(
  193. component=menu.component or 'Layout',
  194. hidden=menu.visible == '1',
  195. name=menu.path,
  196. path='/'+menu.path,
  197. meta = Meta(
  198. title=menu.menu_name,
  199. icon=menu.icon,
  200. noCache=menu.is_cache == '1',
  201. link = menu.path
  202. ),
  203. children=[]
  204. )
  205. else:
  206. menu_data = Router(
  207. name=menu.path,#menu.menu_name,
  208. path='/'+menu.path,
  209. hidden=menu.visible == '1',
  210. component=menu.component or 'Layout',
  211. meta=Meta(
  212. title=menu.menu_name,
  213. icon=menu.icon,
  214. noCache=menu.is_cache == '1'
  215. ),
  216. children=[] # 初始化 children 列表,即使没有子菜单
  217. )
  218. # 如果菜单有子菜单,则递归构建子菜单
  219. if menu.menu_type == 'M': # 假设 'M' 表示目录类型
  220. query = db.query(SysMenu)
  221. query = query.filter_by(parent_id=menu.menu_id)
  222. query = query.filter(SysMenu.del_flag != '2')
  223. # children_menus = db.query(SysMenu).filter_by(parent_id=menu.menu_id).all()
  224. children_menus = query.all()
  225. menu_data.children = build_menu_tree(children_menus, menu)
  226. else:
  227. del menu_data.children #没有子菜单,删除children 列表
  228. del menu_data.redirect
  229. del menu_data.alwaysShow
  230. menu_data.path = menu_data.path[1:]
  231. menu_tree.append(menu_data) # 将当前菜单数据添加到菜单树列表
  232. return menu_tree
  233. # 构建顶级菜单的树形结构
  234. routers = build_menu_tree(menus, None)
  235. # routers_dict = [router.dict() for router in routers]
  236. routers_dict = []
  237. for router in routers:
  238. router_info = router.dict()
  239. if len(router_info['children'])==0:
  240. del router_info['children']
  241. del router_info['redirect']
  242. del router_info['alwaysShow']
  243. router_info['path'] = router_info['path'][1:]
  244. routers_dict.append(router_info)
  245. # 返回构建好的路由数据
  246. return {
  247. "code": 200,
  248. "msg": "操作成功",
  249. "data": routers_dict #[router.dict() for router in routers] # 如果没有顶级菜单,返回空列表
  250. }
  251. except Exception as e:
  252. # 处理异常,返回错误信息
  253. raise HTTPException(status_code=500, detail=str(e))
  254. @router.get('/list')
  255. async def get_list(
  256. # request: Request,
  257. menuName: str = Query(None, max_length=100),
  258. status: str = Query(None, max_length=100),
  259. db: Session = Depends(get_db),
  260. body = Depends(remove_xss_json),
  261. user_id = Depends(valid_access_token)
  262. ):
  263. query = db.query(SysMenu)
  264. query = query.filter(SysMenu.del_flag != '2')
  265. if menuName:
  266. query = query.filter(SysMenu.menu_name.like(f'%{menuName}%'))
  267. if status:
  268. query = query.filter(SysMenu.status.like(f'%{status}%'))
  269. # 应用查询
  270. # menu_list = db.query(SysMenu).filter(
  271. # (SysMenu.menu_name.like(f'%{menu_name}%')) ,
  272. # (SysMenu.status.like(f'%{status}%'))
  273. # ).all()
  274. menu_list = query.all()
  275. # 将模型实例转换为字典
  276. menu_list_dict = [{
  277. "menuId": menu.menu_id,
  278. "menuName": menu.menu_name,
  279. "parentId": menu.parent_id,
  280. "orderNum": menu.order_num,
  281. "path": menu.path,
  282. "component": menu.component,
  283. "queryParam": menu.query_param,
  284. "isFrame": str(menu.is_frame),
  285. "isCache": str(menu.is_cache),
  286. "menuType": menu.menu_type,
  287. "visible": menu.visible,
  288. "status": menu.status,
  289. "perms": menu.perms,
  290. "icon": menu.icon,
  291. "createDept": menu.create_dept,
  292. "remark": menu.remark,
  293. "createTime": menu.create_time.strftime('%Y-%m-%d %H:%M:%S') if menu.create_time else '',
  294. "children": [] # 递归调用以获取子菜单
  295. } for menu in menu_list]
  296. # 构建分页响应
  297. # pagination_info = {
  298. # "total": total_count,
  299. # "page_num": page_num,
  300. # "page_size": page_size,
  301. # "total_pages": (total_count + page_size - 1) // page_size # 计算总页数
  302. # }
  303. return {
  304. "code": 200,
  305. "data": menu_list_dict,
  306. # 'pages': page_num, # 总页数
  307. # 'currentPage': page_num, # 当前页数
  308. # # 'current':current,
  309. # # 'total' : total,
  310. # 'total': total_count, # 总数据量
  311. # # 'size':size,
  312. # 'pageSize': page_size, # 页码
  313. # {
  314. # "items": menu_list_dict,
  315. # "pagination": pagination_info
  316. # },
  317. "msg": "操作成功"
  318. }
  319. @router.get('/layer_list')
  320. async def get_list(
  321. # request: Request,
  322. menuName: str = Query(None, max_length=100),
  323. status: str = Query(None, max_length=100),
  324. db: Session = Depends(get_db),
  325. body = Depends(remove_xss_json),
  326. user_id = Depends(valid_access_token)
  327. ):
  328. query = db.query(SysMenuLayer)
  329. query = query.filter(SysMenuLayer .del_flag != '2')
  330. if menuName:
  331. query = query.filter(SysMenuLayer.menu_name.like(f'%{menuName}%'))
  332. if status:
  333. query = query.filter(SysMenuLayer.status.like(f'%{status}%'))
  334. # 应用查询
  335. # menu_list = db.query(SysMenu).filter(
  336. # (SysMenu.menu_name.like(f'%{menu_name}%')) ,
  337. # (SysMenu.status.like(f'%{status}%'))
  338. # ).all()
  339. menu_list = query.all()
  340. # 将模型实例转换为字典
  341. menu_list_dict = [{
  342. "menuId": menu.menu_id,
  343. "menuName": menu.menu_name,
  344. "parentId": menu.parent_id,
  345. "orderNum": menu.order_num,
  346. "path": menu.path,
  347. "component": menu.component,
  348. "queryParam": menu.query_param,
  349. "isFrame": str(menu.is_frame),
  350. "isCache": str(menu.is_cache),
  351. "menuType": menu.menu_type,
  352. "visible": menu.visible,
  353. "status": menu.status,
  354. "perms": menu.perms,
  355. "icon": menu.icon,
  356. "createDept": menu.create_dept,
  357. "remark": menu.remark,
  358. "createTime": menu.create_time.strftime('%Y-%m-%d %H:%M:%S') if menu.create_time else '',
  359. "children": [] # 递归调用以获取子菜单
  360. } for menu in menu_list]
  361. # 构建分页响应
  362. # pagination_info = {
  363. # "total": total_count,
  364. # "page_num": page_num,
  365. # "page_size": page_size,
  366. # "total_pages": (total_count + page_size - 1) // page_size # 计算总页数
  367. # }
  368. return {
  369. "code": 200,
  370. "data": menu_list_dict,
  371. # 'pages': page_num, # 总页数
  372. # 'currentPage': page_num, # 当前页数
  373. # # 'current':current,
  374. # # 'total' : total,
  375. # 'total': total_count, # 总数据量
  376. # # 'size':size,
  377. # 'pageSize': page_size, # 页码
  378. # {
  379. # "items": menu_list_dict,
  380. # "pagination": pagination_info
  381. # },
  382. "msg": "操作成功"
  383. }
  384. @router.get('/{menuid}')
  385. async def get_list(
  386. # request: Request,
  387. menuid: str = Query(None, max_length=100),
  388. db: Session = Depends(get_db),
  389. body = Depends(remove_xss_json),
  390. user_id = Depends(valid_access_token)
  391. ):
  392. query = db.query(SysMenuLayer)
  393. query = query.filter(SysMenuLayer.del_flag != '2')
  394. if menuid:
  395. query = query.filter(SysMenuLayer.menu_id.like(f'{menuid}'))
  396. menu= query.first()
  397. # 将模型实例转换为字典
  398. menu_list_dict = {
  399. "menuId": menu.menu_id,
  400. "menuName": menu.menu_name,
  401. "parentId": menu.parent_id,
  402. "orderNum": menu.order_num,
  403. "path": menu.path,
  404. "component": menu.component,
  405. "queryParam": menu.query_param,
  406. "isFrame": str(menu.is_frame),
  407. "isCache": str(menu.is_cache),
  408. "menuType": menu.menu_type,
  409. "visible": menu.visible,
  410. "status": menu.status,
  411. "perms": menu.perms,
  412. "icon": menu.icon,
  413. "createDept": menu.create_dept,
  414. "remark": menu.remark,
  415. "createTime": menu.create_time.strftime('%Y-%m-%d %H:%M:%S') if menu.create_time else '',
  416. "children": [], # 递归调用以获取子菜单
  417. "layer_template":menu.layer_template
  418. }
  419. return {
  420. "code": 200,
  421. "data": menu_list_dict,
  422. "msg": "操作成功"
  423. }
  424. class SysMuneCreateForm(BaseModel):
  425. component:str = None
  426. icon : str
  427. isCache: str
  428. isFrame:str
  429. menuName: str
  430. menuType:str
  431. orderNum:int
  432. parentId:int
  433. path:str
  434. perms:str=None
  435. queryParam:str=None
  436. status:str
  437. visible:str
  438. layer_template:str
  439. @router.post('/create')
  440. async def create(
  441. form_data: SysMuneCreateForm,
  442. db: Session = Depends(get_db),
  443. body=Depends(remove_xss_json),
  444. user_id=Depends(valid_access_token)
  445. ):
  446. try:
  447. # 开始事务
  448. db.begin()
  449. # 创建新的菜单项
  450. new_menu = SysMenu(
  451. menu_name=form_data.menuName,
  452. parent_id=form_data.parentId,
  453. order_num=form_data.orderNum,
  454. path=form_data.path,
  455. is_frame=int(form_data.isFrame),
  456. is_cache=int(form_data.isCache),
  457. menu_type=form_data.menuType,
  458. visible=form_data.visible,
  459. status=form_data.status,
  460. icon=form_data.icon,
  461. component=form_data.component,
  462. perms=form_data.perms,
  463. query_param=form_data.queryParam,
  464. create_by=user_id
  465. )
  466. db.add(new_menu)
  467. # 创建新的菜单层,此时还不能使用new_menu.menu_id,因为它还没有被赋值
  468. new_menu_layer = SysMenuLayer(
  469. menu_id=None, # 先设置为None,稍后更新
  470. menu_name=form_data.menuName,
  471. parent_id=form_data.parentId,
  472. order_num=form_data.orderNum,
  473. path=form_data.path,
  474. is_frame=int(form_data.isFrame),
  475. is_cache=int(form_data.isCache),
  476. menu_type=form_data.menuType,
  477. visible=form_data.visible,
  478. status=form_data.status,
  479. icon=form_data.icon,
  480. component=form_data.component,
  481. perms=form_data.perms,
  482. query_param=form_data.queryParam,
  483. create_by=user_id,
  484. layer_template=form_data.layer_template
  485. )
  486. db.add(new_menu_layer)
  487. # 提交事务之前刷新new_menu以确保menu_id被数据库生成
  488. db.flush() # 使用flush而不是commit,这样可以保存数据但不结束事务
  489. db.refresh(new_menu) # 刷新new_menu对象以获取数据库生成的menu_id
  490. new_menu_layer.menu_id = new_menu.menu_id # 现在可以设置new_menu_layer的menu_id了
  491. # 如果需要,可以在这里再次刷新new_menu_layer,但通常不是必需的
  492. # db.refresh(new_menu_layer)
  493. # 提交事务
  494. db.commit()
  495. return {
  496. "code": 200,
  497. "data": new_menu_layer.menu_id, # 返回新创建的SysMenuLayer的ID
  498. "msg": "操作成功"
  499. }
  500. except Exception as e:
  501. # 如果发生异常,回滚事务
  502. db.rollback()
  503. raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
  504. class SysMuneUpdateForm(BaseModel):
  505. menuId : str
  506. component:str = None
  507. icon : str = None
  508. isCache: str = None
  509. isFrame:str = None
  510. menuName: str = None
  511. menuType:str = None
  512. orderNum:int = None
  513. parentId:int = None
  514. path:str = None
  515. perms:str=None
  516. queryParam:str=None
  517. status:str = None
  518. visible:str = None
  519. @router.put('')
  520. async def update(
  521. request: Request,
  522. # form_data: SysMuneUpdateForm,
  523. db: Session = Depends(get_db),
  524. body = Depends(remove_xss_json),
  525. user_id = Depends(valid_access_token)
  526. ):
  527. try:
  528. db.begin()
  529. query = db.query(SysMenu)
  530. query = query.filter(SysMenu.menu_id == body['menuId'])
  531. query = query.filter(SysMenu.del_flag != '2')
  532. menu = query.first()
  533. if not menu:
  534. detail = "菜单不存在"
  535. raise HTTPException(status_code=404, detail="菜单不存在")
  536. # 更新字段,排除主键和不可更新的字段
  537. if 'component' in body:
  538. menu.component=body['component']
  539. if 'icon' in body:
  540. menu.icon=body['icon']
  541. if 'isCache' in body:
  542. menu.is_cache=body['isCache']
  543. if 'isFrame' in body:
  544. menu.is_frame=body['isFrame']
  545. if 'menuName' in body:
  546. menu.menu_name=body['menuName']
  547. if 'menuType' in body:
  548. menu.menu_type=body['menuType']
  549. if 'orderNum' in body:
  550. menu.order_num=body['orderNum']
  551. if 'parentId' in body:
  552. menu.parent_id=body['parentId']
  553. if 'path' in body:
  554. menu.path=body['path']
  555. if 'perms' in body:
  556. menu.perms=body['perms']
  557. if 'queryParam' in body:
  558. menu.query_param=body['queryParam']
  559. if 'status' in body:
  560. menu.status=body['status']
  561. if 'visible' in body:
  562. menu.visible=body['visible']
  563. if user_id:
  564. menu.create_by = user_id
  565. # for field, value in menu_data.items():
  566. # if field != 'menu_id' and field in menu_to_update.__dict__:
  567. # setattr(menu_to_update, field, value)
  568. #
  569. # db.add(menu_to_update)
  570. # db.commit()
  571. queryLayer = db.query(SysMenuLayer)
  572. queryLayer = queryLayer.filter(SysMenuLayer.menu_id == body['menuId'])
  573. queryLayer = queryLayer.filter(SysMenuLayer.del_flag != '2')
  574. menu = queryLayer.first()
  575. if not menu:
  576. detail = "菜单不存在"
  577. raise HTTPException(status_code=404, detail="菜单不存在")
  578. # 更新字段,排除主键和不可更新的字段
  579. if 'component' in body:
  580. menu.component = body['component']
  581. if 'icon' in body:
  582. menu.icon = body['icon']
  583. if 'isCache' in body:
  584. menu.is_cache = body['isCache']
  585. if 'isFrame' in body:
  586. menu.is_frame = body['isFrame']
  587. if 'menuName' in body:
  588. menu.menu_name = body['menuName']
  589. if 'menuType' in body:
  590. menu.menu_type = body['menuType']
  591. if 'orderNum' in body:
  592. menu.order_num = body['orderNum']
  593. if 'parentId' in body:
  594. menu.parent_id = body['parentId']
  595. if 'path' in body:
  596. menu.path = body['path']
  597. if 'perms' in body:
  598. menu.perms = body['perms']
  599. if 'queryParam' in body:
  600. menu.query_param = body['queryParam']
  601. if 'status' in body:
  602. menu.status = body['status']
  603. if 'visible' in body:
  604. menu.visible = body['visible']
  605. if user_id:
  606. menu.create_by = user_id
  607. if user_id:
  608. menu.layer_template =body['layer_template']
  609. db.commit()
  610. return {
  611. "code": 200,
  612. "msg": "菜单更新成功"
  613. }
  614. except Exception as e:
  615. # db.rollback()
  616. if str(e)=='':
  617. e = detail
  618. raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
  619. @router.delete('/{menu_id}')
  620. async def delete(
  621. menu_id: int,
  622. db: Session = Depends(get_db),
  623. body = Depends(remove_xss_json),
  624. user_id = Depends(valid_access_token)
  625. ):
  626. try:
  627. db.begin()
  628. query = db.query(SysMenu)
  629. query = query.filter(SysMenu.menu_id == menu_id)
  630. query = query.filter(SysMenu.del_flag != '2')
  631. menu_to_delete =query.first()
  632. if not menu_to_delete:
  633. detail = "菜单不存在"
  634. raise HTTPException(status_code=404, detail="菜单不存在")
  635. menu_to_delete.create_by = user_id
  636. menu_to_delete.del_flag='2'
  637. # db.delete(menu_to_delete)
  638. # db.commit()
  639. queryLayer = db.query(SysMenuLayer)
  640. queryLayer = queryLayer.filter(SysMenuLayer.menu_id == menu_id)
  641. queryLayer = queryLayer.filter(SysMenuLayer.del_flag != '2')
  642. menu_to_delete = queryLayer.first()
  643. if not menu_to_delete:
  644. detail = "菜单不存在"
  645. raise HTTPException(status_code=404, detail="菜单不存在")
  646. menu_to_delete.create_by = user_id
  647. menu_to_delete.del_flag = '2'
  648. db.commit()
  649. return {
  650. "code": 200,
  651. "msg": "菜单删除成功"
  652. }
  653. except Exception as e:
  654. db.rollback()
  655. if str(e)=='':
  656. e = detail
  657. raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))