有段时间比较闲就尝试着作了一个微信小程序,一是为了锻炼本身独立部署一个先后端全链路系统的能力,二是想作一个本身都想用的小程序出来。方向是让用户能够集中获取优质的电影、音乐、书籍、游戏等信息的推荐,那什么是优质的信息呢?我这里假设的是排行榜里越靠前的信息就越是优质的信息,因而就作了一个这几类信息的排行榜小程序,固然排行的信息不是我随便瞎编的,数据来源主要是豆瓣以及其余一些排行网站,但愿排行数据是权威和客观的,能最大化的减小用户获取优质资源的成本。html
下面讲解的可能不会太详细,毕竟想呈现的是一个全过程,弄一个很是详细的图文教程反而显得有些冗长,有些详细操做过程须要读者本身去参照相关文档,有些文档连接也会给出。OK,准备好了吗?一块儿开始这趟快乐的旅程吧。前端
工欲善其事,必先利其器。要作的事明确了,那怎么作呢?须要准备什么呢? 下面我将我涉及到的以等式的形式罗列出来:java
进入:微信公众平台, 选择小程序的帐号类型按照流程进行注册。注意每一个邮箱只能注册一个帐号。python
有了帐号后,咱们就可使用这个帐号进行开发了,开发用的IDE是腾讯出品的微信开发者工具,进入:小程序开发工具,下载对应的版本安装便可。web
打开刚下载好的微信开发者工具,扫码登陆、建立小程序项目。登陆微信公众号平台,在开发->开发设置->开发者ID中找到你小程序的AppID并填入到项目设置里。数据库
接着开始真正具体页面的开发了,开发过程参考开发文档:微信小程序接入指南apache
小程序前端开发其实就是在腾讯的开发工具里,使用js语言,遵循腾讯小程序的开发文档规范进行代码编写。开发过程当中能够编译、预览、真机调试等,可使用各类插件,能够调用一些公共的api或者本身定义的后端接口,也可使用腾讯提供的云函数。json
调用的后端接口须要是https开头的,而且须要在微信公众平台的开发->开发设置->服务器域名里配置好。小程序
开发完成后就能够准备上线了,首先在开发者工具里将写好的代码上传,点击上传,定义版本号和注释,再到微信公众平台的版本管理提交审核,待审核经过了就表示上线成功了,就能够在微信中搜索到你的小程序进行访问了。后端
到这里,前端的工做就算是完成了,其实通常若是不涉及复杂数据处理的话,后端不是必需的,直接全部简单数据都存放在前端就好了。若是你的小程序是这样的话,那本文到这里就能够结束了。后面的你也不须要看了。若是你须要更灵活的交互,更复杂的逻辑,那后端接口则必不可少了。那更复杂的后端数据接口又是怎么完成的呢,跟着我继续往下走你就知道了。
后端主要是提供给小程序数据接口,让小程序各个页面都能有排行榜数据展现,这里我提供的是http接口,返回的Json格式的字符串。使用的语言是Java,使用的框架是SpringBoot,将最终的java代码打包成war包部署在云主机上的web服务器Tomcat中,Tomcat就能够自动的将经过url过来的请求分发到个人程序代码的处理逻辑中,处理完请求拿到相应的数据则以Json字符串的格式返回。
主要流程以下图:
首先要存放后端程序代码,须要一台机器,本身的电脑虽然也能够,可是本身的电脑可不能保证24小时都开机且让外网能访问到,因此须要购买一台云服务器;其次,外网能访问到意味着须要一个公网IP,购买的云服务器会配套一个对应的IP地址。
这里我使用的是腾讯云服务器,进入官网购买:腾讯云,选择服务器的配置,付款便可。
基于经费预算以及实际须要(其实仍是由于舍不得花钱)的考虑,我这里选择的是比较低配的机器:
域名是用来映射到IP上,便于直接使用域名访问其绑定IP所在的服务器。虽然直接用IP和端口的形式也能够访问到咱们购买的云服务器,可是一来IP很差记,二来微信不容许使用IP加端口形式的url。因此只能“慷慨解囊”购买一个域名了。
域名能够在任意域名服务商购买,我为了方便也是直接在腾讯云上买的,购买连接:域名注册
买好了域名,那这个域名怎么用呢,不和IP配套使用的域名是没有任何意义的域名。这里咱们须要将这个域名或者其子域名绑定在咱们须要对外提供服务的服务器所对应的IP上,也就是我刚刚购买的云服务器的IP上。
在腾讯云后台的云解析里,点击你的域名添加记录,通常主要是添加A记录,也就是将域名绑定到IPv4地址上,能够添加多条,以主机记录区分各级的域名,@表示直接使用二级域名xxx.com,其余的则表示使用三级或更多级的域名,挂在你本身二级域名如下的多级域名都归你管。
为何要域名备案呢?这个,普天之下莫非王土,互联网这块一亩三分地天然也是属于国家的,不能随随便便让你接入服务。要想在这块地开垦拓荒,不是不能够,只是须要向国家报备,接受监管。
整个小程序的搭建过程,域名备案花的时间是最长的,花了十几二十天。进入备案页面:备案管理开始备案,详细的我就很少说了, 备案过程详情参考:网站备案 主要流程包括下面几个:
(1) 办理幕布拍照 (2) 验证备案信息 (3) 填写主体信息 (4) 填写网站信息 (5) 上传材料 (6) 确认备案信息,提交初审 (7) 经过审核,完成备案
为何须要SSL证书呢?由于配置了SSL证书后可让咱们的url以https开头,这是微信小程序中要求的域名访问方式,以加密传输的方式更加安全。
说是购买,其实你能够选择免费的证书“购买”,同样能够达到目的,只是没有付费的加密功能强,安全性天然弱了一等。不过这也阻拦不了我选择免费的,毕竟穷字当头。
进入购买页面:SSL证书, 选择你要购买的证书的配置,下单付钱便可,将证书下载下来,后续配置web服务器用得着。
通过了前面5个大步骤,这时咱们的服务器具有了使用https协议经过域名访问的能力。接下来的工做就剩下开发咱们的后端接口以及把后端程序代码部署到这台服务器上供小程序访问。
环境:
安装这些工具就不细讲了,网上一大堆教程,并且要是不懂后端开发的,安装了这一套环境也没用,这里姑且假设读者也是懂必定的后端开发知识。
下面列出最主要的一部分Java代码来讲明后端程序是怎么提供的http接口:
@RestController
@RequestMapping(value = "/movie")
public class MovieListController extends MovieBaseController{
private static final Logger log = org.slf4j.LoggerFactory.getLogger(MovieListController.class);
/** * 豆瓣top250电影 * test: http://localhost:8080/movie/top250?start=0&limit=10 */
@RequestMapping(value = "/top250")
public CommonRespVo<List<ListCommonVo>> getMovieTop250() {
try {
HttpServletRequest request = this.getHttpServletRequest();
String start = request.getParameter("start");
String limit = request.getParameter("limit");
String url = String.format("https://api.douban.com/v2/movie/top250?start=%s&count=%s",start,limit);
JSONObject jsonObject = HttpUtil.getInfoFromHttpApi(url);
List<ListCommonVo> listCommonVos = this.movieListDataTrans(jsonObject);
if (CollectionUtils.isNotEmpty(listCommonVos)) {
return new CommonRespVo(listCommonVos, CommonRespVoCode.SUCCESS);
}
} catch (Exception e) {
log.error("获取豆瓣top250电影信息异常",e);
}
return new CommonRespVo(CommonRespVoCode.FAILED.code, "未获取到数据");
}
/** * 华语top100电影 * test: http://localhost:8080/movie/chinaTopMovie?start=0&limit=10 */
@RequestMapping(value = "/chinaTopMovie")
public CommonRespVo<List<JSONObject>> getChinaTopMovie() {
try {
List<JSONObject> result = this.getSubList(Lists.newArrayList(ChinaTopMovieData.chinaTopMovieData));
if (CollectionUtils.isNotEmpty(result)) {
return new CommonRespVo(result, CommonRespVoCode.SUCCESS);
}
} catch (Exception e) {
log.error("获取华语Top电影信息异常",e);
}
return new CommonRespVo(CommonRespVoCode.FAILED.code, "未获取到数据");
}
//省略后续代码
}
复制代码
上面这段代码,就是其中的两个接口,一个是经过公共API获取豆瓣top250电影信息,一个是经过爬虫数据获取的华语top100电影信息。能够看到SpringBoot使用RestController注解代表此类处理http请求,并在每一个RequestMapping对应的方法上都返回json格式的数据。
RequestMapping注解的做用是为每一个方法映射一个url。@RequestMapping注解能够做用在控制器类上,也能够做用在其下的某个方法上。当在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的全部方法上。而方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。这就是上面最终的url是类加方法上的路径的缘由,在本地测试的时候在浏览器里经过url:http://localhost:8080/movie/chinaTopMovie?start=0&limit=10
就能够获取到返回的数据。
程序代码开发完成后,使用Maven构建项目并将代码打包成一个war包形式的文件,在target目录中能够找到该war包,后面会讲到这个war包的用途。
排行榜数据是要具备必定的权威性,客观性的,因此固然不能我随便拿一些数据排列一下就成的,我本身又没有能力去统计这几类信息的相关排行,因此我就想到了拿来主义:从别人那里拿已经具有必定权威的数据。豆瓣有一些公共开源的api能够拿到我想要的部分数据,另一些数据在其余各大排行榜网站上都有,可是没有现成的api把他们的数据提供给我,他们既然不给,那我只能本身去取了。
我使用Python写了一些爬虫软件按期的爬取特定的排行榜网站上的数据,用这些数据更新我本地的静态数据,这样个人Java程序就能够拿到相对新的数据了。这里其实我还能够作得更好,但为了快速的上线,我来不及使用数据库落地这些爬取来的数据,这样有个很差的结果就是,每次服务重启的时候,有一段时间的数据不是最新的。这在个人可接受范围内,后面有时间再去解决这个问题吧。
豆瓣的api示例:api.douban.com/v2/movie/to…,经过这个url能够批量分页的拿到top电影榜的数据。
python爬虫则使用的是urlopen,urllib.request.urlopen()函数是用于实现对目标url的访问,返回url对应的网页数据。再使用BeautifulSoup对网页数据进行解析,主要是遍历搜索文档树从而拿到本身想要的那部分数据。
准备:
首先登陆购买的那台云服务器,部署前先安装好环境,主要是安装JRE和Tomcat,安装好后还须要对Tomcat进行一番配置。
/usr/local
。将咱们以前用Maven打包好的war包拷贝到安装Tomcat的webapps目录下,如我这里下图的位置:
[root@VM_0_12_centos webapps]# pwd
/usr/local/tomcat8/webapps
[root@VM_0_12_centos webapps]# ls
docs examples host-manager manager ROOT wxrank wxrank.war
复制代码
这里也就是上图中wxrank.war文件,而后去Tomcat的bin文件夹下运行startup.bat启动tomcat,便可自动解压war包,并部署。
为了方便,上面有些文件是在本身的电脑上下载好了,再经过FileZilla上传到云服务器上,我本身电脑和云服务器之间的其余文件传输也都是用的这个工具。
随着Tomcat的配置以及部署成功,咱们的后端接口就能够经过url访问到了。
虽然难度不大,可是整个过程确实仍是挺繁琐的,以前只是大体知道怎么搭建,却并无完整的实践过。整个流程完成下来,心中对于软件开发的全局观更加具体化了,这算是最大的收获吧。
下面是小程序成品,扫一扫看一下吧: