vue学习之留言板实例

留言板实例

  • 知识点:
    • 渲染html页面时,设置root为根目录;
     exports.showindex=(req,res)=>{
         res.sendFile("index.html",{root:"./"});
     };
    
    • 前端用vue-reosurce发送请求,后台用express创建服务器,利用mongodb数据库存储数据;
    • 前端a标签中的href发送get请求,发送请求时如何提交参数,配合动态数据;如<a :href='"/deldata?id="+item._id' class="btn btn-danger">删除</a>;其中item为动态数据;
    • js模块导出变量,用module.exports=db;则在其他js文件中导入此文件,变量即db;
    • vue生命周期中,数据在created()和beforeMount()函数中获取;
    • 若提交数据时,传入的time参数为毫秒数,即设置fields.time=new Date().getTime();则需要将获取的time值转化为特定格式的日期;
     getData(){
         this.$http.get(`/getdata?page=${this.page}&pageamount=${this.pageamount}`).then(res=>{
             var ary=res.body;
             //时间转化,0=》00;1=》01
             function todate(time) {
                 if(time>=0 && time<=9){
                     return "0"+time;
                 }else{
                     return ""+time;
                 }
             }
             //将毫秒数转化为特定格式的日期;
             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遍历数组,然后修改里面的time值;
             ary=ary.map(function (item) {
                 item.time=changeTime(item.time);
                 return item;
             });
             //获取数组数据赋值给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">标题</label>
                 <input type="text" class="form-control" id="title" name="title" placeholder="请输入留言标题" v-model="title">
             </div>
             <div class="form-group">
                 <label for="comment" class="h3">内容</label>
                 <textarea name="comment" id="comment" class="form-control" placeholder="请输入留言内容" cols="30" rows="6" v-model="comment"></textarea>
             </div>
             <button type="button" class="btn btn-primary" @click="subData">提交留言</button>
         </form>
         <!--分页区域-->
         <ul class="pagination">
             <li v-for="(item,index) in pageCount" :class={active:index===page}><a href="" @click.prevent="getPage(index)">{{item}}</a></li>
         </ul>
         <!--留言区域-->
         <ul class="list-group">
             <li class="list-group-item" v-for="(item,index) in dataAry">
                 <p>【标题】:{{item.title}}</p>
                 <p>【内容】:{{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.发送post请求,提交留言数据
                 subData(){
                     //判断输入框内的内容不能为空
                     this.$http.post("/subdata",{
                         title:this.title,
                         comment:this.comment
                     }).then(res=>{
                         this.title=this.comment="";
                         alert(res.body);
                         window.location.href="/";
                     })
                 },
                 //2.获取数据的总个数
                 getCount(){
                     //需要传参
                     this.$http.get("/getcount").then(res=>{
                         var count=res.body;//字符串类型的数字;
                         this.pageCount=Math.ceil(count/this.pageamount);
                     })
                 },
                 //3.获取指定页码内的数据
                 getData(){
                     this.$http.get(`/getdata?page=${this.page}&pageamount=${this.pageamount}`).then(res=>{
                         //获取数组数据赋值给this.dataAry
                         this.dataAry=res.body;
                     })
                 },
                 //4.点击页码,更新this.page值
                 getPage(index){
                     this.page=index;
                     this.getData();//重新获取数据,动态操作页面;
                 }
             },
             beforeMount(){
                 this.getCount();
                 this.getData();
             }
         })
     </script>
     </body>
     </html>
    
    • app.js代码:
     const express=require("express");
     //引入自定义模块
     const router=require("./controller/router");
     const app=express();
     
     //设置静态资源目录,引入js文件
     app.use(express.static("./public"));
     
     //渲染html页面
     app.get("/",router.showindex);
     //提交数据
     app.post("/subdata",router.subData);
     //获取数据总个数
     app.get("/getcount",router.getCount);
     //获取数据
     app.get("/getdata",router.getData);
     //删除数据
     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请求数据
         var form= new formidable.IncomingForm();
         form.parse(req,function (err, fields, files) {
             //添加时间戳
             fields.time=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');
             //插入数据库
             db.insertOne("comment",fields,function (err, result) {
                 if(err){
                     console.log(err);
                     return;
                 }
                 res.send("提交留言成功");
             })
         });
     };
     exports.getData=(req,res)=>{
         //解构赋值
         var {page,pageamount}=req.query;
         //从数据库获取数据
         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()中不能放数字类型
             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("/");
         })
     };
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容