菜单

本身的首先个python web开拓框架(1七)——产品管理,pythonweb

2019年5月3日 - 金沙编程资讯

 

 1 @get('/api/main/menu_info/') 2 def callback(): 3     """ 4     主页面获取菜单列表数据 5     """ 6     _menu_info_logic = menu_info_logic.MenuInfoLogic() 7     # 读取记录 8     result = _menu_info_logic.get_list('*', 'is_show and is_enabled', orderby='sort') 9     if result:10         # 定义最终输出的html存储变量11         html = ''12         for model in result.get('rows'):13             # 提取出第一级菜单14             if model.get('parent_id') == 0:15                 # 添加一级菜单16                 temp = """17                 <dl >18                     <dt><i >%s</i> %s<i >&#xe6d5;</i></dt>19                     <dd>20                         <ul>21                 """ % {'id': model.get('id'), 'icon': model.get('icon'), 'name': model.get('name')}22                 html = html + temp23 24                 # 从所有菜单记录中提取当前一级菜单下的子菜单25                 for sub_model in result.get('rows'):26                     # 如果父id等于当前一级菜单id,则为当前菜单的子菜单27                     if sub_model.get('parent_id') == model.get('id'):28                         temp = """29                         <li><a data-href="%s" data-title="%s" href="javascript:void">%s</a></li>30                     """ % {'page_url': sub_model.get('page_url'), 'name': sub_model.get('name')}31                         html = html + temp32 33                 # 闭合菜单html34                 temp = """35                         </ul>36                     </dd>37                 </dl>38                     """39                 html = html + temp40 41         return web_helper.return_msg(0, '成功', {'menu_html': html})42     else:43         return web_helper.return_msg(-1, "查询失败")

本人的率先个python web开拓框架(一柒)——产品管理,pythonweb

  那是后台管理体系最后1个成效,产品管理,它的接口与页面效果与上一章大约。

图片 1

 

图片 2

 

  获取产品列表接口

图片 3 1@get(‘/api/product/’) ② def callback(): ③ “”” 四 获取列表数据 五 “”” 陆 #
设置查询条件 柒 wheres = ” 八 # 产品分类id 九 product_class_id =
convert_helper.to_int0(web_helper.get_query(‘product_class_id’,
”, is_check_null=False)) 10 if product_class_id > 0: 11 wheres =
‘where product_class_id=’ + str(product_class_id) 12 # 页面索引 1三page_number = convert_helper.to_int1(web_helper.get_query(‘page’,
”, is_check_null=False)) 14 # 页面展现记录数据 壹五 page_size =
convert_helper.to_int0(web_helper.get_query(‘rows’, ”,
is_check_null=False)) 16 # 排序字段 1七 sidx =
web_helper.get_query(‘sidx’, ”, is_check_null=False) 18 #
顺序还是倒序排序 1九 sord = web_helper.get_query(‘sord’, ”,
is_check_null=False) 20 # 开头化排序字段 21 order_by = ‘id desc’ 22
if sidx: 23 order_by = sidx + ‘ ‘ + sord 24 25
#############################################################
26 # 初步化输出格式(前端选取jqgrid列表,必要钦赐输出格式) 贰七 data = {
2八 ‘records’: 0, 2九 ‘total’: 0, 30 ‘page’: 壹, 31 ‘rows’: [], 32 } 33
#############################################################
34 # 实行sql,获取钦命条件的记录总量量 35 sql = ‘select count(一) as
records from product %(wheres)s’ % {‘wheres’: wheres} 3陆 result =
db_helper.read(sql) 37 #
即便查询失败或不设有内定条件记录,则一向重回起初值 38 if not result or
result[0][‘records’] == 0: 39 return data 40 # 保存总记录数据 4一data[‘records’] = result[0].get(‘records’, 0) 42 43
#############################################################
44 ### 设置分页索引与页面大小 ### 45 # 设置分页大小 4陆 if
page_size is None or page_size <= 0: 47 page_size = 10 48 #
总结总页数 4玖 if data[‘records’] % page_size == 0: 50 page_total =
data[‘records’] // page_size 51 else: 52 page_total =
data[‘records’] // page_size + 1 53 # 记录总页面数量 5四data[‘total’] = page_total 55 56 # 推断提交的页码是还是不是赶过范围 5七 if
page_number < 1 or page_number > page_total: 58 page_number =
page_total 59 # 记录当前页面索引值 60 data[‘page’] = page_number 61
62 # 计算当前页面要显得的记录起初地方 六叁 record_number = (page_number

  这些接口多了按产品分类id查询的典型化,假设少了那么些的话,直接将成品分类字段替换为产品字段变量就能够了。

  大家能够看出这里的代码好像有点复杂。是的,这里要拓展分页查询举办了分页管理,所以代码有点多,可是写了很详细的笺注,只要您对python的中坚语法、字典的拍卖通晓,然后对此前工具函数这里按供给重写过测试用例,那么对读书那段代码是一向不什么大标题标。

  上面再另行帮我们耳熟能详一下眼前讲述过的工具函数

product_class_id = convert_helper.to_int0(web_helper.get_query('product_class_id', '产品分类id', is_check_null=False))

  这是得到客户端(HTML)用AJAX提交上去的产品分类id接收管理,如果您认真看过前边工具函数内容的话,看到web_helper.get_query()那个函数应该会很熟习,它正是收获GET情势提交值的接收函数,第三个参数是要吸收的变量名称,第二个参数是其1变量的普通话表明,第多个是在吸收接纳参数时,是不是做非空推断,当前设置为那不是必填项。暗中认可它为True,当为True时,若是客户端从未交到那一个参数值,则系统活动会重返“xxx
不允许为空”,这几个xxx正是第一个参数,也便是目前变量的国语表明,还有别的参数我们可以打看web_helper.py查看。

  convert_helper.to_int0()那些函数,在前边工具函数第三篇中讲到的函数,它会将收取到的参数字符串转为int类型值,借使这几个参数小于0时,会自行使用默许值0代替。

 

sql = 'select count(1) as records from product %(wheres)s' % {'wheres': wheres}

  使用习贯O宝马X5M的仇敌或然会不太习贯从来写sql语句,本类别第一片段注重面向未有何基础的相恋的人,所以尽量不封装各系列和函数,那样我们一贯看出内容会更便于了然。第3部分会教大家本身轻便包装五个OPAJEROM,到时重构后再也代码就能够缩减大部分。

  上边那行是收获当前询问有个别许条记下的sql语句,熟稔python字符串替换的心上人应该会很熟练,它会将字符串%前边的字典内容取代字符串中对应的键值,假如wheres值为空时,则替换空值,将要%(wheres)s那一个键值替换掉。

  python的字符串替换有各个主意,而那边运用字典方式来替换会让代码可读性越来越高,而且字典中相继值的地方无需按一定情势摆放,不易于失误。

 

  获取钦定id的笔录实体

 1 @get('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     获取指定记录
 5     """
 6     sql = """select * from product where id = %s""" % (id,)
 7     # 读取记录
 8     result = db_helper.read(sql)
 9     if result:
10         # 直接输出json
11         return web_helper.return_msg(0, '成功', result[0])
12     else:
13         return web_helper.return_msg(-1, "查询失败")

  那段代码相比较轻巧,第4行使用的就是%s替换字符串情势,前边的元组(id,) 
好像python三随后元组里不加逗号替换也向来不难题,python2是确定要加的。

 

  增加产品与修改产品接口

图片 4 1@post(‘/api/product/’) 2 def callback(): 3 “”” 四 新增添记录 五 “”” 六 name =
web_helper.get_form(‘name’, ‘产品名称’) 7 code =
web_helper.get_form(‘code’, ‘产品编码’) 8 product_class_id =
convert_helper.to_int0(web_helper.get_form(‘product_class_id’,
‘产品分类’)) 9 standard = web_helper.get_form(‘standard’, ‘产品规格’)
10 quality_guarantee_period =
web_helper.get_form(‘quality_guarantee_period’, ‘保质期’) 11
place_of_origin = web_helper.get_form(‘place_of_origin’, ‘产地’)
12 front_cover_img = web_helper.get_form(‘front_cover_img’,
‘封面图片’) 壹叁 content = web_helper.get_form(‘content’, ‘产品描述’,
is_check_special_char=False) 14 # 防sql注入攻击处理 15 content =
string_helper.filter_str(content, “‘”) 16 # 防xss攻击管理 1柒 content
= string_helper.clear_xss(content) 18 is_enable =
convert_helper.to_int0(web_helper.get_form(‘is_enable’,
‘是还是不是启用’)) 19 20 #
增添记录(使用returning那一个函数能回到钦定的字段值,这里须要重临新扩大加记录的自增id值)
2壹 sql = “””insert into product (name, code, product_class_id,
standard, quality_guarantee_period, 22 place_of_origin,
front_cover_img, content, is_enable) 23 values (%s, %s, %s, %s, %s,
%s, %s, %s, %s) returning id””” 24 vars = (name, code,
product_class_id, standard, quality_guarantee_period,
place_of_origin, front_cover_img, content, is_enable) 25 #
写入数据库 26 result = db_helper.write(sql, vars) 27 #
推断是不是交付成功 2捌 if result and result[0].get(‘id’): 29 return
web_helper.return_msg(0, ‘成功’) 30 else: 31 return
web_helper.return_msg(-一, “提交战败”) 3二 33 3四@put(‘/api/product/<id:int>/’) 35 def callback(id): 3陆 “”” 三七修改记录 3八 “”” 39 40 name = web_helper.get_form(‘name’, ‘产品名称’)
四一 code = web_helper.get_form(‘code’, ‘产品编码’) 4二product_class_id =
convert_helper.to_int0(web_helper.get_form(‘product_class_id’,
‘产品分类’)) 4三 standard = web_helper.get_form(‘standard’, ‘产品规格’)
44 quality_guarantee_period =
web_helper.get_form(‘quality_guarantee_period’, ‘保质期’) 45
place_of_origin = web_helper.get_form(‘place_of_origin’, ‘产地’)
46 front_cover_img = web_helper.get_form(‘front_cover_img’,
‘封面图片’) 4柒 content = web_helper.get_form(‘content’, ‘产品描述’,
is_check_special_char=False) 48 # 防sql注入攻击管理 4玖 content =
string_helper.filter_str(content, “‘”) 50 # 防xss攻击管理 5壹 content
= string_helper.clear_xss(content) 52 is_enable =
convert_helper.to_int0(web_helper.get_form(‘is_enable’,
‘是不是启用’)) 伍三 5肆 # 编辑记录 55 sql = “”” 56 update product 伍柒 set
name=%s, code=%s, product_class_id=%s, standard=%s,
quality_guarantee_period=%s, 58 place_of_origin=%s,
front_cover_img=%s, content=%s, is_enable=%s 59 where id=%s returning
id””” 60 vars = (name, code, product_class_id, standard,
quality_guarantee_period, place_of_origin, front_cover_img,
content, 61 is_enable, id) 62 # 写入数据库 63 result =
db_helper.write(sql, vars) 64 # 判别是不是交由成功 6五 if result and
result[0].get(‘id’): 66 return web_helper.return_msg(0, ‘成功’) 67
else: 68 return web_helper.return_msg(-一, “提交失利”) View Code

  使用非get形式交给时,即选择post、put、delete等方法提交参数时,须求接纳web_helper.get_form()函数来接过,这点我们要专注,不然就能够博得不到客户端提交的参数值

    # 添加记录(使用returning这个函数能返回指定的字段值,这里要求返回新添加记录的自增id值)
    sql = """insert into product (name, code, product_class_id, standard, quality_guarantee_period,
                place_of_origin, front_cover_img, content, is_enable)
              values (%s, %s, %s, %s, %s, %s, %s, %s, %s) returning id"""
    vars = (name, code, product_class_id, standard, quality_guarantee_period, place_of_origin, front_cover_img, content, is_enable)
    # 写入数据库
    result = db_helper.write(sql, vars)

  新添记录时,轻松出错的地点是参数中的%s与字段数量不相配,这里大家要留意一下。此外,在insert语句的后尾最佳拉长returning
id或returning * 
再次回到新扩张记录值或任何记录实体,方便用来剖断是或不是插入成功,即便回到那么些剧情的话,比较难决断数据库记录是或不是丰硕成功了

    # 编辑记录
    sql = """
          update product
            set name=%s, code=%s, product_class_id=%s, standard=%s, quality_guarantee_period=%s,
                place_of_origin=%s, front_cover_img=%s, content=%s, is_enable=%s
          where id=%s returning id"""
    vars = (name, code, product_class_id, standard, quality_guarantee_period, place_of_origin, front_cover_img, content,
            is_enable, id)
    # 写入数据库
    result = db_helper.write(sql, vars)

  更新记录时,参数元组中著录要将记录的id值放进来,不然也会并发sql施行分外的难题,那个也是便于出错的地点。

 

  删除记录接口

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 编辑记录
 7     sql = """delete from product where id=%s returning id"""
 8     vars = (id,)
 9     # 写入数据库
10     result = db_helper.write(sql, vars)
11     # 判断是否提交成功
12     if result:
13         return web_helper.return_msg(0, '成功')
14     else:
15         return web_helper.return_msg(-1, "删除失败")

  

  前端代码大家本身能够相比较一下上一章,看看有如何两样

  非凡多谢Sunshine-X
的提醒,在成品编辑页面包车型客车js中,增添了保留成功后jqgrid表格刷新代码(本身前端对比菜)

  前边附上完整的档案的次序代码

 

 

  正文对应的源码下载

 

版权申明:本文原创公布于 和讯,小编为 AllEmpty 本文欢迎转发,但未经作者同意必须保留此段注脚,且在篇章页面明显地方给出原来的文章连接,不然正是侵权。

python开辟QQ群:669058475    小编博客:

 

web开采框架(一柒)——产品管理,pythonweb
那是后台处理种类最后三个效果,产品质量管理理理,它的接口与页面效果与上壹章大约…

  产品分类相关接口(product_class.py)与制品有关接口(product.py)功效大致,具体落到实处本身就不1一解说了,大家能够友善尝试

  前边的接口大家也改变一下

图片 5

  一.有未有代表可以完毕的不2诀要存在

  代码看起来十分长,有点复杂,对于那种列表分页查询,假设不封装的话,开辟时复制粘贴就很轻便失误,所以大家供给重新管理才行。

  对于后台管理类别的话,要办好权限管理离不开菜单项和页面按键控件效率的管制。由于程序无法智能的掌握有何菜单和控件,哪些人有着什么样操作权限,所以首先要做的是菜单管理效果,将索要管住的菜单项和1一职能项加多到菜单处理表中,方便后续权限调整管理。

  产品分类的删减分类接口大家会看到它的代码与制品删除接口差不离,但是多了3个该分类是不是已经被引用的三个确定,对于这么些下边专门求证一下

 1             #########################################################
 2             ### 设置分页索引与页面大小 ###
 3             if page_size <= 0:
 4                 page_size = 10
 5             # 计算总分页数量:通过总记录数除于每页显示数量来计算总分页数量
 6             if data['records'] % page_size == 0:
 7                 page_total = data['records'] // page_size
 8             else:
 9                 page_total = data['records'] // page_size + 1
10             # 判断页码是否超出限制,超出限制查询时会出现异常,所以将页面索引设置为最后一页
11             if page_number < 1 or page_number > page_total:
12                 page_number = page_total
13             # 记录总页面数量
14             data['total'] = page_total
15             # 记录当前页面值
16             data['page'] = page_number
17             # 计算当前页面要显示的记录起始位置(limit指定的位置)
18             record_number = (page_number - 1) * page_size
19             # 设置查询分页条件
20             paging = ' limit ' + str(page_size) + ' offset ' + str(record_number)
21         #############################################################

版权评释:本文原创发布到今后日头条,小编为AllEmpty本文接待转发,但未经作者同意必须保留此段注解,且在篇章页面分明地点给出原著连接,不然就是侵权。

1     ##############################################################
2     ### 获取登录用户记录,并进行登录验证 ###
3     ##############################################################
4     _manager_logic = manager_logic.ManagerLogic()
5     # 从数据库中读取用户信息
6     manager_result = _manager_logic.get_model_for_cache_of_where('login_name=' + string(username))
7     # 判断用户记录是否存在
8     if not manager_result:
9         return web_helper.return_msg(-1, '账户不存在')

  首先,我们对下面代码的分析,可以提炼出分页查询办法必要有下边参数:查询字段、查询条件、当前分页索引值、每页显示记录数据、排序。如若是多表查询时,大家的O兰德EscortM是直接绑定当前表单的就不适用了,所以还索要有个设置表名的参数,好灵活管理各个须求,依照那一个供给,我们得以成立好列表查询办法:

  接下去我们先完毕菜单列表获取接口,由第二片段的后端管理效果能够清楚,大家前端采纳的是jqGrid插件,这一块大家在目前早已落实过了,而OENVISIONM中也封装好对应的点子,所以一直调用就足以了。(这些接口在促成时,大家要询问清楚的是,前端插件jqGrid它会传送什么参数和内需回到什么格式的数额回去)

  三.假如它只是对点名表单操作时才用到,就将它包裹到该逻辑层子类,方便该子类要用到时能够每天调用

版权申明:本文原创公布于 博客园,作者为 AllEmpty 本文招待转发,但未经小编同意必须保留此段注明,且在篇章页面鲜明地方给出原来的文章连接,否则视为侵权。

 1 @delete('/api/system/menu_info/<id:int>/') 2 def callback: 3     """ 4     删除指定记录 5     """ 6     _menu_info_logic = menu_info_logic.MenuInfoLogic() 7     # 判断要删除的节点是否有子节点,是的话不能删除 8     if _menu_info_logic.exists('parent_id=' + str: 9         return web_helper.return_msg(-1, "当前菜单存在子菜单,不能直接删除")10 11     # 删除记录12     result = _menu_info_logic.delete_model13     if result:14         return web_helper.return_msg(0, '删除成功')15     else:16         return web_helper.return_msg(-1, "删除失败")

  那段代码后半片段能够参见产品的去除接口落成,前半部分需求调用产品艺术进行剖断管理。

  除了产品列表这一个接口,大家可以看看产品分类列表接口,会发觉七个接口第三局地到第4局地都大概,所以大家封装OCRUISERM时,能够将这么些相似部分开始展览管理,将它们封装到ORubiconM对应的主意里。

  要付出多少个菜单管理职能,离不开那几个成效:菜单列表显示(须求菜单列表获取接口)、新添菜单、编辑菜单(获取菜单记录以及交付修改接口)、删除菜单,由于菜单是多层级的关系,所以还索要充实菜单树列表获取接口来绑定菜单层级,在主页面还亟需追加菜单列表项输出接口,用来彰显菜单项。

  有了那么些主意,大家就能够传承对成品分类删除接口举行改造了

 

  菜单管理项增多落成后,列表效果图

 1 @delete('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     # 判断该分类是否已经被引用,是的话不能直接删除
 9     if _product_logic.exists('product_class_id=' + str(id)):
10         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
11 
12     # 实例化product_class表操作类product_class_logic
13     _product_class_logic = product_class_logic.ProductClassLogic()
14     result = _product_class_logic.delete_model(id)
15     # 判断是否提交成功
16     if result:
17         return web_helper.return_msg(0, '成功')
18     else:
19         return web_helper.return_msg(-1, "删除失败")
 1         ### 按条件查询数据库记录
 2         sql = "select %(column_name_list)s from %(table_name)s %(wheres)s order by %(orderby)s %(paging)s" % \
 3               {'column_name_list': column_name_list,
 4                'table_name': table_name,
 5                'wheres': wheres,
 6                'orderby': orderby,
 7                'paging': paging}
 8         result = db.execute(sql)
 9         if result:
10             data['rows'] = result
11             # 不需要分页查询时,直接在这里设置总记录数
12             if page_size is None:
13                 data['records'] = len(result)
14 
15     return data

  由于当下还从未数据,所以权且列表是空的,上边我们创立增添和改变功用

  大家在开采时,除了通过主键id来获得记录实体以外,在某些数据表中,还会设有第二个主键,或几个主键的情况,我们须求通过那么些主键来赢得相应的笔录实休,比如说管理员或用户表中的记名账号字段;订单表中的订单编码字段等。

  第2片段(玖到3叁行)是接受并结合查询条件,接收分页参数和排序参数

  PS:部门管理中,部门编码生成是1个比较十分的主意,须要多debug通晓。

  具体操作必要大家温馨多debug,多测试使用才晓得怎么使用到实际项目中。

  大家在单元测试中跑1跑,看看结果吗

 1 @post('/api/system/menu_info/') 2 def callback(): 3     """ 4     新增记录 5     """ 6     name = web_helper.get_form('name', '菜单名称') 7     icon = web_helper.get_form('icon', '菜单小图标', True, 10, False, is_check_special_char=False) 8     icon = icon.replace('\'', '').replace('|', '').replace('%', '') 9     page_url = web_helper.get_form('page_url', '页面URL', is_check_null=False)10     interface_url = web_helper.get_form('interface_url', '接口url', is_check_null=False, is_check_special_char=False)11     # 替换编码12     interface_url = interface_url.replace('@', '').replace('\'', '').replace('|', '').replace('%', '')13     parent_id = convert_helper.to_int0(web_helper.get_form('parent_id', '父id', is_check_null=False))14     sort = convert_helper.to_int0(web_helper.get_form('sort', '排序', is_check_null=False))15     is_leaf = web_helper.get_form('is_leaf', '是否最终节点', is_check_null=False)16     is_show = web_helper.get_form('is_show', '是否显示', is_check_null=False)17     is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False)18 19     _menu_info_logic = menu_info_logic.MenuInfoLogic()20     # 计算深度级别,即当前菜单在哪一级21     if parent_id == 0:22         level = 023     else:24         level = _menu_info_logic.get_value_for_cache(parent_id, 'level') + 125     # 如果没有设置排序,则自动获取当前级别最大的序号加126     if sort == 0:27         sort = _menu_info_logic.get_max('parent_id', 'parent_id=' + str(parent_id)) + 128 29     # 组合更新字段30     fields = {31         'name': string,32         'icon': string,33         'page_url': string,34         'interface_url': string(interface_url),35         'parent_id': parent_id,36         'sort': sort,37         'level': level,38         'is_leaf': is_leaf,39         'is_show': is_show,40         'is_enabled': is_enabled,41     }42     # 新增记录43     result = _menu_info_logic.add_model44     if result:45         return web_helper.return_msg(0, '提交成功')46     else:47         return web_helper.return_msg(-1, "提交失败")

  只需求将第十行到第十行替换对应的调用代码就足以了

  输出结果

  大家必要抽取页面提交上去的这几个参数,然后向数据库中增多一条记下

1 ##############################################################
2     ### 更新用户信息到数据库 ###
3     ##############################################################
4     # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典)
5     sql = """update manager set last_login_time=%s, last_login_ip=%s, login_count=login_count+1 where id=%s"""
6     # 组合更新值
7     vars = ('now()', ip, manager_id,)
8     # 写入数据库
9     db_helper.write(sql, vars)

  同时大家还索要安装查询字段内容,若是想询问出具备字段,直接动用*,如若只想要输出钦命的多少个字段值,则足以填充那多少个字段值,举例:id,name,content

  二.无需再总计当前美食指南所在层级的深浅

  若是是数值类型,直接写值就足以了,当然从来赋字符串值也绝非提到,因为生成sql是不会自动抬高单撇号的

 1     with db_helper.PgHelper(self.__db, self.__is_output_sql) as db:
 2         #############################################################
 3         # 判断是否需要进行分页
 4         if not page_size is None:
 5             ### 执行sql,获取指定条件的记录总数量
 6             sql = 'select count(1) as records from %(table_name)s %(wheres)s ' % \
 7                   {'table_name': table_name, 'wheres': wheres}
 8             result = db.execute(sql)
 9             # 如果查询失败或不存在指定条件记录,则直接返回初始值
10             if not result or result[0]['records'] == 0:
11                 return data
12 
13             # 设置记录总数量
14             data['records'] = result[0].get('records')

  然后在接口中,获取设置为彰显并启用情形的菜种类表

    def exists(self, wheres):
        """检查指定条件的记录是否存在"""
        return self.get_count(wheres) > 0

  第伍有些(80到九二行)是组成查询语句,查询并出口结果

  页面呈现效果

 

 1     # 初始化输出参数:总记录数量与列表集
 2     data = {
 3         'records': 0,   # 总记录数
 4         'total': 0,     # 总页数
 5         'page': 1,      # 当前页面索引
 6         'rows': [],     # 查询结果(记录列表)
 7     }
 8     # 初始化查询数据表名称
 9     if not table_name:
10         table_name = self.__table_name
11     # 初始化查询字段名
12     if not column_name_list:
13         column_name_list = self.__column_name_list
14     # 初始化查询条件
15     if wheres:
16         # 如果是字符串,表示该查询条件已组装好了,直接可以使用
17         if isinstance(wheres, str):
18             wheres = 'where ' + wheres
19         # 如果是list,则表示查询条件有多个,可以使用join将它们用and方式组合起来使用
20         elif isinstance(wheres, list):
21             wheres = 'where ' + ' and '.join(wheres)
22     # 初始化排序
23     if not orderby:
24         orderby = self.__pk_name + ' desc'
25     # 初始化分页查询的记录区间
26     paging = ''

  2二行是安装查询条件,私下认可菜单列表咱们只体现第一级菜单,也便是父id为0的菜单。在列表第贰回加载时,列表提交上去的nodeid为空(即父节点为默感到0),所以设置查询条件时父节点会赋值为parent_id=0。当大家点击树菜单实行时,才加载下顶级菜单出来,那时jqGrid控件会再度走访接口,提交当前要张开拓节点id给接口,接口接收到参数今后回到对应的子节点列表给客户端。

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     result = _product_logic.delete_model(id)
 9     # 判断是否提交成功
10     if result:
11         return web_helper.return_msg(0, '成功')
12     else:
13         return web_helper.return_msg(-1, "删除失败")

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图