最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

VUE+Express+MongoDB前后端分離實現(xiàn)一個便簽墻

 更新時間:2021年04月18日 10:07:33   作者:登樓痕  
這篇文章主要介紹了VUE+Express+MongoDB前后端分離實現(xiàn)一個便簽墻,需要的朋友可以參考下

計劃來實現(xiàn)一個便簽墻系列,這個東西做簡單也簡單,往復雜了做功能也很多,記錄一下從零到有的開發(fā)過程吧,希望最后能把這個項目做得很完善。

首先是前后端分離架構,前端用vue,后臺我們就用express,數(shù)據(jù)庫用mongodb吧。

在腦袋里過一下,最最開始,要完成一個怎樣的雛形呢?先把用戶登錄管理放在一邊,當然是便簽的增刪改查+顯示?。?/p>

那么,我們就來實現(xiàn)“初號機”,一張張便簽的顯示,增加,修改,刪除。

1、怎么說也得先把樣式畫出來

先別管接口,先把純前端的問題解決先,我們先來一個像模像樣的“黑板”,對了,這里推薦一個網(wǎng)站https://www.transparenttextures.com/,可以生成你喜歡的壁紙素材,于是就有了:

好了,我們要在這塊黑板上“貼上”我們的便簽了,這一塊就是css的東西了,這個就看大家的美術設計功底了,我隨意了:

那么重要的一點是,在這塊背景板上,便簽就應該是可以隨意貼在你想要的位置,所以對于便簽,用戶應該可以拖拽并記錄位置。

所以將便簽div采取position: absolute,然后用top: y px和left: x px來實現(xiàn)定位。

于是我們考慮單個便簽對象包含的屬性有:

x: 便簽距容器左側距離, left的值

y: 便簽距容器上邊界距離, top得值

txt: 便簽的內(nèi)容

title: 標題

color: {

bg: "", // 背景色

pin: "" // 回形針顏色

}

接下來我們就來實現(xiàn)便簽的拖動:

(1) 在便簽的div上綁定鼠標點擊函數(shù):

@mousedown="mousedown($event)"

(2) 實現(xiàn)拖動:

mousedown: function(event) {
      let _this = this;
      if (!this.isEdit) {
        this.startX = event.x;
        this.startY = event.y;
        this.note.moving = true;
        document.onmousemove = event => {
          if (!_this.note.moving) return false;
 
          let dx = event.x - _this.startX;
          let dy = event.y - _this.startY;
 
          if (
            _this.note.x + dx <= 0 ||
            _this.note.x + dx >= _this.width - 250 ||
            _this.note.y + dy <= 60
          ) {
            return false;
          }
 
          _this.note.x1 = _this.note.x + dx;
          _this.note.y1 = _this.note.y + dy;
        };
        document.onmouseup = () => {
          if (!this.isEdit) {
            this.note.moving = false;
            this.note.x = this.note.x1;
            this.note.y = this.note.y1;
            this.saveNote();
            document.onmousemove = null;
            document.onmouseup = null;
          }
        };
      }
    }

初始記錄x和y的副本為x1,y1。用startX和startY記錄下最開始鼠標按下的位置,然后在拖動過程中和原始值計算偏移量,賦值給x1和y1進行定位,在鼠標抬起時更新x,y為最終值。

這里有個關鍵點就是,如果用@mousemove,會導致在鼠標拖動過快的情況下,便簽不能及時跟隨鼠標,鼠標就會移出div,造成拖動失效。

所以這里只把mousedown綁定在目標上,而把mousemove和mouseup綁定在document上,這樣就不會擔心鼠標移快后出了便簽導致便簽卡住了。

2、對于便簽的內(nèi)容,該怎么編輯

這里設計一個按鈕,鼠標hover上去后,顯示按鈕;點擊編輯按鈕,讓便簽內(nèi)容變成可編輯的狀態(tài),當內(nèi)容區(qū)域blur的時候自動保存。

由于div便簽沒有blur事件,所以在編輯狀態(tài)下,將內(nèi)容區(qū)域變?yōu)閠extarea:

 <div
      class="note-content"
      v-if="!isEdit"
      v-html="content"
      :ref="'note' + index"
    ></div>
    <el-input
      v-else
      class="note-content my-textarea"
      type="textarea"
      placeholder="請輸入內(nèi)容"
      :autosize="{ minRows: 10 }"
      v-model="content"
      :ref="'note' + index"
      @blur="handleChange"
    ></el-input>

很明顯,這里的內(nèi)容得用innerHTML結果保存,因為我們要保存換行回車空格這些樣式,使顯示保持一致,所以在獲取編輯的字符串我們要用正則進行替換:

this.content = this.content

.replace(/\r\n/g, "<br/>")

.replace(/\n/g, "<br/>")

.replace(/\s/g, "&nbsp;");

變成編輯狀態(tài)時,我們要把形式再轉(zhuǎn)換一下給textarea:

this.content = this.content

.replace(/&nbsp;/g, " ")

.replace(/<br\/>/g, "\r\n");


3、下面不就是調(diào)接口的時候了

express框架這里就不再贅述了,我們用mongoose連接mongodb數(shù)據(jù)庫,創(chuàng)建controller文件夾,增加note.js來實現(xiàn)數(shù)據(jù)庫操作:

// controller/note.js
const Notes = require("../model/notes");
var mongoose = require('mongoose');
module.exports = {
  updateNote(obj) {
    if (!obj.params._id) {
      obj.params._id = new mongoose.mongo.ObjectID();
    }
    return Notes.findByIdAndUpdate(
      obj.params && obj.params._id,
      {
        $set: obj.body
      },
      {
        upsert: true,
        new: true,
        setDefaultsOnInsert: true
      }
    )
      .then(function (newobj) {
        return Promise.resolve({
          status: 200,
          messgae: "OK"
        });
      })
      .catch((err) => {
        return Promise.reject(err);
      });
  },
  getNotes() {
    return new Promise(function (resolve, reject) {
      Notes.find()
        .then(function (newobj) {
          resolve(newobj);
        })
        .catch((err) => {
          reject(err);
        });
    });
  },
  deleteNoteById(_id) {
    return Notes.findByIdAndDelete(_id)
      .then(function (newobj) {
        return Promise.resolve({
          status: 200,
          messgae: "OK"
        });
      })
      .catch((err) => {
        return Promise.reject(err);
      });
  }
};

這里先簡單寫寫,還可以進一步封裝好返回結果。

創(chuàng)建model文件夾,增加note.js存放Schema:

// model/note.js
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
 
// 聲明一個數(shù)據(jù)集 對象
var noteSchema = new Schema({
  txt: {
    type: String,
    required: false
  },
  x: {
    type: Number
  },
  y: {
    type: Number
  },
  color: {
    type: Object
  },
  title:{
    type: String,
    default: "未命名"
  },
  createTime: {
    type: Date,
    default: Date.now
  }
});
mongoose.set("useCreateIndex", true);
mongoose.set('useFindAndModify', false);
// 將數(shù)據(jù)模型暴露出去
module.exports = mongoose.model("Notes", noteSchema, "notes");

所以,在拖動結束時、便簽blur時都要自動保存。

于是數(shù)據(jù)庫里就會保存我們的便簽了:

于是一個初步的雛形完成了,我們創(chuàng)建便簽,拖動,編輯,刪除,這些都是實時保存的,刷新頁面后便簽的位置都是能保留的。

下面看看效果:

接下來,還有好多任務清單沒做呢,隨便一想,功能上能完善的就很多,例如:用戶管理、時間分類、多條件查詢、便簽內(nèi)容支持富文本、便簽支持自定義樣式、備忘提醒功能等等。

再接再厲,任重道遠~~~~

大家也可關注一下Cavans小游戲系列:

《VUE實現(xiàn)一個Flappy Bird~~~》

《VUE+Canvas 實現(xiàn)桌面彈球消磚塊小游戲》

《VUE+Canvas實現(xiàn)雷霆戰(zhàn)機打字類小游戲》

到此這篇關于VUE+Express+MongoDB前后端分離實現(xiàn)一個便簽墻的文章就介紹到這了,更多相關vue前后端分離便簽墻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • 簡單聊聊Vue中的ref,toRef與toRefs

    簡單聊聊Vue中的ref,toRef與toRefs

    這篇文章主要是想和大家來簡單聊聊Vue中的ref、toRef、toRefs這三個函數(shù)的使用與區(qū)別,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-04-04
  • 淺談vue項目,訪問路徑#號的問題

    淺談vue項目,訪問路徑#號的問題

    這篇文章主要介紹了淺談vue項目,訪問路徑#號的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue-cli3 從搭建到優(yōu)化的詳細步驟

    vue-cli3 從搭建到優(yōu)化的詳細步驟

    這篇文章主要介紹了vue-cli3 從搭建到優(yōu)化的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 一文詳解如何在Vue網(wǎng)站中實現(xiàn)多語言支持

    一文詳解如何在Vue網(wǎng)站中實現(xiàn)多語言支持

    在當今全球化的互聯(lián)網(wǎng)環(huán)境中,為網(wǎng)站提供多語言支持已成為提升用戶體驗和擴大受眾范圍的關鍵策略,本文為大家介紹了如何在Vue網(wǎng)站中實現(xiàn)多語種支持功能,有需要的可以了解下
    2025-03-03
  • Vue3監(jiān)聽屬性與Computed的區(qū)別詳解

    Vue3監(jiān)聽屬性與Computed的區(qū)別詳解

    在 Vue 3 中,watch 和 computed 都是非常重要的概念,它們都可以用于觀察和響應數(shù)據(jù)的變化,但在使用場景和原理上存在明顯的區(qū)別,本文將詳細解析 Vue 3 中監(jiān)聽屬性 (watch) 和計算屬性 (computed) 的區(qū)別,需要的朋友可以參考下
    2024-02-02
  • vue.js 底部導航欄 一級路由顯示 子路由不顯示的解決方法

    vue.js 底部導航欄 一級路由顯示 子路由不顯示的解決方法

    下面小編就為大家分享一篇vue.js 底部導航欄 一級路由顯示 子路由不顯示的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue3中watchEffect高級偵聽器的具體使用

    Vue3中watchEffect高級偵聽器的具體使用

    Vue3中新增了一種特殊的監(jiān)聽器watchEffect,本文主要介紹了Vue3中watchEffect高級偵聽器的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • vue封裝swiper代碼實例解析

    vue封裝swiper代碼實例解析

    這篇文章主要介紹了vue封裝swiper代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • vue.js與后臺數(shù)據(jù)交互的實例講解

    vue.js與后臺數(shù)據(jù)交互的實例講解

    今天小編就為大家分享一篇vue.js與后臺數(shù)據(jù)交互的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue.use()在new Vue() 之前使用的原因淺析

    Vue.use()在new Vue() 之前使用的原因淺析

    本文通過實例代碼給大家介紹了為什么Vue.use()在new Vue() 之前使用,需要的朋友可以參考下
    2019-08-08

最新評論

蒙城县| 吉林省| 普定县| 通山县| 任丘市| 仙游县| 保山市| 常熟市| 凤凰县| 黎川县| 元阳县| 苗栗县| 杭州市| 衡东县| 合川市| 都匀市| 白朗县| 海门市| 阜阳市| 松溪县| 洱源县| 鄂温| 太和县| 新乡市| 郧西县| 林芝县| 蒙城县| 扎兰屯市| 安远县| 饶平县| 阳春市| 桑植县| 平阴县| 鄂托克前旗| 广元市| 平原县| 黄浦区| 洞头县| 北川| 甘泉县| 济南市|