Category.js
var mongoose = require("mongoose"); var schema = new mongoose.Schema({ // 分类名称 name: { type: String, required: true }, }); module.exports = mongoose.model("Category", schema);Content.js
var mongoose = require("mongoose"); var schema = new mongoose.Schema({ /** * 关联字段-分类id */ category: { // 类型 type: mongoose.Schema.Types.ObjectId, // 引用: 引用另一张表 ref: 'Category' }, user: { // 类型 type: mongoose.Schema.Types.ObjectId, // 引用 ref: 'User' }, // 内容标 title: { type: String, required: true }, // 简介 description: { type: String, default: "" }, // 内容 content: { type: String, default: "" }, // 添加时间 addTime: { type: Date, default: new Date() }, // 阅读量 views: { type: Number, default: 0 }, // 评论 comments: { type: Array, default: [] } }); module.exports = mongoose.model("Content", schema);User.js
var mongoose = require("mongoose"); /** * 用户表结构 * 1.required 这个为true表示插入前必须检查,没传入则不会执行成功. 但是没报错,有点蛋疼 */ var schema = new mongoose.Schema({ // 用户名 username: { type: String, required: true }, // 密码 password: { type: String, required: true }, isAdmin: { type: Boolean, default: false } }); /** * 1.导出可以操作的对象 * 2.这个第一个参数将会是 mongodb中存储的表格的名字,而且不仅被变小写,而且被加了s,变为users * 3.好在导出后像操作对象一样对导出的这个对象操作来操作数据库, */ module.exports = mongoose.model("User", schema);// 用户注册
router.post("/user/register", function (req, res, next) { var username = req.body.username; var password = req.body.password; var repassword = req.body.repassword; if(username == ""){ responseData.code = 1; responseData.message = '用户名不能为空'; res.json(responseData); return; } if(password == ""){ responseData.code = 2; responseData.message = '密码不能为空'; res.json(responseData); return; } if(password !== repassword){ responseData.code = 3; responseData.message = '两次输入密码必须一致'; res.json(responseData); return; } User.findOne({username: username}).then(function (userInfo) { // 数据库查询是否注册过了 console.log("\nuserInfo =", userInfo); if(userInfo){ responseData.code = 4; responseData.message = "用户名已经被注册"; res.json(responseData); return; } /** * 这里字段拼写错误,则会导致存不上这个字段 */ var user = new User({ username: username, password: password }); /** * 1.这个user.save 返回的又是一个Promise对象,因此接下来可以继续then * 2.像操作对象一样操作数据库 */ return user.save(); }).then(function (newUserInfo) { // 异步得到的这个newUserInfo就是上次save的那个数据 console.log("\nnewUserInfo =", newUserInfo); responseData.message = "注册成功"; res.json(responseData); }); });// 评论提交
router.post("/comment/post", function (req, res, next) { // 评论的id var contentId = req.body.contentid || ''; var postData = { username: req.userInfo.username, postTime: new Date(), content: req.body.content, }; // 查询当前这篇文章的信息 Content.findOne({ _id: contentId }).then(function (content) { content.comments.push(postData); return content.save(); }).then(function (newContent) { responseData.message = "评论成功"; responseData.data = newContent; res.json(responseData); }); });// 管理员:添加分类
router.post("/category/add", function (req, res) { console.log("add req.body =", req.body); var name = req.body.name || ''; if(!name){ res.render("admin/error", { userInfo: req.userInfo, // 由于继承来的页面的信息也需要初始化,因此需要传递这个userInfo message: "名称不能为空" }); return; }; // 数据库中是否已经存在了同分类的名称 Category.findOne({ name: name }).then(function (rs) { if(rs){ res.render("admin/error", { userInfo: req.userInfo, // 由于继承来的页面的信息也需要初始化,因此需要传递这个userInfo message: "分类已经存在" }); return Promise.reject(); // 失败后保证不走下面的then } return new Category({ name: name }).save(); }).then(function (newCategory) { res.render("admin/success", { userInfo: req.userInfo, message: "分类保存成功", url: "/admin/category" }); }); });// 添加内容
router.post("/content/add", function (req, res) { if(req.body.category == ""){ res.render("admin/error", { userInfo: req.userInfo, message: "分类内容不能为空" }); return; } if(req.body.title == ""){ res.render("admin/error", { userInfo: req.userInfo, message: "分类标题不能为空" }); return; } new Content({ category: req.body.category, title: req.body.title, user: req.userInfo._id.toString(), // 这样就和User表格关联起来了 description: req.body.description, content: req.body.content, }).save().then(function (rs) { res.render("admin/error", { userInfo: req.userInfo, message: "分类保存成功", url: '/admin/content' }); return; }); });
// 内容删除
router.get("/content/delete", function (req, res) { var id = req.query.id || ''; Content.remove({ _id: id }).then(function () { res.render("admin/success", { userInfo: req.userInfo, message: "删除成功", url: "/admin/content" }); }); });
// 修改分类名字
router.post("/category/edit", function (req, res) { // 当前修改的 var id = req.query.id || ''; var name = req.body.name || ""; Category.findOne({ _id: id }).then(function (category) { if(!category){ res.render("admin/error", { userInfo: req.userInfo, message: "分类信息不存在" }); return Promise.reject(); // 不再进入下面的then } // 名称没有修改 if(name == category.name){ res.render("admin/success", { userInfo: req.userInfo, message: "当前没做任何修改", url: "/admin/category" }); return Promise.reject(); } return Category.findOne({ // 不等于当前id,名字还一样的 _id: {$ne: id}, name: name }); }).then(function (sameCategory) { if(sameCategory){ res.render("/admin/error", { userInfo: req.userInfo, message: "数据库中已经存在同名分类" }); return Promise.reject(); } /** * 尝试更新数据, 这个add search很简单 update 难一点 del呢? * 1.条件 2.要修改的值 */ return Category.update({ _id: id }, { name: name }); }).then(function () { res.render("admin/success", { userInfo: req.userInfo, message: "修改成功", url: "/admin/category" }); }); });// 保存修改内容
router.post("/content/edit", function (req, res) { var id = req.query.id || ''; if(!req.body.category){ res.render("admin/error", { userInfo: req.userInfo, message: "内容分类不能为空" }); return; } if(!req.body.title){ res.render("admin/error", { userInfo: req.userInfo, message: "内容标题不能为空" }); return; } /** * update参数 * 1.条件 * 2.最新内容 */ Content.update({ _id: id }, { category: req.body.category, title: req.body.title, description: req.body.description, content: req.body.content }).then(function () { res.render("admin/success", { userInfo: req.userInfo, message: "内容保存成功", url: '/admin/content/edit?id=' + id }); }); });// 阅读数增加
router.get("/view", function (req, res) { var contentid = req.query.contentid || ""; Content.findOne({ _id: contentid }).then(function (content) { data.content = content; content.views++; content.save(); // 阅读数增加 res.render("main/view", data); }); });// 用户登录: 根据账号密码查询账号信息
router.post("/user/login", function (req, res, next) { var username = req.body.username; var password = req.body.password; if(!username || !password){ responseData.code = 1; responseData.message = "用户名或密码不能为空"; res.json(responseData); return; } // 查询数据库中相同用户名和密码的记录是否存在,如果存在则登陆成功 User.findOne({ username: username, password: password }).then(function (userInfo) { if(!userInfo){ responseData.code = 2; responseData.message = "用户名或密码错误"; res.json(responseData); return; } responseData.message = "登陆成功"; responseData.userInfo = { _id : userInfo._id, username: userInfo.username }; /** * 存储登陆信息到cookies中 */ req.cookies.set("userInfo", JSON.stringify({ _id: userInfo._id, username: userInfo.username })); res.json(responseData); return; }); });// 获得文章所有评论
router.get("/comment", function (req, res) { var contentId = req.query.contentid || ""; Content.findOne({ _id: contentId }).then(function (content) { responseData.data = content.comments; res.json(responseData); }); });// 用户管理: 分页展示
router.get("/user", function (req, res) { // 玩家请求第几页 var page = parseInt(req.query.page || 1); // 一页限制10条记录 var limit = 10; // 当前一共几页 var pages = 0; // 统计有几条记录 User.count().then(function (count) { pages = Math.ceil(count/limit); // 限制在合适的请求页数内 page = Math.min(page, pages); // 最小1页 page = Math.max(page, 1); // 当前请求页数跳过的数据条数 var skip = (page - 1) * limit; /** * 1 升序 * -1 降序 */ User.find().sort({_id: -1}).limit(limit).skip(skip).then(function (users) { res.render("admin/user_index", { userInfo: req.userInfo, users: users, count: count, pages: pages, limit: limit, page: page }); }); }); });// 分类首页: 分页展示
router.get("/category", function (req, res) { // 玩家请求第几页 var page = parseInt(req.query.page || 1); // 一页限制10条记录 var limit = 10; // 当前一共几页 var pages = 0; // 统计有几条记录 Category.count().then(function (count) { pages = Math.ceil(count/limit); // 限制在合适的请求页数内 page = Math.min(page, pages); // 最小1页 page = Math.max(page, 1); // 当前请求页数跳过的数据条数 var skip = (page - 1) * limit; Category.find().sort({_id: -1}).limit(limit).skip(skip).then(function (categories) { res.render("admin/category_index", { userInfo: req.userInfo, categories: categories, count: count, pages: pages, limit: limit, page: page }); }); }); });// 内容首页
router.get("/content", function (req, res) { var page = parseInt(req.query.page || 1); var limit = 10; var pages = 0; Content.count().then(function (count) { pages = Math.ceil(count/limit); page = Math.min(page, pages); page = Math.max(page, 1); var skip = (page-1)*limit; Content.find().limit(limit).skip(skip).populate(['category', 'user']).sort({addTime: -1}).then(function (contents) { res.render("admin/content_index", { userInfo: req.userInfo, contents: contents, count: count, pages: pages, limit: limit, page: page }); }); }); });