平时由于工作的关系需要用到多台电脑,Mac和Windows来回切换。有时候想把一些信息复制到另一台电脑上,只能打开文件共享,然后把内容保存到文件里,再到另一台电脑里打开。时间一长,就积累了很多垃圾文件。于是乎就花了点时间,写了个简单的基于Web的内容共享程序,我叫它Clipboard。

源码在此:github

我是把它当作一个练手项目来写的,尝试了很多新东西,也学到了很多。

数据库

一开始我把所有内容以JSON格式存储到文件里,为此写了一个简单的JSON-DB以及相应的ORM。(View History)在这个过程中充分的学习了Meta class以及Descriptor的相关知识。

后来考虑到以后可能会有更多功能,自己维护一套类似数据库有点不现实,所以就转向了Sqlite,并采用了一个比较小巧的ORM - Peewee。也就有了当前的版本。

Unit Test

从写JSON-DB的时候就仔仔细细的写了Unit Test,虽然最后还是发现了一些纰漏,但是还算成功。后来又加了Web层的Unit Test,学会了用Tornado的HTTPClient来测试,也算收获不小。

class TestModel(unittest.TestCase):
    def setUp(self):
        application = app.App()
        http_server = tornado.httpserver.HTTPServer(application)
        http_server.listen(8888)

    def handle_request(self, response):
        self.response = response
        tornado.ioloop.IOLoop.instance().stop()

    def test_get(self):
        http_client = tornado.httpclient.AsyncHTTPClient()
        http_client.fetch('http://0.0.0.0:8888', self.handle_request)
        tornado.ioloop.IOLoop.instance().start()

        print self.response.body

XMLHTTPRequest

尝试了一把RESTful,但由于原生的HTML Form不支持DELETE方法,我又不想引入JQuery这样的牛刀。经过一番搜索,找着了XMLHTTPRequest。就照着网上的例子画了个瓢~

function delete_entry(id) {
        var form = new FormData();
        form.append("id", id);

        var xhr = new XMLHttpRequest();
        xhr.open("DELETE", "/c/"+id, true);
        xhr.responseType = "json";
        xhr.onload = function(e) {
                if (this.status == 200) {
                        var data = JSON.parse(this.response);
                        if (data.status == 'success'){
                                window.location.reload();
                        } else {
                                alert(data.status);
                        }
                } else {
                        alert('Connection error!');
                }
        };

        xhr.send(form);
};

Others

为了使开发的过程更加规范,我强制自己用了Github的issue功能,成功的解决了仅有的两个issue~

用了Yahoo的CSS框架 - Pure。Bootstrap太大了,而且默认的界面看疲劳了。所以就尝试了这个小清新的Pure。抄了不少官网的代码。最后的界面还凑合,不难看。

最后,上一张效果图~

Clipboard