什么是小程序
小程序是微信推出的一种新的公众账号形式
无需下载安装即可在微信中使用的应用
小程序、订阅号、服务号、企业号是平行的系统
微信小程序在微信开发中的地位
尽可能简单、高效地让开发者在微信进行开发
具有原生APP体验的服务
小程序能为开发者提供什么?
为了方便和限制开发者的开发,微信定义了一系列基础组件,这些组件是视图层的组件(表单组件、媒体组件、导航等)。组件具有一些功能和微信风格的样式,类似于 HTML 标签。微信也提供了很多原生的微信 API 来调用微信提供的功能,同时还提供了一个微信小程序开发者工具。
微信小程序源码结构
视图层(将逻辑层的数据展示在视图上)
逻辑层(通过改变数据[方法]来改变视图)
配置文件
在小程序中,微信规定了界面的组成模式,由四个文件组成。
.wxml文件(页面结构文件)标签语言,类似html,是真正负责页面结构,能绑定数据的文件。
.wxss文件(样式表文件)与css类似,大部分css样式都相同
.js文件(脚本文件)用于运行我们的逻辑,使用js语言
.json文件(配置文件)主要配置常用的样式,比如标签栏,窗口样式等。
知识库微信小程序示例
开发CSDN小程序的初步尝试,主要关注js文件和wxml文件。
知识库将开发领域划分为一定的区域,比如技术语言、运维体系、行业应用等,并对每个技术、知识点设计一张网络图,将技术某一方面涉及到的知识进行归纳总结,为知识架构准备一些优质内容,让大家可以比较系统地学习知识。
在知识库产品中,需要实现内容推荐、个人中心和搜索。用户端和内容推荐端都包含四层:库->知识结构->内容列表->内容详情页。搜索功能可以根据用户搜索的关键词,在用户端或推荐中找到相关内容。方便用户阅读和收藏。
知识库页面设计
小程序组件满足所有展示功能和结构(列表、窗口、按钮、事件)
API齐全,逻辑开发简单,不同功能模块放在不同的页面。
View层:标签栏、列表页、知识结构页、内容详情页、搜索页
逻辑层:
标签栏->通过绑定数据选择第一级页面
列表页->通过改变绑定的数据数组来控制列表的显示和动态加载
搜索页面->通过绑定数据,通过事件及时获取用户输入
小程序开发的陷阱
限制打开页面的数量(仍然)
微信提供了标签栏设置,可以在app.json中配置,应用中配置的标签栏会出现在所有一级页面中。但是这样有个问题,就是第一次点击标签会打开一个新页面,而微信限制打开的页面数为5个。
微信提供了几种跳转页面的方式,,,和返回。重点就这两个,会直接在原页面打开新页面,打开新页面。由于微信对页面数量有限制,而且我们的产品层级很多,所以不能直接在app.json中设置标签栏。所以我们单独设计了标签栏,点击标签不会打开新页面,而是在各个一级页面中引用,然后二级、三级页面就不用标签切换了,而是需要返回到一级页面。
树形结构显示
每个库都是一个树状的知识结构,请看这个例子。每个层级的展示方法都是一样的,所以一般情况下,我们会选择递归的方式来展示。比如这张图,当我们判断这个节点有子节点的时候,我们就想再次调用同样的方法来展示。但很可惜,在小程序中,无论是使用模板,还是使用引用文件的方法,都没有办法自己调整。
幸好我们知道我们的层级有多深,所以我们可以写几个相同的文件和模板,添加不同的名称,然后调用。如果是层级不明的树形结构,那就很难处理了。这里我建议大家把树形结构变成数组,添加层级标识,用循环来处理 wxml 文件中层级的显示。
顺序调用,如果html标签层级超过模板数量,超过的部分不会显示出来。本应用运行在微信中,建议你在服务端转换数据,再将转换后的数据发送给小程序。另外小程序()不能超过一次,如果你的json格式数据超过这个限制,拼接起来会比较困难。
冒泡事件
小程序在运营上的优势在于微信用户量大,适合推广。一些功能单一的APP可以放在小程序中实现,不需要下载APP,开发者不用考虑平台,开发成本低。但不适合开发逻辑复杂,界面丰富的程序,受框架限制,灵活性不高,不能满足所有功能。
(=”/form-data”),这样post上传的表单就可以包含文件等key-数据了。微信小程序也使用了类似的操作。
我使用PHP编写了服务器,接受文件的接口是save,我将$和$中的数据直接输出到info.log文件中,方便调试,代码如下:
保存($){(“:”。$)。“\r\n”,3,“。/logs/info.log”);(“POST:”。$)。“\r\n”,3,“。/logs/info.log”);(“城市:”。$[“city”]。“\r\n”,3,“。/logs/info.log”);(“名称:”。$[“name”]。“\r\n”,3,“。/logs/info.log”);(“:”。$[“”]。“\r\n”,3,“。/logs/info.log”);(“:”。$[“”]。“\r\n”,3,“。/logs/info.log”); .log”); (“标签:”. $[“city”]. “\r\n”, 3, “./logs/info.log”);echo '';}
在小程序开发工具中运行小程序,选择图片并上传,服务端成功接收数据,info.log输出的数据信息如下:
:{"":{"name":".jpg","type":"\/jpeg","":"\/tmp\/","":0,"size":}}POST: {"":"0","":"0","":"0","tags":"","city":"\\","name":"\\\\\\\"}城市: 北京名称: ปัก ก回复: : : 0
(ps:php中,有文件接收,将临时文件从该路径移动到指定目录即可保存文件,这里可以看到/tmp/临时文件,就代表文件接收成功了)
在手机上预览小程序,点击上传,但是出现问题,如下图:
POST数据为空,接收成功,但是单独输出的$data却是乱码(中文和泰文部分),出现溢出。
可以看到非英文和数字数据都是乱码,其他数据都没问题,明显是编码有问题,POST数据输出为空,乱码导致溢出,格式乱了。
如果编码有问题,请尝试更改其传输编码并添加
{"":"utf-8"} 或 {"-type":'/x-www-form-'}
但是没有效果,在微信小程序工具里还是有效的,但是在真机上预览会出现乱码。
刚刚发现 中的数据在真机预览时无效,需要改为 。受此启发,我尝试将编码后的数据添加到 中,但只是传输了数据,并没有改变编码。小程序开发工具中调试依然成功,但真机预览有问题。估计微信团队得回答这个问题了。
知道是bug了,暂时只能手动进行编码操作,于是就把小程序段里的数据全部编码了。
代码中,字符串编码函数是,我在小程序中试了一下,也有这个函数,于是,我把小程序代码改成如下
在服务器端,PHP 用于解码 URL 的函数是
保存( $)
(“:”。$)。“\r\n”,3,“。/logs/info.log”);
(“POST:”。($)。“\r\n”,3,“。/logs/info.log”);
("城市: " . ($["city"]) . "\r\n", 3, "./logs/info.log");
("名称: " . ($["name"]) . "\r\n", 3, "./logs/info.log");
(“:”。$[“”])。“\r\n”,3,“。/logs/info.log”);
(“:”。$[“”])。“\r\n”,3,“。/logs/info.log”);
(“:”。$[“”])。“\r\n”,3,“。/logs/info.log”);
("标签: " . ($["city"]) . "\r\n", 3, "./logs/info.log");
回声'';
再进行测试,真机预览测试输出如下:
:{"":{"名称":"jpeg","类型":"\/jpeg","":"\/tmp\/","":0,"大小":9561}}
发布:{“”:“0”,“标签”:“”,“”:“0”,“”:“0”,“城市”:“%E5%8C%97%E4%BA%AC”,“名称”:“%E0%B8%9B%E0%B8%B1%E0%B8%81%E0%B8%81%E0%B8%B4%E0%B9%88%E0%B8%8 7”}
城市: 北京
名称:ปักกิ่ง
:零
:零
:零
可以看到所有数据都正常输出,POST数据中的City和name在解码前都是编码数据,解码后正常输出。
至此我觉得我已经成功使用小程序上传文件信息到服务器了,希望这个方法能对遇到同样问题的同学有所帮助。