南宁网站开发公司,网站建设费用大概多少钱,seo快排软件,网络维护年终个人工作总结最近需要用python写一个菜单#xff0c;折腾了两三天才搞定#xff0c;现在记录在此#xff0c;需要的朋友可以借鉴一下。备注#xff1a;文章引用非可执行完整代码#xff0c;仅仅摘录了关键部分的代码环境数据库#xff1a;mysqlpython#xff1a;3.6表结构CREATE TAB…最近需要用python写一个菜单折腾了两三天才搞定现在记录在此需要的朋友可以借鉴一下。备注文章引用非可执行完整代码仅仅摘录了关键部分的代码环境数据库mysqlpython3.6表结构CREATE TABLE tb_menu (id varchar(32) NOT NULL COMMENT 唯一标识,menu_name varchar(40) DEFAULT NULL COMMENT 菜单名称,menu_url varchar(100) DEFAULT NULL COMMENT 菜单链接,type varchar(1) DEFAULT NULL COMMENT 类型,parent varchar(32) DEFAULT NULL COMMENT 父级目录id,del_flag varchar(1) NOT NULL DEFAULT 0 COMMENT 删除标志 0不删除 1已删除,create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,PRIMARY KEY (id) USING BTREE) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT菜单表;Python代码Menu对象中有一个子菜单列表的引用“subMenus”类型为list核心代码def set_subMenus(id, menus):根据传递过来的父菜单id递归设置各层次父菜单的子菜单列表:param id: 父级id:param menus: 子菜单列表:return: 如果这个菜单没有子菜单返回None;如果有子菜单返回子菜单列表# 记录子菜单列表subMenus []# 遍历子菜单for m in menus:if m.parent id:subMenus.append(m)# 把子菜单的子菜单再循环一遍for sub in subMenus:menus2 queryByParent(sub.id)# 还有子菜单if len(menus):sub.subMenus set_subMenus(sub.id, menus2)# 子菜单列表不为空if len(subMenus):return subMenuselse: # 没有子菜单了return None测试方法def test_set_subMenus(self):# 一级菜单rootMenus queryByParent()for menu in rootMenus:subMenus queryByParent(menu.id)menu.subMenus set_subMenus(menu.id, subMenus)备注基本流程是先查询一级菜单然后分别把该级菜单的id、和这级菜单的子菜单列表传入set_subMenus方法递归进行子菜单列表的下级菜单设置支持传递菜单Id查询该菜单下面的所有子菜单。传递空字符则从根目录开始查询在“rootMenus ”对象中可以看到完整的菜单树形结构转Json我采用的ORM框架是sqlalchemy直接从数据库中查询出来的Menu对象转Json时会报错。需要重新定义一个DTO类来把Menu对象转成Dto对象。MenuDtoclass MenuDto():def __init__(self, id, menu_name, menu_url, type, parent, subMenus):super().__init__()self.id idself.menu_name menu_nameself.menu_url menu_urlself.type typeself.parent parentself.subMenus subMenusdef __str__(self):return %s(id%s,menu_name%s,menu_url%s,type%s,parent%s) % (self.__class__.__name__, self.id, self.menu_name, self.menu_url, self.type, self.parent)__repr __str__于是重新定义了递归设置子菜单的方法def set_subMenuDtos(id, menuDtos):根据传递过来的父菜单id递归设置各层次父菜单的子菜单列表:param id: 父级id:param menuDtos: 子菜单列表:return: 如果这个菜单没有子菜单返回None;如果有子菜单返回子菜单列表# 记录子菜单列表subMenuDtos []# 遍历子菜单for m in menuDtos:m.name to_pinyin(m.menu_name)if m.parent id:subMenuDtos.append(m)# 把子菜单的子菜单再循环一遍for sub in subMenuDtos:menus2 queryByParent(sub.id)menusDto2 model_list_2_dto_list(menus2,MenuDto(id, menu_name, menu_url, type, parent, subMenus))# 还有子菜单if len(menuDtos):if len(menusDto2):sub.subMenus set_subMenuDtos(sub.id, menusDto2)else: # 没有子菜单删除该节点sub.__delattr__(subMenus)# 子菜单列表不为空if len(subMenuDtos):return subMenuDtoselse: # 没有子菜单了return None备注当一个菜单没有子菜单时删除掉“subMenus”属性否则转Json时会出现空值model_list_2_dto_list 方法可以把Menu列表转成MenuDto列表to_pinyin 是把汉字转成拼音的方法在这里不用关注View层返回Json的方法def get(self):param request.argsid param[id]# 如果id为空查询的是从根目录开始的各级菜单rootMenus queryByParent(id)rootMenuDtos model_list_2_dto_list(rootMenus,MenuDto(id, menu_name, menu_url, type, parent, subMenus))# 设置各级子菜单for menu in rootMenuDtos:menu.name to_pinyin(menu.menu_name)subMenus queryByParent(menu.id)if len(subMenus):subMenuDtos model_list_2_dto_list(subMenus,MenuDto(id, menu_name, menu_url, type, parent, subMenus))menu.subMenus set_subMenuDtos(menu.id, subMenuDtos)else:menu.__delattr__(subMenus)menus_json json.dumps(rootMenuDtos, defaultlambda o: o.__dict__, sort_keysTrue, allow_nanfalse,skipkeystrue)# 需要转字典否则返回的字符串会带有“\”menus_dict json_dict(menus_json)return fullResponse(menus_dict)fullResponsefrom flask import jsonifydef fullResponse(data, msg, code0):if msg :return jsonify({code: code, data: data})elif data :return jsonify({code: code, msg: msg})else:return jsonify({code: code, msg: msg, data: data})备注python中json和字典的含义类似在最后json返回给页面时需要先使用json_dict方法转成dict类型否则返回的字符串中会带有“\”查询结果以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家。