Python 递归返回树形菜单JSON串 <flask>
需求:菜单管理功能(增、删、改),多级树形菜单展示
数据库表设计
create table if not exists Menu(
id serial primary key ,
title varchar (50) not null ,
parent_id int ,
url varchar (100),
app_id int ,
icon varchar (50),
sortby int default 0,
create_time timestamp,
update_time timestamp,
foreign key (parent_id) references Menu(id) on delete cascade on update cascade
);
Model 定义
class Menu:
def __init__(self, id, title, parent_id, url, app_id, icon, sort_by, create_time, update_time, subMenus):
self._id = id
self._title = title
self._parent_id = parent_id
self._url = url
self._app_id = app_id
self._icon = icon
self._sortby = sort_by
self._create_time = create_time
self._update_time = update_time
self._subMenus = subMenus @property
def id(self):
return self._id
@property
def title(self):
return self._title
@property
def parent_id(self):
return self._parent_id
@property
def url(self):
return self._url
@property
def app_id(self):
return self._app_id
@property
def icon(self):
return self._icon
@property
def sortby(self):
return self._sortby
@property
def subMenus(self):
return self._subMenus
理论上Models应该中的参数应该和数据库表字段对应,但是subMenus我们不需要存库,反给前端用的。
核心代码
def set_subMenus(id, menus):
"""
:param id: 父id
:param subMenu:子菜单列表
:return: 没有子菜单返回None 有子菜单返回子菜单列表
"""
try:
_subMenus = [] for menu in menus:
if menu.parent_id == id:
_subMenus.append(menu)
for sub in _subMenus:
menu2 = _query_sub_menu_info(sub.id)
if len(menus):
sub._subMenus = set_subMenus(sub.id, menu2)
else:
sub.__delattr__('_subMenus')
# 子菜单列表不为空
if len(_subMenus):
# print(sub_list)
return _subMenus
else: # 没有子菜单了
return None
except Exception as e:
LOG.exception('error query_sub_menu_info !')
raise e
_query_sub_menu_info 方法是查询返回 测试方法:
def test_sub_menu_list(self):
Menus = []
rootMenu = GuardianModelDao._query_root_menu_info()
for root in rootMenu:
subMenu = GuardianModelDao._query_sub_menu_info(root.id)
root = jsonpickle.loads(jsonpickle.encode(root))
if root.subMenus is not None:
root.subMenus.append(GuardianModelDao.set_subMenus(root.id, subMenu))
Menus.append(root)
Python 递归返回树形菜单JSON串 <flask>的更多相关文章
- 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等
1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...
- PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹
PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...
- java 传入list集合 返回树形菜单,for循环遍历
public List<SysPermissionVO> getTreeMenu(List<SysPermissionVO> list,SysPermissionVO sysP ...
- [Python] 递归返回值 为 None 的问题
递归返回值 为 None 的问题 解决办法: 在递归调用下一个 递归 函数前面,一定要加上 return,否则就会返回 None 如红色 所处的return: def getAllCityUrl(ur ...
- JAVA递归生成树形菜单
递归生成一个如图的菜单,编写两个类数据模型Menu.和创建树形的MenuTree.通过以下过程实现: 1.首先从菜单数据中获取所有根节点. 2.为根节点建立次级子树并拼接上. 3.递归为子节点建立次级 ...
- python字典、字符串(json串)、字节串之间的转化
字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps(): 字典→json字符串 json.loads(): json字符 ...
- Unity 引擎UGUI之自定义树形菜单(TreeView)
先上几张效果图: 如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三 ...
- DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...
- 构建简单的json树形菜单
json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func: ...
随机推荐
- wcf文件上传时碰到的配置问题
1.远程服务器返回了意外相应:(413) Request Entity Too Large 修改客户端配置maxReceivedMessageSize="2147483647" & ...
- 小议C#接口的隐式与显示实现
小弟不才,各位大牛嘴下留情... 一.对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法 例如 public interface IA { void Test(); } publi ...
- 图像读取Exif小知识,图像扶正,还原拍摄时的角度
在做人脸识别的时候发现很多手机拍摄的图像在C#读取之后方向出现了错误,Bitmap中的宽度和实际的windows的文件属性内的参数相反,引起一阵测试和思考,后来百度出来可以用Exif来解决 githu ...
- 多态实现的原理------新标准c++程序设计
“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定.例子: #include<iostream> using namespac ...
- 互斥锁与join
三 互斥锁与join 使用join可以将并发变成串行,互斥锁的原理也是将并发变成穿行,那我们直接使用join就可以了啊,为何还要互斥锁,说到这里我赶紧试了一下 #把文件db.txt的内容重置为:{&q ...
- kali 插耳机没声音
打开终端,然后输入命令:下载pulseaudio音量控制软件: apt install pavucontrol 然后终端输入指令:pavucontrol打开软件,发现在输出设备中有两个输出设备:一个N ...
- Python3之requests模块
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 发送G ...
- 0.jQuery选择器
左边的是jQuery用法 右边是js用法 $("tag") == document.getElementsByTagName("tag"); $(". ...
- java技术
线程池的原理及实现:https://blog.csdn.net/hsuxu/article/details/8985931 Java高级工程师面试题总结及参考答案:https://www.cnblog ...
- LeetCode902. Numbers At Most N Given Digit Set
题目: We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}. ...