Chrome 插件 030RateViewer 0.02版更新

上一篇地址:Chrome 插件 030RateViewer

在上一次做好了个Chrome插件之后,自己一直在使用。上个版本的功能,仅仅只是去Get了一把数据,保证每天能看到汇率而已。由于最近又看上了好多宅物,因此除了能看到每天的汇率之外,更迫切的想要知道与前一天的变化。以便在较低的时候出手。(宅需果然是第一生产力)

GitHub地址:030RateViewer
注:由于Chrome已经无法直接从本地拖crx包来安装了,因此需要的话可以下载整个文件夹使用开发者模式,通过加载已解压的扩展程序来进行使用。或者使用不可名状的方法从应用商店下载。名字就是030RateViewer.

碰巧今天天凤上又吃了两把二位,于是就干脆把汇率的参照对比这一功能给加上来解解气。
其实类似的功能在上一次也已经想到了。而这一次主要实现的就是第三条。(所以根本就没有完美的需求啊)

  • 萌购对于国内的IP,给出的地址是.net。而对于国外的IP给出的地址是.com。因此,如果在国外使用的话, 估计速度会有一点慢。
  • 每次点开插件,其实都是一次请求。但其实不一定有这个必要。可以缓存一下,然后等过一段时间再发起请求。(毕竟也不能给对方服务器造成负担)
  • 可以记录一下前一天的汇率。在第二天查看时有一个参照和对比。(甚至可以积累一点数据做一个走势图,虽然感觉没什么必要)

那么接下来就来看看对应的代码吧。因为这次使用了Bootstrap修改了样式,首先放出HTML的代码。

<!DOCTYPE html>
<html lang="UTF-8">
<head>
    <link rel="stylesheet" href="./css/bootstrap.min.css" />
    <link rel="stylesheet" href="./css/index.css" />
    <script type="text/javascript" src="./js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="./js/bootstrap.min.js"></script>
    <script type="text/javascript" src="./js/index.js"></script>
    <body>
        <div id="container">
            <div class = "rate-area">
                <div class="row">
                    <div class="col-xs-8">
                        <p class = "rate-content text-info">Loding...</p>
                    </div>
                    <div class="col-xs-4">
                        <p class="arrow-icon glyphicon" aria-hidden="true" data-toggle="popover" data-placement="bottom" data-container="body"></p>
                        <!-- 这里使用了Bootstrap 的Glyphicons字体图标来做箭头标识,同时也是设置弹出框的元素,弹出框中显示的内容是在 js 中设定的。-->
                    </div>
                </div>
            </div>
            <div class= "gate">
                <button class= "desc btn btn-sm btn-block btn-primary">传送门</button>
            </div>
        </div>
    </body>
</head>
</html>

接下来就是最关键的 js 部分了。由于代码比较长,就只截取相应的内容。完整的代码可以去GitHub上查看。其中存储的方法使用了Chrome的chrome.storage.local方法,其用法类似于HTML5的localstorage。详细方法,请查阅官方文档。

$(function() {
    // 式样上的 class 和 显示内容 通过一个对象常量进行管理
    //----------- 常量定义区 START ---------
    const ARROW = {
        UP: "glyphicon-arrow-up",
        DOWN: "glyphicon-arrow-down",
        MINUS: "glyphicon-minus",
        BLACK: "arrow-icon-black",
        RED: "arrow-icon-red",
        GREEN: "arrow-icon-green"
    };

    const MSG = {
        INFO_NORMAL: "系统中没有存储昨天的汇率",
        INFO_OLDRATE: "昨日汇率: ",
        INFO_NEWRATE: "萌购汇率: "
    };

    const URL = "http://www.030buy.net/";
    //------------ 常量定义区 END -----------

    //------------ 变量定义区 START -----------
    // 获取当前日期
    var date = new Date();
    var today = date.toLocaleDateString();
    //------------ 变量定义区 END -----------

    // …… 省略中间代码

    //------------ 主逻辑区域 START------------
    /*  
        数据结构 {
            // 存放今天数据
            "newData":{
                "date":date  日期
                "rate":rate 汇率
                "arrowMark":arrowMark 相对于昨天,走势变化
                "arrowColor": arrowColor 箭头颜色
                "popMsg": popMsg 弹出窗口的内容
            }
            
            // 存放前一天的数据
            "oldData":{
                "date": date
                "rate": rate
                "arrowMark":arrowMark
                "arrowColor": arrowColor 箭头颜色
            }
        }

        chrome.storage.local.remove('newData'); 清除云端存储
        chrome.storage.local.set({'newData': newData}); 设置今天日期
        chrome.storage.local.get('newData'); 获取今天日期
        每天只在打开的第一次通过ajax来获取最新的汇率,并且和前一天进行比较
        利用 chrome.storage.local 来判断是否需要获取当天的信息
    */

    // 获取当天的萌购汇率并更新存储
    function dateRefresh(URL) {
        $.get(URL, function(data) {
            var rate = $(data).find('.jmall-currency').html();
            var rateArr = rate.split(':'); // 切分文字表述和汇率数字,返回的数组 0 是文字描述,,1 是汇率数字
            var arrowMark = ARROW.MINUS;
            var arrowColor = ARROW.BLACK;
            var popMsg = MSG.INFO_NORMAL;

            $('.rate-content').html(rateArr[0] + ': <strong>' + rateArr[1] + '</strong>');

            // 当存在过去的数据时,与过去数据进行比较,并设定箭头与走势
            chrome.storage.local.get('oldData', function(data) {
                if (data.oldData) {
                    var oldData = data.oldData;
                    arrowMark = (parseFloat(rateArr[1]) == parseFloat(oldData.rate) ? ARROW.MINUS : (parseFloat(rateArr[1]) > parseFloat(oldData.rate) ? ARROW.UP : ARROW.DOWN));
                    arrowColor = (arrowMark == ARROW.MINUS ? ARROW.BLACK : (arrowMark == ARROW.UP ? ARROW.RED : ARROW.GREEN));
                    popMsg = MSG.INFO_OLDRATE + ' (' + oldData.date + ') ' + oldData.rate;
                }

                // 更新新的数据
                chrome.storage.local.set({
                    'newData': {
                        'date': today,
                        'rate': parseFloat(rateArr[1]),
                        'arrowMark': arrowMark,
                        'arrowColor': arrowColor,
                        'popMsg': popMsg
                    }
                }, function() {
                    // showData('newData');
                    // 设置箭头图标以及对应的颜色
                    $('.arrow-icon').addClass(arrowMark).addClass(arrowColor).attr('data-content', popMsg);
                    $('.arrow-icon').popover();
                });
            });
        });
    }

    chrome.storage.local.get('newData', function(data) {
        // 第一次打开应用时,data.today 为 null 通过 ajax 获取当天汇率并设置
        if (!data.newData) {
            // console.log('new data');
            dateRefresh(URL);
        } else {
            // 当存储的日期不是当天的时候,更新old,并更新汇率的箭头符号
            if (data.newData.date != today) {
                chrome.storage.local.set({
                    'oldData': data.newData
                }, function() {
                    chrome.storage.local.get('oldData', function(data) {});
                    dateRefresh(URL);
                });
            } else {
                var newData = data.newData;
                $('.rate-content').html(MSG.INFO_NEWRATE + ': <strong>' + newData.rate + '</strong>');
                // 设置箭头图标以及对应的颜色
                $('.arrow-icon').addClass(newData.arrowMark).addClass(newData.arrowColor).attr('data-content', newData.popMsg);
                $('.arrow-icon').popover();
            }
        }
    });

//…… 后面代码省略

其实关于dateRefresh方法,感觉应该还能再写得更简单一些。因为现在看来,这个函数实现的功能还是有点多。只是由于经验和能力还欠缺,不知道怎么简化更好。特别是当有$.getchrome.storage这种异步方法时,没什么头绪。还望能得到一些指导。

光看上面的代码应该听枯燥的吧,下面就来放一下实际样子的截图吧。

当首次打开插件时,会通过$.get方法获取当天的萌购汇率(此时会有一个Loading的文字),由于系统中没有存储过。所以走势图是 -。点开箭头处也会有文字显示。此外,首次打开插件的同一天内,会采用存储的内容直接显示。这部分因为不太好截图,所以可以看上面的代码。

当第二天(或者第N天后)打开时,会先比较储存着的数据。然后用$.get进行更新(此时也会有一个Loading的文字)。然后会和存储的汇率进行比较,给出对应的走势表示(红色向上箭头,绿色向下箭头,黑色横杠)。点开后也会显示之前存储的日期和汇率。(这里的只是我用来测试效果的数据)。




到此为止,0.02版本的功能就基本实现了。在实现了和过去数据进行对比的同时,顺带实现了同一天内利用储存的数据来达到提高加载速度的目的。估计下一次的话,再实现些什么功能呢?可能是登陆也可能是一个搜索功能?具体还是要看需求吧。

而其实在这一次的编写过程中,深深地感到了测试的重要性以及测试Case设定的重要性。不过关于这个,我还是再开一篇来写吧。毕竟这篇已经足够长了,再看下去的话估计要睡着了吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容