vue學(xué)習(xí)之留言板實例

留言板實例

  • 知識點:
    • 渲染html頁面時沼琉,設(shè)置root為根目錄胜蛉;
     exports.showindex=(req,res)=>{
         res.sendFile("index.html",{root:"./"});
     };
    
    • 前端用vue-reosurce發(fā)送請求凄吏,后臺用express創(chuàng)建服務(wù)器葱色,利用mongodb數(shù)據(jù)庫存儲數(shù)據(jù)豁护;
    • 前端a標(biāo)簽中的href發(fā)送get請求杏头,發(fā)送請求時如何提交參數(shù),配合動態(tài)數(shù)據(jù)捺典;如<a :href='"/deldata?id="+item._id' class="btn btn-danger">刪除</a>鸟廓;其中item為動態(tài)數(shù)據(jù);
    • js模塊導(dǎo)出變量襟己,用module.exports=db引谜;則在其他js文件中導(dǎo)入此文件,變量即db;
    • vue生命周期中擎浴,數(shù)據(jù)在created()和beforeMount()函數(shù)中獲仍毖省;
    • 若提交數(shù)據(jù)時贮预,傳入的time參數(shù)為毫秒數(shù)贝室,即設(shè)置fields.time=new Date().getTime();則需要將獲取的time值轉(zhuǎn)化為特定格式的日期仿吞;
     getData(){
         this.$http.get(`/getdata?page=${this.page}&pageamount=${this.pageamount}`).then(res=>{
             var ary=res.body;
             //時間轉(zhuǎn)化滑频,0=》00;1=》01
             function todate(time) {
                 if(time>=0 && time<=9){
                     return "0"+time;
                 }else{
                     return ""+time;
                 }
             }
             //將毫秒數(shù)轉(zhuǎn)化為特定格式的日期唤冈;
             function changeTime(time){
                 var commonTime = "";
                 if(time){
                     var unixTimestamp = new Date(time*1) ;
                     Date.prototype.toLocaleString = function() {
                         return this.getFullYear() + "-" + todate(this.getMonth() + 1) + "-" + todate(this.getDate()) + " " + todate(this.getHours()) + ":" + todate(this.getMinutes()) + ":" + todate(this.getSeconds());
                     };
                     commonTime = unixTimestamp.toLocaleString();
                 }
                 return commonTime;
             }
             //通過map遍歷數(shù)組峡迷,然后修改里面的time值;
             ary=ary.map(function (item) {
                 item.time=changeTime(item.time);
                 return item;
             });
             //獲取數(shù)組數(shù)據(jù)賦值給this.dataAry
             this.dataAry=ary;
         })
     },
    
  • 代碼:
    • index.html文件代碼:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>vue留言板實例</title>
         <link rel="icon" type="image/x-icon" href="img/icon.jpg">
         <link rel="stylesheet" href="css/bootstrap.css">
     </head>
     <body>
     <div class="container" id="app">
         <h1 style="text-align: center;margin-top: 50px;">Vue分頁留言板</h1>
         <form>
             <div class="form-group">
                 <label for="title" class="h3">標(biāo)題</label>
                 <input type="text" class="form-control" id="title" name="title" placeholder="請輸入留言標(biāo)題" v-model="title">
             </div>
             <div class="form-group">
                 <label for="comment" class="h3">內(nèi)容</label>
                 <textarea name="comment" id="comment" class="form-control" placeholder="請輸入留言內(nèi)容" cols="30" rows="6" v-model="comment"></textarea>
             </div>
             <button type="button" class="btn btn-primary" @click="subData">提交留言</button>
         </form>
         <!--分頁區(qū)域-->
         <ul class="pagination">
             <li v-for="(item,index) in pageCount" :class={active:index===page}><a href="" @click.prevent="getPage(index)">{{item}}</a></li>
         </ul>
         <!--留言區(qū)域-->
         <ul class="list-group">
             <li class="list-group-item" v-for="(item,index) in dataAry">
                 <p>【標(biāo)題】:{{item.title}}</p>
                 <p>【內(nèi)容】:{{item.comment}}</p>
                 <p>【時間】:{{item.time}}</p>
                 <p><a :href='"/deldata?id="+item._id' class="btn btn-danger">刪除</a></p>
             </li>
         </ul>
     </div>
     <script src="js/vue.js"></script>
     <script src="js/vue-resource.js"></script>
     <script>
         var vm=new Vue({
             el:"#app",
             data:{
                 title:"",
                 comment:"",
                 dataAry:[],
                 pageamount:3,
                 pageCount:0,
                 page:0
             },
             methods:{
                 //1.發(fā)送post請求你虹,提交留言數(shù)據(jù)
                 subData(){
                     //判斷輸入框內(nèi)的內(nèi)容不能為空
                     this.$http.post("/subdata",{
                         title:this.title,
                         comment:this.comment
                     }).then(res=>{
                         this.title=this.comment="";
                         alert(res.body);
                         window.location.href="/";
                     })
                 },
                 //2.獲取數(shù)據(jù)的總個數(shù)
                 getCount(){
                     //需要傳參
                     this.$http.get("/getcount").then(res=>{
                         var count=res.body;//字符串類型的數(shù)字绘搞;
                         this.pageCount=Math.ceil(count/this.pageamount);
                     })
                 },
                 //3.獲取指定頁碼內(nèi)的數(shù)據(jù)
                 getData(){
                     this.$http.get(`/getdata?page=${this.page}&pageamount=${this.pageamount}`).then(res=>{
                         //獲取數(shù)組數(shù)據(jù)賦值給this.dataAry
                         this.dataAry=res.body;
                     })
                 },
                 //4.點擊頁碼,更新this.page值
                 getPage(index){
                     this.page=index;
                     this.getData();//重新獲取數(shù)據(jù)傅物,動態(tài)操作頁面夯辖;
                 }
             },
             beforeMount(){
                 this.getCount();
                 this.getData();
             }
         })
     </script>
     </body>
     </html>
    
    • app.js代碼:
     const express=require("express");
     //引入自定義模塊
     const router=require("./controller/router");
     const app=express();
     
     //設(shè)置靜態(tài)資源目錄,引入js文件
     app.use(express.static("./public"));
     
     //渲染html頁面
     app.get("/",router.showindex);
     //提交數(shù)據(jù)
     app.post("/subdata",router.subData);
     //獲取數(shù)據(jù)總個數(shù)
     app.get("/getcount",router.getCount);
     //獲取數(shù)據(jù)
     app.get("/getdata",router.getData);
     //刪除數(shù)據(jù)
     app.get("/deldata",router.delData);
     
     app.listen(2525);
    
    • router.js代碼:
     const db=require("../model/db");
     const formidable=require("formidable");
     const sd=require("silly-datetime");
     const ObjectId=require("mongodb").ObjectId;
     
     exports.showindex=(req,res)=>{
         res.sendFile("index.html",{root:"./"});
     };
     exports.subData=(req,res)=>{
         //formidable接受post請求數(shù)據(jù)
         var form= new formidable.IncomingForm();
         form.parse(req,function (err, fields, files) {
             //添加時間戳
             fields.time=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');
             //插入數(shù)據(jù)庫
             db.insertOne("comment",fields,function (err, result) {
                 if(err){
                     console.log(err);
                     return;
                 }
                 res.send("提交留言成功");
             })
         });
     };
     exports.getData=(req,res)=>{
         //解構(gòu)賦值
         var {page,pageamount}=req.query;
         //從數(shù)據(jù)庫獲取數(shù)據(jù)
         db.find("comment",{},{"sort":{"time":-1},page,pageamount},function (err, result) {
             if(err){
                 console.log(err);
                 return;
             }
             res.send(result);
         })
     };
     exports.getCount=(req,res)=>{
         db.count("comment",{},function (err, count) {
             //res.send()中不能放數(shù)字類型
             res.send(count.toString());
         })
     };
     exports.delData=(req,res)=>{
         var id=req.query.id;
         db.deleteMany("comment",{_id:ObjectId(id)},function (err, result) {
             if(err){
                 console.log(err);
                 return;
             }
             res.redirect("/");
         })
     };
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末董饰,一起剝皮案震驚了整個濱河市蒿褂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卒暂,老刑警劉巖贮缅,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異介却,居然都是意外死亡谴供,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門齿坷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桂肌,“玉大人数焊,你說我怎么就攤上這事∑槌。” “怎么了佩耳?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谭跨。 經(jīng)常有香客問我干厚,道長,這世上最難降的妖魔是什么螃宙? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任蛮瞄,我火速辦了婚禮,結(jié)果婚禮上谆扎,老公的妹妹穿的比我還像新娘挂捅。我一直安慰自己,他們只是感情好堂湖,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布闲先。 她就那樣靜靜地躺著,像睡著了一般无蜂。 火紅的嫁衣襯著肌膚如雪伺糠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天斥季,我揣著相機(jī)與錄音训桶,去河邊找鬼。 笑死泻肯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慰照。 我是一名探鬼主播灶挟,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毒租!你這毒婦竟也來了稚铣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤墅垮,失蹤者是張志新(化名)和其女友劉穎惕医,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算色,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抬伺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灾梦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡钓。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓笙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出能岩,到底是詐尸還是另有隱情寞宫,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布拉鹃,位于F島的核電站辈赋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膏燕。R本人自食惡果不足惜钥屈,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煌寇。 院中可真熱鬧焕蹄,春花似錦、人聲如沸阀溶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽银锻。三九已至永品,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間击纬,已是汗流浹背鼎姐。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留更振,地道東北人炕桨。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像肯腕,于是被迫代替她去往敵國和親献宫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容