我的第一个python web开发框架(16)——产品分类管理
产品分类管理的html页面之前忘记做了,这次附件里补上。
好了先上图
从页面效果图来看,我们需要开发列表获取接口、添加接口、单条记录获取接口、编辑接口和删除接口
对于产品分类列表,我们将使用jqgrid前端表格框架,jqgrid与接口通信时,它会提交页面索引、页面大小、排序字段名以及顺序还是倒序排序这几个参数,而返回的结果也有格式约束。
返回格式要求:
{ 'records': 0, 'total': 0, 'page': 1, 'rows': [], }
产品分类列表获取接口
@get('/api/product_class/') def callback(): """ 获取列表数据 """ # 页面索引 page_number = convert_helper.to_int1(web_helper.get_query('page', '', False)) # 页面显示记录数量 page_size = convert_helper.to_int0(web_helper.get_query('rows', '', False)) # 排序字段 sidx = web_helper.get_query('sidx', '', False) # 顺序还是倒序排序 sord = web_helper.get_query('sord', '', False) # 初始化排序字段 order_by = 'sort asc' if sidx: order_by = sidx + ' ' + sord ############################################################# # 初始化输出格式(前端使用jqgrid列表,需要指定输出格式) data = { 'records': 0, 'total': 0, 'page': 1, 'rows': [], } ############################################################# # 执行sql,获取指定条件的记录总数量 sql = 'select count(1) as records from product_class' result = db_helper.read(sql) # 如果查询失败或不存在指定条件记录,则直接返回初始值 if not result or result[0]['records'] == 0: return data # 保存总记录数量 data['records'] = result[0].get('records', 0) ############################################################# ### 设置分页索引与页面大小 ### # 设置分页大小 if page_size is None or page_size <= 0: page_size = 10 # 计算总页数 if data['records'] % page_size == 0: page_total = data['records'] // page_size else: page_total = data['records'] // page_size + 1 # 记录总页面数量 data['total'] = page_total # 判断提交的页码是否超出范围 if page_number < 1 or page_number > page_total: page_number = page_total # 记录当前页面索引值 data['page'] = page_number # 计算当前页面要显示的记录起始位置 record_number = (page_number - 1) * page_size # 设置查询分页条件 paging = ' limit ' + str(page_size) + ' offset ' + str(record_number) ### 设置排序 ### if not order_by: order_by = 'id desc' ############################################################# # 组合sql查询语句 sql = "select * from product_class order by %(orderby)s %(paging)s" % \ {'orderby': order_by, 'paging': paging} # 读取记录 result = db_helper.read(sql) if result: # 存储记录 data['rows'] = result if data: # 直接输出json return web_helper.return_raise(json.dumps(data, cls=json_helper.CJsonEncoder)) else: return web_helper.return_msg(-1, "查询失败")
这段代码有点长,从功能上可以分为四段,第一段是接收客户端提交的参数;第二段获取当前查询条件下有多少条记录数量;第三段是处理分页,并组合查询sql语句;第四段是提交查询请求,并返回结果
get方式提交,我们使用web_helper.get_query()函数获取参数值
具体代码有详细注释,这里就不细说了,大家如果有不明白的地方留言或到群里问我。
界面中的删除按钮对应的是删除接口
@delete('/api/product_class/<id:int>/') def callback(id): """ 删除指定记录 """ # 判断该分类是否已经被引用,是的话不能直接删除 sql = """select count(*) as total from product where product_class_id=%s""" % (id,) # 读取记录 result = db_helper.read(sql) if result and result[0].get('total', -1) > 0: return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除") # 编辑记录 sql = """delete from product_class where id=%s returning id""" vars = (id,) # 写入数据库 result = db_helper.write(sql, vars) # 判断是否提交成功 if result: return web_helper.return_msg(0, '成功') else: return web_helper.return_msg(-1, "删除失败")
在做删除前,需要判断一下这个分类是否已经被相关的产品引用绑定了,如果是的话,直接删除将会造成前端相关产品无法展示,所以需要做出提醒,让用户清除绑定后再进行删除操作。
增改删操作都是对数据库的写操作,所以都使用db_helper.write()函数。
在postgresql数据库中,returning是一个非常棒非常好用的函数,它可以指定返回的字段,即进行增改删操作后,将这些记录的指定字段值返回给我们,我们可以通过检查返回值是否存在来判定是否执行成功。而且在进行条件操作时,它能返回我们想要的主键id值,方便我们进行我们想要的操作,比如删除nosql缓存对应值。
点击列表上面的添加按钮,会弹出一个小框,让用户输入新增记录值,如下图:
接口代码:
@post('/api/product_class/') def callback(): """ 新增记录 """ name = web_helper.get_form('name', '分类名称') is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用')) # 添加记录(使用returning这个函数能返回指定的字段值,这里要求返回新添加记录的自增id值) sql = """insert into product_class (name, is_enable) values (%s, %s) returning id""" vars = (name, is_enable) # 写入数据库 result = db_helper.write(sql, vars) # 判断是否提交成功 if result and result[0].get('id'): return web_helper.return_msg(0, '成功') else: return web_helper.return_msg(-1, "提交失败")
post方式提交,我们使用web_helper.get_form()函数获取参数值
编辑记录和添加记录一样,使用同一个窗口,但在接口上,它需要获取记录值和编辑后保存两个接口
@get('/api/product_class/<id:int>/') def callback(id): """ 获取指定记录 """ sql = """select * from product_class where id = %s""" % (id,) # 读取记录 result = db_helper.read(sql) if result: # 直接输出json return web_helper.return_msg(0, '成功', result[0]) else: return web_helper.return_msg(-1, "查询失败") @put('/api/product_class/<id:int>/') def callback(id): """ 修改记录 """ name = web_helper.get_form('name', '分类名称') is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用')) # 编辑记录 sql = """update product_class set name=%s, is_enable=%s where id=%s returning id""" vars = (name, is_enable, id) # 写入数据库 result = db_helper.write(sql, vars) # 判断是否提交成功 if result and result[0].get('id'): return web_helper.return_msg(0, '成功') else: return web_helper.return_msg(-1, "提交失败")
联系我们页面的前端代码与接口代码都在下载包中,大家自己比较一下自己处理的结果和我的是不是一样。
- 点赞
- 收藏
- 关注作者
评论(0)