mirror of
https://github.com/cnodejs/nodeclub.git
synced 2025-12-08 19:55:55 +00:00
93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
var tag_ctrl = require('./tag');
|
|
var user_ctrl = require('./user');
|
|
var topic_ctrl = require('./topic');
|
|
|
|
var config = require('../config').config;
|
|
var EventProxy = require('eventproxy').EventProxy;
|
|
|
|
var sanitize = require('validator').sanitize;
|
|
|
|
exports.index = function(req,res,next){
|
|
var page = Number(req.query.page) || 1;
|
|
var keyword = req.query.q || ''; // in-site search
|
|
keyword = keyword.trim();
|
|
var limit = config.list_topic_count;
|
|
|
|
var render = function(tags,topics,hot_topics,stars,tops,no_reply_topics,pages){
|
|
var all_tags = tags.slice(0);
|
|
|
|
// 计算最热标签
|
|
tags.sort(function(tag_a,tag_b){
|
|
if(tag_a.topic_count == tag_b.topic_count) return 0;
|
|
if(tag_a.topic_count > tag_b.topic_count) return -1;
|
|
if(tag_a.topic_count < tag_b.topic_count) return 1;
|
|
});
|
|
var hot_tags = tags.slice(0,5);
|
|
|
|
// 计算最新标签
|
|
tags.sort(function(tag_a,tag_b){
|
|
if(tag_a.create_at == tag_b.create_at) return 0;
|
|
if(tag_a.create_at > tag_b.create_at) return -1;
|
|
if(tag_a.create_at < tag_b.create_at) return 1;
|
|
});
|
|
var recent_tags = tags.slice(0,5);
|
|
res.render('index', {
|
|
tags: all_tags,
|
|
topics: topics,
|
|
current_page: page,
|
|
list_topic_count: limit,
|
|
recent_tags: recent_tags,
|
|
hot_topics: hot_topics,
|
|
stars: stars,
|
|
tops: tops,
|
|
no_reply_topics: no_reply_topics,
|
|
pages: pages,
|
|
keyword: keyword
|
|
});
|
|
};
|
|
|
|
var proxy = new EventProxy();
|
|
proxy.assign('tags','topics','hot_topics','stars','tops','no_reply_topics','pages',render);
|
|
|
|
tag_ctrl.get_all_tags(function(err,tags){
|
|
if(err) return next(err);
|
|
proxy.trigger('tags',tags);
|
|
});
|
|
|
|
var opt = {skip:(page-1)*limit, limit:limit, sort:[['top','desc'],['last_reply_at','desc']]};
|
|
var query = {};
|
|
if (keyword) {
|
|
keyword = keyword.replace(/[\*\^\&\(\)\[\]\+\?\\]/g, '');
|
|
query.title = new RegExp(keyword, 'i');
|
|
}
|
|
topic_ctrl.get_topics_by_query(query, opt,function(err,topics){
|
|
if(err) return next(err);
|
|
proxy.trigger('topics',topics);
|
|
});
|
|
opt = {limit:5, sort:[['visit_count','desc']]};
|
|
topic_ctrl.get_topics_by_query({},opt,function(err,hot_topics){
|
|
if(err) return next(err);
|
|
proxy.trigger('hot_topics',hot_topics);
|
|
});
|
|
opt = {limit:5};
|
|
user_ctrl.get_users_by_query({is_star:true},opt,function(err,users){
|
|
if(err) return next(err);
|
|
proxy.trigger('stars',users);
|
|
});
|
|
opt = {limit:10, sort:[['score','desc']]};
|
|
user_ctrl.get_users_by_query({},opt,function(err,tops){
|
|
if(err) return next(err);
|
|
proxy.trigger('tops',tops);
|
|
});
|
|
opt = {limit:5, sort:[['create_at','desc']]};
|
|
topic_ctrl.get_topics_by_query({reply_count:0},opt,function(err,no_reply_topics){
|
|
if(err) return next(err);
|
|
proxy.trigger('no_reply_topics',no_reply_topics);
|
|
});
|
|
topic_ctrl.get_count_by_query(query,function(err,all_topics_count){
|
|
if(err) return next(err);
|
|
var pages = Math.ceil(all_topics_count/limit);
|
|
proxy.trigger('pages',pages);
|
|
});
|
|
};
|