2018-01 小结

2018年1月份小结

最近一直在忙小程序的事情,也是公司的新项目。因为之前小程序的入口一直很深,使用起来比较麻烦,所以也没重视起来,,但是今年1月份,微信突然更新之后,有了『社交』小游戏–跳一跳,在朋友圈好一波刷屏。但对于我们来说,,最惹眼球的莫过于微信首页下拉呼出recent小程序。如此一来,小程序的使用场景顿时多了起来,公司也开始重视起来。

其实之前自己也一直想做一个小程序的,用来收集自己的位置信息,,当然位置数据是自己主动提交的。如此,就可以做阶段性的总结了,比如生成个全年范围内的热力图什么的,看看自己过去一年中都在什么地方消耗时间了~

其实,还想用小程序做另外一个项目的,关于LBS的,,已经把后台框架搭起来了,使用的Spring + Spring MVC + Mongodb;Spring 和 Spring MVC已经好久没用过(好吧,,Spring和Spring MVC第一次用,在学校时老师还没教,就出来找工作了)了,Mongodb更是从来没有接触过,所以一切从头开始。做完上个用纯Servlet搭的项目,感觉思维已经被禁锢了。。
不过,这个框架也挺有意思的,好像做游戏开发的都这样做,,整个项目只有一个Servlet,每个请求都带有一个messageId参数,不同的 messageId 代表不同的 Controler (中的不同的业务),message中包含了所有的请求信息和用户的session,然后将message实例注入到相应messageId对应的接口所在的Controler中进行操作。

用户请求 -》装配message -》将message以动态代理的方式注入相应的Controler -》根据message中的messageId,找到对应的接口 -》执行业务逻辑代码

第一次见到这种『框架』,还是蛮受启发的。因为是某前辈程序员自己搭的,就是坑多了点儿,耦合也比较严重。。

关于Mongodb,,当初学 MySQL 的时候,老师提到这是一种关系型数据库,与之相对的还有『非关系型数据库』,即NoSQL(全称Not Only SQL)。当时提到了Mongodb,觉得这个数据库名字特别好听,印象还挺深刻。。但具体它是什么,完全没概念。本来计划继续用 MySQL 的,但是中间想到一个问题,,怎么用 MySQL 在一个字段中存储未知数量的经纬度信息呢??直接用逗号拼接?觉得不够优雅。。然后在网上看到有网友说可以尝试 Mongodb,而且 Mongodb 中还有原生的地理位置索引,相当方便。于是,就想尝试一下,,欧耶!新的训练集~刷了一遍Mongodb的入门视频,又刷了一遍SSM(Spring + Spring MVC + Mongodb)框架整合视频,然后开始依样画葫芦。有几点记录下:

  1. 用@Autowried注入,但在调用相关实例的时候总是报错,具体报错信息记不得了,类似org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'locationController': Unsatisfied dependency expressed through field 'locationDao';网上几乎所有的方法都试了,还是不行,各种心灰意冷,,最后在一篇博客中得到启发,,那篇博客好像在讲注入什么的,还通过控制台的日志信息验证自己的想法。噢?然后我也去盯控制台,发现项目启动的时候没有关于Beans注入成功的信息,,丫丫!然后继续往上捣,发现applicationContext.xml没有被正确载入。。。。。重新修改web.xml配置文件路径,搞定!
    Loading XML bean definitions from class path resource [applicationContext.xml]

    Root WebApplicationContext: initialization completed in 1684 ms
  2. 配置文件中关于 Mongodb 数据库连接的地方,同样,,网上的方法几乎都试了,还是不行。主要是配置文件中提示cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mongo:mongo'.最后实在没辙,去 Mongodb 官网翻doc,,找到相应jar包的版本,发现人家用的<mongo:mongo-client>标签,不是<mongo:mongo>。。因为这段配置是在网上找的,而且都用的这个标签。。但我一般都会用最新版本的jar包,,好吧。

别的还算顺利,,从搭环境到我把第一条位置信息持久化的Mongodb中已经两天了。。。但收获也是满满~

关于微信小程序,,最近好像一直都在做关于前端的东西,博客中最近也分享的大多也是js的内容,但我明明是Java工程师。。。在上面的项目中遇到一个问题,,假如我想定时向数据库中插入位置信息,那常规实现起来可能是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
setInterval(function(){
wx.getLocation({
type: 'wgs84',
success: function(res) {
wx.getLocation({
url: '',
data: {
...
},
type: 'json',
method: 'POST',
success: res => {
console.log(res.data);
}
});
}
});
},10000);

这样的代码还是很可怕的,很容易陷入回调深渊。。想用Promise或者asyncawait,又怕某些手机支持到了ES5,于是想着有没有什么很好的解决办法,最好微信小程序也有个框架什么的。在网上做了做功课,发现了腾讯官方在Github上开源的一个框架wepy(微信小程序组件化开发框架WePY官方文档)。然后又开始做功课,看到文档上说是基于Vue.js框架,OK,,又去刷Vue的视频。在讲到Vue中的v-model的时候,好像明白一点什么是MVVM框架了。回过头再学wepy,,它像一个框架,又像一个翻译器。说到这儿,感觉又有点像本站所用Hexo,是一个博客框架。前者将.wyp文件翻译成[.wxml,.wxss,.js,.json],后者将.md文件翻译成.html文件。这两者应该都是基于node.js。想想以前做前端项目时,完全不是一样的感觉。到目前为止,因为不了解node.js,,我只能说,嗯,有点意思~

另外,,因为小程序代码包不能超过2M,所以今天尝试将目录中的静态资源文件放到服务器中,以节省空间。首先想到的是nginx,公司用的坑爹windows server 2008。事实证明的确坑爹,,已经可以在浏览器中访问本地图片列表了,但是点到某个具体的文件时就开始缓慢请求,最后报504错误。在自己Mac上的nginx模拟了下,虽然中间出了些问题,但最终还是解决了。只能将静态资源放到了tomcat中,不够优雅。。得改。
关于在mac中遇到问题,location中alias和root的区别,,

alias


syntax: alias file-path|directory-path;
default: no // 无默认值
context: location // 上下文环境,处于location配置项中
This directive assigns a path to be used for the indicated location. Note that it may look similar to the

root

// 这条命令为表明的位置分配了一个路径。需要注意的是,alias看起来有些像root
directive, but the document root doesn’t change, just the file system path used for the request.
// ???,但是文档根路径不会变,仅仅用来响应请求要访问的文件系统路径
For example:
location /i/ {
alias /spool/w3/images/;
}
The request “/i/top.gif” will return the file “/spool/w3/images/top.gif”.
// “/i/top.gif”的请求实际得到的是”/spool/w3/images/top.gif”


root


syntax: root path
default: root html
context: http, server, location, if in location
root specifies the document root for the requests. For example, with this configuration
location /i/ {
root /spool/w3;
}
A request for “/i/top.gif” will return the file “/spool/w3/i/top.gif”. You can use variables in the argument.
note: Keep in mind that the root will still append the directory to the request so that a request for “/i/top.gif” will not look in “/spool/w3/top.gif” like might happen in an Apache-like alias configuration where the location match itself is dropped. Use the

alias

directive to achieve the Apache-like functionality. 
// 记住,请求路径仍然会拼接在root所代指的路径后,所以请求”/i/top.gif”不会在”/spool/w3/top.gif”路径下寻找;类似的像类Apache服务器中的配置???😂???,在类Apache服务器中使用alias来实现类似的功能。