• 我的第一个python web开发框架(16)——产品分类管理


      产品分类管理的html页面之前忘记做了,这次附件里补上。

      好了先上图

      

      从页面效果图来看,我们需要开发列表获取接口、添加接口、单条记录获取接口、编辑接口和删除接口

      对于产品分类列表,我们将使用jqgrid前端表格框架,jqgrid与接口交互时,它会提交页面索引、页面大小、排序字段名以及顺序还是倒序排序这几个参数,而返回的结果也有格式约束。

      返回格式要求:

    {
        'records': 0,
        'total': 0,
        'page': 1,
        'rows': [],
    }

      产品分类列表获取接口

     1 @get('/api/product_class/')
     2 def callback():
     3     """
     4     获取列表数据
     5     """
     6     # 页面索引
     7     page_number = convert_helper.to_int1(web_helper.get_query('page', '', False))
     8     # 页面显示记录数量
     9     page_size = convert_helper.to_int0(web_helper.get_query('rows', '', False))
    10     # 排序字段
    11     sidx = web_helper.get_query('sidx', '', False)
    12     # 顺序还是倒序排序
    13     sord = web_helper.get_query('sord', '', False)
    14     # 初始化排序字段
    15     order_by = 'sort asc'
    16     if sidx:
    17         order_by = sidx + ' ' + sord
    18 
    19     #############################################################
    20     # 初始化输出格式(前端使用jqgrid列表,需要指定输出格式)
    21     data = {
    22         'records': 0,
    23         'total': 0,
    24         'page': 1,
    25         'rows': [],
    26     }
    27     #############################################################
    28     # 执行sql,获取指定条件的记录总数量
    29     sql = 'select count(1) as records from product_class'
    30     result = db_helper.read(sql)
    31     # 如果查询失败或不存在指定条件记录,则直接返回初始值
    32     if not result or result[0]['records'] == 0:
    33         return data
    34     # 保存总记录数量
    35     data['records'] = result[0].get('records', 0)
    36 
    37     #############################################################
    38     ### 设置分页索引与页面大小 ###
    39     # 设置分页大小
    40     if page_size is None or page_size <= 0:
    41         page_size = 10
    42     # 计算总页数
    43     if data['records'] % page_size == 0:
    44         page_total = data['records'] // page_size
    45     else:
    46         page_total = data['records'] // page_size + 1
    47     # 记录总页面数量
    48     data['total'] = page_total
    49 
    50     # 判断提交的页码是否超出范围
    51     if page_number < 1 or page_number > page_total:
    52         page_number = page_total
    53     # 记录当前页面索引值
    54     data['page'] = page_number
    55 
    56     # 计算当前页面要显示的记录起始位置
    57     record_number = (page_number - 1) * page_size
    58     # 设置查询分页条件
    59     paging = ' limit ' + str(page_size) + ' offset ' + str(record_number)
    60     ### 设置排序 ###
    61     if not order_by:
    62         order_by = 'id desc'
    63     #############################################################
    64 
    65     # 组合sql查询语句
    66     sql = "select * from product_class order by %(orderby)s %(paging)s" % 
    67           {'orderby': order_by, 'paging': paging}
    68     # 读取记录
    69     result = db_helper.read(sql)
    70     if result:
    71         # 存储记录
    72         data['rows'] = result
    73 
    74     if data:
    75         # 直接输出json
    76         return web_helper.return_raise(json.dumps(data, cls=json_helper.CJsonEncoder))
    77     else:
    78         return web_helper.return_msg(-1, "查询失败")

      这段代码有点长,从功能上可以分为四段,第一段是接收客户端提交的参数;第二段获取当前查询条件下有多少条记录数量;第三段是处理分页,并组合查询sql语句;第四段是提交查询请求,并返回结果

      get方式提交,我们使用web_helper.get_query()函数获取参数值

      具体代码有详细注释,这里就不细说了,大家如果有不明白的地方留言或到群里问我。

      

      界面中的删除按钮对应的是删除接口

     1 @delete('/api/product_class/<id:int>/')
     2 def callback(id):
     3     """
     4     删除指定记录
     5     """
     6     # 判断该分类是否已经被引用,是的话不能直接删除
     7     sql = """select count(*) as total from product where product_class_id=%s""" % (id,)
     8     # 读取记录
     9     result = db_helper.read(sql)
    10     if result and result[0].get('total', -1) > 0:
    11         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
    12 
    13     # 编辑记录
    14     sql = """delete from product_class where id=%s returning id"""
    15     vars = (id,)
    16     # 写入数据库
    17     result = db_helper.write(sql, vars)
    18     # 判断是否提交成功
    19     if result:
    20         return web_helper.return_msg(0, '成功')
    21     else:
    22         return web_helper.return_msg(-1, "删除失败")

      在做删除前,需要判断一下这个分类是否已经被相关的产品引用绑定了,如果是的话,直接删除将会造成前端相关产品无法展示,所以需要做出提醒,让用户清除绑定后再进行删除操作。

      增改删操作都是对数据库的写操作,所以都使用db_helper.write()函数。

      在postgresql数据库中,returning是一个非常棒非常好用的函数,它可以指定返回的字段,即进行增改删操作后,将这些记录的指定字段值返回给我们,我们可以通过检查返回值是否存在来判定是否执行成功。而且在进行条件操作时,它能返回我们想要的主键id值,方便我们进行我们想要的操作,比如删除nosql缓存对应值。

      点击列表上面的添加按钮,会弹出一个小框,让用户输入新增记录值,如下图:

      

      接口代码:

     1 @post('/api/product_class/')
     2 def callback():
     3     """
     4     新增记录
     5     """
     6     name = web_helper.get_form('name', '分类名称')
     7     is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用'))
     8 
     9     # 添加记录(使用returning这个函数能返回指定的字段值,这里要求返回新添加记录的自增id值)
    10     sql = """insert into product_class (name, is_enable) values (%s, %s) returning id"""
    11     vars = (name, is_enable)
    12     # 写入数据库
    13     result = db_helper.write(sql, vars)
    14     # 判断是否提交成功
    15     if result and result[0].get('id'):
    16         return web_helper.return_msg(0, '成功')
    17     else:
    18         return web_helper.return_msg(-1, "提交失败")

      post方式提交,我们使用web_helper.get_form()函数获取参数值

      

      编辑记录和添加记录一样,使用同一个窗口,但在接口上,它需要获取记录值和编辑后保存两个接口

      

     1 @get('/api/product_class/<id:int>/')
     2 def callback(id):
     3     """
     4     获取指定记录
     5     """
     6     sql = """select * from product_class 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, "查询失败")
    14 
    15 @put('/api/product_class/<id:int>/')
    16 def callback(id):
    17     """
    18     修改记录
    19     """
    20     name = web_helper.get_form('name', '分类名称')
    21     is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用'))
    22 
    23     # 编辑记录
    24     sql = """update product_class set name=%s, is_enable=%s where id=%s returning id"""
    25     vars = (name, is_enable, id)
    26     # 写入数据库
    27     result = db_helper.write(sql, vars)
    28     # 判断是否提交成功
    29     if result and result[0].get('id'):
    30         return web_helper.return_msg(0, '成功')
    31     else:
    32         return web_helper.return_msg(-1, "提交失败")

      

      暂时还没有朋友说看不明白,所以就不往细说了,大家看代码注释,有人不明白提出后我再补上吧(最近太忙了,所以更新可能会有点慢,大家耐心等一等,我尽量抽空码完代码后更新上来的)。

      联系我们页面的前端代码与接口代码都在下载包中,大家自己比较一下自己处理的结果和我的是不是一样。

      本文对应的源码下载

     

    版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

    python开发QQ群:669058475(本群已满)、733466321(可以加2群)    作者博客:http://www.cnblogs.com/EmptyFS/

     

  • 相关阅读:
    TRansportation ANalysis and SIMulation System
    源数据的换行符
    小学生的加减乘除
    ORDER BY today_used ASC' % (MAX_USED_TIMES)
    线程污染 重复请求
    SQLite支持的并发访问数
    数组和链表的对比
    第一类 第二类 反向 螺旋 数学归纳法
    阶乘
    api 爬虫 避免相同 input 在信息未更新 情况下 重复请求重复
  • 原文地址:https://www.cnblogs.com/EmptyFS/p/7846746.html
Copyright © 2020-2023  润新知