Express腳手架項目2

前面《Express腳手架項目》篇基本實現了一個留言板登錄註冊和留言的一個功能,但是一旦留言很多就會破壞頁面結構,這裏需要一個分頁的效果。在說分頁之前,先讓留言能夠查看在detail.ejs頁面展示一下。

//detail.ejs
<!DOCTYPE html>
<html>
  <head>
    <title>詳情</title>
    <link rel='stylesheet' href='/stylesheets/bootstrap.min.css' />
    <script src="/javascripts/jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
  	<%- include('head.ejs')%>
  	<h2>詳情</h2>
    <h1>歌曲名字:<%- detail2%></h1>
    <h2>歌手:<%- detail1%></h2> 
 
</html>

這裏面的數據通過點擊留言具體信息的時候,提交一個id去後臺數據庫查找,之後讓後臺把數據給前端頁面,也就是前端會得到detail1和detail2這兩條代表留言標題、留言內容的數據,在前端頁面展示。下面是在留言頁面去傳遞id和跳轉到詳情頁面的操作。

//liuyan.ejs
<table class="table table-striped">
	  	<tr><th>序號</th><th>標題</th><th>內容</th></tr>
	  	<% list.map(function(item,i){%>
	  			<tr>
	  				<td><%- i+1%></td>
                     //點擊跳轉,通過query傳參,search的方式,知道點擊的是哪一條留言
	  				<td onclick="location.href='/detail?id=<%- item._id%>'"><%- item.title%></td>
	  				<td><%- item.con%></td>
	  			</tr>
	  	<% })%>
	  	
	  </table>

然後需要在前端路由渲染detail頁面,還有通過req.query來接收前端傳參數據。

//index.js
var mongodb = require("mongodb").MongoClient;
//這裏引入mongodb模塊裏面的ObjectId是爲了在查找的時候能通過id查找,因爲前端傳來的id是字符串格式,
//{ id: '5b6bb56282685418c87bf5ce' },而數據庫裏面的是處理過的
//{"_id": ObjectId('5b6bb56282685418c87bf5ce') }這樣格式,不處理肯定找不到
var ObjectId = require("mongodb").ObjectId;
var db_str = "mongodb://localhost:27017/html5";

//詳情
router.get("/detail",(req,res)=>{
	//console.log(req.query)
	var id = ObjectId(req.query.id)
	mongodb.connect(db_str,(err,database)=>{
		database.collection("liuyan",(err,coll)=>{
			coll.find({_id:id}).toArray((err,data)=>{
                //找到的留言信息傳給前端頁面
				res.render("detail",{detail1:data[0].con,detail2:data[0].title})
                               database.close()
			})
		})
	})
})

以上就實現了留言詳情的一個展示,下面來實現分頁。

在liuyan.ejs的發佈留言按鈕結構下面寫入分頁模塊,拿了bootstrap的組件裏面的分頁結構,主要代碼如下

//liuyan.ejs
<!--分頁-->
	  <nav aria-label="Page navigation">
		  <ul class="pagination">
		    <li>
		      <a href="/liuyan?pageNum=<%-pageNum<1?1:parseInt(pageNum)-1%>" aria-label="Previous">
		        <span aria-hidden="true">&laquo;</span>
		      </a>
		    </li>
		    <!--<li><a href="#">1</a></li>
		    <li><a href="#">2</a></li>
		    <li><a href="#">3</a></li>
		    <li><a href="#">4</a></li>
		    <li><a href="#">5</a></li>-->
		    
		    <% if(page>4){%>
		    	<li><a href="/liuyan?pageNum=1">1</a></li>
			    <li><a href="/liuyan?pageNum=2">2</a></li>
			    <li><a href="#">...</a></li>
			    <li><a href="/liuyan?pageNum=<%-page-1%>"><%-page-1%></a></li>
			    <li><a href="/liuyan?pageNum=<%-page%>"><%-page%></a></li>
		    <%}else{%>
		    	
		    	<%for(let i=0; i<page;i++){%>
		    		<li><a href="/liuyan?pageNum=<%-i+1%>"><%-i+1%></a></li>
		    	<%}%>
		    
		    <%}%>
		    
		    <li>
		      <a href="/liuyan?pageNum=<%-pageNum>page?page:parseInt(pageNum)+1%>" aria-label="Next">
		        <span aria-hidden="true">&raquo;</span>
		      </a>
		    </li>
		  </ul>
		</nav>

前端路由對接收到的由前端頁面用戶點擊的第幾頁即pageNum做的處理,如下

//index.js
//要安裝async依賴模塊(npm i async -D),然後引入
var async = require("async");

//留言
router.get("/liuyan",(req,res)=>{
	//頁碼
	var  pageNum = req.query.pageNum;
    //沒點擊時候,展示第一頁,點擊時候,點哪一頁展示哪一頁的數據
	pageNum = pageNum?pageNum:1;
	//總頁數
	var page = 0;
	//每頁數量
	var size =5;
	//總條數
	var count = 0;
	
	mongodb.connect(db_str,(err,database)=>{
		database.collection("liuyan",(err,coll)=>{
			
			async.series([
				function(callback){
					coll.find({}).toArray((err,data)=>{
						count = data.length;
						page = Math.ceil(count/size)
						
						
//						上一頁/下一頁
						pageNum=pageNum<1?1:pageNum;
						pageNum= pageNum.page?page:pageNum;
						
						callback(null,"")
						
					})
				},
				function(callback){
					coll.find({}).sort({_id:-1}).limit(size).skip((pageNum-1)*size).toArray((err,data)=>{
						callback(null,data)
					})
				}
			],function(err,data){
				 res.render("liuyan",{list:data[1],pageNum:pageNum,page:page,count:count,size:size})
				 database.close()
			})

			
//			coll.find({}).sort({_id:-1}).toArray((err,data)=>{
//					res.render("liuyan",{list:data})
//          database.close()
//			})
		})
	})
})

這裏用到異步流程模塊,主要是因爲兩個事件需要同時進行,沒有先後順序。

爲了完善留言板功能,添加了一個富文本編輯器,這裏需要引入幾個文件,可以參考富文本編輯器入門的用法。主要是在javascripts中引入xheditor文件夾和fwb.js(可以從我上傳的資源裏面下,也可以在官網即入門裏面下),然後再路由界面引入upload.js文件。

//liuyan.ejs
<script src="/javascripts/jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
  	<script src="/javascripts/xheditor/xheditor-1.2.2.min.js" type="text/javascript" charset="utf-8"></script>
 		<script src="/javascripts/xheditor/xheditor_lang/zh-cn.js" type="text/javascript" charset="utf-8"></script>


//修改一下input框爲多行文本輸入框,加上xheditor類名
<label for="con">內容</label>
<textarea type="text" class="form-control xheditor" id="con" placeholder="內容"></textarea>

到這裏可以實現富文本的表情、加粗、傾斜、字變色等功能,但是圖片不能上傳。下面配置一下,實現圖片上傳。

//liuyan.ejs

//在ajax事件的script上面調用一下,這裏面配有上傳圖片路徑upImgUrl: '/users/uploadImg',
<script src="/javascripts/fwb.js" type="text/javascript" charset="utf-8"></script>

然後看一下upload.js,它裏面引入了一個multiparty模塊,實現上傳圖片的。安裝一下依賴(npm i multiparty -D),然後能看到這個upload.js文件封裝了一個函數實現了文件的上傳時候相關配置,最後作爲upload模塊暴露出去了,說明要在其他地方引用。下面是upload.js的代碼。

//upload.js
var multiparty=require('multiparty')
var fs=require('fs')
function upload(req,res){
//	創建表單
	var form =new multiparty.Form()
//	編碼格式
	form.encoding='utf-8';
//	文件大小
	form.maxFilesSize=2*1024*1024;
//	文件上傳目錄
	form.uploadDir='./uploadtem';
	
	
	form.parse(req,function(err,fields,files){
		var uploadurl='/images/upload';
//		獲取文件
		file=files['filedata'];
//		文件的原始名字
		originalFilename=file[0].originalFilename;
//		文件路徑
		tempath=file[0].path;
		
		var timestap=new Date().getTime()
		uploadurl+=timestap+originalFilename;
		newPath='./public/'+uploadurl;
		
		var fsread=fs.createReadStream(tempath)
		var fswrite=fs.createWriteStream(newPath)
		
		fsread.pipe(fswrite)
		fswrite.on('close',()=>{
			fs.unlinkSync(tempath)
			res.send('{"err":"","msg":"'+uploadurl+'"}')	
		})	
	})
}

module.exports=upload;

 上面文件上傳目錄是根路徑下的uploadtem,需要去在項目根路徑創建一下這個目錄,還有上傳的路徑是'/images/upload',所以要在images裏面去建一下upload文件目錄。再去看一下富文本fwb.js這個文件

//fwb.js
pageInit()
    function pageInit() {
      $.extend(XHEDITOR.settings, {shortcuts:{'ctrl+enter': submitForm}})
      $('#con').xheditor({
        html5Upload: false,
        upMultiple: '1',
		width:'100%',
        upLinkUrl: 'upload.html',
        upLinkExt: 'zip, rar, txt',

        upImgUrl: '/users/uploadImg',
        upImgExt: 'jpg,jpeg,gif,png',

        upFlashUrl: 'upload.html',
        upFlashExt: 'swf',
        upMediaUrl: 'upload.html',
        upMediaExt: 'wmv,avi,wma,mp3,mid'
      })
    }
//  富文本自動調用
	function insertUpload(arrmsg){
		var i ,msg;
		for (i=0;i<arrmsg.length;i++) {
			msg=arrmsg[i];
			$('#uploadList').append('<option value="'+msg.id+'">'+msg.localname+'</option>')
		}
	}
    function submitForm() {
      $('#frmDemo').submit()
    }

可以看到upImgUrl: '/users/uploadImg'----當我們上傳圖片時候,是在請求users路由裏面的/uploadImg,所以去uses路由裏面配置一下。

//user.js
//接收一下這個圖片處理模塊
var upload = require("./upload");


//圖片
router.post("/uploadImg",(req,res)=>{
	upload(req,res);
})

以上就將相關配置工作做好了,啓動項目就可以實現登錄、註冊、富文本留言、查看詳情這些操作了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章