$2015武汉森果公司web后端开发实习日记书写是为了更好的思考AzureSky

下午考完期中考试最后一门接口技术,晚上和陈明一起到森果公司办公室,做到快十点,主要是配置系统开发的环境。今天完成的主要内容:

1、熟悉Github的用法:clone代码到本地(需要命令行命令)。

2、clone森果网站的代码到本地,并配置本地数据库,跑通入口程序。在乔迁学长的帮助下,了解网站架构,把网站的功能和代码进行对比。

3、产生的困惑:由于对tornado框架和sqlalchemy框架的不熟悉,导致对代码的理解不是很好,后来回去跟廖思敏学长聊,学长建议先把这两个框架官网上的Demo都跑通再说。此外还有对python的熟悉。

【5.29】

这两天做的事情有如下几点:

1、继续熟悉整个系统.

2、使用和了解worktile团队协作工具.

3、试着实现商家后台订单管理中根据不同条件对订单进行筛选和排序的功能.

【5.30】

考试周完太累了,想休息一下,跟学长请假一天.主要是给妹子装数据库,教她数据库.在教的过程中自己也小小的复习了一下.

【5.31】

继续到公司上班,今天只有两个学长在,其他小伙伴都休息了.今天做的主要事情有:

1、调试系统网站的本地测试,依然没有成功.

3、今天的文档记录在:worktile的Daily文档.

【6.1周一】

1、进入系统进行订单管理新增功能的功能测试.在反复调试中掌握了前后端交互数据的形式.需要注意的有以下几点:

②pyton3app.py–debug=1#调试模式,每次修改代码后不用重启即可实时更新.

③测试后台的单独功能的时候直接在地址栏中添加和改变参数的值进行测试,不要在页面进行点击测试!否则会出错!!

④多次测试的时候因为URL参数中多了空格而出错,空格很不起眼,但仍然会导致页面打不开!!这点在后面的测试的时候一定要注意!!

2、在实现多表连接查询的排序功能的时候,多次尝试失败,到晚上仍没有找到解决方案,主要是因为对SQLAlchemy框架的操作不熟练,需要恶补框架知识.

3、今天的记录文档在:①WorktileDaily文档;②浏览器Daily书签;③快盘今日备份

【6.2周二】

早上起来看新闻看到湖北客轮沉没,船上有四百多人,而且多为老年人,祈祷.

今天所做的工作有:

2、这周的新任务是:实现超级管理员后台的商铺管理功能,与店铺后台的代码逻辑比较相似,但是必须要充分优化效率,以应对大数据量.

3、进一步熟悉了整个系统的代码结构和数据库数据结构,但是对于表的联合查询的效率优化方面还有很多事情可做.

【6.3周三】

今天下午和晚上所做的工作有:

1、熟悉超级管理员后台的代码逻辑,重点熟悉店铺管理的代码逻辑和数据逻辑.

2、试着修改原有代码,进行小的功能测试.

3、实现了部分排序功能,但因为数据量大,数据库查询效率低下,急需寻找高效率的方法或算法进行优化.

现在想到的思路有:

①通过sqlalchemy对数据库的shop表编制索引,提高查询效率.

②尝试使用海量数据排序算法,对数据排序进行优化.

4、sqlalchemy的知识还很欠缺,急待加强,可以看今天浏览器书签中的几篇博文进行加强.

5、店铺后台订单管理订单筛选排序功能的后端代码已经完成,前端实现推迟.

6、今天的文档记录在:①Worktile的DailyTips文档中;②浏览器的Daily书签中,文件备份在快盘的Backupdaily中.

【6.5周五】

这两天主要实现总后台店铺管理功能,到6.5晚上已经基本完成,留下了两个难点问题还没有解决.这两天的工作总结如下:

4、陈明的ubuntu升级到15.10以后,重启后进入不了系统,到windows下发现系统所在盘的所有文件都不见了,怀疑是在更新的时候感染了病毒,只好重装系统,费时费力.而且装ubuntu的时候最好装LTS稳定版的系统,最新版的系统一般不是很稳定.

so,保持每天云端文档备份和文件备份的好习惯.

5、今天文档保存在:woktile项目中;文件保存在:快盘DailyBackup中.

6、今天要整理快盘一周来的Backup,腾出本地空间.

【6.6周六】

今天把总后台店铺管理的两个难点问题解决了,主要做的工作及总结如下:

1、完成了总后台店铺综合满意度的计算问题,解决方案是参照/list页面店铺满意度的计算方法.

2、完成了总后台按照店铺号或店铺名称搜索的功能,实现方法是在url增加search键,假定将search框中输入的关键字通过search传给后台,后台根据关键字对数据库进行筛选,筛选完毕以后再将数据返回给前台.主要代码如下:

1if'search'inself.args:#如果url中有'search'键2fromsqlalchemy.sqlimportor_#导入sqlalchemy的or_,用于下方的判断店铺号或者店铺名是否等于搜索关键字3search=self.args['search']#获取search的值4q=self.session.query(models.Shop).filter(or_(models.Shop.shop_name.like("%{0}%".format(self.args["search"])),#数据库查询,将查询结果赋给q5models.Shop.shop_code.like("%{0}%".format(self.args["search"]))),\6models.Shop.shop_status==models.SHOP_STATUS.ACCEPTED,\#要是申请成功的店铺7models.Shop.shop_code!='notset',models.Shop.status!=0).all()#店铺号非空(!='notset')并且店铺不是关闭中8shops=q9else:10q=self.session.query(models.Shop)#否则将整个Shop表赋给shops11shops=q.order_by(models.Shop.id).all()3、下午学习了html/js/css的初步知识,熟悉了一下总后台前端的代码逻辑,为下一步编写总后台的前端代码做准备.

5、今天的文档文件和笔记记录备份在:wortile项目文件中和Daily项目中,快盘Daily备份,firefoxDaily书签.

【6.7周日】

高考第一天,湖北数学惊现文言文大题;晚上韵苑体育馆青春琴缘音乐会.

1、学习javascript基本语法,H5基本语法(主要在W3SHOOL上学).

2、继续研究前端代码结构,要接着学习javascript/h5/css/jquery.

3、新任务:在完成总后台店铺管理前-后端以后,再接着实现总后台余额管理的前-后端功能(与陈明协作).

4、今天的文件、文档备份在:worktileDaily,快盘Daily,firefox书签Daily.

5、总后台店铺管理数据分析:*将整形的sort_order映射成False(0)或True(1)*CustomerShopFollow表和orders表的链接查询,用于筛选新/老用户*筛选order_type和选定order_type相同的订单*根据sort_key和sort_order对orders进行排序*根据选定的支付方式对orders进行筛选'*如果选定的order_status=5(所有订单)

(1)店铺状态(status=Column(Integer,default=1)(0:关闭1:营业中2:筹备中3:休息中)#键值对:"shop_status:int"所有(shop_status=5,shop.shop_statusin[0,1,2,3,4])未激活(shop_status=4,shop_code="notset")筹备中(shop_status=2,shop.shop_status=2)营业中(shop_status=1,shop.shop_status=1)休息中(shop_status=3,shop.shop_status=3)已停业(shop_status=0,shop.shop_status=0)

(2)认证状态(shop_auth=Column(Integer,default=0)(0:未认证1:个人认证2:企业认证3:个人认证转企业认证4:企业认证转个人认证)键值对:"shop_auth:int"所有(shop_auth=4,shop.shop_authin[0,1,2,3,4])已认证(shop_auth=3,shop.shop_authin[1,2,3,4])个人认证(shop_auth=2,shop.shop_authin[1,4])企业认证(shop_auth=1,shop.shop_authin[2,3])未认证(shop_auth=0,shop.shop_auth=0)

4:订单数5:营业额6:客单价

[订单数]:order_count营业额:*原来:self.session.query(func.sum(models.Order.totalPrice)).filter_by(shop_id=shop.id).scalar()*增加字段后:shop.shop_property

[客单价]:营业额/订单数增加字段:single_price

(4)排序顺序:键值对:"if_reverse:int"值:0:升序1:降序

键值对默认值:1.shop_status:5(所有)2.shop_auth:5(所有)3.shop_sort_key:4(默认按订单数排序,降序)4.if_reverse:1(默认降序排列)(5)shop信息卡data数组:*店铺名(data["shop_name"]=shop.shop_name)(店铺名有超链接)

*店铺管理员昵称(data["admin_nickname"]=shop.admin.accountinfo.nickname)(昵称有超链接)

*店铺地址(data["shop_address_detail"]=shop.shop_address_detail)

*auth_type_array=['未认证','个人认证','个人认证转企业认证','企业认证转个人认证']*认证状态(data["auth_type"]=auth_type_array[shop.shop_auth])

*认证信息(超链接)()

*店铺号(data["shop_code"]=shop.shop_code)

*shop_status_array=['关闭','营业中','筹备中','休息中']*店铺状态(data["shop_shop_status"]=shop_status_array[shop.status])

*申请信息(超链接)*评价数(data["old_msg"]=shop.old_msg)

*满意度()

1shop_id=shop.id2orders=self.session.query(models.Order).filter_by(shop_id=shop_id,status=6).first()3iforders:4q=self.session.query(func.avg(models.Order.commodity_quality),\5func.avg(models.Order.send_speed),func.avg(models.Order.shop_service)).filter_by(shop_id=shop_id).all()6ifq[0][0]:7commodity_quality=int(q[0][0])8ifq[0][1]:9send_speed=int(q[0][1])10ifq[0][2]:11shop_service=int(q[0][2])12ifcommodity_qualityandsend_speedandshop_service:13satisfy=format((commodity_quality+send_speed+shop_service)/300,'.0%')14else:15satisfy=format(1,'.0%')16data["satisfy"]=satisfy*为了提高效率,在shop末尾新加入三种'满意度'字段:##突然感觉加这写没有必要,店铺满意度在/handlers/customer.py中已经有实现,为何不直接调用呢?或者直接用那种方法实现呢?新方法见上方.

1commodity_quality=Column(Float,default=0,nullable=False)#valuein0~1002send_speed=Column(Float,default=0,nullable=False)#valuein0~1003shop_service=Column(Float,default=0,nullable=False)#valuein0~100*并写如下脚本更新数据库:

1usesenguocc;2altertableshopaddcolumncommodity_qualityfloat(11)notnulldefault0;3altertableshopaddcolumnsend_speedfloat(11)notnulldefault0;4altertableshopaddcolumnshop_servicefloat(11)notnulldefault0;56updateshopsetcommodity_quality=7(8selectavg(senguocc.order.commodity_quality)9fromsenguocc.order10whereshop.id=senguocc.order.shop_id11);1213updateshopsetsend_speed=14(15selectavg(senguocc.send_speed)16fromsenguocc.order17whereshop.id=senguocc.order.shop_id18);1920updateshopsetshop_service=21(22selectavg(shop_service)23fromsenguocc.order24whereshop.id=senguocc.order.shop_id25);*并在顾客购物后的处理方法中加入更新代码:goods_count=len(shop.fruits)+self.session.query(models.MGoods).join(models.Menu).filter(models.Menu.shop_id==shop.id).count()*商品件数(data["goods_count"]=goods_count)

*订单数(data["order_count"]=shop.order_count)

*营业额(data["shop_property"]=shop.shop_property)

1ifshop.order_count==0:2single_price=03else:4single_price=shop.shop_property/shop.order_count*客单价(data["single_price"]=single_price)

*账户余额(data["available_balance"]=shop.available_balance)

order表中:

1commodity_quality=Column(Integer)#取值:0-1002send_speed=Column(Integer)#取值:0-1003shop_service=Column(Integer)#取值:0-1001selectcommodity_qualityfromorderinnerjoinshoponshop.id=order.shop_idwhereshop.shop_namelike'吃在东农%';6、解决整形值做除法会变成0的方法:88/100:结果是0float(88)/100:结果是0.887、根据店铺号或店铺名搜索的功能:search=水果&shop_auth=4&shop_status=5&shop_sort_key=0&if_reverse=0&

8、今日数据:快盘.

【6.9周二】

高考结束,相继出来替考、听力故障等事件。

感觉这两天的状态有点手忙脚乱的感觉,一是自从开始研究前端的知识以及和后端的交互,都是一头雾水的,需要学习的东西太多,而又不怎么能抓住重点;二是课程的各种任务和实验,拖延症导致的疲于应对。今天git又出了点问题,明天要解决。

看着学长和小伙伴们做的热火朝天的,各种新功能都实现了,解决了一个又一个问题,心中不免失落。不管怎样,这两天做的事情总结如下:

1、修正总后台店铺管理后端代码的bug和缺陷,研究与前端的交互。

5、html文件中可以调用py文件中的方法,举例如下(事先要先继承base.html):

【6.10周三】

今天做的工作有:

1、研究前端通过post请求和ajax与后端进行数据交互,解决局部刷新的问题。

2、总后台店铺管理代码bug的排查,这要在post请求交互数据的代码中处理。

3、感觉对于js很不熟练,对于jquery框架也不是很熟悉,从前认为的前端开发就是写写html和css的想法完全是错误的,前端的重中之重是js。

4、学长又分配了新任务,实现总后台的订单统计功能,要用统计图的形式统计展现出来,这个可以参考店铺后台的订单统计的前端和后端的实现方法。

5、这一阶段要恶补一下js的知识(主要是敲w3school上的代码)。现在有个感受是后台的简单功能实现有很多现成的代码可以参考可以模仿,但是前端的实现以及与后端的交互这一块必须对原理有了透彻的理解后才能实现功能。

6、以后熬夜不能超过一点半,否则第二天完全是昏昏沉沉的状态,做什么都没有效率。

7、要整理一下worktile的文档了,现在开始显得有些杂乱了。

8、今天的文档文件备份在:worktileDaily,快盘Daily,firefox书签。

【6.15周一】

1、实现了总后台的订单统计功能的python/js/html开发,绘出统计图表。发现echarts是个功能很强大的东西,特别在数据统计方面,功能很实用,很丰富,很酷炫。

2、修正了之前总后台店铺管理的几个BUG:

①shop表营业额字段的自动更新处理

解决方法:

分别在staff.py和admin.py的shop.order_count+=1语句后添加:

totalprice_inc=order.totalPriceshop.shop_property+=totalprice_inc

经测试,原bug成功解决

②总后台店铺申请页面布局有错误

经过反复测试发现是在有未处理的店铺申请的时候才会出现布局错乱,于是重点排查对店铺申请进行处理的html代码,发现了问题所在.

解决方法:apply-manage.html第86行左右{%end%}的位置错误,且多了两个右div。

③其他几个小BUG。

3、这两天每天实现新功能后就往git上推代码,经历过之前几天使用git的磕磕绊绊,现在已经能够熟练使用git推代码了,无非是三步曲:

假设当前的本地工作分支为jyj.

①$gitfetchorigin远程分支名:tmp(tmp为本地临时分支)#把代码从远程分支上更新到本地的tmp分支上.

②$gitmergetmp(将tmp与当前分支合并,如果有冲突,手动修改冲突)#合并tmp分支到当前工作分支,并手动修改冲突.

③$gitpushoriginjyj:远程分支名#将合并后的本地工作分支推到远程分支上,如果指定的远程分支不存在,则新创建一个分支.

实现的新功能已经在测试服务器上跑起来了。

4、现在所用的从前端到后端的技术总结起来主要是这些:python后端-js中间层-html前端-css样式修饰.

5、python3和mysql的datetime数据类型好像不兼容,这个明天要和学长进一步讨论.

6、今天的文档和文件保存在:worktileDaily,快盘,书签Daily,github.

【6.17周三】

近几日主要任务:总后台每日对账功能。

1、增加总后台页面的回到顶部按钮:*base.html*superadmin-global.css*global.js

2、每日对账html

4、tornado的标签(if-else,for)

1{%ifhis["type"]==2%}2-{{his["balance_value"]}}元3{%else%}4+{{his["balance_value"]}}元5{%end%}67for:8{%foriinrange(10)%}9dosomething10{%end%}5、每日对账新建及修改文件:(1).superAdmin/count-balance.html(2).urls.py(3).superadmin.py:classCheckCash(4).superAdmin/balance-check.html(5).balance-check.js

7、css垂直居中:.align-center{padding:1px;}

html空格: html换行:

8、html中js的src要放在继承的模板中才能生效.或者导入src的{%block%}块名称要与模板相同才能生效.

9、hide()和empty()方法均能让一个控件隐藏.

10、点击一个按钮:1.让一个控件或div隐藏或消失.2.往一个div中新增内容.3.获取输入框中的输入内容.4.引起一个post方法.

1$("#wx").text("lalala")2varwx=$("#wx-income").val()3wx=wx.toFixed(2);保留两位小数11、js中加号被当成了连接符,如果要当做运算符,则先转换为整形或浮点型:parseFloat("123")=123

【6.18周四】

1、postjson方法这样用:(1)在js中:

1functionshowCheckInfo(page){2varurl="";3vardata=1;4varargs={5data:data6};7$.postJson(url,args,function(res){8if(res.success){9alert(res.output_data);10}11});12}(2)在后台superadmin中:

1@tornado.web.authenticated2@SuperBaseHandler.check_arguments('data:int')3defpost(self):4data=self.args["data"]5output_data=data+3336returnself.send_success(output_data=output_data)运行后会弹出一个提示框,显示334.

当然也可以把data封装成一个复杂类型的数据包:(1)js:

1functionshowCheckInfo(page){2varurl="";3vardata={};4data["a"]=1;5data["b"]=2;67varargs={8data:data9};10$.postJson(url,args,function(res){11if(res.success){12console.log(res.output_data["a"],res.output_data["b"]);13}14});15}(2)后台:

1@tornado.web.authenticated2@SuperBaseHandler.check_arguments('data')#这一行必须要写3defpost(self):4data=self.args["data"]5output_data=data6output_data["a"]=5557output_data["b"]=6668returnself.send_success(output_data=output_data)在控制台输出:555666

3、mysql获取当前日期函数:now()返回年月日时分秒

4、对于日期的一个处理:

1now=datetime.datetime.now()-datetime.timedelta(1)2start_date=datetime.datetime(now.year,now.month,now.day,0)3end_date=datetime.datetime(now.year,now.month,now.day,23)4q=q.filter(models.Order.create_date>=start_date,\5models.Order.create_date<=end_date)5、mysql的有些函数sqlalchemy并不能用.

6、收入总额要加入余额消费的数据.7、本来在对账的时候,是可以在js中根据加载完成后从后台get到的数据的控件的id得到然后进行比较的,不需要用post.但是考虑到数据精度,还是在js中向后台发post请求进行对账.

8、js通过post向后台传递的键值对的值都是str型的,如果需要比较大小等操作需要进行参数转化.但后台通过post向js返回的数据类型还是本来的数据类型.

9、python中format的结果是str型(千万要注意!),而round方法的结果才是字符型,但round方法只能用于浮点数.如:a=round(3.445,2),则a=3.45,type(a)为float

10、考虑每天的对账信息都要记录下来,所以在数据库新建立一个对账表check_profit:

1createtablecheck_profit(2idint(5)primarykeynotnullauto_increment,3create_timedatetimenotnull,4is_checkedint(1)default0,5wx_recordfloat(11)default0,6wx_count_recordint(11)default0,7alipay_recordfloat(11)default0,8alipay_count_recordint(11)default0,9widt_recordfloat(11)default0,10widt_count_recordint(11)default0,11total_recordfloat(11)default0,12total_count_recordint(11)default0,1314wxfloat(11)default0,15wx_countint(11)default0,16alipayfloat(11)default0,17alipay_countint(11)default0,18widtfloat(11)default0,19widt_countint(11)default0,20totalfloat(11)default0,21total_countint(11)default022);11、sqlalchemy向数据库中加数据示例:

1balance_history=models.BalanceHistory(balance_record='提现:管理员'+name,balance_type=\22,balance_value=apply_cash.value,customer_id=apply_cash.shop.admin.accountinfo.id,name=\3name,shop_id=apply_cash.shop_id,shop_totalPrice=shop.shop_balance,superAdmin_id=\4self.current_user.id,available_balance=shop.available_balance)5self.session.add(balance_history)6self.session.commit()12、数据库查询时offset和limit的用法:

1balance_history=self.session.query(models.BalanceHistory).filter(models.BalanceHistory.shop_id==shop_id,models.BalanceHistory.balance_type.in_([0,2,3])).order_by(desc2(models.BalanceHistory.create_time)).offset(page*page_size).limit(page_size).all()注意:offset和limit要用在filter,order_by等的后面.offset表示先取偏移量,然后limit表示从偏移量位置开始取多少个.常用于分页.而且偏移量是从0开始的.

13、python和js中的/不是整除,而是带小数的除法.

14、每天对账单的唯一性问题

【6.20周六】

1、data={}要放在循环里,否则会有诡异的错误2、sqlalchemydelete操作用法:

1self.session.query(models.CheckProfit).filter(models.CheckProfit.create_time==end_date,models.CheckProfit.is_checked==0).delete()3、js中attr4、分页:两种分页方法的困惑.(页面加载时候就发post请求,在js中写渲染页面的代码的方案比较可行,简洁);js模板引擎.5、table标签6、js有时候有语法错但不提示,会导致莫名其妙的错误.7、html中if-else等的用法;块的用法(tornado).8、js中slice(m,n)函数相当于python中的切片操作.

9、js强制类型转化:parseInt(),parseFloat()10、jspost分页技术总结:(1)第1步:在html中建空表并用class(或id)标记,建上一页下一页按钮并用class或id标识:

1$(document).ready(function(){2getPageSum();3showHistory(1);4}).on("click","#PrePage",function(){5if(page==1){6alert("当前已经是第一页了~");7returnfalse;8}9else{10page--;11showHistory(page);12}13}).on("click","#NextPage",function(){1415if(page>=page_sum){16alert("当前已经是最后一页了~");17returnfalse;18}else{19page++;20showHistory(page);21}22});11、从数据库中删除数据示例:

1self.session.query(models.CheckProfit).filter(models.CheckProfit.create_time==end_date,models.CheckProfit.is_checked==0).delete()12、其实如果对账成功,那么CheckProfit表中的记录值和实际值肯定是一样的;如果还没有对账,那么CheckProfit表中只会有记录值。所以向前台返回数据的时候没有必要把所有数据都返回,而只需要把记录的数据返回即可。13、sublime中html还是识别不了注释。

14、经常将js和python的变量定义方法搞混...python的普通变量定义是可以直接拿来就用的,而js是要写var的,切记!!!js不写var的变量是全局变量。

15、今日数据:快盘,github.

【6.21周日】

1、mysql中日期格式转换函数:DATE_FORMAT(date,format)根据format字符串格式化date值。下列修饰符可以被用在format字符串中:%M月名字(January……December)

3、balance_history表是不管每天有没有记录都会自动创建吗?4、检查昨天的对账单是否创建,如果没有创建,说明balance_history的昨天的在线支付、用户余额充值的记录为空,说明昨天的对账单的记录值为0,这还是要创建check_profit表的昨天的数据的,只不过收入数据和提现数据每一项都为0.5、artTemplate原生语法是否支持if...else:这样的写法:<%if(…){%>html<%}else{%>html<%}%>或者这种写法:

{if...}html{else}html{/if}可是好像都用不了?正确写法:{{if...}}...{{else}}..{{/if}}6、模板引擎arttemplate7、解决artTemplate中不能使用if-else的问题:这样解决:(1)先提前判断条件type的取值:

1varrender=template.compile(item);(4)再按照原来的步骤做即可。

8、css遮罩层

9、js中动态生成的button用jquery怎样添加点击响应事件?(jquery获取不到动态创建的元素id)在js中动态生成了一个button,而且它的name是从数据库中获得是数据,也就是说我不知道当前点击的的button的id是什么,而且生成button是循环做的,一次会生成多个。我想用jquery获取他的name。用js写的话可以onclick=function(this),想问用jquery怎么做?

10、让css遮罩层不随滚动条的滚动而消失的方法:将遮罩层的position样式改为fixed即可。

11、jQuery中在循环中绑定事件容易出现的问题.解决方法:

1...(artTemplate模板引擎代码)2$(".tb-history").append(list_item);3$("#btn-check-"+i).click(function(i){4returnfunction(){5alert(i+"xxxxxxxxxxxxx");6};//如果在这个btn点击以后还要监听其他按钮的click事件,则要把其他按钮放在这个click事件中,而且也要用这种形式的函数。7}(i));【6.22周一】

1、jquery循环绑定只能获取到最后一个元素的值的问题;js闭包问题;代理。2、获取第i个子元素。3、each方法遍历。4、动态绑定的button的click事件中再添加其他button的click事件,但为什么连续发了好几个post请求??

5、重命名文件的命令:mva.txtb.txt#把文件a.txt重命名为b.txt

7、新任务:总后台-用户。用户选项里,增加用户ID、出生日期的显示。增加搜索:id、用户昵称

1b_time_stamp=7763616002print(type(b_time_stamp))3dateArray=datetime.datetime.utcfromtimestamp(b_time_stamp)4birthday=dateArray.strftime("%Y年%m月%d日")5print(birthday)输出:1994年08月08日

10、python中list方法

11、点击链接变成了绿色而并列的其他链接变回原来的颜色,这是怎么实现的?(当点击链接后链接变色,切换别的链接,又恢复原来样子)解决方案:1.首先在html中有类似这样的代码,表示3个链接(注意其中‘{{}}’中的变量):

1{%setpage=context.get("page","detail")%}2{%setdetail_active=""%}3{%setcash_active=""%}4{%setcheck_active=""%}56{%ifpage=="detail"%}7{%setdetail_active="active"%}8{%elifpage=="cash"%}9{%setcash_active="active"%}10{%else%}11{%setcheck_active="active"%}12{%end%}3.在后台实现该功能的类中,在get方法最后render的时候要有context属性,类似于这样:

【6.23周二】

1varinput=$("#inputinfo");//inputinfo表示搜索输入框的id2input.on('keyup',function(){3page=0;4getSearchContent('search',$("#inputinfo").val(),page);5});//getSearchContent是向后台发出post请求并根据返回的数据渲染页面的函数。4、sqlalchemy中将整形转化为字符串的函数:func.concat(models.Accountinfo.id,'')5、sqlalchemy中like的用法:q=q.filter(or_(models.Accountinfo.nickname.like("%{0}%".format(inputinfo)),(func.concat(models.Accountinfo.id,'')).like("%{0}%".format(inputinfo))))6、完成总后台用户管理搜索和完善信息卡功能!

7、数据备份:快盘.

【6.24周三】

1、bug:在测试服务器上看,总后台店铺余额详情页面上方的"提现中"数据有问题,显示的是当前系统最新的提现数据,而不是该店铺的正在提现的数据.

7、数据,代码和文档备份:快盘.

【6.29周一】

又是一个周一,发现已经两周没有更新博客了。之前一周多一直在加班和复习期末考试,再加上自身的拖延症,导致一搁置就是两周。不过技术上,之前每天的工作日志文档记录的都很详细,遇到、解决的问题和Bug也有记录;生活上,复习复习复习+实验报告实验报告实验报告,呃...当然每天和她在一起复习还是很棒很棒的。

今天是期末考试的第一天,复习之余来点小总结放松一下。

第一件事,前天下午去光谷创业咖啡参加的segmentfault组织的技术沙龙,真心不错。第一次参加这种外面的技术沙龙,各个领域的大神很多,除了抽了两次kindle都没有抽到和热浪滚滚的天气以外,其他都还是很愉快的,特别是森哥专门为沙龙提供的水果很好吃,很解渴。

nodejs,x11,光谷社区,持续集成,单元测试,docker,自动化测试,GUI,开源字体github.com/ecomfe/fontmin...这些是关键词。一个小小的字体能玩出太多的花样,也可以搞各种优化;上古GUI——Alt+Tab的底层原来有那么多的细节要考虑,自以为熟练使用GTK原来还差的远着呢。

深度科技的deepin操作系统印象深刻,感觉很适合程序员,爱折腾的程序员;圆桌会议的支持人贺钧大神原来是乔迁学长的哥们,世界略小。最后,光谷社区是个好地方。

第二件事,这两天写实验报告真是写苦了,各种排版,不得已把当时组原课设的实验报告拿来,用其中已经设置好的各种样式当模板了,当时老谭真是下了一番功夫,不得不说组原课设的模板真的很赞。完成实验报告以后于是决定狠下心来把各种报告、论文写作的基本和高端的排版技巧学一学,以后(至少一年之内)到处用得到,随后会在另一篇博文中经常更新每天get到的新技能。

第三件事,没有更新的两周的博客内容会在临近这周末的几天里总结出来,主要是各种技术问题。

【7.4周六】

今天完成的任务和遇到的问题总结如下:

可是做完以后检查发现数据还是有些问题,经过测试发现通过上述方法计算出的系统总余额与通过shop.shop_balance累加出来的系统总余额不一致,前者比后者要多,但是核查每个店铺的帐又都是一致的.这个问题还是要等周一的时候跟学长讨论一下.

3、今天还遇到这个类型问题:从表中用分组查询的方法查询年龄最大的人的姓名,正确的应该是这样:selectnamefrominfotablewherebirthday=(selectmin(birthday)frominfotable);而不是:selectname,min(birthday)frominfotable;

例:有people表:

+----+------+-------+|id|name|grade|+----+------+-------+|1|aa|90||2|bb|95||3|cc|87|+----+------+-------+

从中查询grade最低的人的姓名,如果这样查:selectname,min(grade)frompeople;结果是:aa87,显然不对;正确的应该是这样查:selectnamefrompeoplewheregrade=(selectmin(grade)frompeople);结果是:cc,结果正确.

4、之前写的每日对账功能存在一个bug:线上系统缺了一周的数据,而且数据更新逻辑有问题.

5、js保留两位小数:number=number.toFixed(2)python保留两位小数:number=round(number,2)

6、今天发现senguo的git上有artTemplate的资料,大喜,要好好学习一下.

【7.5周日】

今天同事们都放假,只有我一个人坐在那里写代码.因为晚上要赶一篇论文,所以下午四五点时候就回去了.完成的主要工作有:

12所有账单3提现记录4用户充值5在线支付6余额列表7第二步:对应的css中有:

1.tab-lst{border-bottom:2pxsolid#f6f6f6;-webkit-box-sizing:border-box;height:28px;}2.tab-lst>li{font-size:14px;color:#666;line-height:28px;float:left;height:28px;width:70px;margin-right:20px;cursor:pointer;text-align:center;}3.tab-lst.active{border-bottom:2pxsolid#52b43f;color:#52b43f;}第三步:js中为ul的li添加click事件:

5、明天一定要把总后台的对账bug解决.

6、这几天要把这篇博客中的所有代码都改成插入代码的格式.

【7.6周一】

今天完成了总后台的订单评价管理的功能,实现对系统所有订单评价的统计和筛选.学到的东西和遇到的问题总结如下:

1、点击页面中不同的选项按钮显示不同的子页面:将两个不同子页面的相同部分写成一个新的base,选项按钮中加a标签.然后将子页面分别写成几个不同的html文件,每个html文件都继承这个base,将那个新base中的a标签链接到新创建的html文件即可.

2、html中一个p标签占至少一行.

3、python字符串内置函数:split例:>>>s='a;b;c;d'>>>s.split(';')['a','b','c','d']

4、tornado中的块(block)的用法:

比如某个base.html中有一段共同的代码:

1{%blockcontent%}2

...
3{%end%}如果想在继承它的子页面中的这段代码的下面插入东西,则要在上面代码的后面写上空块名,比如:

1{%blockshop%}2{%end%}合起来如下:

1{%blockcontent%}2

...
3{%blockshop%}45{%end%}6{%end%}然后在子页面中加入块shop,然后在shop块中写代码即可,如下:

1{%extends'base.html'%}2{%blockshop%}3...这是子页面代码...4{%end%}此外还要注意多级继承时块的命名和引用,页面排版格式的问题.

5、sqlalchemy用'!=None'来判断表的某一项不为空.

6、sqlalchemy的like用法:models.Shop.shop_name.like('果%')或者:models.Shop.shop_name.like("%{0}%".format(input_name))

7、postjson不能传datetime类型的数据的问题:用python的strftime函数转成字符串再传.用法:data["comment_create_date"]=order.create_date.strftime("%Y-%m-%d%H:%M:%S")8、js中要保持id或class的唯一性,否则容易出现重复执行导致错乱.

10、用clone隐藏元素的方法更新页面的时候,如果遇到一个元素需要根据后台数据多次添加怎么办解决方法:比如有一个p标签中有多个img标签,数量根据后台传来的变量i来确定,那么在js中只需用一个循环把多个img标签加入到一个字符串中,然后把这个字符串append到p标签即可.

11、js中get方法的使用(参见系统代码文件superadmin-comment-info.js的initPagesum方法):简单描述如下:假设需要的数据为page_sum①js中在页面加载完毕后执行这个函数:

1functioninitPagesum(){2varurl='/super/comment_infoajaxFlag=1';3$.ajax({4url:url,5type:'get',6success:function(res){7if(res.success){8page_sum=res.page_sum;9alert(page_sum);10}11}12});13}②后台对应的get方法要这样检查参数:

1@SuperBaseHandler.check_arguments("ajaxFlag")③后台要先判断ajaxFlag的值是否为1,如果是则用send_success返回数据,否则用render返回数据:

1ifajaxFlag!='1':2self.render('superAdmin/shop-comment-info.html',output_data=output_data,page_sum=page_sum,context=dict(count={'del_apply':'','all_temp':'','all':'','auth_apply':''},subpage="info"))3else:4returnself.send_success(page_sum=page_sum)12、sqlalchemy不能直接用shop_idin[1,2]这样的用法,而要这样用:shop_id.in_([1,2,3,4])

13、遗留bug汇总:

①总后台'店铺'栏下左侧的选项激活有问题.

②总后台对账的bug.

14、数据备份:快盘.

【7.7周二】

1、今日主要任务列表:修复总后台店铺页面中激活左侧选项不变成绿色的问题,以及括号中的数据错误问题.<---ok①不变绿色问题:superadmin-shop-manage.js加载页面ready方法中多了这样一段代码:

4、要在浏览器中查看html加载后,某项后台数据的值的方法:

1这样就可以在浏览器的调试器里查看data-info的值,耶可以在js中调用这个值了。

5、HTML怎么给图片加超链接,点击图后在另一页打开

7、sublime2清除所有书签:Ctrl+Shift+F2

9、html字体加粗:style="font-weight:bold"

10、mysql中limit用法:select*fromtablelimitm,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条。例如:select*fromtablenamelimit2,4即取出第3条至第6条,4条记录

*mysql分组查询并用limit的方法:

1假如有如下info数据库:2+----+------+3|id|name|4+----+------+5|1|aa|6|2|bb|7|3|cc|8|4|bb|9|5|cc|10|6|cc|11+----+------+12执行下列查询及结果如下:13mysql>select*frominfogroupby(name)limit0,1;14+----+------+15|id|name|16+----+------+17|1|aa|18+----+------+1920mysql>select*frominfogroupby(name)limit0,2;21+----+------+22|id|name|23+----+------+24|1|aa|25|2|bb|26+----+------+2728mysql>select*frominfogroupby(name)limit0,3;29+----+------+30|id|name|31+----+------+32|1|aa|33|2|bb|34|3|cc|35+----+------+11、pythondatetime和time的区别.①字符串转化为time类型:

1>>>importtime2>>>timestr="time2009-12-14"3>>>t=time.strptime(timestr,"time%Y-%m-%d")4>>>printt5(2009,12,14,0,0,0,0,348,-1)67>>>type(t)89>>>②将time类型转化为字符串:

1now_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime(time.time()))③time类型与datetime类型的转换:

1>>>importdatetime2>>>d=datetime.datetime(*t[:6])3>>>printd42009-12-1400:00:0056>>>type(d)78>>>④常用格式化符号:

14、sqlalchemydistinct用法:persons=self.session.query(models.BalanceHistory.customer_id).distinct()或:persons=self.session.query(models.BalanceHistory).distinct(models.BalanceHistory.customer_id)15、jQuery中this与$(this)的区别

16、MySQL查询某个字段不重复的所有记录:

1//假设现在有如下6条记录表名叫info2+------+----+3|name|id|4+------+----+5|aa|1|6|bb|2|7|cc|3|8|bb|4|9|cc|5|10|cc|6|11+------+----+12//现在想从这6条记录中查询所有name不重复的记录13selectdistinctname,idfrombook这样是不可以的因为distinct只能作用于一个字段14//答案:15selecta.*frominfoarightjoin(16selectmin(id)frominfogroupbyname)bonb.id=a.id17wherea.idisnotnull17、sqlalchemy不能对datetime类型用distinct(这是什么问题咧???)用老办法:利用存在性数组,每次搜索是否在数组之中。缺陷:严重影响性能!有必要研究一下sql的distinct算法实现。根本原因还是js动态绑定的问题!

【7.8周三】

1、今天任务:完成店铺后台的销售统计;总后台对账仍然有bug且查询效率很低:要重构代码。

2、echarts好酷炫.

3、echarts简析(标准条形图)1.图表数据都包含在一个Object对象option中

1option={2title:{//图表标题和副标题3text:'世界人口',4subtext:'数据来自网络'5},6tooltip:{//数据提示框7trigger:'axis'8},9legend:{//图表图例10data:['2011年','2012年']11},12toolbox:{//图表的右上角的工具箱13show:true,14feature:{//控制显示哪些工具15mark:{show:true},16dataView:{show:true,readOnly:false},17restore:{show:true},18saveAsImage:{show:true}19}20},21calculable:true,22xAxis:[//x轴的属性及数据23{24type:'value',25boundaryGap:[0,0.01]26}27],28yAxis:[//y轴的属性及数据29{30type:'category',31data:['巴西','印尼','美国','印度','中国','世界人口(万)']32}33],34series:[//图表中显示的数据,有若干个系列,数量及名称和legend的data对应35{36name:'2011年',37type:'bar',38data:[18203,23489,29034,104970,131744,630230]39},40{41name:'2012年',42type:'bar',43data:[19325,23438,31000,121594,134141,681807]44}45]46};472.option内容分析:(1)title:图表标题,每个图表最多仅有一个标题控件,每个标题控件可设主副标题。text(主标题)subtext(副标题)

(2)tooltip:提示框,常用于展现更详细的数据.trigger:触发类型,默认数据触发,可选为:'item'|'axis'

(3)legend:图例,每个图表最多仅有一个图例。orient:布局方式,默认为水平布局,可选为:'horizontal'|'vertical'x:水平安放位置,默认为全图居中,可选为:'center'|'left'|'right'|{number}(x坐标,单位px)y:垂直安放位置,默认为全图顶端,可选为:'top'|'bottom'|'center'|{number}(y坐标,单位px)backgroundColor:图例背景颜色,默认透明data:图例内容数组,数组项通常为{string},每一项代表一个系列的name,默认布局到达边缘会自动分行(列),传入空字符串''可实现手动分行(列)。使用根据该值索引series中同名系列所用的图表类型和itemStyle,如果索引不到,该item将默认为没启用状态。如需个性化图例文字样式,可把数组项改为{Object},指定文本样式和个性化图例icon,格式为

1{2name:{string},3textStyle:{Object},4icon:{string}5}(4)toolbox:工具箱,每个图表最多仅有一个工具箱.orient:布局方式,默认为水平布局,可选为:'horizontal'|'vertical'.x:水平安放位置,默认为全图居中,可选为:'center'|'left'|'right'|{number}(x坐标,单位px)y:垂直安放位置,默认为全图顶端,可选为:'top'|'bottom'|'center'|{number}(y坐标,单位px)backgroundColor:工具箱背景颜色,默认透明padding:工具箱内边距,单位px,默认各方向内边距为5,接受数组分别设定上右下左边距,同css.itemGap:各个item之间的间隔,单位px,默认为10,横向布局时为水平间隔,纵向布局时为纵向间隔.itemSize:工具箱icon大小,单位(px),默认16pxcolor:工具箱icon颜色序列,循环使用,同时支持在具体feature内指定color.

1feature:{2mark:{show:true},3dataView:{show:true,readOnly:false},4magicType:{show:true,type:['line','bar','stack','tiled']},5restore:{show:true},6saveAsImage:{show:true}7}(5)xAxis:[{type:'value'}](6)yAxis:[{type:'category',data:['周一','周二','周三','周四','周五','周六','周日']}](7)series(直角系):驱动图表生成的数据内容数组,数组中每一项为一个系列的选项及数据,其中个别选项仅在部分图表类型中有效,请注意适用类型。stack:组合名称,双数值轴时无效,多组数据的堆积图时使用,eg:stack:'group1',则series数组中stack值等于'group1'的数据做堆积计算。

注:在series后面再加如下的一个color数组,则echarts中的图表元素的颜色会根据这个数组自动循环设置。

color:['#b6a2de','#2ec7c9','#5ab1ef','#ffb980','#d87a80','#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa','#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050','#59678c','#c9ab00','#7eb00a','#6f5553','#c14089']

4、jQuery遍历-siblings()方法:例:$("p").siblings(".selected")查找每个p元素的所有类名为"selected"的所有同胞元素.

6、导出数据库中某张表的结构及数据:mysqldump-uroot-pdbpasswddbnametest>db.sql;导入的话还是用source,导入的时候不用删除表结构,直接导入sql即可。导入后会自动覆盖旧数据,不用担心错乱的问题。

7、python获取今天的0:0:0:now_time=time.localtime(time.time())now_time=datetime.datetime(*now_time[:6])now_time=datetime.datetime(now_time.year,now_time.month,now_time.day,0,0,0)获取昨天的0:0:0:last_time=now_time-datetime.timedelta(1)

1$(document).ready(function(){2$('.change-listli').on('click',function(){3var$this=$(this);4$this.addClass('active').siblings('li').removeClass('active');5});6$('.change-list').each(function(){7var$this=$(this);8$this.find('li').eq(0).addClass('active');9});10});(3)css中有如下属性:

1.sell-change-list{margin-left:60px;margin-top:10px;}2.sell-change-listli{border-left:2pxsolid#fff;padding-left:14px;float:left;margin-right:30px;}3.sell-change-listli.active{border-color:#44b549;}4.sell-change-listli.activea{color:#44b549;}9、css的padding:padding属性设置元素的内边距。padding属性定义元素边框与元素内容之间的空间。该属性可采取4个值:如果规定一个值,比如div{padding:50px}-所有四个边的padding都是50px。如果规定两个值,比如div{padding:50px10px}-上下内边距是50px,左右内边距是10px。如果规定三个值,比如div{padding:50px10px20px}-上内边距是50px,左右内边距是10px,下内边距是20px。如果规定四个值,比如div{padding:50px10px20px30px}-上内边距是50px,右内边距是10px,下内边距是20px,左内边距是30px。

1varstr='2015-01-0123:13:15';2str=str.replace(/-/g,"/");3vardate=newDate(str);12、js判断某天是这年的第几周:

1functionWeekNumOfYear(date){2varyy=date.getFullYear();3varday=date.getDay();45vardate0=newDate(yy,0,1);6vardate_diff=DateDiff(date,date0);7if(date_diff<7-day){8week_num=1;9}10else{11varweek_num=Math.ceil((date_diff-(7-day))/7)+1;12}1314returnweek_num;15}13、jsceil()方法可对一个数进行上舍入。Math.ceil(x)

14、jsround()方法可把一个数字舍入为最接近的整数。

15、js获取当前日期的前后N天日期的方法:

17.css居中问题:div居中:margin:0auto;text居中:text-align:center;

18.js深拷贝和浅拷贝问题.

19.sublime快捷键:Ctrl+Shift+上/下键:将一行上移/下移.

20.js计算两个日期的天数差:

//计算天数差的函数,通用functionDateDiff(sDate1,sDate2){varoDate1,oDate2,iDays;vardd1,dd2,mm1,mm2,yy1,yy2;dd1=sDate1.getDate();mm1=sDate1.getMonth();yy1=sDate1.getFullYear();dd2=sDate2.getDate();mm2=sDate2.getMonth();yy2=sDate2.getFullYear();oDate1=newDate(yy1,mm1,dd1);oDate2=newDate(yy2,mm2,dd2);iDays=parseInt(Math.abs(oDate1-oDate2)/1000/60/60/24);//把相差的毫秒数转换为天数returniDays;}21、今日备份:快盘。

[7.14周二]

即:年份能被4整除但不能被100整除,或者能被400整除。3、js单独set年月日时要先setmonth再setdate4、jsdate类的setMonth方法的诡异问题(setMonth后月份顺延问题):

11、今日备份:快盘

【7.15周三】

今天主要做的工作是继续写店铺后台的销售统计的功能。昨天已经完成了前台最重要的功能之一:显示并能够选择不同的日/周/月,今天做的工作主要是数据需求和数据库的分析工作。

1selectdistinctfruit_type.namefromfruit_type,fruitwherefruit_type.id=fruit.fruit_type_idandfruit.shop_id=1203;②查询某个店铺的某个水果属于什么类目:

1selectfruit_type.namefromfruit_type,fruitwherefruit.fruit_type_id=fruit_type.idandfruit.shop_id=1203andfruit.name='青苹果';③查询某个店铺的所有水果名称:

1selectnamefromfruitwhereshop_id=1203;④从order表中查询出特定的一天某个店铺的所有有效订单(status字段的值大于等于5)的fruits字段:

1selectfruitsfromsenguocc.orderwhereshop_id=1203andstatus>=5and((create_datelike"2015-07-15%"andtoday=1)or(date_sub(create_date,interval-1day)like"2015-07-15%"andtoday=2));⑤从order表中查询出某个日期区间内某个店铺的所有有效订单(status字段的值大于等于5)的fruits字段(比如2015-07-15和2015-07-16两天的):

1selectfruitsfromsenguocc.orderwhereshop_id=1203andstatus>=5and((create_date>="2015-07-15"anddate_sub(create_date,interval1day)<'2015-07-16'andtoday=1)or(date_sub(create_date,interval-1day)>="2015-07-15"andcreate_date<"2015-07-16"andtoday=2));⑥查询某个店铺所有水果类目中分别有多少种水果:

1shop_type_num_list=[]2forshop_type_nameinshop_all_type_name:3tmp={}4shop_type_name=shop_type_name[0]5tmp["type_name"]=shop_type_name6tmp["type_num"]=self.session.query(models.FruitType).join(models.Fruit).filter(models.Fruit.shop_id==self.current_shop.id,models.FruitType.name==shop_type_name).count()7shop_type_num_list.append(tmp)⑦把⑥中查到的fruits字段中的每个单种商品的名称、数量、计价方式的单价分离出来,并计算出每个fruits中每个单种商品的销售额。

selectcurdate()>'2015-07-10'的值为1,selectcurdate()>'2015-07-19'的值为0.selectnow()>'2015-07-10'的值为1,selectnow()<'2015-07-10'的值为0.

8、今日备份:快盘

【7.16周四】

今天完成的主要工作有:店铺后台销售统计的按照商品类目统计和按照商品名称统计的功能已经基本实现。

1、python的下面这段代码执行的时候会出现错误:now_date=datetime.datetime(now.year,now.month,now.date)TypeError:anintegerisrequired(gottypebuiltin_function_or_method)

1now=datetime.datetime.now()2now_date=datetime.datetime(now.year,now.month,now.date)解决方法:把now.date改为now.day即可。

2、sqlalchemyjoin查询的总结:(1)当两个表之间只有一个外键的时候,这样用:

1session.query(User).join(Address).\2...3filter(Address.email_address=='jack@google.com').\4.5all()(2)当两个表之间没有外键或者有不止一个外键的时候,这样用:

1query.join(Address,User.id==Address.user_id)#明确的条件2query.join(User.addresses)#指定从左到右的关系3query.join(Address,User.addresses)#同样,有明确的目标4query.join('addresses')#同样,使用字符串outerjoin()和join()用法相同:

1query.outerjoin(User.addresses)#LEFTOUTERJOIN3、两个很有用的前端网站:bootstrap,iconfont

4、python将字符串转化为datetime类型:

1d1=datetime.datetime.now()2d2=d1+datetime.timedelta(days=10)6、python遍历取得字典的value的方法:

1forkeyindic_list:2value=dic_list[key]注:这里的'key'可以写成其他的字符,比如aa,bb等。此外字典可以用变量当做索引。

7、python只获得字典中所有键的名字到列表中:

1d={'a':2,'b':3,'d':4}2dlist=list(d.keys())用字典的keys方法获得所有键的名字,python3需要转换为list,python2直接为list

(是不是还有个values方法)8、js给后台传的参数设计:

(1)action,5个取值:'all','type','name','single_type','single_name'(2)type,3个取值:'day','week','month'(3)start_date(4)end_date注:感觉type没有必要要.

9、python列表排序:

1listaa.sort(key=lambdaaa_item:len(aa_item),reverse=True)#按照列表listaa的每一项的长度的降序排列.10、今天遇到一个问题:在js中将Date类型值通过postJson传给python后台后,发现这个值莫名其妙地少了一天,后来经过学长的提醒,发现应该是因为js和python所用时区不一样,从而导致了日期不一致的问题。解决方案:在js中通过postJson传Date值前,先将它转化成字符串再传。自编字符串转化函数:

1functiongetDateStr(date){2vary=date.getFullYear();3varm=(date.getMonth()+1)<10"0"+(date.getMonth()+1):(date.getMonth()+1);//获取当前月份的日期,不足10补04vard=date.getDate()<10"0"+date.getDate():date.getDate();//获取当前几号,不足10补05varstr=y+"-"+m+"-"+d;6returnstr;7}11、研究一下echarts条形图的点击事件12、js中for(vari=0;i

13、今日备份:快盘

[7.17周五]

1、今天主要任务:店铺后台销售统计。

2、问题:图表所在的div的高度不能根据图表内容的增多自动增高

解决方法:在图表init之前就发post请求获得要显示的数据,然后根据数据的多少动态设置div的高度,然后再init图表即可。设置div高度的方法:

1$("#div-name").css("height",50*data.length+'px');3、今天用到的技术:(1)echarts条形图的点击事件(2)遮罩层的实现(3)下拉选项按钮(4)echarts图表的属性设置

4、页面刷新后图表的y坐标轴的文字被遮挡了一部分,而且横坐标的值也没有显示出来。问题所在:options的series[0]的itemStyle属性设置的问题解决方案:原来的echarts的itemStyle属性为:

1itemStyle:{normal:{label:{show:true,position:'insideRight'}}}改为如下这样即可解决问题:

1itemStyle:{2normal:{3label:{4show:true,5position:'right',6textStyle:{7fontWeight:'bold'8}9}10}11}5、js把数值字符串转化为浮点型并保留两位小数(后来发现toFixed最后的结果的类型是字符串):

1varprice=parseFloat("123.4567").toFixed(2);6、发现个问题:如果echarts图表所在的div的高度太小了那么echarts也显示不出来。

8、问题:echarts图表能显示最大值最小值,但就是显示不出来平均值。经过反复测试发现:echarts在求平均值的时候竟然不能对浮点数求平均值,只能是整数。最后才发现:原来js对浮点数执行toFixed方法的结果是字符串,并不是数值型,这才导致了不能求平均值。比如:varaa=123.456.toFixed(2);则用typeofaa可以发现aa的类型为string,并不是浮点型,要把aa在转换成浮点型,要用parseFloat(aa)函数。把toFixed方法执行过的结果先用parseFloat强制转换成浮点型,再push给echarts的series的data,则可以解决问题。

9、这几天公司经常断网,要下个echarts的离线文档,防止断网的时候不能看。

[7.19周日]

今天把店铺后台的销售统计功能成功完成!

1、标签属性中添加的onclick事件传递参数的问题,传递的参数是整个标签吗?

2、下拉选择按钮的实现总结。

这个实现使用的bootstrap的控件元素。

①在css中编写如下样式:

1

  • 2选择商品类目:
  • 345678910
    11③在js中,为button及ul添加内容及添加点击事件:

    添加内容:

    12$("#first_type").text(type_max);36$("#currentTypeName").empty();789for(vari=0;i'13+'{{type_name}}'14'

    1functiononTypeItemClick(type_id){2varfirst_type=$("#"+type_id.id).text();3$("#first_type").text(first_type);456}3、为echarts的series动态添加新的系列:

    1options.series.push({name:"aaa",stack:'总量',type:'bar',data:[220,232,101,234,190]});4、js遍历object的方法:

    1varobj={"name":"jyj","age":22};2for(varkeyinobj){3console.log(key);4}输出结果:nameage

    如果改成这样:

    1varobj={"name":"jyj","age":22};2for(vareinobj){3console.log(obj[e]);4}输出结果:jyj22

    5、echarts渲染之前xAxis的data不能为空,否则会出错。

    6、几个小问题:(1)考虑到数据量大的时候的显示问题,为下拉选项框和前两个图表增加滚动条功能。---ok(2)前两个图表的每个条的高度小一点,20px左右。---ok因为有行间距,所以20太小,最后定为40px(3)为第三个图表增加echarts滚动条效果。---ok(4)去掉按周排序的“第几周”。---ok

    7、让元素的高度达到一定值的时候出现滚动条:在该元素的class中添加如下css属性即可:

    1.dropdown-menu{overflow:hidden;max-height:100px;overflow-y:auto;}8、要让echarts图表的高度变高到一定值的时候也出现正常的滚动条小果,那么不能直接在echarts的父div上加滚动条css,而要在父div外面再套一个div,再在这个div上添加滚动条css.

    9、echartsdatazoom数据区缩放控件的蓝色拖动条的宽度大一点(可是改变dataZoom控件的handleSize属性后不起作用,这是个问题)

    10、ubuntufirefox的cookie文件位置:$HOME/.mozilla/firefox/xxxx.default/目录下的cookie.sqlite文件。

    11、今日备份:快盘。

    [7.20周一]

    1、今日任务:余额记录重复、遗漏、数值计算错误的问题(错误多是因为并发操作没有加锁引起的)这几个表:balancehistory(余额变化记录),shop(shop_balance),customer_shop_follow(用户在某店铺中存的余额),order(是依据)

    2、今天装公司新电脑ubuntu系统装完以后开机遇到这个问题,且每次开机都会出现:SystemprogramproblemdetectedDoyouwanttoreporttheproblemnow

    4、mysql将查询记录及结果记录写入到外部文件中的方法:方法1:使用tee命令(登入数据库的时候要加sudo):mysql>tee/home/senguo/log.txt;mysql>usemysql;mysql>showtables;mysql>notee;//关闭记录功能方法2(按照格式写入excel文件):select*fromshopintooutfile'/tmp/test.xls'fieldsterminatedby','optionallyenclosedby'"'linesterminatedby'\n';注:路径必须是/tmp/xxx.xxx,否则没有权限。

    5、今日任务数据库分析:(1)shop表:*shop_balance字段:当前店铺的余额*available_balance:该店铺当前的可提现余额*正确的情况下:同一时刻available_balance<=shop_balanc

    (2)order表:*pay_type=Column(TINYINT,default=1)#付款方式:1:货到付款,2:余额3:在线支付(3)balancehistory表:*balance_type=Column(Integer,default=1)#0:代表充值,1:余额消费2:提现3:在线支付4:商家删除订单5:用户自己取消订单6:余额消费完成,可提现额度的变化*这个表是从2015-5-3开始有记录的。(4)customer_shop_follow表:*shop_balance:该用户在该店铺存的余额

    6、python3相比python2的输入函数的变化:python3删除了raw_input,用input代替:2.X:guess=int(raw_input('Enteraninteger:'))#读取键盘输入的方法3.X:guess=int(input('Enteraninteger:'))

    7、mysql用select1intooutfile'/home/senguo/test/test.xls';命令将查询结果写入外部文件出错:ERROR1(HY000):Can'tcreate/writetofile'/home/senguo/test/test.xls'(Errcode:13)修改了test文件夹权限:sudochmod-R777/home/senguo/test仍然不行,如果先创建test.xls文件然后修改其权限为777,则在数据库中再执行命令:select1intooutfile'/home/senguo/test/test.xls';又会出现错误:ERROR1086(HY000):File'/home/senguo/test.xls'alreadyexists解决方法:在系统根目录下有一个'/tmp/'目录,将上面的sql命令的文件路径改为'/tmp/test.xls'即可成功执行。

    8、ubuntu中在命令行下当不知道用什么程序打开某一个文件的时候,可以使用:xdg-openfile.xxx的命令自动用默认的对应的程序打开。比如:xdg-opentest.xls,会自动用excel程序打开当前目录的test.xls文件。

    9、mysql改变某一列:altertablesenguocc.orderchangefruitsfruitsvarchar(2000)defaultNULL;

    10、店铺后台是根据浏览器cookie判断当前店铺是哪个店铺的,如果线上系统和本地系统同时运行,那么因为cookie的原因,会导致点击链接跳到另外一个店铺的问题。所以以后测试的时候还是不要同时开线上的和线下的比较好。

    11、admin-sell-countbug:第三张单种类目销售统计表,当某种类目中的商品数非常多的时候,会出现图例(legend)很拥挤的情况,非常影响美观,因此最后去掉legend.(ok)

    12、admin-sell-countbug:第三张单种类目销售统计表,当添加新商品并有销售记录后,前几天的销售记录的数据会出问题。主要原因:js中object的元素是无序排列的,python的字典也是无序排列的,后台给js传参的时候没有注意到这个问题。

    13、python中把一个字典aa中的元素按照键名排序并存到一个列表中的方法:先获得字典aa的键名列表:bb=list(aa.keys())然后把列表bb排序:bb.sort()然后再以bb的元素为索引读取aa中的值:

    1another_list=[]2foriinrange(len(bb)):3tmp={}4print(bb[i],":",aa[bb[i]])5tmp[bb[i]]=aa[bb[i]]6another_list.append(tmp)14、今日备份:快盘。

    [7.21周二]

    1、admin-sell-countabigbug:查询数据库的时候用的是商品名称而不是id导致的很多错误,而且还没考虑到商品的名称是可以修改的。经过大规模修改后才解决问题。

    这给了以后一个教训:所有数据库查询必须用不变且唯一的值进行操作(如id),不能想当然用自己觉得对的字段。

    2、让echarts在后台查询数据的时候就显示loading画面的方法:将chart和options都定义成全局变量,先初始化chart和option,同时在初始化的function中定义loading函数,不隐藏,然后再发post请求,等到返回成功数据以后再往chart的option里面添加数据,添加数据后再隐藏loading函数,最后显示图表。

    3、小问题:adminsellcount前两个图表的排序方式和下面图表距离太近了,如果图表太高添加滚动条以后两者就挨在了一起,要增大间距。

    4、python将整数强制转换成字符串:str(123)

    5、python文件操作:(1)打开文件:f=open("./test.txt","w+")(2)向文件写入字符串:f.write("")(只能写入字符串,如果想把列表等用write函数写入文件,则要先转化成字符串才行。)(3)关闭文件:f.close()

    6、今日备份:快盘。

    [7.22周三]

    1、今日任务:余额记录重复、遗漏、数值计算错误的问题(错误多是因为并发操作没有加锁引起的)这几个表:balancehistory(余额变化记录),shop(shop_balance),customer_shop_follow(用户在某店铺中存的余额),order(是依据)2、js实现遮罩层:(1)首先在htmlbody块中写如下代码:

    123

    4//这个div中的内容为自定义的内容567(2)然后在css中写如下样式:

    12#checkinput_bg{display:none;position:absolute;top:0%;left:0%;width:100%;height:100%;background-color:black;z-index:1001;-moz-opacity:0.7;-khtml-opacity:0.7;opacity:.70;filter:alpha(opacity=70);}3#div-input{display:none;position:absolute;top:25%;left:22%;width:53%;height:49%;padding:8px;border:8pxsolid#E8E9F7;background-color:white;z-index:1002;overflow:auto;}4(3)最后在js中写如下代码添加按钮的回调函数,控制div的显示和隐藏:

    12functionshowdiv(){3document.getElementById("checkinput_bg").style.display="block";4document.getElementById("div-input").style.display="block";5}6functionhidediv(){7document.getElementById("checkinput_bg").style.display='none';8document.getElementById("div-input").style.display='none';9}103、SQLServer[siku's:v]

    4、mysql改变某一列的结构和属性:altertablesenguocc.orderchangefruitsfruitsvarchar(2000)defaultNULL;改变某一列的值:updatestudentsetname="jyj"whereid=001;

    5、bug:

    1File"/home/senguo/KuaiPan/Senguo/gitwork/senguo.cc/admin/handlers/admin.py",line495,inpost2fruit_id=self.session.query(models.Fruit.id).join(models.ChargeType).filter(models.ChargeType.id==int(key)).all()[0][0]3IndexError:listindexoutofrange45File"/home/senguo/KuaiPan/Senguo/gitwork/senguo.cc/admin/handlers/admin.py",line608,inpost6fruit_id=self.session.query(models.Fruit.id).join(models.ChargeType).filter(models.ChargeType.id==int(key)).all()[0][0]7IndexError:listindexoutofrange89File"/home/senguo/KuaiPan/Senguo/gitwork/senguo.cc/admin/handlers/admin.py",line717,inpost10fruit_id=self.session.query(models.Fruit.id).join(models.ChargeType).filter(models.ChargeType.id==int(key)).all()[0][0]11IndexError:listindexoutofrange问题所在:没有对自定义商品进行处理的问题。

    6、严重问题:现在从订单的fruits字段查询店铺的销售情况,在数据量较大的时候这样的方式查询效率非常低,用户体验非常差。解决方案:(1)千方百计优化目前算法。(2)在数据库中为每一个店铺新建一张销售情况表,该表保存了该店铺每一笔订单的每种商品的销售情况。从而在查询销售情况的时候可以直接从这个表中查询,大大提高查询效率。(3)在order表中新增加销售情况字段,每次在订单完成后就往该字段中加入这个订单中每种商品的如下信息,:(商品类目id1:{{商品id1:销售额,商品id2:销售额,...},该类目销售额},商品类目id2:{{商品id1:销售额,商品id2:销售额,...},该类目销售额},...)(存为字符串格式)

    7、admin-sell-count添加新功能:点击一个按钮的时候会出来图表的全屏浏览大图(需要遮罩层技术)。问题:把图表放在遮罩层中,显示不出来图表线条。

    8、admin-sell-count在店铺还没有商品的情况下会出错。

    9、第三个表要加上图例

    10、第一个表的tooltip要加上每种类目包含的商品名称解决方案:从后台返回每一种类目包含的商品名称,把包含的所有商品连成一个字符串,然后把所有类目的数据以字符串数组的形式返回给前台.前台把数据加入到series[1]的data数组中,然后tooltip的formatter函数读取该数组内容并显示出来:

    1options.tooltip.formatter=2function(params,ticket,callback){3varres="单类目销售情况
    "+params[0].name+":";4res+=params[0].data+"
    ";5res+="包含商品:"+params[1].data;67setTimeout(function(){8//仅为了模拟异步回调9callback(ticket,res);10},0)11};11、今日备份:快盘,github.

    [7.23周四]

    1、今日任务:深度优化销售统计算法。

    2、echarts的tooltip的formatter(内容格式器)属性中可以加入函数。用法举例:

    1formatter:function(params,ticket,callback){2varres="单类目销售情况
    "+params[0].name+":";3res+=params[0].data;45setTimeout(function(){6//仅为了模拟异步回调7callback(ticket,res);8},0)9//return'loading';10}11//注:其中每个params[i]对应一个series中的object3、js取字符串的子串:

    1str=str.substr(start,lenth)4、Echartslegend覆盖图表问题:echarts的legend选项值过多的时候会覆盖到下面的图表,这个问题最后这样解决:在循环中控制给legend的data赋值的个数,当超过这个个数的时候,就给data赋值空字符串即可.

    5、店铺后台销售统计bug:当店铺还没有商品的时候前台和后台都报错.解决方法:js第一次发post请求,后台先查询该店铺的商品列表是不是为空,如果为空就直接返回前台一个标记,前台在后面的所有post请求都没必要发了,直接在页面显示该店铺没有商品即可.

    7、dbinitdata.py文件中有所有水果的信息.

    8、问题:echarts放在新的图层上,新图层初始化为hidden,为一个按钮绑定点击事件,点击的时候显示这个图层,但点击按钮后发现只能显示坐标轴,数据并不难显示出来.解决方法:把新图层div初始化隐藏的方式改为:.invisiable{visibility:hidden;}即可.

    9、居中问题:div居中:margin:0auto;text居中:text-align:center;

    10、销售统计添加遮罩层显示大图功能成功!剩下的就是各种性能优化,以及对于用户自定义商品的错误处理的修正.

    11、把除水果和干果以外的"其他"商品都当做"其他"处理.

    12、在js中代码任意处加"debugger;",则可以进行断点调试,而且调试的时候变量的值也会自动显示处理,这个很厉害.

    13、chrome浏览器模拟手机:打开小手机的图标,然后在上方的UA栏中输入MicroMessenger即可.

    14、新任务:店铺后台的统计项目(前30)统计同种类目的销售额前十名店铺

    15、今日备份:快盘,github.

    4、python中合并两个字典的方法(假设a,b是两个字典):方法1:c=dict(a,**b)方法2:c=a.copy()c.update(b)从效率上来讲方法2的效率更高.

    5、python获取字典的键列表(假设d为一个字典):key_list=list(d.keys())获取字典的值的列表:value_list=list(d.values())获取字典的键和值组成的元组的列表:item_list=list(d.items())

    6、python以下代码并不会改变列表a:

    1a=[1,2,3,4,5]2foreina:3e=e+1注:但用sqlalchemy对数据库进行查询并且做修改的时候,这种方法是能改变原来列表的。这一点要特别注意。

    7、店铺后台销售统计前两个表的左边距太小.

    8、今日数据备份:快盘,github.

    [7.25周六]

    1、今日任务:整个森果系统的余额错误对账2、昨天陈明遇到一个问题:在数据库中加表以后,推到线上测试的时候因为数据库的编码问题导致线上git分支不能用了,解决方法是:在admin.py顶部加入:

    4、今日任务数据库分析:(1)shop表:*shop_balance字段:当前店铺的余额*available_balance:该店铺当前的可提现余额*正确的情况下:同一时刻available_balance<=shop_balance*mysql>selectidfromshopwhereshop_code='czneau';+----+|id|+----+|4|+----+

    注:“吃在东农”店铺的数据量比较大,为了数据统计的方便性,以该店铺为例.

    5、python中保留小数位数的两种方法:round(1.2222,2),结果为1.22,类型为floatformat(1.2222,".2f"),结果为'1.22',类型为str

    6、当然果园:id=1163;果缤纷:id=1080

    1SELECTshop.idASshop_id2FROMshop3WHEREshop.shop_status=%(shop_status_1)s8、数据查询:

    9、order表pay_type每个值表示的意思:1:货到付款,2:余额3:在线支付

    12、balance_type分析:(1)能导致shop_totalPrice增大的balance_type有:[0,1,3];能导致shop_totalPrice减小的balance_type有:[2,4,5];shop_totalPrice不变的balance_type有:[6,7](2)能导致available_balance增大的balance_type有:[6,7];能导致available_balance减小的balance_type有:[2];available_balance不变的balance_type有:[0,1,3,4,5].

    14、发现的问题整理:(1)shop_id=1163+---------------------+--------------+------------------------------------------------+---------------+-----------------+-------------------+|create_time|balance_type|balance_record|balance_value|shop_totalPrice|available_balance|+---------------------+--------------+------------------------------------------------+---------------+-----------------+-------------------+|2015-06-0516:31:45|7|可提现额度入账:订单1163000001完成|2.5|2.5|2.5||2015-06-0516:32:31|3|在线支付(支付宝):订单1163000002|6.5|9|0|

    (3)shop_id=1163|2015-06-0714:05:24|7|可提现额度入账:订单1163000084完成|7.5|1051.6|993.1||2015-06-0714:11:53|3|在线支付(支付宝):订单1163000134|14|1065.6|0|

    (4)|2015-06-0714:05:24|7|可提现额度入账:订单1163000084完成|7.5|1051.6|993.1||2015-06-0714:11:53|3|在线支付(支付宝):订单1163000134|14|1065.6|0|

    (5)|2015-06-0718:55:21|3|在线支付(支付宝):订单1163000158|14.3|1333.5|0||2015-06-0719:04:28|7|可提现额度入账:订单1163000153完成|20.3|1333.5|1013.4|

    15、订单号组成:前若干位是店铺id,后6位是该店铺的订单的累计个数.

    16、在以下c语言代码段中只能修改或增加或删除一个字符,使得输出结果是20个'-',给出三种方法(今天陈明不知道从哪找的一个题)代码段:

    1#include2intmain()3{4intn=20;5inti;6for(i=0;i3intmain()4{5intn=20;6inti;7for(i=0;i+n;i--){8printf("-");9}10}1112//方法2:13#include14intmain()15{16intn=20;17inti;18for(i=0;i25intmain()26{27intn=20;28inti;29for(i=0;-i

    18、sqlalchemy如果某一个表类的某一个字段和另外一张表有relationship关系,那么可以直接引用该relationship字段的子字段,比如在order表中有如下shop字段:

    1classOrder(MapBase,_CommonApi):2...3shop=relationship("Shop",uselist=False,join_depth=1)4...那么可以直接这样写:

    1shop_order=self.session.query(models.Order).filter_by(shop_id=4).first()2print(shop_order.shop.shop_name)输出结果是id=4的店铺的名称.

    19、今日数据:快盘,github.

    [7.27周一]

    1、今日任务:余额错误对账2、提取字符串中第若干位到倒数第三位之间的数字子串:

    1str0="可提现额度入账:订单1234002379121完成"2i=-13whilei

    3、查找一下balancehistory表中最早是从什么开始将shop_totalPrice和available_balance分离的(即在balance_record字段中balance_typein(6,7)第一次出现的记录).selectcreate_time,balance_type,balance_record,balance_value,shop_totalPrice,available_balancefrombalancehistorywherebalance_typein(6,7)orderbycreate_time;查询结果第一条为:+---------------------+--------------+------------------------------------------------+---------------+-----------------+-------------------+|create_time|balance_type|balance_record|balance_value|shop_totalPrice|available_balance|+---------------------+--------------+------------------------------------------------+---------------+-----------------+-------------------+|2015-05-0911:35:00|6|可提现额度入账:订单607000133完成|27|173|109|

    查询所有用余额支付或在线支付方式的订单的信息:selectsenguocc.order.create_date,senguocc.order.pay_type,senguocc.order.num,senguocc.order.totalPrice,senguocc.order.today,senguocc.order.arrival_timefromsenguocc.orderwheresenguocc.order.status>=5andsenguocc.order.pay_typein(2,3)anddate_format(senguocc.order.create_date,"%Y-%m-%d")>"2015-05-02"orderbysenguocc.order.create_date;从查询结果中查订单号为的订单信息是:+---------------------+----------+------------+------------+-------+--------------+|create_date|pay_type|num|totalPrice|today|arrival_time|+---------------------+----------+------------+------------+-------+--------------+|2015-05-0812:06:55|2|607000133|27|1|11:35|

    +---------------------+-----------+-------------+---------+-------------+--------------+------------+|create_date|num|customer_id|shop_id|arrival_day|arrival_time|totalPrice|+---------------------+-----------+-------------+---------+-------------+--------------+------------+|2015-05-1423:56:23|197000176|1|197|NULL|NULL|0.01||2015-05-1500:27:36|615000311|16435|615|2015-05-15|18:59|14||2015-05-1501:24:33|271000022|1854|271|2015-05-15|11:39|4.46||2015-05-1501:28:24|197000177|1|197|NULL|NULL|0.01||2015-05-1509:00:29|624001065|29452|624|2015-05-16|22:19|8.98||2015-05-1512:29:06|848000584|32843|848|2015-05-15|19:01|13||2015-05-1512:37:51|624001076|10788|624|2015-05-16|22:20|22.5||2015-05-1512:42:41|848000585|33111|848|2015-05-15|19:02|10|+---------------------+-----------+-------------+---------+-------------+--------------+------------+

    7、Mysql中如何创建一个表让id自动增长

    1CREATETABLEusers(2idint(5)NOTnullauto_increment,3namevarchar(20)NOTnull,4PRIMARYKEY(`id`)5)举例:

    1createtabletest_autoid(idint(11)notnullprimarykeyauto_increment,namechar(5)notnull);2insertintotest_autoid(name)values('jyj');3...(省略了八条插入)4select*fromtest_autoid;+----+------+|id|name|+----+------+|1|jyj||2|aa||3|bb||4|cc||5|d||6|eee||7|ff||8|gg||9|hh|+----+------+

    1deletefromtest_autoidwhereid=3;2select*fromtest_autoid;+----+------+|id|name|+----+------+|1|jyj||2|aa||4|cc||5|d||6|eee||7|ff||8|gg||9|hh|+----+------+

    1insertintotest_autoid(name)values('new');2select*fromtest_autoid;+----+------+|id|name|+----+------+|1|jyj||2|aa||4|cc||5|d||6|eee||7|ff||8|gg||9|hh||10|new|+----+------+

    *注意事项:因为balancehistory中每一条记录与其他记录的店铺余额和可提现余额都是相互关联的,所以为了避免混乱,首先只需把缺少的不包括这两项的记录插到表中,然后再依据其他信息依次推出这两项的值。

    9、python的format的用法:

    1>>>"iam{0}yearsold,iamnowin{1}".format(22,'wuhan')2'iam22yearsold,iamnowinwuhan'10、今日数据:快盘,github.

    [7.28周二]

    1、今日任务:余额错误对账2、查询每个店铺的当前shop表中的shop_balance,available_balance两个值是否与balancehistory表中该店铺最后一条记录的两者的值是否相吻合.

    1selectid,shop_id,create_time,shop_totalPrice,available_balancefrombalancehistorywherebalance_typein(0,1,2,3,4,5)orderbyshop_id,create_timedesc;2selectshop_id,shop_totalPrice,available_balancefrombalancehistorywherebalance_typein(2,6,7)groupbyshop_idorderbycreate_timedesclimit0,1;注:因为分组查询再取limit会出现错误,即分组后查询后再取每组的第一个值的问题没有解决,所以分组查询后在python中进行处理取最新一条记录的值。

    3、mysql取分组后每组最后一条数据的一个方法:

    1select*fromtablewhereidin(selectidfromtablelimit12);但是,只要你再加一层就行。如:

    1select*fromtablewhereidin(selectt.idfrom(select*fromtablelimit12)ast)这样就可以绕开limit子查询的问题。问题解决。后来我发现,上述是解决问题的一个方法,其实还有一个更好的做法,就是把限制条件放到from而非where子句中,就不必出现嵌套再嵌套。如上例,可以改为:

    1select*from(selectidfromtablelimit12)asfoo;注意:其实asfoo特别重要,如果不写成from()asxxx的形式,即不给from后的select语句构成表名,那么最后系统仍会报错。

    5、balancehistory表中balance_typein(4,5)的记录表示的是商家删除订单或者用户取消订单的记录,但这样的记录的订单号在order表中对应的status都为0,所以如果order表中有遗漏的status=0的记录没有插入到balancehistory表中,那么插入的时候都按照balance_type=5进行插入。

    1selectcreate_date,pay_type,totalPricefromsenguocc.orderwhereshop_id=1080andnum="1080000332";2selectnum,pay_type,status,totalPricefromsenguocc.orderwhereshop_id=1080andcustomer_id=48338;3selectcreate_time,shop_id,balance_type,balance_record,balance_value,shop_totalPrice,available_balancefrombalancehistorywhereshop_id=1080orderbycreate_time;6、sqlalchemy修改数据库中某一个表的某些字段的值的方法:

    query=self.session.query(models.Order).filter_by(num="1203000000").first()query.pay_type=22self.session.commit()7、sqlalchemy向表中添加记录的方法:

    1balance_history=models.BalanceHistory(customer_id=insert_list[i][0],\2shop_id=insert_list[i][1],name=insert_list[i][2],balance_value=insert_list[i][3],\3balance_record=insert_list[i][4],create_time=insert_list[i][5],balance_type=1)4self.session.add(balance_history)5self.session.commit()8、sqlalchemy上锁方法:

    1query=self.session.query(models.Order).filter_by(num="1203000000").with_lockmode("update").first()9、元组中的元素不能进行自加操作,只能先把元组转化为字符串(用list方法),然后才能执行自加操作

    10、今日数据:快盘,github.

    [7.30周四]1、今日任务:余额错误对账

    1selectcreate_time,shop_id,balance_type,balance_record,balance_value,shop_totalPrice,available_balancefrombalancehistoryorderbyshop_id,create_time;2selectshop_id,count(*)frombalancehistorywherecount(*)<(selectcount(*)fromsenguocc.orderwheresenguocc.order.shop_id=balancehistory.shop_idandsenguocc.order.pay_type=3)group3byshop_id;4selectshop_id,count(*)frombalancehistorywherebalance_type=3groupbyshop_id;2、异常数据:

    1totalprice:3910.402totalprice:25966.503available_balance:2710.08.924totalprice:28716.505totalprice:44470.006totalprice:56326.407totalprice:8381.008totalprice:103710.009available_balance:103710.0010totalprice:10571.0011available_balance:10570.01012totalprice:11082.0013totalprice:111511.0014totalprice:11413.0015totalprice:12304.0016totalprice:12841.0017totalprice:13170.01018totalprice:13401.01019totalprice:147338.003、零散后台打印数据记录:

    1!!@@@111111111111111972@@@@7344['197000154','197000155','197000156']5!!@@@111111111111116616@@@@2708['661000036','661000037']9!!@@@1111111111111184810@@@@211112['848000285']1[4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,69,69,69,69,69,69,69,69,197,197,197,197,197,197,235,272,289,289,289,488,488,549,549,607,607,607,2607,607,607,607,615,624,624,624,624,624,624,624,624,661,661,661,661,661,848,866,866,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,1037,1057,31080,1080,1080,1080,1080,1080,1080,1194]4、零散mysql查询记录:

    6、*筛选出shop_id错误的记录并修正.

    1>>>importdatetime2>>>now=datetime.datetime(2015,12,31,23,59,50)3>>>now4datetime.datetime(2015,12,31,23,59,50)5>>>now=now+datetime.timedelta(minutes=15)6>>>now7datetime.datetime(2016,1,1,0,14,50)8、python列表去重的二种方法:第一种

    1defdelRepeat(liebiao):2forxinliebiao:3whileliebiao.count(x)>1:4delliebiao[liebiao.index(x)]5returnliebiao第二种无法保持原有顺序

    1liebiao=set(liebiao)9、sqlalchemy存储过程

    [7.31周五]

    1、今日任务:余额错误对账2、数据临时记录:

    1self.session.query(models.CheckProfit).filter(models.CheckProfit.create_time==end_date,models.CheckProfit.is_checked==0).delete()5、今日数据:快盘,github.

    【8.3周一】

    1、今日任务:总后台销售统计功能*框架搭建:url,页面布局,echarts框架*后台数据获取:数据获取数据结果及算法

    3、系统预定义的水果的名称,id及其他信息存在db_initdata.py文件中.

    7、想要给总后台的订单统计的echarts添加loading,但改了半天发现出各种错误,还是当初在似懂非懂的时候写出的代码太混乱了,结构不清晰,变量不规范,有必要进行重构.

    3、注意事项:(1)fruit_type_id<999:水果(2)fruit_type_id=999:其他水果(3)1000

    4、python在当前类中调用当前类的其他方法,在其他方法名前一定要加'self.'才行,否则会提示方法未定义.

    5、jquery两个关联元素绑定hover事件(这个问题好麻烦,网上找了很多资料都很麻烦,最后发现了setTimeout函数)解决方案1:用延时函数解决.

    解决方案2:用联动的addClass("hidden")和removeClass("hidden")方法实现,此种方法可以方案一的闪烁现象,但也有缺陷.假设第二级菜单有两个选项,id分别为second1,second2,点击second1,second2弹出的第三级菜单的id分别为third1,third2,先给second1添加mouseover事件:

    1$("#third1").removeClass("hidden");2$("#third2").addClass("hidden");3//再给third1添加mouseover事件:4$("third1").removeClass("hidden")5//给third1添加mouseout事件:6$("third1).addClass("hidden")对second2和third2的处理同理,只要保证third1和third2的隐藏和消失互斥即可.

    【8.5周三】1、今日任务:总后台销售统计

    2、jquery有时候要显示一个元素,仅仅使用removeClass("hidden")属性是不管用的,display属性仍然为none,还要再加个show()方法.

    3、jquerydisplay:none与visible:hidden的区别:display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别:display:none---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是看不见也摸不到。visible:hidden---使对象在网页上不可见,但该对象在网页上所占的空间没有改变,通俗来说就是看不见但摸得到。例子:

    123display:none和visible:hidden的区别456隐藏区域,同时把位置让出来显示区域,显示的地方会占据原先隐藏区域的位置
    7隐藏区域,虽然隐藏但是位置依然占着显示区域894、jquery中调用post方法所在的函数可能会出现这个问题:前一个调用还没有执行完(比如因为数据量大等因素),后一个调用紧接着就执行了,这会带来相互之间的影响,引发未知的错误.可以这样解决:定义一个全局的标志变量,类似于一个锁,用该变量的状态控制每次的调用是否能够执行即可.或者关闭异步:$.ajaxSetup({async:false});

    5、用echarts的hideLoading方法时遇到一个奇怪的问题:刷新页面的时候js出现异常,出现错误:

    6、在浏览器中打开一个纯文本txt编辑器页面:在地址栏中输入:data:text/html,然后回车即可;如果想保留文本的格式和图片,则只需输入这行代码即可:data:text/html,还可以把这两个页面保存为书签,或在输入内容以后保存成文件,以后点开就能用.

    7、总后台添加了省级代理管理员,增加管理员的level(总超级管理员:0,省级代理管理员:1,已删除:-1)

    1self.current_user.level2shop_province=self.current_user.province【8.6周四】1、今日任务:(1)已经完成了总后台销售统计功能,但是考虑到系统新增加了总后台省级代理管理员,所以要根据管理员的level和province对数据进行筛选.(2)为店铺后台-商品管理-商品分组中的分组添加链接,跳转到'所有商品'并显示相应分组的商品.(3)店铺后台-商品关联-所有商品的排序有bug,修复之.2、根据总后台管理员的level和province对数据进行筛选的基本方式举例:

    1level=self.current_user.level2shop_provice=self.current_user.province3iflevel==0:4order_list_data=self.session.query(models.Order).filter(models.Order.status==6).order_by(desc(models.Order.comment_create_date))5eliflevel==1:6order_list_data=self.session.query(models.Order).join(models.Shop,models.Order.shop_id==models.Shop.id).filter(models.Order.status==6,models.Shop.shop_province==shop_province).distinct(models.Order.id).order_by(desc(models.Order.comment_create_date))测试用数据:level=1,shop_province=420000

    3、完成数据分省筛选!

    4、echarts中series添加属性barWidth:[number]可以设置柱状条的宽度.

    5、sqlalchemy三表联合查询示例:

    1query_list=self.session.query(models.TableA.a_name).join(models.TableB,models.TableA.b_id==models.TableB.id).join(models.TableC,models.TableB.c_id=models.TableC.id).filter(models.TableC.name=='ccc').all()6、html中如何让鼠标箭头移到某个div上就变为手型,移出后再变为原型:给这个div的样式加一条:'cursor:pointer;'如果被覆盖了,就在pointer后面加一个'!important'

    8、jquery,点击DIV触发事件,但是点击DIV的子元素不触发事件,该如何写选择器解决方法:即取消事件冒泡:

    1$('.diva').click(function(e){2e.stopPropagation();3...//a标签的其他事件处理4});然后为div添加点击事件即可.主要就是让a标签点击了以后停止冒泡,'.div'就是a标签外层容器的class.

    10、util.js里面有很多好方法.base.py里面也有很多好方法.

    【8.7周五】今日任务:店铺后台-商品关联-所有商品的排序有bug,修复之.1、关于reverse_url和static_url两个函数:(1)reverse_url:①在goods-set-base.html中,有几个链接,其中用到reverse_url函数:

    1...2(r"/admin/goods/all",handlers.admin.Goods,{"action":"all"},"adminGoods"),3(r"/admin/goods/classify",handlers.admin.Goods,{"action":"classify"},"adminGoodsClassify"),4(r"/admin/goods/group",handlers.admin.Goods,{"action":"group"},"adminGoodsGroup"),5(r"/admin/goods/delete",handlers.admin.Goods,{"action":"delete"},"adminGoodsDelete"),6...③在admin.py的Goods类中,有初始化方法:

    1@tornado.web.authenticated2definitialize(self,action);3self._action=action④在Goods类的get方法中调用action:

    1@AdminBaseHandler.check_arguments(...)2defget(self):3action=self._action4...⑤reverse_url是tornado自带的函数,用来根据name来反查url.(2)static_url,也是tornado自带的函数:①在application.py文件的setting中有:static_path=os.path.join(os.path.dirname(__file__),"static")②在template/index.html中有:

    3、js中ajax的使用:

    1functiongetData(action,id,page){2varurl;3url="/admin/goods/allaction="+action+"&id="+id+"&page="+page;4$.ajax({5url:url,6type:"get",7success:function(res){8if(res.success){9output_data=res.output_data;10console.log(output_data);11}12else{13Tip(res.error_text);14}15}16})17}然后在后台的相应类的get方法中要这样写:

    1varout_link=$.getUrlParam("out_link");2if(out_link=="true"){3vardata_id=$.getUrlParam("data_id");4page=0;5getSearchContent('out_link',data_id,page);//这里getSearchContent为B页面的js中原来就有的搜索函数,这里借用一下,只是把action6//从'search'改成了'out_link',把传给后台的参数从inputinfo改成了data_id7//当然也可以自己重新再写一个函数向后台请求数据.8}(3)在B页面的后台中,增加如下代码:

    1...2action=self.args["action"]3...4ifaction=="out_link":5user_id=int(self.args["inputinfo"])//这里的参数inputinfo正是(2)中js传过来的参数data_id.6q=q.filter(models.Accountinfo.id==user_id)7...#后面的是对q进行处理从而返回给js数据的代码注:跳转后要把跳转到的页面的"上一页/下一页"按钮隐藏掉

    5、pythoneval函数的强大:可以将字符串str当成有效的表达式来求值并返回计算结果。例如:

    1ifsort_way="group":2case='models.Fruit.group_id'3elifsort_way="type":4case='models.Fruit.fruit_type_id'5goods=self.session.query(models.Fruit.name).order_by(eval(case_one)).all()6、mysql中按照拼音排序的方法:selectnamefromuserorderbyconvert(nameusinggbk)asc;但这种方法在sqlalchemy中用不了,无论是这样用:name_list=self.session.query(models.User.name).order_by(func.convert(models.User.name.using('gbk'))还是这样用:name_list=self.session.query(models.User.name).order_by(func.convert(models.User.name,'gbk'))或者这样用:name_list=self.session.query(models.User.name).order_by(func.convert(models.User.name,'gbk','utf-8'))或者这样用:name_list=self.session.query(models.User.name).order_by(func.encode(models.User.name,'gbk'))结果都会报错,看来sqlalchemy是不支持这种编码转换的.

    【8.8周六】

    1、python3中只有unicodestr,把decode方法去掉了2、python多维排序示例(用operator):

    1>>>fromoperatorimportitemgetter2>>>c=[[1,2,5],[2,43,23],[1,1,32],[3,34,6],[3,2,5],[3,2,4]]3>>>c.sort(key=operator.itemgetter(0,1,2))4>>>c5[[1,1,32],[1,2,5],[2,43,23],[3,2,4],[3,2,5],[3,34,6]]6>>>b=[{'b':211,'a':100},{'b':21,'a':100},{'b':323,'a':101},{'b':12,'a':100}]7>>>b.sort(key=itemgetter('a','b'))8>>>b9[{'b':12,'a':100},{'b':21,'a':100},{'b':211,'a':100},{'b':323,'a':101}]3、因为gbk/gb2312的坑爹编码方式,前几千个一级汉子是连续的且按拼音排序的,但后面的汉子却不是按照拼音排序的,所以中文拼音排序仍然还是一个问题,有待解决.

    4、gb2312是gbk的子集,两者都是16位的,gbk是gb18030的子集,gb18030是32位的.

    【8.10周一】

    1、sqlalchemy执行原生sql语句的方法:

    今日任务:de各种bug,增加店铺后台用户管理的排序功能.新功能:商品秒杀的店铺后台前端与后端实现.1、昨天的任务完成!分页错乱的问题是因为联合查询的时候没有筛选店铺id导致的.2、下拉选择按钮的实现总结:(1)首先在html的适当位置加入如下代码:

    【8.12周三】

    今日任务:商品秒杀1、wdatepicker只显示时分秒2、选中时候为绿色的方形单选按钮;switch开关按钮;3、确认对话框的使用:4、js查找离最近的具有某种属性的元素:

    1defgetUnit(self,unit):2ifunit==1:3name='个'4elifunit==2:5name='斤'6elifunit==3:7name='份'8elifunit==4:9name='kg'10elifunit==5:11name='克'12elifunit==6:13name='升'14elifunit==7:15name='箱'16elifunit==8:17name='盒'18elifunit==9:19name='件'20elifunit==10:21name='筐'22elifunit==11:23name='包'24else:25name=''26returnname【8.13周四】

    今日任务:商品秒杀seckill1、新建秒杀-后台数据获取:

    1$("div").each(function(){2//这里干你想干的事情3//用$(this)可以访问正在循环的元素4});6、必须设置距离现在最少五分钟以后秒杀才能开始7、jquery的return只能return出一层方法,如果有多个方法嵌套,内层return,则要设置stop-flag变量来return.8、数据中少一个计价方式id.9、*各列分析:

    【8.14周五】

    今日任务:商品秒杀1、数据库建表:

    1importtime2print"a"3time.sleep(5)4print"b"5time.sleep(10)程序会先输出“a”,暂停5秒后再输出“b”

    【8.18周二】

    1$(document).on("click",function(e){2if($(e.target).closest(".sw-er-tip").size()==0){3$(".sw-er-tip").addClass("invisible");4}5});然后为这个div添加点击事件并停止冒泡:

    【8.19周三】

    今日任务:商品秒杀商城端后台1、修改表结构重新建表:

    1秒杀活动表:2createtableseckill_activity(3idint(11)notnullprimarykeyauto_increment,4shop_idint(11)notnull,5start_timeint(11)notnull,6end_timeint(11)notnull,7continue_timeint(11)notnull,89activity_statustinyint(4),1011foreignkey(shop_id)referencesshop(id)12);1314秒杀商品表15createtableseckill_goods(16idint(11)notnullprimarykeyauto_increment,17fruit_idint(11)notnull,18activity_idint(11)notnull,1920charge_type_idint(11)notnull,21former_pricefloat,22seckill_pricefloatnotnull,2324storage_pieceint(11),25activity_pieceint(11),2627not_pickint(11),28pickedint(11)default0,29orderedint(11)default0,30deletedint(11)default0,31statustinyint(4)default1,3233foreignkey(activity_id)referencesseckill_activity(id),34foreignkey(fruit_id)referencesfruit(id),35foreignkey(charge_type_id)referencescharge_type(id)36);2、github忽略本地工作区删除的文件:gitadd--ignore-removal<文件路径路径>',忽略本地工作区中移除的文件。3、fruit表新增加字段:(一种商品只能同时参与一种活动,活动在同一商品上不能叠加)

    1activity_status=Column(TINYINT,default=0)#0(该商品未参与任何活动),1(参与秒杀活动),2(参与限时折扣),...(等待扩展中)2seckill_charge_type=Column(Integer,default=0)#秒杀活动中该商品所使用的计价方式id3altertablefruitaddcolumnactivity_statustinyint(4)default0;4altertablefruitaddcolumnseckill_charge_typeint(11)default0;4、如果24小时之内没有秒杀活动,那么发现页面的秒杀活动不显示。

    1sec_fruit=self.session.query(models.Fruit).filter_by(id=fruit_id).with_lockmode('update').first()2sec_fruit.activity_status=13sec_fruit.seckill_charge_type=charge_type_id5、秒杀活动编辑限定:

    【8.20周四】

    今日任务:商品秒杀商城端1、python中的字典直接传给js,js不能解析成对象,必须在python中为字典外面套上一个列表才行。2、sqlalchemy中预提交:session.flush()(和commit类似)如果预提交失败则会回滚3、全局实时更新店铺秒杀活动基类方法:

    1seckill_img_url=Column(String(100))#秒杀公告背景2gbuy_img_url=Column(String(100))#团购公告背景3dscount_img_url=Column(String(100))#折扣公告背景4presell_img_url=Column(String(100))#预售公告背景注:notice表中config_id就是shop_id字段数据添加时机:只要店铺开启某项活动,就把该店铺的notice表中对应的url字段赋值为七牛云上的图片url.10、商城商品首页商品列表后台返回数据中增加判断字段:is_activity(0:当前无活动,1:秒杀,2:xxx,...)11、秒杀商品表要加一个已经抢过该商品的顾客的customer_id字段,以保证同一个活动中同一件商品每个人只能抢一份(bought_customer)bought_customer=Column(String(5000))altertableseckill_goodsaddcolumnbought_customervarchar(5000);经过思考后,发现这种方法不太合理,而且查询起来比较复杂,所以改变方案:新建一个customer_seckill_goods表(用户抢购的秒杀商品表):

    1createtablecustomer_seckill_goods(2idint(11)notnullprimarykeyauto_increment,3customer_idint(11)notnull,4shop_idint(11)notnull,5seckill_goods_idint(11)notnull,6statustinyint(4)default0,78foreignkey(customer_id)referencescustomer(id),9foreignkey(shop_id)referencesshop(id),10foreignkey(seckill_goods_id)referencesseckill_goods(id)11);12、用户抢购的秒杀商品表

    1classCustomerSeckillGoods(MapBase,_CommonApi):2__tablename__='customer_seckill_goods'3id=Column(Integer,nullable=False,primary_key=True,autoincrement=True)4customer_id=Column(Integer,ForeignKey(Customer.id),nullable=False)5shop_id=Column(Integer,ForeignKey(Shop.id),nullable=False)6seckill_goods_id=Column(Integer,ForeignKey(SeckillGoods.id),nullable=False)7status=Column(TINYINT,default=0)13、postJson可以向别的页面发请求,只用把url改成其他页面即可。14、删除表中的一列:altertableAAAdropcolumnaName;

    【8.21周五】

    1>>>a=[1,2,3,4]2>>>list(filter(lambdae:e!=1,a))3[2,3,4]4>>>a5[1,2,3,4]67>>>a=[{'a':111,'b':345},{'a':23,'b':3}]8>>>a9[{'b':345,'a':111},{'b':3,'a':23}]10>>>a=list(filter(lambdaitem:item['a']!=111,a))11>>>a12[{'b':3,'a':23}]1314或者:15a=[eforeinaife!=1]16a=[eforeinaife['a']!=111]6、jquery中each方法中发ajax请求时候,可能会由于异步的原因导致先执行后面的代码再执行请求导致逻辑错乱,为了避免这个问题,需要在发ajax请求之前关闭异步:

    1$.ajaxSetup({2async:false3});7、linux截屏软件:sudoapt-getinstallscrot然后命令行输入:scrot-s可以用鼠标选区然后保存截图到当前目录。

    【8.24周一】1、今日任务:商品秒杀商城端支付环节2、要加一个限制:同一个秒杀活动中不能存在两种相同的商品。3、jquery中遍历某个类的所有元素的两种方法:

    1①for(vari=0;i<$('.aaa').size;i++){2var$this=$('.aaa').eq(i);3function($this){4...5}6}1②$('.aaa').each(function(){2...3}注:用each方法遍历如果each中有ajax函数,那么要在执行ajax函数前关闭异步,否则会导致执行时候逻辑错乱的问题。4、关闭ajax异步:

    1$.ajaxSetup({2async:false3});5、对于charge_type表的分析:

    1priceunitnumunit_numactivemarket_priceselect_numrelate250827148192.7143转换成'每份'的计价方式:450317/21481919/(7/2)(=2.714*2)6、seckill_goods表加一个字段:seckill_charge_type_id=Column(Integer,ForeignKey(ChargeType.id),nullable=False)#当前秒杀商品的计价方式idaltertableseckill_goodsaddcolumnseckill_charge_type_idint(11)notnullreferences

    charge_type(id);7、charge_type表新增加一个字段:activity_type=activity_type=Column(TINYINT,default=0)#0:正常计价方式,未参与任何活动;1:秒杀活动计价方式;2:限时折扣活动计价方式altertablecharge_typeaddcolumnactivity_typetinyint(4)default0;注:每次新建或编辑秒杀活动后都往charge_type表中插入秒杀活动新建的计价方式。8、m-admin/js/util.js里面有各种工具方法。9、商品如果正在参加秒杀活动,那么不允许下架(在商品下架接口中要加以判断)

    1end_charge_type=[xforxincharge_typesifx.activity_type==-1]2end_charge_type_id=[]3foriteminend_charge_type:4end_charge_type_id.append(item.id)5seckill_goods_list=self.session.query67(models.SeckillGoods).filter(models.SeckillGoods.seckill_charge_type_id.in_89(end_charge_type_id)).with_lockmode('update').all()10foriteminseckill_goods_list:11item.picked-=112item.not_pick+=113self.session.commit()10、店铺商品管理中,商品详细信息是在base.py的getGoodsData方法中查询到的。

    11、用户在购物车中删除秒杀商品后要有相应的响应。

    12、mysqldump-uroot-psenguosenguocc>senguocc2015-8-24.sql

    【8.25周二】今日任务:商品秒杀商城端支付环节1、今天遇到好几次python3的错误:'段错误(核心已转储)'2、seckill_goods表的activity_piece,not_pick,picked,ordered四个字段之间的关系:商品首页和秒杀的发现页面显示的秒杀商品的库存为activity_piece,只有当一个商品被下单成功后该库存才减去1;当一个商品被用户放到购物车里时,not_pick减1,picked加1,另外两个不变;当一个正在参与秒杀的商品被用户从购物车里删除时,not_pick加1,picked减1;当一个秒杀商品被用户下单成功后,activity_piece减1.3、加载商品首页时遇到如下警告,加载速度非常慢,达到一分钟多:

    【8.26周三】今日任务:商品秒杀商城端支付环节1、点击购物车的'提交订单'后,js向后台发post请求的参数中,fruits参数的形式为:{'12668':2,'12641':3,'12645':1},表示计价方式和数量的键值对字典;在该post请求的一开始要更新秒杀数据,然后设置一个overdue变量,初始化为0,然后遍历fruits列表的计价方式判断有没有商品的活动过期,如果有商品的活动过则置overdue为1,直接self.send_success(overdue=overdue),前台根据overdue的值重定向到当前购物车页面,并给用户发出提示,刷新购物车

    1>>>x=time.localtime(1317091800.0)2>>>time.strftime('%w',x)3'2'4>>>time.strftime('%Y-%m-%d%H:%M:%S',x)5'2011-09-2710:50:00'

    今日任务:商品秒杀全方位debug.森果实习最后一天1、为所有包含折扣商品的订单的fruits字段添加折扣数(0~1之间),非折扣商品的折扣数为1,显示订

    单商品详情的时候折扣商品要显示原价乘上折扣数的价格。

    ******************************************************************************************************************end

    至此,为期三个月的森果实习结束,感受颇多,成长颇多,感受及总结将会陆续总结在其他博文中。感谢森果。

    THE END
    1.江苏共青团后台登录 PU口袋校园掌缘打卡器C空间 手机帐号邮箱帐号 立即登录返回后台登录https://service.jiangsugqt.org/apiadmin/
    2.后台管理系统登录 请输入正确的密码 登录https://gxycm.cmc.gov.cn/
    3.大众传媒后台管理系统欢迎登录 湖南大众传媒职业技术学院内容管理系统 用户名 : 密码: 验证码: 语言: 主题: 登录 Copyright ? 2007-2015 Zving.com Inc. All rights reserved.泽元软件版权所有 http://www.hnmmc.cn/zcms/login.zhtml
    4.系统后台管理平台欢迎登录内容管理系统后台 账号: 密码:https://www.hnkjzy.edu.cn/hnkj.php/sites-index
    5.首页森果可帮助您加快发展各个方面的业务,包括:采购、生产、销售和客户服务。 您将能够更加充分地了解公司在全球各地的业绩表现。 支持自定义域名 支持成员管理 全流程定制 专业的咨询顾问全面调研企业的目标与现状,梳理业务流程,量体裁衣,将优化后的业务流程方案落地,构建最适合企业的全流程解决方案。 http://www.sengo-health.com/
    6.森果云系统以下是关于森果云系统的文章详情内容供你参考,更多内容请访问[轻流]。轻量级、可自定义的管理系统搭建平台,无需代码开发即可如搭积木般快速、灵活地创造属于你的个性化管理系统,轻松实现多元业务场景的数字化管理。https://news.qingflow.com/plugin/zz/0fe931f4e90529ac88712958ef9929d0.html
    7.可通过关键词搜索商品类目,针对性查找,省时又省力连锁后台→商品管理→批量添加商品 连锁后台→商品管理→商品列表→编辑→商品类目重选 ▌致谢用户▌ 黑马优果 感谢以上及更多的老板,对此功能提出的建议 有大家的支持,森果一定会更加努力! ▌近期更新▌ 「老带新」拼团新玩法:仅新用户可参团,店铺涨粉蹭蹭的! https://i.senguo.cc/bbs/detail/efb1f72214a10e8d
    8.登录数字化决策、提升电商价值 精细化管理,提高业务流程的自动化程度,实现更高效、更智能的电商运营 统一管理、高效运营 更快地适应市场的变化,提高企业的竞争力,实现长期的可持续发展 快速部署、灵活应对,助力您的电商发展 帮助电商企业快速部署系统,并灵活应对各种业务变化 https://erp.sengox.cn/
    9.森果森果——互联网+水果技术服务商,专业的后台管理系统。全方位数据统计,卡片式商品管理、 流程化订单处理、丰富的营销玩法、想要的功能应有尽有! 互联网+水果称重收银软件。水果实体店转型升级利器。五分钟轻松入门,一小时熟练操作,人人都是收银员! 席卷朋友圈的水果拼团。多模板选择、丰富的自定义设置、免费功能轻松上https://apps.apple.com/kn/app/%E6%A3%AE%E6%9E%9C-%E6%89%8B%E6%9C%BA%E7%AE%A1%E7%90%86%E4%BD%A0%E7%9A%84%E6%B0%B4%E6%9E%9C%E5%BA%97/id1115984807
    10.森果货主帮下载2024安卓最新版手机app官方版免费安装下载货主必备的批次管理、货款结算、财务对账神器【高效卖货】森果货主帮APP可以帮助货主高效开票,并配合森果批发收银系统进行收银结算。【数据管理】在森果货主帮APP,货主可以轻松查看自己货品在果蔬档口商行的售卖数据,和货款结算相关数据。【信息沟通】森果货主帮APP能够实时同步果蔬档口商行与货主相关的数据,极大地方https://m.wandoujia.com/apps/8172223
    11.六合开·奖结果(2024已更新微信/小程序)IOS最新版下载森果云以「用数字技术提升果蔬产业流通效率」为使命,致力于为果蔬产业融入新的科技力量,助力果蔬产业实现生产数据化、产品六合开·奖结果标准化、流通数字化、管理信息化变革。 ===联系森果云=== 官网主页:https://pf.senguo.cc/官方 :400-027-0135 微信公众号/视频号/号:森果批发https://www.xywy.com/xylhcp8913.html
    12.森果批发易app下载森果批发易v3.4.3最新版果树批发市场高效管理工具。应用截图应用介绍 森果批发易app,果蔬批发零售收银管理专家。配合智能硬件,为档口老板提供商品上下架管理,销售数据预览,以及便捷的店铺管理功能,帮助提高果摊收益。 软件特色: app开单 打印机1秒出票; 移动管理后台 远程监控更放心; 扫码收银 高峰期不排长队; 业绩自动排名 绩效考核更公平;https://www.qqtn.com/azsoft/563113.html
    13.毕设项目&课程设计&毕设项目:基于springboot+vue实现的二手交易我们相信在不久的将来我们的二手交易平台将成为二手交易领域的佼佼者为更多用户提供优质、高效、便捷的服务。 需获取源码和观看运行以及配置视频,可通过下面地址访问观看 森果网-项目详情和讲解_基于springboot+vue实现的二手交易平台A4https://www.jianshu.com/p/45cfa0da4547
    14.Java项目:(前端vue后台java微服务)在线考试系统(java+vue+springboot+m源码获取:博客首页 "资源" 里下载! 考试流程: 用户前台注册成为学生 管理员后台添加老师,系统将该用户角色上升为老师 老师登录,添加考试,添加题目,发布考试 考生登录前台参加考试,交卷 老师后台批改试卷,查看成绩 考试查看成绩 练习流程: 考生登录前台参加练习,练习完自动判分,记录错题 https://blog.csdn.net/m0_66863468/article/details/122995793
    15.「森果招聘」森果怎么样?首页>森果 公司介绍 森果,互联网+水果技术服务商。 为水果零售门店提供系统软件,行业大数据探索者。水果零售行业正处于互联网化转型升级的浪潮中,越来越多的水果门店接入森果系统,2016年12月平台月交易额突破3000万元,月活跃商户一千多家。数据持续增长中! 通过销售水果店称重收银软硬件以及商城系统和商户管理后台增值https://maimai.cn/brand/home/NQEUbNdZ