__init__.py 26 KB

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