__init__.py 23 KB

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