第5章 首頁數據中加入用戶並實現點贊功能

請關注我的小站:http://oideas.herokuapp.com/

上一章實現了用戶的登錄和註冊功能,當然有些同學可能會發現,這兩個功能做的很粗,沒錯,像前端驗證,就沒有做email的匹配,後臺錯誤返回的時候也沒有記錄輸入的內容,其實,這些小細節都不難實現,難的是你有沒有那個心去做,我只是把大體的框架打出來給大家,但是你們同樣也許要自己動手自己思考,不然,寫着個blog就真的變成了傻瓜教程,遇到問題不要怕,也不要着急,一步一步慢慢解決,總是在剛下手做的時候就被困難嚇到,多沒意思,不多說了,不用在意。。。

1.首頁中的數據加入用戶元素

首先,首頁中的數據來自那了呢?當然是投稿時候insert的啦,好,打開routes下的index.js找到 app.post('/putup')方法,還記得那段註釋嗎?if else中登錄的用戶暫時不做處理,對現在我們可以處理了。將:

 //暫時不做處理 

這段註釋替換成:

User.getById(user._id, function(err, temp) {
				if (!temp) {
					//如果用戶不存在,那user就是null
					mind = new Mind({
						content : cont,
						user : null,
						flag : flag
					});
				}
					mind = new Mind({
						content : cont,
						user : temp,
						flag : flag
					});
				
				console.log(mind);
				mind.save(function(err, mind) {
					if (err) {
						req.flash('error', err);
						return res.redirect('/upminds');
					}
					//不知到爲何,測試的時候session中的user時常clear,所以我基本上在每個方法中加入下面這個段
					req.session.user = user;
					res.redirect('/');
				});
			});

爲什麼不知接用session中的user,還要查一下,其實,你可一試試,而且告訴你sessionn中的user也是可以的,目前也不會有影響,但是當我們用user的id去找一個用戶並根據找到的這個用戶再去查相關的mind,你發現找不到結果,爲什麼?我也不清楚,這是我的解決方法。我們直接在mind中存放一個完整的user這雖然顯得有些浪費,但是我也是爲了方便而已。。

好了投稿的時候用戶已經加上去了,現在來做顯示,打開views/index.ejs將顯示頭像的代碼:

<img src="/images/tem.jpg" title="OMinds">  
                <a href="/">OMinds</a> 

替換成:

<%if(mind.user){%>
  				<img src="<%=mind.user.photo%>" title="<%=mind.user.nickname%>">
  				<a href="/userinfor?uid=<%=mind.user._id%>"><%=mind.user.nickname%></a>
  				<%}%>

顯示也做好了,找個用戶登錄系統,測試一下吧,點擊投稿,隨便寫點什麼,提交後發現,呀~,怎麼報錯了,還是什麼Error: db object already connecting, open cannot be called multiple times之類的的東西,一看代碼行,說是我們的mind.save方法,恩,別擔心,看看它的上一級方法是User.getById恩,我們打開models/user.js具體看看這個方法,恩,果然,db沒有關閉,好,修改一下這個方法:

// R(查,通過ID)
User.getById = function(id, callback) {
	mongodb.open(function(err, db) {
		if (err) {
			return callback(err);
		}
		db.collection('users', function(err, collection) {
			if (err) {
				db.close();
				return callback(err);
			}
			collection.findOne({
				_id : new ObjectID(id)
			}, function(err, user) {
				db.close();
				if (err) {
					return callback(err);
				}
				callback(null, user);
			});
		});
	});
};

就是在最後返回的時候加了一句db.close()方法,爲什麼要跟大家說這個問題,其實這些方法寫完之後是沒有做過驗證的,而且我也是一步一步去做的,遇到問題,也是要去解決的,也是藉此告訴大家,有問題,不是問題,我們可以解決它。

好了,再次打開瀏覽器,投稿一下看看:




另外views/index.ejs中那段作爲參考的div可以刪除(保留也沒問題,如果後面經常做db清除操作的話,建議保留)


2.實現點贊功能

ok先來做點東西,打開index.ejs把點贊和踩的鏈接修改爲:

<li><a id="putups<%= mind._id %>" name="putups" href="javascript:putUps('<%= mind._id %>');" title="<%=mind.ups%>個贊" >贊[<%=mind.ups%>]</a></li>
  					<li><a id="putdowns<%= mind._id %>" name="putdowns" href="javascript:putDowns('<%= mind._id %>')" title="<%=mind.downs%>個踩">踩[<%=mind.downs%>]</a></li>

在index.ejs最後添加js方法:


<script type="text/javascript">
  	function putUps(oid){
			var params ={
                oid:oid
            };
            $.ajax({
                data: params,
                url: '/addups',
                type:'post',
                jsonpCallback: 'callback',
                success: function(data){
                	console.log(data);
                  $('#putups'+oid).attr("title",data+'個贊');
                  $('#putups'+oid).html("贊["+data+"]");
                  
                },
                error: function(jqXHR, textStatus, errorThrown){
                    alert('error ' + textStatus + " " + errorThrown);  
                }
            });
		}
		function putDowns(oid){
			var params ={
                oid:oid
            };
            $.ajax({
                data: params,
                url: '/addowns',
                type:'post',
                jsonpCallback: 'callback',
                success: function(data){
                  $('#putdowns'+oid).attr("title",data+'個踩');
                  $('#putdowns'+oid).html("踩["+data+"]");
                  
                },
                error: function(jqXHR, textStatus, errorThrown){
                    alert('error ' + textStatus + " " + errorThrown);  
                }
            });
		}
	</script>


我們要通過mind的id去找到它然後讓它的ups或downs增加,那麼,我們要天加一個取得數據的方法,打開models/mind.js添加:

//通過id查找
Mind.getById = function(id, callback) {
	mongodb.open(function(err, db) {
		if (err) {
			return callback(err);
		}
		db.collection('minds', function(err, collection) {
			if (err) {
				db.close();
				return callback(err);
			}
			collection.findOne({
				_id : new  ObjectID(id)
			}, function(err, mind) {
				db.close();
				if (err) {
					return callback(err);
				}
				callback(null, mind);
			});
		});
	});
};

好,可以做邏輯處理了,打開routes/index.js,加入:

 app.post('/addups', function(req, res) {
		var oid=req.body.oid;
		Mind.getById(oid, function(err, mind) {
			if (!mind) {
				req.flash('error', err);
				return res.redirect('/');
			}
			var temp = mind.ups + 1;
			Mind.update(oid, temp, mind.downs, mind.comments,function(err) {
				if (err) {
					req.flash('error', err);
					return res.redirect('/');
				}
				console.log(temp);
				res.writeHead(200, { 'Content-Type': 'text/plain' });
				res.end(temp.toString());
				//res.json({success:1});
				return;
			});
		});
	});
	app.post('/addowns', function(req, res) {
		var eid = req.body.oid;
		Mind.getById(eid, function(err, mind) {
			if (!mind) {
				req.flash('error', err);
				return res.redirect('/');
			}
			var temp = mind.downs + 1;
			Mind.update(eid, mind.ups, temp, mind.comments, function(err) {
				if (err) {
					req.flash('error', err);
					return res.redirect('/');
				}
				res.writeHead(200, { 'Content-Type': 'text/plain' });
				res.end(temp.toString());
				return;
			});
		});
	});

簡單嗎?趕快試試把,注意,'Content-Type': 'text/plain'這句話,這個是一text方式傳輸數據,你可一設置application/json試試,這樣前端可能通過json格式獲取了(我沒試過,你們可以嘗試一下)
看一下效果:



注意到紅色框裏面了嗎?對,我們已經實現了哦。。


以上本章內容。。。。

ideas-ominds交流羣:158325682,有想要一起做的,或者有什麼不懂的都可以找我哦。
發佈了49 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章