app.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. 
  2. /*引用模块*/
  3. var express = require('express');
  4. var session = require('express-session');
  5. var RedisStore = require('connect-redis')(session);
  6. var path = require('path');
  7. var favicon = require('serve-favicon');
  8. var logger = require('morgan');
  9. var cookieParser = require('cookie-parser');
  10. var bodyParser = require('body-parser');
  11. var compression = require('compression');
  12. var routes = require('./routes/index');
  13. var io = require('socket.io')();
  14. //用户相关功能
  15. var users = require('./routes/users')(io);
  16. var admin = require('./routes/admin');
  17. var content = require('./routes/content');
  18. //分层路由
  19. var adminCtrl = require('./routes/adminCtrl');
  20. //系统功能支持
  21. var system = require('./routes/system');
  22. //站点配置
  23. var settings = require("./models/db/settings");
  24. var siteFunc = require("./models/db/siteFunc");
  25. //文件操作对象
  26. var fs = require('fs');
  27. //时间格式化
  28. var moment = require('moment');
  29. var filter = require('./util/filter');
  30. /*模板引擎*/
  31. var partials = require('express-partials');
  32. /*实例化express对象*/
  33. var app = express();
  34. //ueditor注册
  35. var ueditor = require('ueditor-nodejs');
  36. app.use('/ueditor/ue', ueditor({//这里的/ueditor/ue是因为文件件重命名为了ueditor,如果没改名,那么应该是/ueditor版本号/ue
  37. configFile: '/ueditor/jsp/config.json',//如果下载的是jsp的,就填写/ueditor/jsp/config.json
  38. mode: 'local', //本地存储填写local
  39. accessKey: '',//本地存储不填写,bcs填写
  40. secrectKey: '',//本地存储不填写,bcs填写
  41. staticPath: path.join(__dirname, 'public'), //一般固定的写法,静态资源的目录,如果是bcs,可以不填
  42. dynamicPath: '/upload/blogpicture' //动态目录,以/开头,bcs填写buckect名字,开头没有/.路径可以根据req动态变化,可以是一个函数,function(req) { return '/xx'} req.query.action是请求的行为,uploadimage表示上传图片,具体查看config.json.
  43. }));
  44. // view engine setup
  45. //静态压缩
  46. app.use(compression());
  47. app.set('views', path.join(__dirname, 'views'));
  48. app.set('view engine', 'ejs');
  49. app.use(partials());
  50. // uncomment after placing your favicon in /public
  51. //app.use(favicon(__dirname + '/public/favicon.ico'));
  52. app.use(logger('dev'));
  53. app.use(bodyParser.json({limit: '50mb'})); // 限制上传5M
  54. app.use(bodyParser.urlencoded({ extended: false , limit: '50mb' }));
  55. app.use(cookieParser(settings.session_secret));
  56. //解决异步层次混乱问题
  57. app.use(require('express-promise')());
  58. app.use(session({
  59. secret: settings.session_secret,
  60. store: new RedisStore({
  61. port: settings.redis_port,
  62. host: settings.redis_host,
  63. pass : settings.redis_psd,
  64. ttl: 1800 // 过期时间
  65. }),
  66. resave: true,
  67. saveUninitialized: true
  68. }));
  69. app.use(filter.authUser);
  70. app.use(function(req, res, next){
  71. // 针对注册会员
  72. res.locals.logined = req.session.logined;
  73. res.locals.userInfo = req.session.user;
  74. // 针对管理员
  75. res.locals.adminlogined = req.session.adminlogined;
  76. res.locals.adminUserInfo = req.session.adminUserInfo;
  77. res.locals.adminNotices = req.session.adminNotices;
  78. // 指定站点域名
  79. res.locals.myDomain = req.headers.host;
  80. next();
  81. });
  82. //配置站点地图和robots抓取
  83. app.get('/sitemap.xml',function(req, res, next) {
  84. siteFunc.setDataForSiteMap(req, res);
  85. });
  86. app.get('/robots.txt',function(req, res, next) {
  87. var stream=fs.createReadStream('./robots.txt',{flags:'r'});
  88. stream.pipe(res);
  89. });
  90. //事件监听
  91. app.io = io;
  92. io.on('connection', function (socket) {
  93. // socket.emit('news', { hello: 'world' });
  94. // socket.on('my other event', function (data) {
  95. // console.log(data);
  96. // });
  97. });
  98. //数据格式化
  99. app.locals.myDateFormat = function(date){
  100. moment.locale('zh-cn');
  101. return moment(date).startOf('hour').fromNow();
  102. };
  103. app.locals.searchKeyWord = function(content,key){
  104. var newContent = content;
  105. if(newContent && key){
  106. var keyword = key.replace(/(^\s*)|(\s*$)/g, "");
  107. if(keyword != ''){
  108. var reg = new RegExp(keyword,'gi');
  109. newContent = content.replace(reg, '<span style="color:red">'+key+'</span>');
  110. }
  111. }
  112. return newContent;
  113. };
  114. app.use(express.static(path.join(__dirname, 'public')));
  115. /*指定路由控制*/
  116. app.use('/', routes);
  117. app.use('/content', content);
  118. app.use('/users', users);
  119. //app.use('/admin', validat);
  120. app.use('/admin', adminCtrl);
  121. app.use('/admin', admin);
  122. app.use('/system',system);
  123. // catch 404 and forward to error handler
  124. app.use(function(req, res, next) {
  125. var err = new Error('Not Found');
  126. err.status = 404;
  127. console.log(err);
  128. siteFunc.renderToTargetPageByType(req,res,'error',{info : '找不到页面',message : settings.system_illegal_param, page : 'do404'});
  129. });
  130. // error handlers
  131. // development error handler
  132. // will print stacktrace
  133. if (app.get('env') === 'development') {
  134. app.use(function(err, req, res, next) {
  135. res.status(err.status || 500);
  136. siteFunc.renderToTargetPageByType(req,res,'error',{info : '出错啦!',message : err.message, page : 'do500'});
  137. });
  138. }
  139. // production error handler
  140. // no stacktraces leaked to user
  141. app.use(function(err, req, res, next) {
  142. res.status(err.status || 500);
  143. siteFunc.renderToTargetPageByType(req,res,'error',{info : '出错啦!',message : err.message, page : 'do500'});
  144. });
  145. module.exports = app;