产品分类管理的html页面以前忘记作了,此次附件里补上。html
好了先上图前端
从页面效果图来看,咱们须要开发列表获取接口、添加接口、单条记录获取接口、编辑接口和删除接口python
对于产品分类列表,咱们将使用jqgrid前端表格框架,jqgrid与接口交互时,它会提交页面索引、页面大小、排序字段名以及顺序仍是倒序排序这几个参数,而返回的结果也有格式约束。web
返回格式要求:sql
{ '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语句;第四段是提交查询请求,并返回结果json
get方式提交,咱们使用web_helper.get_query()函数获取参数值api
具体代码有详细注释,这里就不细说了,你们若是有不明白的地方留言或到群里问我。缓存
界面中的删除按钮对应的是删除接口框架
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/