Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 男女交性视频免费,视频一区在线,国产亚洲久久

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          海報(bào)圖片生成服務(wù)在狐友的落地實(shí)踐

          海報(bào)圖片生成服務(wù)在狐友的落地實(shí)踐

          目背景

          狐友作為搜狐的一款社交產(chǎn)品,在流量傳播上有著旺盛的需求點(diǎn)。而在流量傳播所需的眾多載體之中,海報(bào)圖片以其簡單的分享形式、可定制的視覺體驗(yàn)、自帶二維碼識別導(dǎo)流等特點(diǎn),成為了社交產(chǎn)品高頻必備的流量載體。

          作為狐友的前端開發(fā),生成海報(bào)圖片就成為了我們工作中持續(xù)不斷的一個(gè)重要需求點(diǎn)。以下是狐友目前的產(chǎn)品前端服務(wù)矩陣和海報(bào)圖片的產(chǎn)品形式。

          圖 1 狐友產(chǎn)品前端服務(wù)矩陣和海報(bào)圖片的產(chǎn)品形式

          海報(bào)圖片實(shí)現(xiàn)現(xiàn)狀

          從上圖1可以看到,生成海報(bào)圖片對于狐友產(chǎn)品矩陣來說是一個(gè)高頻強(qiáng)需求。海報(bào)圖片作為分享載體,對于各平臺的分享流程對接也非常暢通和直觀,例如不同于小程序卡片分享只能拘泥于微信平臺,網(wǎng)頁分享的鏈接形式不夠直觀。

          而在海報(bào)圖片這個(gè)重要環(huán)節(jié),長期的主要技術(shù)手段一直是通過各客戶端開發(fā)在本地設(shè)備上進(jìn)行繪制,但這種方案存在如下的劣勢困擾著我們:

          • 各端無法復(fù)用:如圖2, 如果要全平臺都要做圖片分享,那么需要各端分別開發(fā),即使生成的圖片一模一樣,也要開發(fā)iOSAndroidH5、小程序一共4遍,整體開發(fā)各端無法互相復(fù)用。
          • 長圖大圖崩潰:客戶端限于設(shè)備平臺或系統(tǒng)限制,對于長圖的生成并不友好,會出現(xiàn)長圖因?yàn)閮?nèi)存或算力限制無法生成的情況,其中小程序尤為明顯,在微信的框架下很容易長圖生成造成程序直接崩潰。
          • 開發(fā)效率較低:客戶端本地繪制海報(bào)圖片,一般需要手寫原生代碼效率不高。小程序端雖然使用wxml-to-canvas(H5端使用html-to-canvas)來繪制減輕了一些手寫命令式繪制代碼的負(fù)但,但這種標(biāo)記語言轉(zhuǎn)canvas在實(shí)現(xiàn)上也存在缺陷,相比HTML+CSS的表達(dá)力還是非常受限。所以,海報(bào)圖片在代碼層面開發(fā)效率比較低。

          為了解決以上問題,我們開始著手調(diào)研并實(shí)踐落地了一套全新的海報(bào)圖片統(tǒng)一服務(wù),命名為hy-ssr-img

          圖 2 狐友大前端海報(bào)生成各端開發(fā)狀態(tài)

          海報(bào)圖片統(tǒng)一服務(wù)


          海報(bào)圖片統(tǒng)一服務(wù)是一套基于PuppeteerNode.js后端服務(wù)端(SSR)渲染頁面并截圖生成海報(bào)圖片的服務(wù),這一服務(wù)解決了原有海報(bào)圖片生成的三大問題:

          • 各端無法復(fù)用 -> 4端同時(shí)復(fù)用:iOSAndroidH5、小程序4端只需要開發(fā)一遍即可,效率提升400%,如圖3
          • 長圖大圖崩潰 -> 無懼長圖渲染:不需要再擔(dān)心長圖渲染問題,服務(wù)端渲染圖片能力理論上可以達(dá)到上萬長度的渲染,針對不超過5屏的圖片需求來說綽綽有余
          • 開發(fā)效率較低 -> 開發(fā)效率最優(yōu):使用效率超高、表達(dá)力超強(qiáng)的標(biāo)記語言HTML + CSS渲染,開發(fā)效率和表達(dá)力都達(dá)到最優(yōu)狀態(tài)

          圖 3 海報(bào)圖片統(tǒng)一服務(wù)各端復(fù)用

          那么,海報(bào)圖片統(tǒng)一服務(wù)是如何建立起來的呢?下面是從項(xiàng)目立項(xiàng)開始的具體設(shè)計(jì)方案。

          項(xiàng)目選型


          首先,我們調(diào)研了業(yè)界現(xiàn)有的圖片渲染方案,如下表。通過下表的調(diào)研總結(jié)可以看出各個(gè)方案各有優(yōu)劣勢。由于復(fù)用提效是重要需求點(diǎn),我們把方案鎖定了服務(wù)端渲染方向上,即入選方案為:

          • Node.js截圖方案
          • 服務(wù)端圖層繪畫方案

          在對比兩種方案,以及參考相關(guān)業(yè)務(wù)實(shí)踐后,我們最終選用了最常見的【Node.js截圖方案】。因?yàn)榉?wù)端圖層渲染選用的圖形庫在排版表達(dá)力上遠(yuǎn)不及HTML+CSS在瀏覽器上的表達(dá)力,而且系統(tǒng)預(yù)期的使用對象是前端開發(fā)人員,并不是產(chǎn)品和運(yùn)營,所以服務(wù)端圖層渲染方案的拖拽方式并不是必選項(xiàng),反而由于拖拽渲染表達(dá)力的限制,對于實(shí)現(xiàn)一些排版復(fù)雜的圖片非常吃力。而Node.js截圖方案則沒有這方面的問題,前端開發(fā)只需要常規(guī)開發(fā)頁面即可,然后交給Puppeteer渲染后進(jìn)行截圖形成最終用戶看到的海報(bào)圖片。

          表 1 項(xiàng)目選型方案對比

          項(xiàng)目架構(gòu)流程方案

          在確定了【Node.js截圖方案】之后,我們對項(xiàng)目整體架構(gòu)流程進(jìn)行了設(shè)計(jì),首先由于我們的應(yīng)用的后端Java接口服務(wù)已經(jīng)非常成熟,針對參數(shù)的合法性校驗(yàn)及加簽解簽等防護(hù)措施都已建立,所以我們在開發(fā)Node.js服務(wù)時(shí)就沒有必要再造輪子,那么怎么把這些基礎(chǔ)接口功能和Node.js服務(wù)聯(lián)系起來呢?我們決定把Node.js服務(wù)放到內(nèi)網(wǎng),通過只允許后端服務(wù)直接訪問的方式來達(dá)到這一目的,這樣后端接口層就像一個(gè)盾牌,擋在用戶和Node.js服務(wù)之間,而我們就可以專注實(shí)現(xiàn)Node.js的截圖功能了。整體方案流程如下圖4:

          圖 4 Node.js截圖方案整體流程方案

          僅首屏SSR渲染方案

          整體架構(gòu)流程方案確定后,我們就需要細(xì)化截圖相關(guān)的詳細(xì)流程方案。在經(jīng)過調(diào)研之后,我們發(fā)現(xiàn)常見的截圖開源方案在我們的使用場景中還有很多需要優(yōu)化的點(diǎn)和不滿足需求的部分,因此我們決定自研開發(fā)【僅首屏SSR渲染】方案。針對項(xiàng)目特點(diǎn),每個(gè)海報(bào)圖片只有一張,所以不存在首屏渲染過后還要渲染第二頁的場景,因此該方案只包含首屏字符串渲染即可,不需要帶有常見 SSR 的客戶端激活渲染的打包構(gòu)建及執(zhí)行流程。 去掉常見SSR方案中的非首屏渲染邏輯后,頁面就只包含了首屏必要的渲染代碼(HTML + CSS),去除一切不需要的環(huán)節(jié)(JS執(zhí)行激活),保證頁面給到 Puppeteer渲染時(shí)是最簡化的狀態(tài),盡可能減少網(wǎng)絡(luò)I/O和本地磁盤I/O,只包含單純的渲染過程,以加速渲染速度。以下是常見方案和自研方案的對比。

          最常見的截圖方案是通過請求網(wǎng)頁地址,渲染后截圖,如圖5。

          圖 5 Node.js截圖詳細(xì)流程常見方案

          這種方案不管是CSR(客戶端渲染)方式,還是SSR(服務(wù)端渲染)方式,都還是有優(yōu)化空間。我們可以發(fā)現(xiàn),Puppeteer請求網(wǎng)頁的網(wǎng)絡(luò)消耗是可以被節(jié)省下來的,如果我們直接使用在本地生成好的HTMLCSS,則請求網(wǎng)頁并下載所用的時(shí)間就可以節(jié)省下來,獲得更快的截圖速度。

          另外頁面的動態(tài)渲染通過SSR來進(jìn)行,這樣完全不需要客戶端JS的存在,直接還可以省去加載客戶端JS的時(shí)間,獲得更優(yōu)的渲染速度,這種優(yōu)化后的Node.js截圖詳細(xì)流程方案如圖6所示。

          圖 6 優(yōu)化后的Node.js截圖詳細(xì)流程方案

          該方案還有技術(shù)細(xì)節(jié)需要設(shè)計(jì),即如何完成SSR渲染首屏的工作,由于我們的技術(shù)棧是Vue,所以選用vue-server-renderer為基礎(chǔ)庫來完成這一過程,如圖7。

          圖 7 僅首屏SSR渲染方案技術(shù)流程

          項(xiàng)目業(yè)務(wù)技術(shù)流程設(shè)計(jì)

          項(xiàng)目業(yè)務(wù)技術(shù)流程設(shè)計(jì)


          整體架構(gòu)流程方案確定之后,我們就要進(jìn)行更細(xì)化的業(yè)務(wù)技術(shù)流程設(shè)計(jì),這里有很多細(xì)節(jié)需要考慮:

          • 后端接口層如何和Node.js截圖服務(wù)進(jìn)行通信?
          • 截圖服務(wù)是一個(gè)高耗時(shí)服務(wù),如何防止長鏈接堆積?
          • 如何設(shè)計(jì)海報(bào)圖片緩存層?如何設(shè)計(jì)提供海報(bào)預(yù)渲染?
          • 其他流程細(xì)節(jié)...

          為了解決這些問題,我們設(shè)計(jì)了如下的流程,如圖8。

          圖 8 Node.js截圖服務(wù)業(yè)務(wù)技術(shù)流程

          可以看到整個(gè)流程設(shè)計(jì)由接口同步請求和截圖異步任務(wù)兩大塊組成。我們把Node.js截圖服務(wù)當(dāng)做一個(gè)純渲染圖片的服務(wù),用戶發(fā)起請求給后端服務(wù)時(shí)會攜帶渲染頁面所需要的動態(tài)參數(shù),后端服務(wù)則負(fù)責(zé)參數(shù)校驗(yàn)等工作,并且下發(fā)給用戶一個(gè)異步任務(wù)ID。然后后端服務(wù)會請求截圖服務(wù),截圖服務(wù)收到請求后并不會立刻截圖,而是直接返回后端服務(wù),并開啟異步任務(wù)去進(jìn)行耗時(shí)的截圖服務(wù),這樣就可以防止長鏈接堆積造成服務(wù)不可用的情況發(fā)生。之前下發(fā)給用戶側(cè)的異步任務(wù)ID就是異步截圖任務(wù)完成后通知后端服務(wù)的憑證,這樣當(dāng)截圖服務(wù)完成后就可以通知后端服務(wù)截圖完成狀態(tài)(截圖成功或者失敗),而用戶側(cè)則可通過輪詢后端服務(wù)接口得知截圖是否完成并使用海報(bào)圖片了,當(dāng)然可以設(shè)置一個(gè)超時(shí)時(shí)間來完成整個(gè)截圖服務(wù)的交互閉環(huán)。

          對于海報(bào)圖片的緩存層也是要考慮的,因?yàn)楹芏鄨鼍跋掠脩粽埱蟮暮?bào)圖片是一模一樣的,比如我們的熱榜海報(bào)會在固定時(shí)間生成一次,那么緩存層可以有效緩解截圖耗時(shí)操作,并且為預(yù)生成海報(bào)圖片提供了基礎(chǔ)。比如我們會在特定時(shí)間通過代碼自動預(yù)渲染一批海報(bào),當(dāng)?shù)谝粋€(gè)用戶來訪問時(shí)就不需要等待耗時(shí)的截圖服務(wù),直接返回渲染好的海報(bào)圖片即可。那么命中緩存的條件是什么呢?對于長的一模一樣的海報(bào)圖片當(dāng)然希望只生成一次后都走緩存層。我們的設(shè)計(jì)中決定“圖片長相”的因素有兩個(gè):

          1.海報(bào)地址:對應(yīng)不同的海報(bào)樣式

          2.海報(bào)參數(shù):對應(yīng)同一個(gè)海報(bào)樣式中的不同數(shù)據(jù)

          所以,我們通過hash(“海報(bào)地址”+“海報(bào)參數(shù)”)的方式得到緩存命中的key,以此來控制命中緩存。另外截圖服務(wù)生成海報(bào)圖片后會直接上傳到CDN進(jìn)行存儲,用戶側(cè)加載海報(bào)圖片的速度和穩(wěn)定性也得到了相應(yīng)的保障。

          項(xiàng)目技術(shù)選型及工程化方案

          項(xiàng)目技術(shù)選型及工程化方案


          在業(yè)務(wù)技術(shù)流程方案確定后,就需要為此搭建一套工程化開發(fā)環(huán)境,來支持項(xiàng)目業(yè)務(wù)的具體開發(fā)。我們基于公司現(xiàn)有基礎(chǔ)設(shè)施以及技術(shù)棧,確定了以下主要技術(shù)選型:

          • 接口服務(wù)框架:Express
          • 頁面渲染框架:Vue
          • 支持SSR渲染:vue-server-renderer
          • 支持瀏覽器截圖:Puppeteer
          • 支持頁面開發(fā)環(huán)境 :webpack
          • 圖片存儲:OSS (公司內(nèi)部對象存儲服務(wù))
          • 服務(wù)端日志:Logstash + Kafka+ Elasticsearch + Kibana(公司內(nèi)部基礎(chǔ)日志服務(wù)鏈)
          • 部署:DomeOS (公司內(nèi)部云服務(wù)平臺)

          如圖9,展示了通過以上技術(shù)棧及基礎(chǔ)設(shè)施組建的整個(gè)工程化方案。

          圖 9 Node.js截圖服務(wù)工程化方案

          這里需要說明是,一個(gè)海報(bào)圖片對應(yīng)一個(gè)頁面,一個(gè)頁面會有兩個(gè)入口文件:一個(gè)CSR(客戶端渲染)用于開發(fā)頁面時(shí)使用,一個(gè)SSR(服務(wù)端渲染)用于截圖時(shí)Puppeteer渲染頁面使用。這么設(shè)計(jì)的原因是,CSR渲染使用webpack-dev-server是現(xiàn)成的開源方案,對于開發(fā)時(shí)熱更新等支持不需要自定義開發(fā),開箱即用,如果開發(fā)時(shí)也使用SSR進(jìn)行就需要進(jìn)行針對性的改造,由于開發(fā)體驗(yàn)上并沒有區(qū)別,我們就選用了更高效地搭建方式。而截圖時(shí)頁面渲染方式就是上文提到的【僅首屏 SSR 渲染】。

          項(xiàng)目關(guān)鍵優(yōu)化實(shí)踐


          從用戶發(fā)起請求到海報(bào)圖片返回,這整個(gè)過程的耗時(shí)需要進(jìn)行“壓榨”,以獲得更好的用戶體驗(yàn)。以下是我們在開發(fā)過程中實(shí)踐和驗(yàn)證的相關(guān)重點(diǎn)優(yōu)化和部分效果收益。從第一版基礎(chǔ)開發(fā)到最后優(yōu)化完成的版本,截圖服務(wù)總用時(shí)從1300ms+降低到了600ms+(注:測試數(shù)據(jù)均取相同開發(fā)機(jī)10次執(zhí)行結(jié)果的平均值,渲染相同的海報(bào)圖片,圖片為超長圖且內(nèi)容豐富,長寬為:4967×750)。表2為各關(guān)鍵優(yōu)化點(diǎn)明細(xì)。

          表 2 項(xiàng)目關(guān)鍵優(yōu)化實(shí)踐

          項(xiàng)目在線文檔預(yù)覽系統(tǒng)


          為了方便使用海報(bào)圖片的開發(fā)人員,我們還配套開發(fā)了海報(bào)生成系統(tǒng)在線文檔。開發(fā)人員可以通過該系統(tǒng)查看現(xiàn)有的海報(bào)圖片以及相關(guān)參數(shù)字段,并可以通過右方的編輯器更改字段的值并實(shí)時(shí)得到新的渲染圖進(jìn)行預(yù)覽和下載。如圖10,開發(fā)人員可以在這個(gè)playground里進(jìn)行所見即所得的預(yù)覽及操作。

          圖 10 海報(bào)在線文檔預(yù)覽系統(tǒng)

          項(xiàng)目日志實(shí)踐

          海報(bào)圖片服務(wù)作為一個(gè)后端服務(wù),日志采集分析和監(jiān)控是必不可少的,我們可以通過日志得到以下信息:

          • 海報(bào)圖片生成的訪問情況
          • 海報(bào)圖片生成的性能優(yōu)劣
          • 海報(bào)圖片生成失敗的原因
          • 海報(bào)圖片生成異常的報(bào)警

          所以,我們封裝了3種log日志用于海報(bào)圖片服務(wù):

          • access:記錄每次請求的請求日志
          • debug:記錄生成圖片的關(guān)鍵節(jié)點(diǎn)信息的日志
          • error:記錄生成圖片失敗及原因的錯(cuò)誤日志

          日志處理完成后,我們接入了公司現(xiàn)有日志基建服務(wù)來完成后續(xù)的日志采集、存儲和分析等功能,如圖11所示,通過這一套日志流程,我們就可以更加放心地上線并時(shí)刻關(guān)注我們服務(wù)的運(yùn)行情況,輕松做到快速排查和分析問題。

          圖 11 海報(bào)系統(tǒng)日志服務(wù)

          項(xiàng)目部署方案


          海報(bào)生成是一個(gè)耗時(shí)任務(wù),其繪制速度依賴于服務(wù)器的CPU和內(nèi)存。經(jīng)過線上數(shù)據(jù)評估,截圖服務(wù)qps最大支持60即可,經(jīng)使用JMeter并發(fā)測試:

          • 當(dāng)使用單實(shí)例(CPU1核 + 內(nèi)存 2G)單進(jìn)程部署項(xiàng)目時(shí),并發(fā)為1時(shí)生成5000像素的圖片需要耗時(shí)約2s,并發(fā)數(shù)超過1時(shí),后面的請求得等待前面請求生成完圖片,才會生成,生成圖片時(shí)間會隨并發(fā)數(shù)成倍增加。
          • 當(dāng)使用單實(shí)例(CPU1核 + 內(nèi)存 2G)多進(jìn)程部署項(xiàng)目時(shí),并發(fā)為1時(shí)生成5000像素的圖片需要耗時(shí)約2s,并發(fā)數(shù)超過1時(shí),當(dāng)并發(fā)數(shù)少于進(jìn)程數(shù)時(shí),會同時(shí)生成圖片,并發(fā)為5時(shí),圖片返回時(shí)間約為9s,此時(shí)CPU占用會超過40%,內(nèi)存占用20%,雖然CPU和內(nèi)存在并發(fā)數(shù)量為5的時(shí)候占用率不高,但是生成圖片的速度會大幅下降,所以需要增大單實(shí)例CPU和內(nèi)存的大小。
          • 當(dāng)使用單實(shí)例(CPU4核 + 內(nèi)存 6G)多進(jìn)程部署時(shí),并發(fā)為1時(shí)生成5000像素的圖片耗時(shí)約1s,并發(fā)數(shù)為5的時(shí)候,圖片返回時(shí)間約為3s,當(dāng)并發(fā)為10的時(shí)候,圖片返回時(shí)間約為8s。此時(shí)CPU占用會超過20%,內(nèi)存占用10%。

          所以為了保證圖片的生成速度和穩(wěn)定性,使并發(fā)量少的時(shí)候圖片生成速度盡可能快,并發(fā)量大的時(shí)候圖片生成速度在可接受時(shí)間內(nèi),采用了多實(shí)例加多進(jìn)程的部署方式,如圖12,項(xiàng)目部署于DomeOS平臺,部署了5臺 (CPU4核 + 內(nèi)存 6G) 實(shí)例,每個(gè)實(shí)例通過pm2啟動4個(gè)進(jìn)程。通過負(fù)載均衡可以使請求平均打到每個(gè)實(shí)例的每個(gè)進(jìn)程上,讓并發(fā)少的時(shí)候最快的生成圖片,并發(fā)大的時(shí)候充分利用所有實(shí)例,加快整體生成圖片時(shí)間。生成5000像素的圖片,當(dāng)并發(fā)數(shù)小于5時(shí),圖片可以在1s左右返回,當(dāng)并發(fā)數(shù)為20,圖片可以在3s左右返回,當(dāng)并發(fā)數(shù)為60時(shí),圖片可以在8s之內(nèi)返回。

          圖 12 海報(bào)系統(tǒng)部署方案

          項(xiàng)目成果

          截止到2023年初,海報(bào)圖片服務(wù)已上線海報(bào)10+個(gè)。每個(gè)海報(bào)只需開發(fā)1遍就可供給H5、小程序、AndroidiOS共4端進(jìn)行使用。每天平均生成海報(bào)圖片6000+,每張海報(bào)圖片平均生成時(shí)間400ms左右,支持超長圖可達(dá)10000+像素。

          未來展望

          隨著項(xiàng)目迭代,海報(bào)服務(wù)未來可能有更大的需求訴求,下面列出海報(bào)服務(wù)未來進(jìn)化的一些展望:

          1、賦能外部開發(fā)人員

          目前項(xiàng)目是以普通項(xiàng)目的開發(fā)模式進(jìn)行研發(fā),如果提供給非內(nèi)部研發(fā)人員使用則有很多流程和規(guī)范上的問題難以解決。未來可以支持渲染遠(yuǎn)程組件,通過遠(yuǎn)程組件的方式下發(fā)給外部研發(fā)進(jìn)行開發(fā),以此隔絕海報(bào)服務(wù)核心邏輯和業(yè)務(wù)方邏輯,使得業(yè)務(wù)方只需關(guān)心業(yè)務(wù),也防止業(yè)務(wù)方無意間可能影響到海報(bào)核心邏輯。此外,在整個(gè)過程中還可以增加審核遠(yuǎn)程組件等項(xiàng)目管理能力。

          2、賦能非研發(fā)人員

          為了海報(bào)圖片渲染極具靈活性,我們把開發(fā)人員作為首要滿足對象。未來除了開發(fā)人員可以開發(fā)海報(bào)頁面,同時(shí)可以支持非研發(fā)人員通過拖拽編輯等低代碼方式完成海報(bào)圖片的生產(chǎn),這樣針對簡單海報(bào)圖片的場景,運(yùn)營、產(chǎn)品等非研發(fā)人員也可以進(jìn)行海報(bào)圖片的制作,進(jìn)一步提高生產(chǎn)效能。

          作者:狐友FE

          來源:微信公眾號:搜狐技術(shù)產(chǎn)品

          出處:https://mp.weixin.qq.com/s/D1N9qxHYGRBUlCGePvqj3w

          之前做的 WordPress 插件,更多涉及的是管理功能,比如用戶管理,分類管理這些插件等等,這些主要這些功能比較純粹,然后 WPJAM Basic 已經(jīng)實(shí)現(xiàn)了 WordPress 后臺的各種底層類庫和交互組件,只要功能需求就能快速做好。

          但是最近在更新 Autumn Pro 5.0 的功能的時(shí)候,也開始有所涉獵 WordPress 的前端開發(fā)。 我就把一些常用的前端功能整理成統(tǒng)一的插件,一是方便日后更新,也是方便其他主題的集成。

          全能彈窗 WordPress 插件

          今天就來介紹這批插件中的第一個(gè),一個(gè)全能的 WordPress 彈窗插件,也可以叫模態(tài)框插件,目前已經(jīng)實(shí)現(xiàn)了海報(bào) / 打賞 / 分享 / 搜索彈窗,接下來還會實(shí)現(xiàn)登錄 / 公告等彈窗,也提供彈窗接口,只要簡單幾行代碼也可以實(shí)現(xiàn)你自己的彈窗。

          插件激活之后,在后臺「WPJAM」菜單下就又會有「頁面彈窗」的子菜單,當(dāng)然如果已經(jīng)使用 Autumn Pro 主題,這個(gè)在菜單在「Autumn」菜單下,總之不在「WPJAM」菜單,就是在主題設(shè)置菜單下,點(diǎn)擊進(jìn)去就進(jìn)入彈窗的設(shè)置頁面了:

          文章海報(bào)彈窗

          如上圖所示,文章海報(bào)彈窗,需要你設(shè)置 logo 和標(biāo)語,然后選擇自動插入(Autumn Pro 主題已經(jīng)通過代碼插入,上面的自動插入選項(xiàng)也會沒有),就可以在頁面上顯示「生成海報(bào)」按鈕:

          當(dāng)然其他主題你也可以自己通過 wpjam_get_poster_button($args=[]) 來手工插入,這里 $args 的默認(rèn)值是:['title'=>'生成海報(bào)', 'class'=>'poster-button', 'icon'=>'ri-image-line'],你也可以自定義修改它:

          總之最后在頁面上出現(xiàn)「生成海報(bào)」按鈕,點(diǎn)擊它之后就會生成海報(bào)彈窗:

          樣式還是可以的,當(dāng)然你也自己改一下 CSS,去調(diào)整海報(bào)的樣式,這里再多說兩句,海報(bào)是通過 HTML2Canvas 生成圖片的,這樣做好處,就是無需在服務(wù)端去生成海報(bào)圖片了,能夠顯著降低服務(wù)端的消耗,同時(shí)海報(bào)上的二維碼也是使用 jQuery.qrcode 前端 jQuery 插件實(shí)現(xiàn),也不是服務(wù)端生成的圖片,更進(jìn)一步降低服務(wù)器的消耗,本來這些功能就應(yīng)該在前端實(shí)現(xiàn)的嘛,現(xiàn)在的瀏覽器能力也是越來越強(qiáng)了。

          文章打賞彈窗

          我們繼續(xù)看會最上面的設(shè)置圖,文章打賞彈窗需要設(shè)置「打賞標(biāo)題 / 標(biāo)語和收款碼」這三個(gè)選項(xiàng),之后就會出現(xiàn)「打賞作者」的按鈕:

          同樣它的自定義調(diào)用函數(shù)是wpjam_get_donate_button($args=[]),$args的默認(rèn)值是:['title'=>'打賞作者', 'class'=>'donate-button', 'icon'=>'ri-money-cny-circle-line']。

          點(diǎn)擊之后的彈窗如下:

          文章分享彈窗

          文章分享彈窗沒有設(shè)置選項(xiàng),它的自定義調(diào)用函數(shù)是 wpjam_get_share_button($args=[]),$args 的默認(rèn)值是:['title'=>'分享', 'class'=>'share-button', 'icon'=>'ri-share-forward-2-fill']。

          點(diǎn)擊生成的分享按鈕之后彈窗如下:

          文章搜索彈窗

          最后一個(gè)是文章搜索彈窗,通過它可以在后臺設(shè)置常用搜索詞:

          搜索按鈕不能自動插入,它只能通過 wpjam_get_search_button($args=[]) 函數(shù)手動插入,$args 的默認(rèn)值是:['title'=>'', 'class'=>'search-button', 'icon'=>'ri-search-line']。

          比如 Autumn 的搜索按鈕就如下:

          點(diǎn)擊它之后就可以進(jìn)行文章搜索:

          除了顯示搜索框和后臺設(shè)置的熱門搜索之外,還顯示當(dāng)前用戶的搜索歷史,是不是有種大站才有搜索的感覺,哈哈。

          日常的工作中(比如微信小程序),我們經(jīng)常有這樣的需求,就是需要使用程序生成推廣海報(bào),然后海報(bào)里要包含指定的二維碼,這樣用戶分享出去別人掃碼之后就可以確定用戶推薦關(guān)系。

          單獨(dú)生成海報(bào)背景或者單獨(dú)生成二維碼通常還算比較簡單,但如果要將兩者結(jié)合到一起那還是需要花一點(diǎn)心思的。

          那現(xiàn)在怎么解決呢?如何使用PHP在服務(wù)器生成推廣海報(bào)呢?對的,使用PHP中的GD庫。具體過程請往下看。

          前期準(zhǔn)備

          1、海報(bào)背景圖。背景圖一般存服務(wù)器,程序本地讀取;

          2、推廣二維碼。可以是二維碼圖片鏈接,也可以是字符串圖像流。如果自己生成二維碼,詳見phpqrcode官網(wǎng),地址:https://sourceforge.net/projects/phpqrcode。

          3、開啟PHP的GD擴(kuò)展

          操作步驟

          首先熟悉一下幾個(gè)關(guān)鍵的PHP函數(shù):

          1、getimagesize:取得圖像大小。getimagesize() 函數(shù)將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類型和一個(gè)可以用于普通 HTML 文件中 IMG 標(biāo)記中的 height/width 文本字符串。如果不能訪問 filename 指定的圖像或者其不是有效的圖像,getimagesize() 將返回 FALSE 并產(chǎn)生一條 E_WARNING級的錯(cuò)誤。

          2、image_type_to_extension:取得圖像類型的文件后綴。

          3、imagesx:取得圖像寬度。

          4、imagesy:取得圖像高度。

          5、imagecreatetruecolor:新建一個(gè)真彩色圖像。imagecreatetruecolor() 返回一個(gè)圖像標(biāo)識符,代表了一幅大小為 x_size 和 y_size 的黑色圖像。是否定義了本函數(shù)取決于 PHP 和 GD 的版本。從 PHP 4.0.6 到 4.1.x 只要加載了 GD 模塊本函數(shù)一直存在,但是在沒有安裝 GD2 的時(shí)候調(diào)用,PHP 將發(fā)出致命錯(cuò)誤并退出。在 PHP 4.2.x 中此行為改為發(fā)出警告而不是錯(cuò)誤。其它版本只在安裝了正確的 GD 版本時(shí)定義了本函數(shù)。

          6、imagecolordeallocate:取消圖像顏色的分配。

          7、imagefill:區(qū)域填充。imagefill() 在 image 圖像的坐標(biāo) x,y(圖像左上角為 0, 0)處用 color 顏色執(zhí)行區(qū)域填充(即與 x, y 點(diǎn)顏色相同且相鄰的點(diǎn)都會被填充)。

          8、imagecopyresampled:重采樣拷貝部分圖像并調(diào)整大小。imagecopyresampled() 將一幅圖像中的一塊正方形區(qū)域拷貝到另一個(gè)圖像中,平滑地插入像素值,因此,尤其是,減小了圖像的大小而仍然保持了極大的清晰度。

          9、getimagesizefromstring:從字符串中獲取圖像尺寸信息。同 getimagesize() 函數(shù)。 區(qū)別是 getimagesizefromstring() 第一個(gè)參數(shù)是圖像數(shù)據(jù)的字符串表達(dá),而不是文件名。

          10、imagecopymerge:拷貝并合并圖像的一部分。

          11、imagejpeg:輸出圖象到瀏覽器或文件。

          12、imagedestroy:銷毀一圖像。

          熟悉完了這十幾個(gè)核心方法后,我們就可以編碼了。核心代碼如下:

          以上代碼是利用PHP生成推廣海報(bào)的主要部分,有了它我們就可以很容易的生成推廣海報(bào)了。

          參考案例:

          1、生成帶有二維碼的海報(bào)。

          2、生成帶有圖像,昵稱和二維碼的海報(bào)。

          從以上示例可以看出,只要我們定義好核心代碼之后,后面生成不同的推廣海報(bào),只需要調(diào)整config配置參數(shù)即可。


          主站蜘蛛池模板: 国产一区二区三区国产精品| 性色av闺蜜一区二区三区| 亚洲视频一区在线| 日本精品无码一区二区三区久久久 | 秋霞日韩一区二区三区在线观看 | 福利一区二区在线| 日韩精品乱码AV一区二区| av在线亚洲欧洲日产一区二区| 无码国产精品一区二区免费I6| 精品三级AV无码一区| 国产av天堂一区二区三区| 亚洲国产精品一区二区九九| 无码人妻aⅴ一区二区三区有奶水| 精品欧洲AV无码一区二区男男 | 伊人久久大香线蕉av一区| 精品一区二区三区AV天堂| 麻豆国产在线不卡一区二区 | 亚洲AV无码第一区二区三区| 日本一区二区三区高清| 日产一区日产2区| 亚洲av午夜福利精品一区 | 成人国产精品一区二区网站| 国产成人精品一区二区三在线观看| 波多野结衣一区视频在线| 91一区二区在线观看精品| 日韩在线不卡免费视频一区| 色窝窝无码一区二区三区色欲 | 国产女人乱人伦精品一区二区| 日韩AV片无码一区二区不卡| 色天使亚洲综合一区二区| 精品日韩一区二区| 搜日本一区二区三区免费高清视频 | 69久久精品无码一区二区| 亚洲综合无码一区二区三区| 韩国福利影视一区二区三区| 糖心vlog精品一区二区三区| 秋霞鲁丝片一区二区三区| 一区二区三区四区在线视频 | 亚洲日韩一区精品射精| 精品一区二区三区| 精品一区二区三区四区电影|