需求:菜单管理功能(增、删、改),多级树形菜单展示

数据库表设计

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>的更多相关文章

  1. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  2. PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹

    PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...

  3. java 传入list集合 返回树形菜单,for循环遍历

    public List<SysPermissionVO> getTreeMenu(List<SysPermissionVO> list,SysPermissionVO sysP ...

  4. [Python] 递归返回值 为 None 的问题

    递归返回值 为 None 的问题 解决办法: 在递归调用下一个 递归 函数前面,一定要加上 return,否则就会返回 None 如红色 所处的return: def getAllCityUrl(ur ...

  5. JAVA递归生成树形菜单

    递归生成一个如图的菜单,编写两个类数据模型Menu.和创建树形的MenuTree.通过以下过程实现: 1.首先从菜单数据中获取所有根节点. 2.为根节点建立次级子树并拼接上. 3.递归为子节点建立次级 ...

  6. python字典、字符串(json串)、字节串之间的转化

    字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps():   字典→json字符串 json.loads():     json字符 ...

  7. Unity 引擎UGUI之自定义树形菜单(TreeView)

    先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三 ...

  8. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案

    最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...

  9. 构建简单的json树形菜单

    json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func: ...

随机推荐

  1. Oracle动态执行表不可访问

    在scott 用户下,执行查询语句是出现"Oracle动态执行表不可访问" 经查,是因为用户权限不够所致,修改scott用户权限语句如下: grant select on V_$s ...

  2. asp.net mvc 中通过url字符串获取controller和action

    在项目中遇到需要通过url字符串获取controller和action的情况,百度了 一下找到了一个可以用的方法 ,在这里分享和记录一下 这个方法是在博客园的博问里看到的 原文地址是http://q. ...

  3. C# 向TIM或者QQ自动发送中文消息【微信也是可用的】 附测试GIF

    之前用C++简单的写了一个demo 现在用C#写了完整版 定义字符 定义发送数量 定义发送对象 注意事项 QQ必须单独一个窗体 微信对象在输入名字的时候必须写微信 源代码 using System; ...

  4. Django + Gunicorn + Nginx 部署 Ubuntu 服务器

    Django + Gunicorn + Nginx 部署服务器 获取腾讯云 root权限 本人的服务器使用的是腾讯云,腾讯云默认是没有开放 root 用户的,我们来创建 root 用户. 创建 roo ...

  5. Linux里的用户管理

    在linux中系统中,它并不认识帐号名称.它认识的是我们的帐号ID,帐号ID保存在/etc/passwd文件中.我们在登录linux主机时,在输入完帐号和密码时,linux会先查找/etc/passw ...

  6. MongoDB集群配置笔记

    firewall-cmd --query-port=27017/tcp yum install system-config-firewall-tui firewall-cmd --zone=publi ...

  7. 蓝牙4.0BLE抓包(二) – 广播包解析

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播 ...

  8. Java ExecutorService 四种线程池

    1.new Thread的弊端 new Thead(new Runnable(){ @Override public void run() { // TODO Auto-generated metho ...

  9. Exadata 18.1新特性--计算节点升级增强

    新的计算节点升级增强能大幅缩短升级花费的时间,最快能减少40%的时间,具体的增强主要体现在以下方面: 1.计算节点操作系统的备份工作. 以前计算节点操作系统的备份工作是在正式升级之前执行,在滚动升级过 ...

  10. 利用EFCore 封装Repository(可扩展不同数据的sql操作)

    本篇是对EFCore 进行下封装并实现基本的增删改查的同步异步方法及针对不同数据库的批量插入.sql语句直接操作数据库: 一. 先定义基础仓储接口IRepository public interfac ...