一個Chrome插件,用來保存瀏覽網頁時看到的喜歡的圖片。html
在 pixiv 翻圖時看到一些喜歡的插畫,看完就隨手翻過去了,沒有保存。爲何呢? 由於以我對本身的瞭解,圖片下載下來,就至關於放進了垃圾桶。 並非由於本地的文件管理有多亂,而是由於,幾乎沒有用鼠標打開文件管理器的習慣。前端
如今我獲取信息的流量入口最經常使用的只有兩個:1. 終端 2. 瀏覽器node
因而乎,一個想法油然而生:git
把插畫存到瀏覽器吧!github
因而就馬上構思,動手寫了這款插件。web
功能很簡單chrome
保存操做:1. 對圖片點擊右鍵 2. 選擇"保存到瀏覽器.." 之類的選項數據庫
查看操做:1. 點擊插件圖標 查看保存過的圖片。後端
其它:1. 圖片同步到雲端,也可保存到瀏覽器本地。2. 既然要保存到雲端,天然須要帳號系統瀏覽器
核心問題有兩個,一個是數據雲存儲問題,一個是圖片防盜鏈問題。
雲存儲問題,賬號系統,多端同步
最開始只想作瀏覽器本地的存儲,使用Chrome提供的localStorage存在本地就。
後來由於localStorage並不支持數據庫語法查詢,有不少不便。使用過程當中又發現多端同步在體驗上的優越性,決定要把存儲放到雲上。
圖片防盜鏈問題
看了些資料,解決方式基本能夠分爲兩種。
一類使用前端js嵌入iframe解決,優勢是解決方式簡單,問題是Chrome插件不支持頁面嵌入式的js腳本。因此這個方案pass。
第二類使用後臺服務器作反防盜鏈措施,做爲中轉給前端使用。優勢是不受chrome插件的各類安全機制的限制,缺點是須要後臺支持,增長工做量和資源成本。
使用第二類完成。
雲存儲及賬號系統使用LeanCloud提供的存儲服務解決。
反防盜連接口使用LeanCloud提供的雲引擎搭建NodeJs後臺。
囉嗦一句,爲何要使用LeanCloud?
一是對個人需求能夠作到徹底免費,二是它們的文檔實在是太xx的好用了。
實現過程基本照抄這個教程的代碼。後臺帳號系統包括對帳號的重複檢測、密碼加密、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();
使用帳號系統爲每一個用戶添加身份信息後,存儲部分就只須要把數據 + 用戶身份信息一同上傳或下載就能夠了。
照樣只貼關鍵方法
// 初始化類(在數據庫中表現爲數據表`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) { });
要實現的效果是:
我有一個防盜鏈圖片鏈接abc.com/xxx.png。
個人接口url是http://codeli.leanapp.cn/imag...。
訪問http://codeli.leanapp.cn/imag...可訪問原圖,不受防盜鏈措施限制。
主要原理很簡單,後臺處理圖片請求時更改header中的referer字段,將結果做爲response返回。
關於這部分的實現,歡迎閱讀個人另外一篇文章,就再也不贅述:
服務器做防盜鏈圖片中轉,nodejs 上手項目簡明教程
關於LeanEngin的使用,文檔以下,使用方法很是簡單。
雲引擎快速入門
雲引擎支持NodeJS Python PHP JAVA
只須要下載雲引擎命令行工具lean,而後輸入幾行命令就能夠創建一個你熟悉的web框架。
而後,使用你熟悉的語言編寫反防盜鏈實現就好了。
有了 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
前段時間在知乎上看到了一個問題,我也順便說下本身的見解。
web後端會不會變得愈來愈不須要?
像bmob和leancloud這類後臺雲服務的流行有一段日子了,使用這些服務使一些web、app的開發週期大大縮減。這對於小團隊和初創公司尤其方便。
但這並不意味着再也不須要本身開發後臺。不是由於他們提供的服務不夠全面(相反,我倒認爲這類服務將向着全面、便捷、快速發展),而是由於不少公司和產品,爲了保持服務的質量和穩定,突出本身產品的特性,須要本身定製本身的後臺,有針對性的去優化某些模塊。
雲服務做爲大衆服務平臺難覺得每一個產品作定製。
相似於遊戲引擎,現在各個平臺都不缺少優秀的遊戲引擎。但是仍有公司和團隊耗費大量的成本自研遊戲引擎,就是但願能配合本身的遊戲系統,完美地展示本身的遊戲。
同樣的,後臺雲服務和自定製的後臺,是相交但永遠不會重合的關係。 他們彼此之間相互影響,共同進步。