__init__.py 24 KB

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