This commit is contained in:
eshengsky
2019-06-19 14:04:31 +08:00
parent 53513a9327
commit a324417752
12 changed files with 757 additions and 1106 deletions

2
app.js
View File

@@ -29,7 +29,7 @@ process.on('uncaughtException', err => {
* 记录未处理的Promise失败
*/
process.on('unhandledRejection', reason => {
logger.errLogger(err);
logger.errLogger(reason);
});
// 设置模板引擎

View File

@@ -9,66 +9,54 @@ const i18n = require('../models/i18n');
/**
* 获取分类数据
* @param [cached] 是否读取缓存
* @param callback 回调函数
* @param [cached=true] 是否读取缓存
*/
exports.getAll = function (cached, callback) {
if (typeof cached === 'function') {
callback = cached;
cached = true;
}
exports.getAll = (cached = true) => {
// 缓存的key名称
const cache_key = 'categories';
if (cached) {
// 尝试读取缓存
redisClient.getItem(cache_key, (err, categories) => {
// 读取缓存出错
if (err) {
return callback(err);
}
// 缓存中有数据
if (categories) {
return callback(null, categories);
}
// 缓存中没有数据,则从数据库中读取
categoryModel.find((err, categories) => {
// 读取数据库出错
if (err) {
return callback(err);
}
// 从数据库中读到数据
return new Promise((resolve, reject) => {
if (cached) {
// 尝试读取缓存
redisClient.getItem(cache_key).then(categories => {
// 缓存中有数据
if (categories) {
// 将数据塞入缓存
redisClient.setItem(cache_key, categories, redisClient.defaultExpired, err => {
if (err) {
return callback(err);
}
});
return resolve(categories);
}
return callback(null, categories);
// 缓存中没有数据,则从数据库中读取
categoryModel.find((err, categories) => {
// 读取数据库出错
if (err) {
return reject(err);
}
// 从数据库中读到数据
if (categories) {
// 将数据塞入缓存
redisClient.setItem(cache_key, categories, redisClient.defaultExpired);
}
return resolve(categories);
});
}, err => {
// 读取缓存出错
reject(err);
});
});
} else {
categoryModel.find((err, categories) => {
if (err) {
return callback(err);
}
return callback(null, categories);
});
}
} else {
categoryModel.find((err, categories) => {
if (err) {
return reject(err);
}
return resolve(categories);
});
}
});
};
/**
* 根据分类alias获取分类
* @param alias 分类alias
* @param callback 回调函数
* @returns {*}
*/
exports.getByAlias = function (alias, callback) {
exports.getByAlias = alias => {
// 全部分类
const cateAll = {
_id: '',
@@ -86,46 +74,41 @@ exports.getByAlias = function (alias, callback) {
};
const cache_key = `category_${alias}`;
if (alias) {
if (alias === 'other') {
return callback(null, cateOther);
}
redisClient.getItem(cache_key, (err, category) => {
if (err) {
return callback(err);
return new Promise((resolve, reject) => {
if (alias) {
if (alias === 'other') {
return resolve(cateOther);
}
if (category) {
return callback(null, category);
}
categoryModel.findOne({ Alias: alias }, (err, category) => {
if (err) {
return callback(err);
}
redisClient.getItem(cache_key).then(category => {
if (category) {
redisClient.setItem(cache_key, category, redisClient.defaultExpired, err => {
if (err) {
return callback(err);
}
});
return resolve(category);
}
return callback(null, category);
categoryModel.findOne({ Alias: alias }, (err, category) => {
if (err) {
return reject(err);
}
if (category) {
redisClient.setItem(cache_key, category, redisClient.defaultExpired);
}
return resolve(category);
});
}, err => {
reject(err);
});
});
} else {
return callback(null, cateAll);
}
} else {
resolve(cateAll);
}
});
};
/**
* 保存分类数据
* @param array 分类集合
* @param callback 回调函数
*/
exports.save = function (array, callback) {
let jsonArray = [],
toUpdate = [],
updateQuery = [],
cateNew;
exports.save = array => {
const jsonArray = [];
const toUpdate = [];
if (array.length > 0) {
array.forEach(item => {
jsonArray.push({
@@ -139,58 +122,63 @@ exports.save = function (array, callback) {
});
});
}
categoryModel.find((err, categories) => {
if (err) {
return callback(err);
}
categories.forEach(old => {
cateNew = tool.jsonQuery(jsonArray, { _id: old._id });
if (!cateNew) {
// 该分类将被删除
toUpdate.push(old._id);
} else {
// 该分类依然存在,则创建时间沿用原创建时间
cateNew.CreateTime = old.CreateTime;
// 若该分类未做任何修改,则修改时间沿用原修改时间
if (cateNew.CateName.toString() === old.CateName.toString() && cateNew.Alias.toString() === old.Alias.toString() && cateNew.Img === old.Img && cateNew.Link === old.Link) {
cateNew.ModifyTime = old.ModifyTime;
}
}
});
// 将已被删除分类的文章设为"未分类"
if (toUpdate.length > 0) {
toUpdate.forEach(cateId => {
updateQuery.push({
CategoryId: cateId
});
});
post.update({ $or: updateQuery }, { CategoryId: 'other' }, { multi: true }, err => {
if (err) {
return callback(err);
}
});
}
// 将分类全部删除
categoryModel.remove(err => {
return new Promise((resolve, reject) => {
categoryModel.find((err, categories) => {
if (err) {
return callback(err);
return reject(err);
}
if (jsonArray.length > 0) {
// 插入全部分类
// categoryModel.create(jsonArray, function (err) {}); //不用这个,因为这个内部实现依然是循环插入,不是真正的批量插入
// 这里采用mongodb原生的insert来批量插入多个文档
categoryModel.collection.insert(jsonArray, err => {
if (err) {
return callback(err);
categories.forEach(old => {
const cateNew = tool.jsonQuery(jsonArray, { _id: old._id });
if (!cateNew) {
// 该分类将被删除
toUpdate.push(old._id);
} else {
// 该分类依然存在,则创建时间沿用原创建时间
cateNew.CreateTime = old.CreateTime;
// 若该分类未做任何修改,则修改时间沿用原修改时间
if (cateNew.CateName.toString() === old.CateName.toString() && cateNew.Alias.toString() === old.Alias.toString() && cateNew.Img === old.Img && cateNew.Link === old.Link) {
cateNew.ModifyTime = old.ModifyTime;
}
}
});
// 将已被删除分类的文章设为"未分类"
if (toUpdate.length > 0) {
const updateQuery = [];
toUpdate.forEach(cateId => {
updateQuery.push({
CategoryId: cateId
});
});
post.update({ $or: updateQuery }, { CategoryId: 'other' }, { multi: true }, err => {
if (err) {
return reject(err);
}
return callback(null);
});
} else {
return callback(null);
}
// 将分类全部删除
categoryModel.remove(err => {
if (err) {
return reject(err);
}
if (jsonArray.length > 0) {
// 插入全部分类
// categoryModel.create(jsonArray, function (err) {}); //不用这个,因为这个内部实现依然是循环插入,不是真正的批量插入
// 这里采用mongodb原生的insert来批量插入多个文档
categoryModel.collection.insert(jsonArray, err => {
if (err) {
return reject(err);
}
return resolve();
});
} else {
return resolve();
}
});
});
});
};

View File

@@ -4,9 +4,8 @@ const logModel = require('../models/log')
/**
* 获取所有日志
* @param params 参数对象
* @param callback 回调函数
*/
exports.getAll = function (params, callback) {
exports.getAll = params => {
let page = parseInt(params.pageIndex) || 1;
const size = parseInt(params.pageSize) || 10;
page = page > 0 ? page : 1;
@@ -21,24 +20,27 @@ exports.getAll = function (params, callback) {
options.sort = params.sortOrder === 'desc' ? '-timestamp' : 'timestamp';
break;
}
logModel.find({}, {}, options, (err, logs) => {
if (err) {
return callback(err);
}
return callback(null, logs);
return new Promise((resolve, reject) => {
logModel.find({}, {}, options, (err, logs) => {
if (err) {
return reject(err);
}
return resolve(logs);
});
});
};
/**
* 获取日志数
* @param params 参数对象
* @param callback 回调函数
*/
exports.getAllCount = function (params, callback) {
logModel.count((err, count) => {
if (err) {
return callback(err);
}
return callback(null, count);
exports.getAllCount = () => {
return new Promise((resolve, reject) => {
logModel.count((err, count) => {
if (err) {
return reject(err);
}
return resolve(count);
});
});
};

View File

@@ -6,7 +6,6 @@ const tool = require('../utility/tool');
/**
* 为首页数据查询构建条件对象
* @param params 查询参数对象
* @returns {{}}
*/
function getPostsQuery(params) {
const query = {};
@@ -56,37 +55,33 @@ function getPostsQuery(params) {
/**
* 获取首页的文章数据
* @param params 参数对象
* @param callback 回调函数
*/
exports.getPosts = function (params, callback) {
exports.getPosts = params => {
const cache_key = tool.generateKey('posts', params);
redisClient.getItem(cache_key, (err, posts) => {
if (err) {
return callback(err);
}
if (posts) {
return callback(null, posts);
}
let page = parseInt(params.pageIndex) || 1;
const size = parseInt(params.pageSize) || 10;
page = page > 0 ? page : 1;
const options = {};
options.skip = (page - 1) * size;
options.limit = size;
options.sort = params.sortBy === 'title' ? 'Title -CreateTime' : '-CreateTime';
const query = getPostsQuery(params);
postModel.find(query, {}, options, (err, posts) => {
if (err) {
return callback(err);
}
return new Promise((resolve, reject) => {
redisClient.getItem(cache_key).then(posts => {
if (posts) {
redisClient.setItem(cache_key, posts, redisClient.defaultExpired, err => {
if (err) {
return callback(err);
}
});
return resolve(posts);
}
return callback(null, posts);
let page = parseInt(params.pageIndex) || 1;
const size = parseInt(params.pageSize) || 10;
page = page > 0 ? page : 1;
const options = {};
options.skip = (page - 1) * size;
options.limit = size;
options.sort = params.sortBy === 'title' ? 'Title -CreateTime' : '-CreateTime';
const query = getPostsQuery(params);
postModel.find(query, {}, options, (err, posts) => {
if (err) {
return reject(err);
}
if (posts) {
redisClient.setItem(cache_key, posts, redisClient.defaultExpired);
}
return resolve(posts);
});
}, err => {
reject(err);
});
});
};
@@ -94,29 +89,25 @@ exports.getPosts = function (params, callback) {
/**
* 获取首页文章的页数
* @param params 参数对象
* @param callback 回调函数
*/
exports.getPageCount = function (params, callback) {
exports.getPageCount = params => {
const cache_key = tool.generateKey('posts_count', params);
redisClient.getItem(cache_key, (err, pageCount) => {
if (err) {
return callback(err);
}
if (pageCount) {
return callback(null, pageCount);
}
const query = getPostsQuery(params);
postModel.count(query, (err, count) => {
if (err) {
return callback(err);
return new Promise((resolve, reject) => {
redisClient.getItem(cache_key).then(pageCount => {
if (pageCount) {
return resolve(pageCount);
}
const pageCount = count % params.pageSize === 0 ? parseInt(count / params.pageSize) : parseInt(count / params.pageSize) + 1;
redisClient.setItem(cache_key, pageCount, redisClient.defaultExpired, err => {
const query = getPostsQuery(params);
postModel.count(query, (err, count) => {
if (err) {
return callback(err);
return reject(err);
}
const pageCount = count % params.pageSize === 0 ? parseInt(count / params.pageSize) : parseInt(count / params.pageSize) + 1;
redisClient.setItem(cache_key, pageCount, redisClient.defaultExpired);
return resolve(pageCount);
});
return callback(null, pageCount);
}, err => {
reject(err);
});
});
};
@@ -124,31 +115,30 @@ exports.getPageCount = function (params, callback) {
/**
* 根据alias获取文章
* @param alias 文章alias
* @param callback 回调函数
*/
exports.getPostByAlias = function (alias, callback) {
exports.getPostByAlias = alias => {
const cache_key = `article_${alias}`;
// 文章浏览数+1
postModel.update({ Alias: alias }, { $inc: { ViewCount: 1 } })
.exec();
redisClient.getItem(cache_key, (err, article) => {
if (err) {
return callback(err);
}
if (article) {
return callback(null, article);
}
postModel.findOne({ Alias: alias }, (err, article) => {
if (err) {
return callback(err);
}
return new Promise((resolve, reject) => {
redisClient.getItem(cache_key).then(article => {
if (article) {
redisClient.setItem(cache_key, article, redisClient.defaultExpired, err => {
if (err) {
return callback(err);
}
});
return resolve(article);
}
return callback(null, article);
postModel.findOne({ Alias: alias }, (err, article) => {
if (err) {
return reject(err);
}
if (article) {
redisClient.setItem(cache_key, article, redisClient.defaultExpired);
}
return resolve(article);
});
}, err => {
reject(err);
});
});
};
@@ -156,7 +146,6 @@ exports.getPostByAlias = function (alias, callback) {
/**
* 为后台数据查询构建条件对象
* @param params
* @returns {{}}
*/
function getArticlesQuery(params) {
const query = {};
@@ -208,9 +197,8 @@ function getArticlesQuery(params) {
/**
* 获取管理页面的文章数据
* @param params 参数对象
* @param callback 回调函数
*/
exports.getArticles = function (params, callback) {
exports.getArticles = params => {
let page = parseInt(params.pageIndex) || 1;
const size = parseInt(params.pageSize) || 10;
page = page > 0 ? page : 1;
@@ -229,26 +217,29 @@ exports.getArticles = function (params, callback) {
break;
}
const query = getArticlesQuery(params);
postModel.find(query, {}, options, (err, posts) => {
if (err) {
return callback(err);
}
return callback(null, posts);
return new Promise((resolve, reject) => {
postModel.find(query, {}, options, (err, posts) => {
if (err) {
return reject(err);
}
return resolve(posts);
});
});
};
/**
* 获取管理页面的文章数
* @param params 参数对象
* @param callback 回调函数
*/
exports.getArticlesCount = function (params, callback) {
exports.getArticlesCount = params => {
const query = getArticlesQuery(params);
postModel.count(query, (err, count) => {
if (err) {
return callback(err);
}
return callback(null, count);
return new Promise((resolve, reject) => {
postModel.count(query, (err, count) => {
if (err) {
return reject(err);
}
return resolve(count);
});
});
};
@@ -256,107 +247,103 @@ exports.getArticlesCount = function (params, callback) {
* 判断文章Alias是否唯一
* @param alias 文章Alias
* @param articleId 文章Id
* @param callback 回调函数
*/
exports.checkAlias = function (alias, articleId, callback) {
postModel.findOne({ Alias: alias }, (err, article) => {
if (err) {
return callback(err);
}
if (!article) {
return callback(null, true);
}
if (article._id === articleId) {
return callback(null, true);
}
return callback(null, false);
exports.checkAlias = (alias, articleId) => {
return new Promise((resolve, reject) => {
postModel.findOne({ Alias: alias }, (err, article) => {
if (err) {
return reject(err);
}
if (!article) {
return resolve(true);
}
if (article._id === articleId) {
return resolve(true);
}
return resolve(false);
});
});
};
/**
* 根据id获取文章
* @param id 文章id
* @param callback 回调函数
*/
exports.getById = function (id, callback) {
postModel.findById(id, (err, article) => {
if (err) {
return callback(err);
}
return callback(null, article);
exports.getById = id => {
return new Promise((resolve, reject) => {
postModel.findById(id, (err, article) => {
if (err) {
return reject(err);
}
return resolve(article);
});
});
};
/**
* 新增或更新文章
* @param params 参数对象
* @param callback 回调函数
*/
exports.save = function (params, callback) {
let _id = params.UniqueId,
entity = new postModel({
Title: params.Title,
Alias: params.Alias,
Summary: params.Summary,
Source: params.Source,
Content: params.Content,
ContentType: params.ContentType || '',
CategoryId: params.CategoryId,
Labels: params.Labels,
Url: params.Url,
IsDraft: params.IsDraft === 'True',
IsActive: params.IsActive === 'True',
ModifyTime: new Date()
exports.save = params => {
const _id = params.UniqueId;
const entity = new postModel({
Title: params.Title,
Alias: params.Alias,
Summary: params.Summary,
Source: params.Source,
Content: params.Content,
ContentType: params.ContentType || '',
CategoryId: params.CategoryId,
Labels: params.Labels,
Url: params.Url,
IsDraft: params.IsDraft === 'True',
IsActive: params.IsActive === 'True',
ModifyTime: new Date()
});
return new Promise((resolve, reject) => {
postModel.findById(_id, (err, article) => {
if (err) {
return reject(err);
}
if (!article) {
// 新增
entity._id = _id;
entity.IsActive = true;
entity.ViewCount = 0;
entity.CreateTime = new Date();
entity.save(err => {
if (err) {
return reject(err);
}
return resolve();
});
} else {
// 更新
postModel.update({ _id }, entity, err => {
if (err) {
return reject(err);
}
return resolve();
});
}
});
postModel.findById(_id, (err, article) => {
if (err) {
return callback(err);
}
if (!article) {
// 新增
entity._id = _id;
entity.IsActive = true;
entity.ViewCount = 0;
entity.CreateTime = new Date();
entity.save(err => {
if (err) {
return callback(err);
}
return callback(null);
});
} else {
// 更新
postModel.update({ _id }, entity, err => {
if (err) {
return callback(err);
}
return callback(null);
});
}
});
};
/**
* 软删除文章
* @param ids 文章id多个id以逗号分隔
* @param callback 回调函数
*/
exports.delete = function (ids, callback) {
let idArray = ids.split(','),
hasErr = false,
index = 0;
idArray.forEach(id => {
postModel.update({ _id: id }, { IsActive: false }, err => {
index++;
if (err) {
hasErr = true;
}
if (index === idArray.length) {
if (hasErr) {
return callback(err);
}
return callback(null);
}
exports.delete = ids => {
const idArray = ids.split(',');
const promiseArr = idArray.map(id => {
return postModel.update({ _id: id }, { IsActive: false }).exec()
});
return new Promise((resolve, reject) => {
Promise.all(promiseArr).then(() => {
resolve();
}, err => {
reject(err);
});
});
};
@@ -364,13 +351,14 @@ exports.delete = function (ids, callback) {
/**
* 恢复删除的文章
* @param id 文章id
* @param callback 回调函数
*/
exports.undo = function (id, callback) {
postModel.update({ _id: id }, { IsActive: true }, err => {
if (err) {
return callback(err);
}
return callback(null);
exports.undo = id => {
return new Promise((resolve, reject) => {
postModel.update({ _id: id }, { IsActive: true }, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
};

View File

@@ -2,7 +2,6 @@ const express = require('express');
const router = express.Router();
const path = require('path');
const fs = require('fs');
const async = require('async');
const upload = require('jquery-file-upload-middleware');
const post = require('../proxy/post');
const category = require('../proxy/category');
@@ -20,216 +19,163 @@ upload.configure({
// 网站统计页面
router.get('/', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/index', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.web_statistic')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/index', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.web_statistic')}`
});
}, err => {
next(err);
});
});
// 分类管理页面
router.get('/categorymanage', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/categorymanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.classified_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/categorymanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.classified_management')}`
});
}, err => {
next(err);
});
});
// 获取分类数据,不走缓存
router.post('/getCategories', (req, res, next) => {
category.getAll(false, (err, data) => {
if (err) {
next(err);
} else {
res.json(data);
}
category.getAll(false).then(data => {
res.json(data);
}, err => {
next(err);
});
});
// 保存分类数据
router.post('/saveCategories', (req, res, next) => {
const jsonArray = JSON.parse(req.body.json.substr(1, req.body.json.length - 2));
category.save(jsonArray, err => {
if (err) {
next(err);
} else {
res.end();
}
category.save(jsonArray).then(() => {
res.end();
}, err => {
next(err);
});
});
// 文章管理页面
router.get('/articlemanage', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/articlemanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.article_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/articlemanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.article_management')}`
});
}, err => {
next(err);
});
});
// 获取分类数据,不走缓存
router.post('/getCateFilter', (req, res, next) => {
category.getAll(false, (err, data) => {
if (err) {
next(err);
} else {
res.json(data);
}
category.getAll(false).then(data => {
res.json(data);
}, err => {
next(err);
});
});
// 获取文章列表数据
router.post('/getArticles', (req, res, next) => {
let filter,
params = {
pageIndex: req.body.pageNumber,
pageSize: req.body.pageSize,
sortName: req.body.sortName,
sortOrder: req.body.sortOrder,
searchText: req.body.searchText
};
const params = {
pageIndex: req.body.pageNumber,
pageSize: req.body.pageSize,
sortName: req.body.sortName,
sortOrder: req.body.sortOrder,
searchText: req.body.searchText
};
if (req.body.filter) {
filter = JSON.parse(req.body.filter);
const filter = JSON.parse(req.body.filter);
params.cateId = filter.CateName;
params.uniqueId = filter.UniqueId;
params.title = filter.Title;
}
async.parallel([
// 获取文章列表
function (cb) {
post.getArticles(params, (err, posts) => {
if (err) {
cb(err);
} else {
cb(null, posts);
}
});
},
// 获取文章总数
function (cb) {
post.getArticlesCount(params, (err, count) => {
if (err) {
cb(err);
} else {
cb(null, count);
}
});
},
// 获取分类
function (cb) {
category.getAll(false, (err, categories) => {
if (err) {
cb(err);
} else {
cb(null, categories);
}
});
}
], (err, results) => {
let posts,
count,
categories,
post,
cateId,
cateItem,
result = [];
if (err) {
next(err);
} else {
posts = results[0];
count = results[1];
categories = results[2];
posts.forEach(item => {
post = {
UniqueId: item._id,
Alias: item.Alias,
Title: item.Title,
CreateTime: moment(item.CreateTime)
.format('YYYY-MM-DD HH:mm:ss'),
ModifyTime: moment(item.ModifyTime)
.format('YYYY-MM-DD HH:mm:ss'),
Summary: item.Summary,
ViewCount: item.ViewCount,
Source: item.Source,
Url: item.Url,
IsDraft: item.IsDraft,
IsActive: item.IsActive
Promise.all([
post.getArticles(params),
post.getArticlesCount(params),
category.getAll(false)
]).then(results => {
const posts = results[0];
const count = results[1];
const categories = results[2];
const result = [];
posts.forEach(item => {
const post = {
UniqueId: item._id,
Alias: item.Alias,
Title: item.Title,
CreateTime: moment(item.CreateTime)
.format('YYYY-MM-DD HH:mm:ss'),
ModifyTime: moment(item.ModifyTime)
.format('YYYY-MM-DD HH:mm:ss'),
Summary: item.Summary,
ViewCount: item.ViewCount,
Source: item.Source,
Url: item.Url,
IsDraft: item.IsDraft,
IsActive: item.IsActive
};
const cateId = item.CategoryId;
let cateItem;
if (!cateId) {
cateItem = {
_id: '',
Alias: '',
CateName: res.__('Category.all'),
Img: '/static/images/全部分类.svg'
};
cateId = item.CategoryId;
if (!cateId) {
cateItem = {
_id: '',
Alias: '',
CateName: res.__('Category.all'),
Img: '/static/images/全部分类.svg'
};
} else if (cateId === 'other') {
cateItem = {
_id: 'other',
Alias: 'other',
CateName: res.__('Category.uncate'),
Img: '/static/images/未分类.svg'
};
} else {
cateItem = tool.jsonQuery(categories, { _id: cateId });
}
if (cateItem) {
post.CategoryAlias = cateItem.Alias;
post.CateName = cateItem.CateName;
}
result.push(post);
});
res.json({
rows: result,
total: count
});
}
} else if (cateId === 'other') {
cateItem = {
_id: 'other',
Alias: 'other',
CateName: res.__('Category.uncate'),
Img: '/static/images/未分类.svg'
};
} else {
cateItem = tool.jsonQuery(categories, { _id: cateId });
}
if (cateItem) {
post.CategoryAlias = cateItem.Alias;
post.CateName = cateItem.CateName;
}
result.push(post);
});
res.json({
rows: result,
total: count
});
}, err => {
next(err);
});
});
// 新的文章页面
router.get('/newArticle', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/newarticle', {
uniqueId: shortid.generate(),
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.new_article')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/newarticle', {
uniqueId: shortid.generate(),
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.new_article')}`
});
}, err => {
next(err);
});
});
// 检查文章Alias是否唯一
router.post('/checkArticleAlias', (req, res, next) => {
post.checkAlias(req.body.Alias, req.body.uid, (err, isValid) => {
if (err) {
next(err);
} else {
res.json({
valid: isValid
});
}
post.checkAlias(req.body.Alias, req.body.uid).then(isValid => {
res.json({
valid: isValid
});
}, err => {
next(err);
});
});
@@ -249,12 +195,10 @@ router.post('/saveArticle', (req, res, next) => {
IsDraft: req.body.IsDraft,
IsActive: req.body.IsActive
};
post.save(params, err => {
if (err) {
next(err);
} else {
res.end();
}
post.save(params).then(() => {
res.end();
}, err => {
next(err);
});
});
@@ -262,137 +206,81 @@ router.post('/saveArticle', (req, res, next) => {
router.get('/editArticle/:id', (req, res, next) => {
const id = req.params.id;
if (!id) {
res.redirect('/admin/articlemanage');
return res.redirect('/admin/articlemanage');
}
async.parallel([
// 获取分类
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
});
},
// 根据文章Id获取文章
function (cb) {
post.getById(id, (err, article) => {
if (err) {
cb(err);
} else if (!article) {
next();
} else {
cb(null, article);
}
});
}
], (err, results) => {
let settings,
article;
if (err) {
next(err);
} else {
settings = results[0];
article = results[1];
res.render('admin/editarticle', {
settings,
post: article,
title: `${settings.SiteName} - ${res.__('layoutAdmin.edit_article')}`
});
}
Promise.all([
tool.getConfig(path.join(__dirname, '../config/settings.json')),
post.getById(id)
]).then(results => {
const settings = results[0];
const article = results[1];
res.render('admin/editarticle', {
settings,
post: article,
title: `${settings.SiteName} - ${res.__('layoutAdmin.edit_article')}`
});
}, err => {
next(err);
});
});
// 删除文章
router.post('/deleteArticles', (req, res, next) => {
post.delete(req.body.ids, err => {
if (err) {
next(err);
} else {
res.end();
}
post.delete(req.body.ids).then(() => {
res.end();
}, err => {
next(err);
});
});
// 还原文章
router.post('/undoArticle', (req, res, next) => {
post.undo(req.body.id, err => {
if (err) {
next(err);
} else {
res.end();
}
post.undo(req.body.id).then(() => {
res.end();
}, err => {
next(err);
});
});
// 评论管理页面
router.get('/comments', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/comments', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.comment_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/comments', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.comment_management')}`
});
}, err => {
next(err);
});
});
// 留言管理页面
router.get('/guestbook', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/guestbook', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.msg_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/guestbook', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.msg_management')}`
});
}, err => {
next(err);
});
});
// 关于管理页面
router.get('/aboutmanage', (req, res, next) => {
async.parallel([
// 获取关于数据
function (cb) {
tool.getConfig(path.join(__dirname, '../config/about.json'), (err, about) => {
if (err) {
cb(err);
} else {
cb(null, about);
}
});
},
// 获取配置
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
});
}
], (err, results) => {
let settings,
about;
if (err) {
next(err);
} else {
about = results[0];
settings = results[1];
res.render('admin/aboutmanage', {
title: `${settings.SiteName} - ${res.__('layoutAdmin.about_management')}`,
about,
settings
});
}
Promise.all([
tool.getConfig(path.join(__dirname, '../config/about.json')),
tool.getConfig(path.join(__dirname, '../config/settings.json'))
]).then(results => {
const about = results[0];
const settings = results[1];
res.render('admin/aboutmanage', {
title: `${settings.SiteName} - ${res.__('layoutAdmin.about_management')}`,
about,
settings
});
}, err => {
next(err);
});
});
@@ -417,41 +305,35 @@ router.post('/saveAbout', (req, res, next) => {
// 缓存管理页面
router.get('/cachemanage', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/cachemanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.cache_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/cachemanage', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.cache_management')}`
});
}, err => {
next(err);
});
});
// 根据缓存key获取缓存
router.post('/getcache', (req, res, next) => {
redisClient.getItem(req.body.key, (err, data) => {
if (err) {
next(err);
redisClient.getItem(req.body.key).then(data => {
if (data) {
res.json(data);
} else {
if (data) {
res.json(data);
} else {
res.end();
}
res.end();
}
}, err => {
next(err);
});
});
// 清除指定key的缓存
router.post('/clearcache', (req, res, next) => {
redisClient.removeItem(req.body.key, err => {
if (err) {
next(err);
} else {
res.end();
}
redisClient.removeItem(req.body.key).then(() => {
res.end();
}, err => {
next(err);
});
});
@@ -459,15 +341,13 @@ router.post('/clearcache', (req, res, next) => {
router.get('/exception', require('connect-ensure-login')
.ensureLoggedIn(),
(req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/exception', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.exception_management')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/exception', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.exception_management')}`
});
}, err => {
next(err);
});
});
@@ -479,65 +359,40 @@ router.post('/getExceptions', (req, res, next) => {
sortName: req.body.sortName,
sortOrder: req.body.sortOrder
};
async.parallel([
// 获取异常列表
function (cb) {
log.getAll(params, (err, logs) => {
if (err) {
cb(err);
} else {
cb(null, logs);
}
Promise.all([
log.getAll(params),
log.getAllCount(params)
]).then(results => {
const result = [];
const logs = results[0];
const count = results[1];
logs.forEach(item => {
result.push({
message: item.message,
time: moment(item.timestamp)
.format('YYYY-MM-DD HH:mm:ss.SSS'),
level: item.level,
meta: item.meta
});
},
// 获取异常数据总数
function (cb) {
log.getAllCount(params, (err, count) => {
if (err) {
cb(err);
} else {
cb(null, count);
}
});
}
], (err, results) => {
let logs,
count,
result = [];
if (err) {
next(err);
} else {
logs = results[0];
count = results[1];
logs.forEach(item => {
result.push({
message: item.message,
time: moment(item.timestamp)
.format('YYYY-MM-DD HH:mm:ss.SSS'),
level: item.level,
meta: item.meta
});
});
res.json({
rows: result,
total: count
});
}
});
res.json({
rows: result,
total: count
});
}, err => {
next(err);
});
});
// 系统设置页面
router.get('/settings', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('admin/settings', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.settings')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('admin/settings', {
settings,
title: `${settings.SiteName} - ${res.__('layoutAdmin.settings')}`
});
}, err => {
next(err);
});
});
@@ -550,7 +405,7 @@ router.post('/saveSettings', (req, res, next) => {
LogoPath: req.body.LogoPath,
PageSize: req.body.PageSize,
ExpandMenu: req.body.ExpandMenu,
ShowArticleSign:req.body.ShowArticleSign,
ShowArticleSign: req.body.ShowArticleSign,
Editor: req.body.Editor,
CacheExpired: req.body.CacheExpired,
TranslateKey: req.body.TranslateKey,
@@ -562,9 +417,9 @@ router.post('/saveSettings', (req, res, next) => {
ShowGuestbook: req.body.ShowGuestbook,
ChangyanId: req.body.ChangyanId,
ChangyanConf: req.body.ChangyanConf,
Email:req.body.EmailAddr,
Author:req.body.AuthorName,
CodeTheme:req.body.CodeTheme
Email: req.body.EmailAddr,
Author: req.body.AuthorName,
CodeTheme: req.body.CodeTheme
});
res.end();
});

View File

@@ -41,15 +41,13 @@ passport.deserializeUser((id, cb) => {
// 后台登录页面
router.get('/login', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.render('auth/login', {
settings,
title: `${settings.SiteName} - ${res.__('auth.title')}`
});
}
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
res.render('auth/login', {
settings,
title: `${settings.SiteName} - ${res.__('auth.title')}`
});
}, err => {
next(err);
});
});
@@ -67,11 +65,11 @@ router.post('/login', (req, res, next) => {
} else {
// 登录操作
req.logIn(user, err => {
let returnTo = '/admin';
if (err) {
next(err);
} else {
// 尝试跳转之前的页面
// 优先跳转之前的页面
let returnTo = '/admin';
if (req.session.returnTo) {
returnTo = req.session.returnTo;
}

View File

@@ -2,7 +2,6 @@ const express = require('express');
const router = express.Router();
const path = require('path');
const util = require('util');
const async = require('async');
const category = require('../proxy/category');
const post = require('../proxy/post');
const tool = require('../utility/tool');
@@ -13,144 +12,48 @@ const showdown = require('showdown');
// 分类页面
router.get('/:category?', (req, res, next) => {
const currentCate = req.params.category || '';
async.parallel([
// 获取配置
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
Promise.all([
tool.getConfig(path.join(__dirname, '../config/settings.json')),
category.getAll()
]).then(results => {
const settings = results[0];
const categories = results[1];
const cate = tool.jsonQuery(categories, { Alias: currentCate });
if (cate || !currentCate || currentCate === 'other') {
res.render('blog/index', {
cateData: categories,
settings,
title: settings.SiteName,
currentCate,
isRoot: false
});
},
// 获取分类
function (cb) {
category.getAll((err, categories) => {
if (err) {
cb(err);
} else {
cb(null, categories);
}
});
}
], (err, results) => {
let settings,
categories,
cate;
if (err) {
next(err);
} else {
settings = results[0];
categories = results[1];
cate = tool.jsonQuery(categories, { Alias: currentCate });
if (cate || !currentCate || currentCate === 'other') {
res.render('blog/index', {
cateData: categories,
settings,
title: settings.SiteName,
currentCate,
isRoot: false
});
} else {
next();
}
next();
}
}, err => {
next(err);
});
});
// 获取文章数据
router.post('/getPosts', (req, res, next) => {
async.parallel([
// 获取文章列表和文章页数
function (cb) {
async.waterfall([
// 1. 根据分类alias获取分类对象
function (cb) {
category.getByAlias(req.body.CateAlias, (err, category) => {
if (err) {
cb(err);
} else {
cb(null, category);
}
});
},
// 2. 传入分类对象查询文章
function (category, cb) {
const params = {
cateId: category._id,
pageIndex: req.body.PageIndex,
pageSize: req.body.PageSize,
sortBy: req.body.SortBy,
keyword: req.body.Keyword,
filterType: req.body.FilterType
};
async.parallel([
// 文章列表
function (cb) {
post.getPosts(params, (err, data) => {
if (err) {
cb(err);
} else {
cb(null, data);
}
});
},
// 文章页数
function (cb) {
post.getPageCount(params, (err, data) => {
if (err) {
cb(err);
} else {
cb(null, data);
}
});
}
], (err, results) => {
if (err) {
cb(err);
} else {
cb(null, results);
}
});
}
], (err, result) => {
if (err) {
cb(err);
} else {
cb(null, result);
}
});
},
// 获取分类
function (cb) {
category.getAll((err, data) => {
if (err) {
cb(err);
} else {
cb(null, data);
}
});
}
], (err, results) => {
let posts,
pageCount,
categories,
i,
len,
cateId,
cateItem,
result = [];
if (err) {
next(err);
} else {
posts = results[0][0];
pageCount = results[0][1];
categories = results[1];
category.getByAlias(req.body.CateAlias).then(cate => {
const params = {
cateId: cate._id,
pageIndex: req.body.PageIndex,
pageSize: req.body.PageSize,
sortBy: req.body.SortBy,
keyword: req.body.Keyword,
filterType: req.body.FilterType
};
Promise.all([
post.getPosts(params),
post.getPageCount(params),
category.getAll()
]).then(results => {
const posts = results[0];
const pageCount = results[1];
const categories = results[2];
categories.unshift({
_id: '',
Alias: '',
@@ -163,168 +66,130 @@ router.post('/getPosts', (req, res, next) => {
CateName: res.__('Category.uncate'),
Img: '/static/images/未分类.svg'
});
i = 0;
len = posts.length;
for (; i < len; i++) {
result[i] = {
Source: posts[i].Source,
Alias: posts[i].Alias,
Title: posts[i].Title,
Url: posts[i].Url,
PublishDate: moment(posts[i].CreateTime)
const result = [];
posts.forEach(post => {
const obj = {
Source: post.Source,
Alias: post.Alias,
Title: post.Title,
Url: post.Url,
PublishDate: moment(post.CreateTime)
.format('YYYY-MM-DD'),
Host: posts[i].Url ? url.parse(posts[i].Url)
Host: post.Url ? url.parse(post.Url)
.host : '',
Summary: posts[i].Summary,
UniqueId: posts[i].UniqueId,
ViewCount: posts[i].ViewCount
Summary: post.Summary,
UniqueId: post.UniqueId,
ViewCount: post.ViewCount
};
cateId = posts[i].CategoryId;
cateItem = tool.jsonQuery(categories, { _id: cateId });
const cateId = post.CategoryId;
const cateItem = tool.jsonQuery(categories, { _id: cateId });
if (cateItem) {
result[i].CategoryAlias = cateItem.Alias;
result[i].CateName = cateItem.CateName;
obj.CategoryAlias = cateItem.Alias;
obj.CateName = cateItem.CateName;
}
}
res.send({ posts: result, pageCount });
}
result.push(obj);
});
res.json({ posts: result, pageCount });
});
}, err => {
next(err);
});
});
// 根据文章alias获取预览数据
router.post('/getPreviewContent', (req, res, next) => {
post.getPostByAlias(req.body.alias, (err, data) => {
if (err) {
next(err);
post.getPostByAlias(req.body.alias).then(data => {
let resultContent;
if (data.ContentType === 'markdown') {
const converter = new showdown.Converter();
converter.setFlavor('github');
resultContent = converter.makeHtml(data.Content);
} else {
let resultContent;
if (data.ContentType === 'markdown') {
const converter = new showdown.Converter();
converter.setFlavor('github');
resultContent = converter.makeHtml(data.Content);
} else {
resultContent = data.Content;
}
res.send({
Content: resultContent,
ContentType: data.ContentType,
Labels: data.Labels
});
resultContent = data.Content;
}
res.json({
Content: resultContent,
ContentType: data.ContentType,
Labels: data.Labels
});
}, err => {
next(err);
});
});
// 文章详细页
router.get('/:category/:article', (req, res, next) => {
let alias = req.params.article,
cateAlias = req.params.category;
async.parallel([
// 获取配置
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
});
},
const alias = req.params.article;
const cateAlias = req.params.category;
Promise.all([
tool.getConfig(path.join(__dirname, '../config/settings.json')),
post.getPostByAlias(alias),
category.getAll()
]).then(results => {
const settings = results[0];
const article = results[1];
const categories = results[2];
// 根据文章alias获取文章对象
function (cb) {
post.getPostByAlias(alias, (err, data) => {
if (err) {
cb(err);
} else if (data === null) {
next();
} else {
cb(null, data);
}
});
},
// 如果文章已被删除,且当前不是管理员登录状态,则显示 404
if (!article.IsActive && !req.user) {
return next();
}
// 获取分类
function (cb) {
category.getAll((err, data) => {
if (err) {
cb(err);
} else {
cb(null, data);
}
categories.unshift({
_id: '',
Alias: '',
CateName: res.__('Category.all'),
Img: '/static/images/全部分类.svg'
});
categories.push({
_id: 'other',
Alias: 'other',
CateName: res.__('Category.uncate'),
Img: '/static/images/未分类.svg'
});
const trueCateAlias = tool.jsonQuery(categories, { _id: article.CategoryId })
.Alias;
if (cateAlias !== trueCateAlias) {
res.redirect(util.format('/blog/%s/%s', trueCateAlias, alias));
}
const labels = article.Labels;
const labelList = [];
if (labels) {
labels = JSON.parse(labels);
labels.forEach(lbl => {
labelList.push(lbl.text);
});
}
], (err, results) => {
let settings,
article,
categories,
trueCateAlias,
labels,
labelList = [];
if (err) {
next(err);
const post = {
UniqueId: article.UniqueId,
Title: article.Title,
CategoryAlias: cateAlias,
CateName: tool.jsonQuery(categories, { _id: article.CategoryId })
.CateName,
CreateTimeStr: moment(article.CreateTime)
.format('YYYY-MM-DD hh:mm'),
ViewCount: article.ViewCount,
LabelList: labelList,
Summary: article.Summary,
ContentType: article.ContentType
};
let resultContent;
if (article.ContentType === 'markdown') {
const converter = new showdown.Converter();
converter.setFlavor('github');
resultContent = converter.makeHtml(article.Content);
} else {
settings = results[0];
article = results[1];
// 如果文章已被删除,且当前不是管理员登录状态,则显示 404
if (!article.IsActive && !req.user) {
return next();
}
categories = results[2];
categories.unshift({
_id: '',
Alias: '',
CateName: res.__('Category.all'),
Img: '/static/images/全部分类.svg'
});
categories.push({
_id: 'other',
Alias: 'other',
CateName: res.__('Category.uncate'),
Img: '/static/images/未分类.svg'
});
trueCateAlias = tool.jsonQuery(categories, { _id: article.CategoryId })
.Alias;
if (cateAlias !== trueCateAlias) {
res.redirect(util.format('/blog/%s/%s', trueCateAlias, alias));
}
labels = article.Labels;
if (labels) {
labels = JSON.parse(labels);
labels.forEach(lbl => {
labelList.push(lbl.text);
});
}
const post = {
UniqueId: article.UniqueId,
Title: article.Title,
CategoryAlias: cateAlias,
CateName: tool.jsonQuery(categories, { _id: article.CategoryId })
.CateName,
CreateTimeStr: moment(article.CreateTime)
.format('YYYY-MM-DD hh:mm'),
ViewCount: article.ViewCount,
LabelList: labelList,
Summary: article.Summary,
ContentType: article.ContentType
};
let resultContent;
if (article.ContentType === 'markdown') {
const converter = new showdown.Converter();
converter.setFlavor('github');
resultContent = converter.makeHtml(article.Content);
} else {
resultContent = article.Content;
}
res.render('blog/article', {
post,
settings,
resultContent,
title: `${settings.SiteName} - ${article.Title}`
});
resultContent = article.Content;
}
res.render('blog/article', {
post,
settings,
resultContent,
title: `${settings.SiteName} - ${article.Title}`
});
}, err => {
next(err);
});
});

View File

@@ -1,49 +1,25 @@
const express = require('express');
const router = express.Router();
const path = require('path');
const async = require('async');
const category = require('../proxy/category');
const tool = require('../utility/tool');
router.get('/', (req, res, next) => {
async.parallel([
// 获取配置
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
});
},
// 获取分类
function (cb) {
category.getAll((err, categories) => {
if (err) {
cb(err);
} else {
cb(null, categories);
}
});
}
], (err, results) => {
let settings,
categories;
if (err) {
next(err);
} else {
settings = results[0];
categories = results[1];
res.render('blog/index', {
cateData: categories,
settings,
title: settings.SiteName,
currentCate: '',
isRoot: true
});
}
Promise.all([
tool.getConfig(path.join(__dirname, '../config/settings.json')),
category.getAll()
]).then(results => {
const settings = results[0];
const categories = results[1];
res.render('blog/index', {
cateData: categories,
settings,
title: settings.SiteName,
currentCate: '',
isRoot: true
});
}, err => {
next(err);
});
});

View File

@@ -1,64 +1,38 @@
const express = require('express');
const router = express.Router();
const path = require('path');
const async = require('async');
const tool = require('../utility/tool');
// 留言页面
router.get('/guestbook', (req, res, next) => {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
next(err);
} else {
if (settings.ShowGuestbook !== 'true') {
return next();
}
res.render('misc/guestbook', {
title: `${settings.SiteName} - ${res.__('misc.msg')}`,
settings
});
tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => {
if (settings.ShowGuestbook !== 'true') {
return next();
}
res.render('misc/guestbook', {
title: `${settings.SiteName} - ${res.__('misc.msg')}`,
settings
});
}, err => {
next(err);
});
});
// 关于页面
router.get('/about', (req, res, next) => {
async.parallel([
// 获取关于数据
function (cb) {
tool.getConfig(path.join(__dirname, '../config/about.json'), (err, about) => {
if (err) {
cb(err);
} else {
cb(null, about);
}
});
},
// 获取配置
function (cb) {
tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => {
if (err) {
cb(err);
} else {
cb(null, settings);
}
});
}
], (err, results) => {
let about,
settings;
if (err) {
next(err);
} else {
about = results[0];
settings = results[1];
res.render('misc/about', {
title: `${settings.SiteName} - ${res.__('misc.about')}`,
about,
settings
});
}
Promise.all([
tool.getConfig(path.join(__dirname, '../config/about.json')),
tool.getConfig(path.join(__dirname, '../config/settings.json'))
]).then(results => {
const about = results[0];
const settings = results[1];
res.render('misc/about', {
title: `${settings.SiteName} - ${res.__('misc.about')}`,
about,
settings
});
}, err => {
next(err);
});
});

View File

@@ -69,27 +69,24 @@ const storageFile = multer.diskStorage({
});
router.get('/', (req, res, next) => {
let list = [],
total = 0,
rootPath = path.join(__dirname, '../public/uploads/'),
rootFiles,
parFiles,
files,
stat;
const list = [];
let total = 0;
const rootPath = path.join(__dirname, '../public/uploads/');
let rootFiles;
let parFiles;
let files;
let stat;
switch (req.query.action) {
// 获取配置
case 'config':
tool.getConfig(path.join(__dirname, '../config/ue.json'), (err, settings) => {
if (err) {
next(err);
} else {
res.json(settings);
}
tool.getConfig(path.join(__dirname, '../config/ue.json')).then(settings => {
res.json(settings);
}, err => {
next(err);
});
break;
// 图片管理
// 图片管理
case 'listimage':
rootFiles = fs.readdirSync(rootPath);
rootFiles.forEach(rootFile => {
@@ -118,7 +115,7 @@ router.get('/', (req, res, next) => {
});
break;
// 附件管理
// 附件管理
case 'listfile':
rootFiles = fs.readdirSync(rootPath);
rootFiles.forEach(rootFile => {
@@ -152,7 +149,6 @@ router.get('/', (req, res, next) => {
router.post('/', (req, res, next) => {
let uploadFile;
switch (req.query.action) {
// 上传图片
case 'uploadimage':
uploadFile = multer({ storage: storageImg })
@@ -172,13 +168,14 @@ router.post('/', (req, res, next) => {
});
break;
// 上传涂鸦
// 上传涂鸦
case 'uploadscrawl':
var dataBuffer = new Buffer(req.body.upfile, 'base64'),
fileName = `${shortid.generate()}.png`;
if (req.query.uniqueId) {
let dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId),
dirPath = path.join(dirPathParent, 'img'); // 不能直接创建dirPath因为父目录不存在会抛出异常
// 不能直接创建dirPath因为父目录不存在会抛出异常
const dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId);
const dirPath = path.join(dirPathParent, 'img');
fs.mkdir(dirPathParent, err => {
if (err && err.code !== 'EEXIST') {
next(err);
@@ -193,7 +190,9 @@ router.post('/', (req, res, next) => {
} else {
res.json({
state: 'SUCCESS',
url: `/uploads/${req.query.uniqueId}/img/${fileName}`, // 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
// 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
url: `/uploads/${req.query.uniqueId}/img/${fileName}`,
title: fileName,
original: fileName,
error: null
@@ -209,7 +208,7 @@ router.post('/', (req, res, next) => {
}
break;
// 上传附件
// 上传附件
case 'uploadfile':
uploadFile = multer({ storage: storageFile })
.single('upfile');
@@ -219,7 +218,9 @@ router.post('/', (req, res, next) => {
} else {
res.json({
state: 'SUCCESS',
url: `/uploads/${req.query.uniqueId}/file/${req.file.filename}`, // 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
// 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
url: `/uploads/${req.query.uniqueId}/file/${req.file.filename}`,
title: req.file.originalname,
original: req.file.originalname,
error: null

View File

@@ -16,22 +16,24 @@ if (redisEnable) {
* @param key 缓存key
* @param value 缓存value
* @param expired 缓存的有效时长,单位秒
* @param callback 回调函数
*/
exports.setItem = function (key, value, expired, callback) {
if (!redisEnable) {
return callback(null);
}
client.set(key, JSON.stringify(value), function (err) {
if (err) {
return callback(err);
exports.setItem = (key, value, expired) => {
return new Promise((resolve, reject) => {
if (!redisEnable) {
return resolve();
}
if (expired) {
client.expire(key, expired);
}
return callback(null);
client.set(key, JSON.stringify(value), err => {
if (err) {
return reject(err);
}
if (expired) {
client.expire(key, expired);
}
return resolve();
});
});
};
/**
@@ -39,16 +41,18 @@ exports.setItem = function (key, value, expired, callback) {
* @param key 缓存key
* @param callback 回调函数
*/
exports.getItem = function (key, callback) {
if (!redisEnable) {
return callback(null, null);
}
client.get(key, function (err, reply) {
if (err) {
return callback(err);
exports.getItem = key => {
return new Promise((resolve, reject) => {
if (!redisEnable) {
return resolve(null);
}
return callback(null, JSON.parse(reply));
client.get(key, function (err, reply) {
if (err) {
return reject(err);
}
return resolve(JSON.parse(reply));
});
});
};
@@ -57,16 +61,18 @@ exports.getItem = function (key, callback) {
* @param key 缓存key
* @param callback 回调函数
*/
exports.removeItem = function (key, callback) {
if (!redisEnable) {
return callback(null);
}
client.del(key, function (err) {
if (err) {
return callback(err);
exports.removeItem = key => {
return new Promise((resolve, reject) => {
if (!redisEnable) {
return resolve();
}
return callback(null);
client.del(key, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
};

View File

@@ -40,24 +40,22 @@ module.exports = {
* 读取配置文件
* @param filePath - 文件路径
* @param [key] - 要读取的配置项key
* @param callback - 回调函数
*/
getConfig(filePath, key, callback) {
if (typeof key === 'function') {
callback = key;
key = undefined;
}
fs.readFile(filePath, 'utf8', (err, file) => {
if (err) {
console.log(`读取文件%s出错${err}`, filePath);
return callback(err);
}
let data = JSON.parse(file);
if (typeof key === 'string') {
data = data[key];
}
return callback(null, data);
getConfig(filePath, key) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, file) => {
if (err) {
console.log(`读取文件%s出错${err}`, filePath);
return reject(err);
}
let data = JSON.parse(file);
if (key) {
data = data[key];
}
return resolve(data);
});
});
},
/**