下午考完期中考试最后一门接口技术,晚上和陈明一起到森果公司办公室,做到快十点,主要是配置系统开发的环境。今天完成的主要内容:
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
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周日】
今天同事们都放假,只有我一个人坐在那里写代码.因为晚上要赶一篇论文,所以下午四五点时候就回去了.完成的主要工作有:
1
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
1{%blockshop%}2{%end%}合起来如下:
1{%blockcontent%}2
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
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)8
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)7
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