365 lines
10 KiB
JavaScript
365 lines
10 KiB
JavaScript
const postModel = require('../models/post')
|
||
.PostModel;
|
||
const redisClient = require('../utility/redisClient');
|
||
const tool = require('../utility/tool');
|
||
|
||
/**
|
||
* 为首页数据查询构建条件对象
|
||
* @param params 查询参数对象
|
||
*/
|
||
function getPostsQuery(params) {
|
||
const query = {};
|
||
query.IsActive = true;
|
||
query.IsDraft = false;
|
||
if (params.cateId) {
|
||
query.CategoryId = params.cateId;
|
||
}
|
||
if (params.keyword) {
|
||
switch (params.filterType) {
|
||
case '1':
|
||
query.Title = { $regex: params.keyword, $options: 'gi' };
|
||
break;
|
||
case '2':
|
||
query.Labels = { $regex: params.keyword, $options: 'gi' };
|
||
break;
|
||
case '3':
|
||
query.CreateTime = { $regex: params.keyword, $options: 'gi' };
|
||
break;
|
||
default:
|
||
query.$or = [{
|
||
Title: {
|
||
$regex: params.keyword,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Labels: {
|
||
$regex: params.keyword,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Summary: {
|
||
$regex: params.keyword,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Content: {
|
||
$regex: params.keyword,
|
||
$options: 'gi'
|
||
}
|
||
}];
|
||
}
|
||
}
|
||
return query;
|
||
}
|
||
|
||
/**
|
||
* 获取首页的文章数据
|
||
* @param params 参数对象
|
||
*/
|
||
exports.getPosts = params => {
|
||
const cache_key = tool.generateKey('posts', params);
|
||
return new Promise((resolve, reject) => {
|
||
redisClient.getItem(cache_key).then(posts => {
|
||
if (posts) {
|
||
return resolve(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);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 获取首页文章的页数
|
||
* @param params 参数对象
|
||
*/
|
||
exports.getPageCount = params => {
|
||
const cache_key = tool.generateKey('posts_count', params);
|
||
return new Promise((resolve, reject) => {
|
||
redisClient.getItem(cache_key).then(pageCount => {
|
||
if (pageCount) {
|
||
return resolve(pageCount);
|
||
}
|
||
const query = getPostsQuery(params);
|
||
postModel.count(query, (err, count) => {
|
||
if (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);
|
||
});
|
||
}, err => {
|
||
reject(err);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 根据alias获取文章
|
||
* @param alias 文章alias
|
||
*/
|
||
exports.getPostByAlias = alias => {
|
||
const cache_key = `article_${alias}`;
|
||
|
||
// 文章浏览数+1
|
||
postModel.update({ Alias: alias }, { $inc: { ViewCount: 1 } })
|
||
.exec();
|
||
|
||
return new Promise((resolve, reject) => {
|
||
redisClient.getItem(cache_key).then(article => {
|
||
if (article) {
|
||
return resolve(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);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 为后台数据查询构建条件对象
|
||
* @param params
|
||
*/
|
||
function getArticlesQuery(params) {
|
||
const query = {};
|
||
if (params.cateId) {
|
||
query.CategoryId = params.cateId;
|
||
}
|
||
if (params.uniqueId) {
|
||
query._id = params.uniqueId;
|
||
}
|
||
if (params.title) {
|
||
query.Title = { $regex: params.title, $options: 'gi' };
|
||
}
|
||
if (params.searchText) {
|
||
query.$or = [{
|
||
Alias: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Title: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Summary: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Content: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Labels: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}, {
|
||
Url: {
|
||
$regex: params.searchText,
|
||
$options: 'gi'
|
||
}
|
||
}];
|
||
}
|
||
return query;
|
||
}
|
||
|
||
/**
|
||
* 获取管理页面的文章数据
|
||
* @param params 参数对象
|
||
*/
|
||
exports.getArticles = params => {
|
||
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;
|
||
switch (params.sortName) {
|
||
case 'ModifyTime':
|
||
options.sort = params.sortOrder === 'desc' ? '-ModifyTime -CreateTime' : 'ModifyTime CreateTime';
|
||
break;
|
||
case 'ViewCount':
|
||
options.sort = params.sortOrder === 'desc' ? '-ViewCount -CreateTime' : 'ViewCount CreateTime';
|
||
break;
|
||
default:
|
||
options.sort = params.sortOrder === 'desc' ? '-CreateTime' : 'CreateTime';
|
||
break;
|
||
}
|
||
const query = getArticlesQuery(params);
|
||
return new Promise((resolve, reject) => {
|
||
postModel.find(query, {}, options, (err, posts) => {
|
||
if (err) {
|
||
return reject(err);
|
||
}
|
||
return resolve(posts);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 获取管理页面的文章数
|
||
* @param params 参数对象
|
||
*/
|
||
exports.getArticlesCount = params => {
|
||
const query = getArticlesQuery(params);
|
||
return new Promise((resolve, reject) => {
|
||
postModel.count(query, (err, count) => {
|
||
if (err) {
|
||
return reject(err);
|
||
}
|
||
return resolve(count);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 判断文章Alias是否唯一
|
||
* @param alias 文章Alias
|
||
* @param articleId 文章Id
|
||
*/
|
||
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
|
||
*/
|
||
exports.getById = id => {
|
||
return new Promise((resolve, reject) => {
|
||
postModel.findById(id, (err, article) => {
|
||
if (err) {
|
||
return reject(err);
|
||
}
|
||
return resolve(article);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 新增或更新文章
|
||
* @param params 参数对象
|
||
*/
|
||
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();
|
||
});
|
||
}
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 软删除文章
|
||
* @param ids 文章id,多个id以逗号分隔
|
||
*/
|
||
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);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 恢复删除的文章
|
||
* @param id 文章id
|
||
*/
|
||
exports.undo = id => {
|
||
return new Promise((resolve, reject) => {
|
||
postModel.update({ _id: id }, { IsActive: true }, err => {
|
||
if (err) {
|
||
return reject(err);
|
||
}
|
||
return resolve();
|
||
});
|
||
});
|
||
};
|