由于赶demo,这一块的验证就粗粗略过,以后补表单输入合法性验证。先把功能做出来。
这一块主要就是用户输入表单,然后提交后端,写入数据库。依然是图片的上传逻辑这边比较复杂。
逻辑跟头像上传逻辑类似,点加号即上传图片至后端一个文件夹(articleImg),返回给前端这些图片名,前端接收参数,然后点击提交时将图片名和文章的其他信息一起提交给后端并写入数据库。
这边后期我想使用七牛云,因为上传图片的话需要非常大的空间,存在服务器应该不行,用户量一旦起来这个是一定要优化的。
如果是上传到七牛云是什么逻辑呢?点击上传,上传到七牛云服务器,返回图片外链,将图片外链存到服务器,也是一个意思,反而更加简单,后面会选择优化。
关于图片上传其实有一个小问题,就是当用户上传完之后如果删除了,后台依然会保存这张图片,会占用一点空间,但没什么影响,如果想优化,可以在删除图片的钩子里写一个接口,提交后端删除的照片名,后端查找并删除这张图片,后期进行优化。
逻辑是:
点击发布,提交表单数据到后端,写入数据库,这里注意有两个表要写,一个是article表(文章列表),还有一个是user表(用户发布的文章),这里我只用了一个接口,一次将所有数据传到后端,后端将这些数据处理并保存到数据库。
article表好写,就是新增一条数据。
但是user表这里需要用到mongoose的插入操作($push),需将用户发布的文章信息插入到用户表中的publishArticle字段中,如此插入:
User.update({"userId":userId},{
$push:{
publishArticle:{
articleId:10000+doc.length,
articleGoTime:goTime,
articleDescription:description,
articleDestination:destination
}
}
}
这里有一点我感觉写的不完美的地方是在于js的异步,这方面我并没有十分明白,所以在写整个接口的时候,由于需要用到整个文档的长度(作为文章的id),我一开始就直接查询了全部的文档只是为了得到文档长度,以后所有的代码都包在了这个异步操作里,看上去并不好看。我尝试将这个文档长度分离出来,但用了很多方法都行不通,异步真是诡异。全部代码如下:
router.post("/upload", function (req,res,next) {
var userId = req.session.user.userId;
var goTime = req.body.articleGoTime;
var destination = req.body.articleDestination;
var description = req.body.articleDescription;
//就是这里的异步
Article.find({},(err,doc)=>{
var param=new Article({
articleId:10000+doc.length,
articleOwnerId:userId,
articleOwnerName:req.session.user.userNickName,
articleTitle:req.body.articleTitle,
articleDestination:destination,
articleAveragePrice:req.body.articleAveragePrice,
articleOwnerSchool:req.body.articleOwnerSchool,
articleOwnerSex:req.body.articleOwnerSex,
articleDescription:description,
articleGoTime:goTime,
articleGoDay:req.body.articleGoDay,
articlePublishTime:req.body.articlePublishTime,
articleImg:req.body.articleImg
})
param.save((err1)=>{
if (err1) {
res.json({
status:"1",
msg:err1.message
})
}else{
res.json({
status:"0",
msg:'suc'
})
}
})
User.update({"userId":userId},{
$push:{
publishArticle:{
articleId:10000+doc.length,
articleGoTime:goTime,
articleDescription:description,
articleDestination:destination
}
}
},(err2,doc2)=>{
if(err2)throw err2;
})
})
})
上面关于articleId的选择不太对,后面因为要涉及到文档的删除,所以不可以使用文档长度作为articleId,这样当删除一个文章时再发布这时articleId就会重复,其实id的选择只需要保证唯一即可,我们生成一个唯一数就可以了。如下:
//使用第三方模块silly-datetime
var t = sd.format(new Date(),'YYYYMMDDHHmmss');
//生成随机数
var ran = parseInt(Math.random() * 8999 +10000);
var id=t+ran;