学习
实践
活动
专区
工具
TVP
写文章

迁移报告系统中的问题总结

背景介绍

开发奇效系统报告模块时,因老系统关联查询较多且维护麻烦,就人工和时间成本考虑,决定暂弃老系统,且将全部数据和功能迁移至奇效中,因两个系统使用后端代码框架不同,代码未能全部复用。现迁移工作已完成,就过程中遇到的部分问题进行总结。

MySQL数据存储问题

问题

为兼容历史数据,需将报告中全部bug数/已修复bug数等近十条相关数量数据进行存储,字段较多,进行加列展示浪费资源且影响查询效率,因此采用关联数组形式存储;

$bugInfos= array("bugCount" => "10", "bugFixed" => "5","bugLater" => "10");

对于这样的数据,MySQL数据库因存储类型是无法直接写入的,那有什么办法呢?

解决方案

使用PHP自带的serialize()或者json_encode()函数序列化数据成字符串,之后从数据库里面读出来的数据还是字符串格式的,用unserialize()和json_decode()函数转换成数组就可以了

// 写入数据库之前

// 序列化成字符串

$bufInfos_serialize = serialize($bugInfos);

// JSON编码数组成字符串

$bugInfos_json = json_encode($bugInfos);

// 读取数据库后

// 反序列化成数组

$bufInfos _restore =unserialize($bufInfos_serialize);

// JSON解码成数组

$bufInfos _dejson = json_decode($bugInfos_json, true);

SMTP实用功能

问题

原始php自带mail()函数可实现普通发送邮件功能;就可靠性及稳定性考虑,针对发件人/附件等要求实现较麻烦,因报告系统主要反映个人工作时间内工作量及工作进度,且收件人均为项目相关人员,考虑到直观显示发件人中文姓名信息和邮件客户端兼容图片等原因,最终决定使用smtp协议实现该需求。

解决方案

smtp协议:Simple Mail Transfer Protocol即简单邮件传输协议, 基于TCP服务的应用层协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,其他详细信息请自行搜索了解。

1.使用SMTP协议:

2.发件人信息汉字化$mail->SetFrom($mailFrom,$realName);

当设置为$mail->SetFrom(“qixiao@alarm.com”,”奇效管理”);时,收件箱即可看到

3.smtp协议日志,可进行调式实用

// $mail->SMTPDebug = 0; // 关闭SMTP调试功能

// 1 = errors and messages //显示错误详细

// 2 = messages only //显示错误信息

举例:$mail->SMTPDebug = 1:根据日志可判断是认证未通过,修改认证信息即可。

.邮件客户端(outlook)中不显示html样式

问题

邮件发送为HTML页面,outlook展示页面不识别相关样式。

解决方案

Outlook不支持HTML5但支持传统的table 布局;就内部和外联样式表实际操作来看,Outlook2010是支持的,但是慎用,不排除低版本Outlook不支持,建议写内联样式。

PS:要想发邮件的格式美观和布局合理,推荐使用table布局,能支持宽高。

邮件客户端(outlook)中不显示图片

问题

为直观查看报告信息,在日常报告中会发送带有图片样式的邮件,现实现方式为新建/修改报告时由前端将图片信息编码为base64格式,后端存储在数据库中,在查看及发送报告中进行相关解析,现就比较其他邮箱后,发现outlook因限制不能正常显示图片。

解决方案

发送报告时,图片按照附件形式进行发送;发送报告html页面进行src获取附件,最终可顺利进行展示。查看时因无限制,可正常获取base64即可。

web端(outlook)中不显示图片

问题

因工作需要,部分人有需要使用web端查看邮件的习惯,但web端附件均以附件形式展示,现面临图片信息不能通过附件获取问题。

解决方案

跟邮件客户端不同点是,web端不支持内部和外联样式表,所以只能用内嵌;仔细了解发现,直接返回图片即可解决各端不兼容问题,但展示图片会涉及到旧数据兼容,且存放图片需要重新整理库列表/写接口调式等一系列问题。综合考虑了解base64后,知道这是一种用64个字符来表示任意二进制数据的编码方法,用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符;所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。奇效库中存放img base64的数据正是这个原理。

Data URI scheme为:data:image/png;base64,1A2B3C4D5E………9Q

在上面的Data URI中,data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据。

目前,Data URI scheme支持的类型有:

data:,文本数据 data:text/plain,文本数据 data:text/html,HTML代码 等数十种。

知道了组成形式后,就可以使用自己的方式对数据进行相关解析了。现以接口形式返回图片信息,前端在查看时,传递相关参数调用该接口即可以展示图片:

根据以上总结,最终可根据各端需求进行相关实现。

Base64优点:支持广泛,平台和语言支持都比较广泛,浏览器绝大多数都支持,直接可在前端编解码,很多加密算法的都有base64的应用。在小图片base64后,可以减少请求,在某些场景下用途很大。有些情况下传输不可见字符不方便,base64后都是可见字符。能直接把二进制文件变成字符传输;方便传输数据。

Base64缺点:内容编码后的体积会变大,编码和解码需要额外的工作量。

它的使用场景有很多,如将图片等资源文件以Base64编码形式直接放于代码中,使用的时候反Base64后转换成Image对象使用;有些文本协议不支持不可见字符的传递,只能转换成可见字符来传递信息。有时在一些特殊的场合,大多数消息是纯文本的,偶尔需要用这条纯文本通道传一张图片之类的情况发生的时候,会用到Base64等。

pChart生成图片

问题

因库中保存图片方式为base64,一般形式为前端生成base64且将参数传给后端进行保存,以上有说过base64的内容冗余问题,且需要后端重新编写相关接口会增加前后端工作量,因此商量决定图片由后端进行实现。

解决方案

php生成图片的方式有很多,现就pchart进行举例。

借鉴网站http://wiki.pchart.net/doc.introduction.html 就下载类库/实例/说明等有详细的介绍。

pChart是一个基于GD library(图形处理函数库)开发的PHP图表制作开源项目。生成图片中的数据来源方式支持多种,如SQL 查询, CSV文件,或者自动生成;且传参格式一致仅实现方法不同,生成图片种类多达20多种,满足大多数对柱状/圆形/线型等图片显示的要求。

官网对用到的功能都有详细文档说明和实例讲解,现就使用中用到的几个功能进行说明。

1.使用前,下载相关库至公共库中;包括class/fonts/palettes文件

2.传输数据为中文在图标中不显示时,可将 pChart中的 setFontProperties属性设置为fonts文件中支持中文的编码即可。

3. Render为将图片保存在一路径且不在浏览器中输出;autoOutput为将图片保存在一路径且在浏览器中输出;可根据需求自行选择。

现举例说明,相同传参时:

调用方法不同,会显示不同图片:

以上为迁移报告系统中遇到问题的总结,希望对大家有一些帮助。

参考文档

【smtp】https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868325601402299d1e941914a21990ac7861ef4bc2d000

【pChart】

Qtest是360旗下的专业测试团队!

是WEB平台部测试技术平台化、效率化的先锋力量!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180824B1JRKM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券