時間:2023-05-30 23:21:02 | 來源:網(wǎng)站運營
時間:2023-05-30 23:21:02 來源:網(wǎng)站運營
基于 Next.js 和云開發(fā) CMS 的內(nèi)容型網(wǎng)站應用實戰(zhàn)開發(fā):作者簡介:注意:安裝成功后,云數(shù)據(jù)庫會自動創(chuàng)建 3 個集合,分別是
安裝時間有些長,請耐心等待
tcb-ext-cms-contents
、tcb-ext-cms-users
、tcb-ext-cms-webhooks
,存放 CMS 系統(tǒng)配置信息以及內(nèi)容數(shù)據(jù)。會自動創(chuàng)建 3 個云函數(shù),分別是 tcb-ext-cms-api
、tcb-ext-cms-init
、tcb-ext-cms-auth
,封裝了初始化、身份驗證以及數(shù)據(jù)流的相關(guān)邏輯。tcb-cms/
目錄下了:name<string>: 課程名稱time<number>: 課程時間cover<string>: 課程封面url<string>: 課程鏈接level<0 | 1 | 2>: 課程難度
以管理員身份登錄 CMS 系統(tǒng),在「內(nèi)容設(shè)置頁」新建內(nèi)容。在 CMS 中,支持多種高級數(shù)據(jù)類型,例如 url、圖片、markdown、富文本、標簽數(shù)組、郵箱、網(wǎng)址等,并對這些類型進行了智能識別和更友好地展示。注意:新建內(nèi)容時,默認情況下,CMS 會自動填充 4 個字段:name、order、createTime、updateTime??梢愿鶕?jù)自身需要,對不需要的字段進行刪除。
CMS 自帶圖床功能。當數(shù)據(jù)類型是「圖片」時,圖片會自動上傳到當前云開發(fā)環(huán)境下的云存儲中。圖片信息以cloud://
開頭的特殊鏈接,存放在數(shù)據(jù)集合中。
建議:根據(jù)字段創(chuàng)建集合后,CMS 系統(tǒng)左側(cè)會看到「推薦好課」。它對應的內(nèi)容被保存在云數(shù)據(jù)庫的
保留 order 字段,它可以被用作數(shù)據(jù)排序。對運營者來說,數(shù)據(jù)的 order 的值越大,在 CMS 系統(tǒng)中展示的位置越靠前;對開發(fā)者來說,可以根據(jù) order 來進行排序搜索。從而保證了體驗和邏輯的一致性。
recommend-course
(創(chuàng)建時指定)集合中,它的字段信息保存在云數(shù)據(jù)庫的tcb-ext-cms-contents
(CMS 初始化時創(chuàng)建)集合中。npm i --save next react react-dom
因為我們要將網(wǎng)站部署到「靜態(tài)托管」上,所以要使用 Next.js 的靜態(tài)導出功能。package.json
中的打包腳本更新為:"scripts": { "dev": "next", "build": "next build && next export", "start": "next start"}
為了快速部署靜態(tài)網(wǎng)站,以及發(fā)布云函數(shù)。需要全局安裝 @cloudbase/cli
:npm install -g @cloudbase/cli
安裝后,添加兩個腳本:deploy:hosting
: 將 Next.js 的靜態(tài)導出文件部署到「靜態(tài)托管」deploy:function
: 發(fā)布項目中的云函數(shù)"scripts": { "deploy:hosting": "npm run build && cloudbase hosting:deploy out -e jhgjj-0ae4a1", "deploy:function": "echo y | cloudbase functions:deploy --force"}
注意:
準備兩個云環(huán)境,防止靜態(tài)部署時文件覆蓋。envId 為jhgjj-0ae4a1
的云環(huán)境只用于部署 Next.js 的靜態(tài)導出文件。envId 為pagecounter-d27cfe
的云環(huán)境用來部署 CMS 系統(tǒng)。
@cloudbase/node-sdk
,我們可以在 Next.js 的 getStaticProps()
方法中讀取到云數(shù)據(jù)庫中的數(shù)據(jù)。// provider.jsconst cloudbase = require("@cloudbase/node-sdk");const config = { secretId: "your secretId", // 前往「騰訊云控制臺」-「訪問密鑰」獲取 secretKey: "your secretKey", // 前往「騰訊云控制臺」-「訪問密鑰」獲取 env: "your envid" // 前往「騰訊云控制臺」-「云開發(fā) CloudBase」獲取};const app = cloudbase.init(config);/** * 獲取云數(shù)據(jù)庫數(shù)據(jù) */async function getCourses() { const db = app.database(); const result = await db.collection("recommend-course").get(); if (result.code) { throw new Error( `獲取「推薦課程」失敗, 錯誤碼是${result.code}: ${result.message}` ); } return result.data.map(item => { if (item.createTime instanceof Date) { item.createTime = item.createTime.toLocaleString(); } if (item.updateTime instanceof Date) { item.updateTime = item.updateTime.toLocaleString(); } item.cover = getBucketUrl(item.cover); // 處理云存儲的特殊鏈接 return item; });}
前文有講到,CMS 自帶圖床功能,拖拽上傳的圖片會被存儲在同一環(huán)境下的云存儲中,并且獲取圖片的鏈接存放在集合中。云存儲的鏈接是以 cloud://
開頭的特殊鏈接,需要在前端進行識別和特殊處理。cloud://pagecounter-d27cfe.7061-pagecounter-d27cfe-1255463368/uploads/1589990230404.png
。將其轉(zhuǎn)成可訪問的 http 鏈接:https://7061-pagecounter-d27cfe-1255463368.tcb.qcloud.la/uploads/1589990230404.png
。tcb.qcloud.la
域名重新拼接即可:// provider.js/** * 獲取云存儲的訪問鏈接 * @param {String} url 云存儲的特定url */function getBucketUrl(url) { if (!url.startsWith("cloud://")) { return url; } const re = /cloud:////.*?/.(.*?)//(.*)/; const result = re.exec(url); return `https://${result[1]}.tcb.qcloud.la/${result[2]}`;}
注意:目前為止,我們使用 SDK 獲取了云數(shù)據(jù)庫數(shù)據(jù),剩下要做的就是將其注入到 Next.js 頁面組件的
云存儲的「權(quán)限設(shè)置」應為:所有用戶可讀,僅創(chuàng)建者及管理員可寫。否則鏈接無法訪問。
推薦:
除了自帶的圖床功能,開發(fā)者可以根據(jù)自身需求使用其他穩(wěn)定圖床服務,例如微博圖床。如果使用其他圖床,對應字段類型不能設(shè)置為「圖片」,可以是「字符串」或者「超鏈接」。
props
上:// pages/index.jsconst HomePage = ({ courses }) => { return ( // 盡情使用數(shù)據(jù)吧... )}export async function getStaticProps() { const { getCourses } = require('./../provider') return { props: { courses: await getCourses() } }}export default HomePage
打開瀏覽器,進入 http://localhost:3000/ ,可以看到效果如下:注意:
Next.js 的一些方法是雙端都會運行的,但getStaticProps()
只會在 server 端運行
npm run build
命令,網(wǎng)站靜態(tài)文件被打包到了 out/
目錄下:npm run deploy:hosting
將 out/
目錄下的文件上傳到「靜態(tài)網(wǎng)站托管」。訪問靜態(tài)網(wǎng)站托管的鏈接:https://jhgjj-0ae4a1.tcloudbaseapp.com/ ,效果如下:cloudbase login
進行交互式輸入登錄,而是使用密鑰登錄: cloudbase login --apiKeyId $TCB_SECRET_ID --apiKey $TCB_SECRET_KEY
。注意:在 CI 工具的控制臺中,配置
前往 云 API 密鑰 獲得TCB_SECRET_ID
和TCB_SECRET_KEY
的值
TCB_SECRET_ID
和 TCB_SECRET_KEY
。并為package.json
新添加一個腳本:"scripts": { "login": "echo N | cloudbase login --apiKeyId $TCB_SECRET_ID --apiKey $TCB_SECRET_KEY"}
總結(jié)來說,CI 構(gòu)建的流程是:npm run login
npm run build
npm run deploy:function
關(guān)鍵詞:實戰(zhàn),內(nèi)容
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。