最近折腾的论坛总结

Koa cyanprobe 7年前 (2016-12-17) 4564次浏览 已收录 2个评论

这两个月:

这两个月闲的,写个了论坛,PS:只实现了基本功能,还有各种bug,写来玩玩,并没有在意那些细节(弃坑)。这次主要来说说最近的情况。
涉猎:http权威指南 再次看mongodb权威指南 1/2(加深印象)

论坛:

收获:基本的前端页面,对自适应有初步的认识。mongo+koa2实现的基本论坛功能。采用vue.js前端渲染,知道了一些渲染逻辑和做法。

数据库设计

var messageSchema = new Schema({
    type: { type: String },
    master_id: { type: ObjectId ,ref:'User'},//自身
    author_id: { type: ObjectId ,ref:'User'},//被回复人ID
    topic_id: { type: ObjectId ,ref:'Topic'},
    reply: { type: ObjectId ,ref: 'User'},//回复主题Id
    reply_id: { type: ObjectId ,ref:'User'},
    has_read: { type: Boolean, default: false },
    create_at: { type: Date, default: Date.now }
});
const productSchema = new Schema({
 name: {type: String},
 series: {type: ObjectId, ref :'Series'}, //系列
 grade: {type: Number}, //评分
 product: {type: String, default:'earphone'},//产品类型
 type: {type: String},//标识类型
 depict: {type :String, default: ''}, //描述
 num: {type: String, default: ''}, //数量
 price: {type :String, default: ''}, //价格
 create_at: { type: Date, default: Date.now },
 is_sale: {type:String, default:false},
 author_id: {type: ObjectId, ref:'User'}
})
let replySchema = new Schema({
 content: { type: String },
 topic_id: { type: ObjectId ,ref: 'Topic'}, //话题Id
 toreply_id:{ type: ObjectId ,ref: 'Reply'},//被回复topicId
 author_id: { type: ObjectId ,ref: 'User'}, //被回复Id作者
 reply_id: { type: ObjectId ,ref: 'User'},//回复主题Id
 create_at: { type: Date, default: Date.now },
 update_at: { type: Date, default: Date.now },
 ups:[ObjectId],
 ups_count:{type:Number,default:0},
 deleted: {type: Boolean, default: false} //删除需要保留概要
})
let seriesSchema = new Schema({
 brand: {type: String},
 product: [{type:ObjectId ,ref :'Product'}],
 iden: {type: String}, //标识码
 author_id: [{type: ObjectId ,ref :'User'}],
 depict: {type: String},
 create_at: { type: Date, default: Date.now }
})
let topicSchema = new Schema({
 title: { type: String },
 content: { type: String },
 author_id: { type: ObjectId ,ref :'User'},
 top: { type: Boolean, default: false }, // 置顶帖
 good: {type: Boolean, default: false}, // 精华帖
 lock: {type: Boolean, default: false}, // 被锁定主题
 reply_count: { type: Number, default: 0 },
 visit_count: { type: Number, default: 1 },
 collect_count: { type: Number, default: 0 },
 create_at: { type: Date, default: Date.now },
 update_at: { type: Date, default: Date.now },
 last_reply: { type: ObjectId ,ref :'User'},
 last_reply_at: { type: Date, default: Date.now },
 tab: {type: String},
 imge:{type:String,default: Date.now}, //缩略图
 deleted: {type: Boolean, default: false}
});
let userSchema = new Schema({
 name: { type: String},
 loginName: { type: String},
 pass: { type: String },
 email: { type: String},
 city: {type: String},
 url: { type: String },
 score: {type: Number ,default: 0},
 depict: {type:String},
 avatar: {type: String},
 seal:[], //印章
 update_at: { type: Date, default: Date.now },
 medal:[
 {type: String}
 ]//勋章
});

注意的问题:

分mongo分页可参考:http://blog.sina.com.cn/s/blog_56545fd30101442b.html
点赞:查询reply ups[],返回ups[],前端判断存在ups,处于点亮状态。添加使用addToSet。若考虑分页问题,也可以返回所有被点亮评论,因为一个人不会点主题下多少回复的。
连表查询:连表查询其实使用shell是进行2次查询,要尽量一次性尽量返回数据。 mongoose使用populate()。用空间换取时间和性能,可以将一些关联数据在集合中多次出现。schema定义时避免使用驼峰命名法,不要出现大写字母(来自狗哥:这是规定,好处是方便记忆书写和维护),可以看到上面的schema又有问题+1。
在设置session时可以直接设置sid,代替loginName。可以看到上面的user集合设计的就有问题。
已读和未读(虽然没做):匹配SID#SID,读取session,若前SID(回复主题)后者SID(回复别人)为当前user的标识,更改信息未读状态。
权限管理(没整):简单的就是设置管理员,复杂的就要增加权限集合,根据需求会比较复杂,自己有点想法,网上貌似没人用mongo撸这种….
其实最大的收获还是学会了布局,和vue.js前端渲染(PS:pug和vue混用,但是前端渲染蜘蛛是很难抓取到的),前端会了点。

完成效果:

主页(注册页什么的也写了,不要在意那些细节。。。。)
bbs1
信息管理
bbs2
@和主题回复等提示
bbs3
发表话题
bbs5
话题页面和评论页面
 
评论页面可以点赞和继续@消息
bbs6

后记:

话说这个东西各种bug,就比如session过期页面跳转功能都没写,最近学习态度有点问题,需要跳坑,于是就草草结束。花在前端的时间太多,而且貌似也是浪费时间。跳坑~!还有koa2 async/await真的比较酸爽~
代码停靠: https://github.com/fangker/cube/


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:最近折腾的论坛总结
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 挺好的,感谢博主的分享。
    凯哥自媒体2016-12-28 15:45 回复
  2. 进来转转,博主新年快乐。
    Feeey个人博客2017-01-28 14:07 回复