+Promise
This commit is contained in:
2
app.js
2
app.js
@@ -29,7 +29,7 @@ process.on('uncaughtException', err => {
|
||||
* 记录未处理的Promise失败
|
||||
*/
|
||||
process.on('unhandledRejection', reason => {
|
||||
logger.errLogger(err);
|
||||
logger.errLogger(reason);
|
||||
});
|
||||
|
||||
// 设置模板引擎
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
32
proxy/log.js
32
proxy/log.js
@@ -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);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
316
proxy/post.js
316
proxy/post.js
@@ -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();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
583
routes/admin.js
583
routes/admin.js
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
405
routes/blog.js
405
routes/blog.js
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
47
routes/ue.js
47
routes/ue.js
@@ -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
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user