從0到1實現留言牆


項目簡介

留言牆:一個以在線便利簽的形式,也可以擴展成許願牆、樹洞的一個項目。

抽空來完成一個簡單的留言牆項目並完整介紹整個過程。留言牆,顧名思義,就是類似一個留言板,上面可以讓人留下自己的話。自己當ui和產品,所以外觀有點慘不忍睹,但是希望你能耐心看完。整個項目很簡單,分為兩個區域,一個是展示別人留言的區域;一個是寫留言的區域,留言成功自動刷新。

  • 頭部標題(留言條數)
  • 中間是牆體+可移動便簽
  • 底部是留下足跡(留言)的板塊 可以自定義展示的昵稱和內容顏色

實現效果:

image.png

在線預覽地址

動手前先技術選型一下

前端:vue2

后端:項目小,直接借助leanclound。一個領先的 BaaS 提供商,提供數據存儲、文件存儲、雲引擎、容器、即時通訊、消息推送、短信、游戲雲等多項服務,為移動開發提供強有力的后端支持。(沒有收取廣告費,而是真的好用,當然我用的是免費試用版,不是企業級)

項目初始化

創建項目

vue create guestbook

我選了vue2
image.png

安裝依賴和運行

yarn //等待安裝
yarn run serve

image.png
一個vue2項目成功跑起來,到這步還屬於很簡單,沒什么好說的,如果你還不會這些。那你需要看一下VueVue cli的相關文檔

頁面簡單布局

做一個切圖仔該做的事兒,實現上中下三部分,上為標題,中為一個放置便利貼紙的牆體,下為一個提交留言的板塊。

image.png

這步就寫幾個標簽和css,比較簡單和基礎就不詳細說了,不過因為我也沒有好的設計圖,這里實現的比較粗糙。

image.png

實現留言功能和獲取留言列表

想實現這步,建議先看看Leancloud之JS的SDK安裝指南

image.png

安裝

$ npm install leancloud-storage --save
// 或者yarn add leancloud-storage

安裝成功進行下一步引用

引用leancloud-storage

    const AV = require('leancloud-storage')
    AV.init({
      appId: '你自己應用的appId',
      appKey: '你自己應用的appKey',
      serverURL: '你自己應用的serverURL'
    })
    this.query = new AV.Query('Message') //查詢調用get或者find
    this.message = new AV.Object('Message') //可以調用save保存

分別對應下圖的三個地方

image.png

PS:如果你借鑒代碼,我完全沒有意見,不過你要自己申請Leancloud的賬號,然后自己去建應用,而不是直接用我的appId和appKey。我之前分享的個人博客留言系統也是分享了代碼,但是有人用我的賬號,這就很尷尬了,導致數據混亂了,另一個方面說,我是應用擁有者,可以隨時設置白名單或者刪除你的數據的,所以還是悠着點用

這個就是后台表管理的地方
image.png

新建一個Message表,然后新加三列,name(存放昵稱的字段)、content(留言內容的字段)、email(可以看留言的聯系方式的字段)

代碼實現

貼幾個重要的代碼實現,至於數據處理的邏輯之類就不詳細說了。

//獲取留言列表
this.query.find().then((todos) => {
  //打印出todos看字段形式
})
//保存留言
 this.message.save({ ...obj })

補充說明

上面所說已經實現了留言和獲取留言,那取到留言列表的渲染我也不多說了。

  • 便利貼的移動我用了組件vue-xiaoer-drag-ele,可拖拽等功能...

  • 每次獲取列表我都會有個讓便利貼隨機(隨機橫縱坐標)分布的,第一次我用了這個方法去獲取隨機橫縱坐標,但是有個bug,就是輸入框的值變化的時候都會觸發重新獲取坐標,這點我還沒想明白,雖然沒想懂為什么,但我先換了個方法去實現隨機獲取
    獲取單個橫坐標或縱坐標

image.png

   // 獲取隨機x坐標
    getRandomX() {
      return parseInt(Math.round(Math.random() * 800))
    },
    // 獲取隨機y坐標
    getRandomY() {
      return parseInt(Math.round(Math.random() * 300))
    },

獲取坐標數組

// 獲取一個和留言列表一樣length的坐標數組
 getXY() {
      this.xyArr = this.msgList.map(() => {
        return [
          Math.round(Math.random() * 800),
          Math.round(Math.random() * 300)
        ]
      })
    },

PS:服務器部署那些這里就不說明了,我之前也有相關篇幅。還有服務器配置不高,別惡意刷留言等操作,不然我只能被迫關閉了

image.png

可以提項目需求或者改進

我剛好發布了個沸點,有人在里面反饋需求。你們盡管提,合理的都實現

已實現或優化

  • 字數限制(bug修復)
  • 內容錯亂(bug修復)
  • 增加字體顏色選擇(小需求)
  • 換了便利簽顏色和背景牆(小需求)
  • 新增前端分頁(小需求)
  • 增加隨機顏色字體(小需求)

待實現

  • 等人提合理小需求

本文小結

以上是對留言牆的一些基本說明,各位大佬,如果看見錯誤的地方感謝幫忙指出,謝謝了!
熟能生巧(Practice make perfect!)。

567570eb04c107f0a5d6ccf93447999.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM