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

做者:李信棟javascript

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

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

1.1 想法開端

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

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

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

把插畫存到瀏覽器吧!git

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

1.2 應該有什麼功能?

功能很簡單:web

  • 保存操做:1. 對圖片點擊右鍵 2. 選擇「保存到瀏覽器」之類的選項
  • 查看操做:1. 點擊插件圖標 查看保存過的圖片。
  • 其它:1. 圖片同步到雲端,也可保存到瀏覽器本地。2. 既然要保存到雲端,天然須要帳號系統

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

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

雲存儲問題,賬號系統,多端同步
最開始只想作瀏覽器本地的存儲,使用 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 的開發週期大大縮減。這對於小團隊和初創公司尤其方便。

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

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

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

相關文章
相關標籤/搜索