使用 LeanCloud 服務作一站式Chrome插件開發——Favorite Image

1. 要開發的是什麼項目?

一個Chrome插件,用來保存瀏覽網頁時看到的喜歡的圖片。html

1.1 想法開端

在 pixiv 翻圖時看到一些喜歡的插畫,看完就隨手翻過去了,沒有保存。爲何呢? 由於以我對本身的瞭解,圖片下載下來,就至關於放進了垃圾桶。 並非由於本地的文件管理有多亂,而是由於,幾乎沒有用鼠標打開文件管理器的習慣。前端

如今我獲取信息的流量入口最經常使用的只有兩個:1. 終端 2. 瀏覽器node

因而乎,一個想法油然而生:git

把插畫存到瀏覽器吧!github

因而就馬上構思,動手寫了這款插件。web

1.2 應該有什麼功能?

功能很簡單chrome

  • 保存操做:1. 對圖片點擊右鍵 2. 選擇"保存到瀏覽器.." 之類的選項數據庫

  • 查看操做:1. 點擊插件圖標 查看保存過的圖片。後端

  • 其它:1. 圖片同步到雲端,也可保存到瀏覽器本地。2. 既然要保存到雲端,天然須要帳號系統瀏覽器

2. 開發須要解決的核心問題

核心問題有兩個,一個是數據雲存儲問題,一個是圖片防盜鏈問題。

雲存儲問題,賬號系統,多端同步
最開始只想作瀏覽器本地的存儲,使用Chrome提供的localStorage存在本地就。
後來由於localStorage並不支持數據庫語法查詢,有不少不便。使用過程當中又發現多端同步在體驗上的優越性,決定要把存儲放到雲上。

圖片防盜鏈問題
看了些資料,解決方式基本能夠分爲兩種。

一類使用前端js嵌入iframe解決,優勢是解決方式簡單,問題是Chrome插件不支持頁面嵌入式的js腳本。因此這個方案pass。

第二類使用後臺服務器作反防盜鏈措施,做爲中轉給前端使用。優勢是不受chrome插件的各類安全機制的限制,缺點是須要後臺支持,增長工做量和資源成本。
使用第二類完成。

3. 具體解決方案

雲存儲及賬號系統使用LeanCloud提供的存儲服務解決。
反防盜連接口使用LeanCloud提供的雲引擎搭建NodeJs後臺。
囉嗦一句,爲何要使用LeanCloud?
一是對個人需求能夠作到徹底免費,二是它們的文檔實在是太xx的好用了。

3.1 賬號系統

參照:數據存儲入門教程 · JavaScript

實現過程基本照抄這個教程的代碼。後臺帳號系統包括對帳號的重複檢測、密碼加密、session等都已經實現。

咱們要作的,就是調用前端的這幾個關鍵方法,實現簡單的註冊、登錄、退出:

// LeanCloud - 註冊
  // https://leancloud.cn/docs/leanstorage_guide-js.html#註冊
  var user = new AV.User();
  user.setUsername(username);
  user.setPassword(password);
  user.setEmail(email);
  user.signUp().then(function (loginedUser) {
    // 註冊成功
  }, (function (error) {
      alert(JSON.stringify(error));
  }));


  // LeanCloud - 登陸
  // https://leancloud.cn/docs/leanstorage_guide-js.html#用戶名和密碼登陸
  AV.User.logIn(username, password).then(function (loginedUser) {
    // 登陸成功
  }, function (error) {
    alert(JSON.stringify(error));
  });


  // LeanCloud - 當前用戶信息
  // https://leancloud.cn/docs/leanstorage_guide-js.html#當前用戶
  var currentUser = AV.User.current();


  // 退出登錄
  AV.User.logOut();

3.2 存儲服務

使用帳號系統爲每一個用戶添加身份信息後,存儲部分就只須要把數據 + 用戶身份信息一同上傳或下載就能夠了。

照樣只貼關鍵方法

// 初始化類(在數據庫中表現爲數據表`ImageRepo`)和實例(數據庫中表現爲一條數據)
this.ImageRepo = AV.Object.extend('ImageRepo');
var repo = new this.ImageRepo();
// 填充數據
repo.put('username', 'xxx');
// 上傳數據
repo.save().then(function (repo) {
    }, function (error) {
    });

// 下載數據
// 初始化對'ImageRepo'表的查詢
var query = new AV.Query('ImageRepo');
// 查詢條件爲 username字段等於'xxx'
query.equalTo('username', 'xxx');
// 查詢
query.find().then(function(results) {
    // 遍歷results
    // 在頁面添加解決防盜鏈問題後的圖片
}, function(error) {
});

3.3 使用LeanEngine作反防盜鏈中轉接口

要實現的效果是:

主要原理很簡單,後臺處理圖片請求時更改header中的referer字段,將結果做爲response返回。

關於這部分的實現,歡迎閱讀個人另外一篇文章,就再也不贅述:
服務器做防盜鏈圖片中轉,nodejs 上手項目簡明教程

關於LeanEngin的使用,文檔以下,使用方法很是簡單。
雲引擎快速入門

雲引擎支持NodeJS Python PHP JAVA
只須要下載雲引擎命令行工具lean,而後輸入幾行命令就能夠創建一個你熟悉的web框架。
而後,使用你熟悉的語言編寫反防盜鏈實現就好了。

3.4 Chrome 插件實現

有了 3.1~3.3 的實現,這部分就是簡單的插件部署和業務邏輯了。

Chrome 插件結構如圖:
圖片描述

主要業務:

  • 在popup窗口中添加註冊 登錄 退出 等業務。

  • 打開popup 窗口時從雲端獲取指定帳號下保存的圖片信息,並展現。若未登錄,則從瀏覽器localStorage獲取並展現。

  • background script 中添加右鍵菜單項: 當目標是圖片時,顯示Keep image in browser。

  • 點擊Keep image in browser, 執行保存業務邏輯:
    若登錄了,保存到雲端。若未登陸,保存到瀏覽器localStorage。

具體實現見個人github項目: KeepImageInBrowser
插件Web Store地址: Favorite Image

4. 最後,對去後端化的見解

前段時間在知乎上看到了一個問題,我也順便說下本身的見解。

web後端會不會變得愈來愈不須要?
像bmob和leancloud這類後臺雲服務的流行有一段日子了,使用這些服務使一些web、app的開發週期大大縮減。這對於小團隊和初創公司尤其方便。

但這並不意味着再也不須要本身開發後臺。不是由於他們提供的服務不夠全面(相反,我倒認爲這類服務將向着全面、便捷、快速發展),而是由於不少公司和產品,爲了保持服務的質量和穩定,突出本身產品的特性,須要本身定製本身的後臺,有針對性的去優化某些模塊。
雲服務做爲大衆服務平臺難覺得每一個產品作定製。

相似於遊戲引擎,現在各個平臺都不缺少優秀的遊戲引擎。但是仍有公司和團隊耗費大量的成本自研遊戲引擎,就是但願能配合本身的遊戲系統,完美地展示本身的遊戲。

同樣的,後臺雲服務和自定製的後臺,是相交但永遠不會重合的關係。 他們彼此之間相互影響,共同進步。

相關文章
相關標籤/搜索