express+mongodb+bootstrap搭建个人博客系统(十四),2024年最新推荐学生的推荐语

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

$(‘.tip_user’).show();

return;

}

//2.验证密码是否合法 纯数字,5-12

var pass_reg = /^\d{5,12}$/;

if(!pass_reg.test(formData.get(‘pass’))){

$(‘.tip_pass’).show();

return;

}

//3. 重复密码验证

if(formData.get(‘pass’)!=formData.get(‘repass’)){

$(‘.tip_repass’).show();

return;

}

$.ajax({

url:‘/api/reg’,

type:‘post’,

processData: false,//不对数据进行转换

contentType: false,

data:formData,

success:function(res){

console.log(res);

}

})

})

  1. 注册的后台接口

var express = require(‘express’);

var router = express.Router();

var formidable = require(‘formidable’);

/* 注册 */

router.post(‘/reg’,function(req, res, next) {

// 创建formidable表单解析对象

var form = new formidable.IncomingForm();

// formidable对象对提交的数据进行解析

form.parse(req,function(err,filds,files){ //err错误对象,filds:普通表单提交的数据。files:提交的二进制文件

if(!err){

console.log(filds);

}

})

});

module.exports = router;

四、设计用户数据库


  1. 创建 schema模型user.js

var mongoose = require(‘mongoose’);

module.exports=mongoose.Schema({

user:String,

pass:String,

isAdmin:{type:Boolean,default:false}

},{timestamps:true})

备注:isAdmin字段,用来区分用户的身份。在这里,我们用false来表示普通用户身份,用true来表示管理员身份。所以,给isAdmin设置了默认值:false。

  1. 创建model模型 User.js

var mongoose = require(‘mongoose’);

var user=require(‘…/schema/user’);

module.exports=mongoose.model(‘User’,user)

  1. 注册逻辑

/* 注册 */

router.post(‘/reg’,function(req, res, next) {

// 创建formidable表单解析对象

var form = new formidable.IncomingForm();

// formidable对象对提交的数据进行解析

form.parse(req,function(err,filds,files){ //err错误对象,filds:普通表单提交的数据。files:提交的二进制文件

if(!err){

console.log(filds); // {user:xxx,pass:xxx,repass:xxx}

//注册逻辑

/*

第一步:先查询数据库,是否存在该用户

第二步:如果没有该用户,直接向前端响应json ,注册失败

第三部:没有该用户,写入数据库,向前端响应json,注册成功

*/

//查询第一条数据,

User.findOne({user:filds.user},function(err,data){

// 如果用该用户:data—>{user:xxx,pass:xxx,isAdmin:false} true

// 如果没用该用户 data–>null false

if(!err){

console.log(data);

if(data){ // 有该用户

res.json({code:0,msg:‘该用户已存在’})

}else{ // 没有该用户

User.create({user:filds.user,pass:filds.pass},function(err){

if(!err){

res.json({code:1,msg:‘注册成功’})

}

})

}

}

})

}

})

});

  1. 登陆前端

//登陆

$(‘.btn_login’).on(‘click’,function(){

$(‘.tip’).hide();

//原生dom

var form = document.querySelector(“#form_login”);

var formData = new FormData(form);

console.log(formData.get(‘user’));

console.log(formData.get(‘pass’));

//本地数据验证

var user_reg = /^[0-9a-zA-Z_ ] 5 , 12 ]{5,12} ]5,12/g;

if(!user_reg.test(formData.get(‘user’))){

$(‘.tip_login_user’).show();

return;

}

//密码验证

var pass_reg = /^\d{5,12}$/;

if(!pass_reg.test(formData.get(‘pass’))){

$(‘.tip_login_pass’).show();

return;

}

//请求接口

$.ajax({

url:‘/api/login’,

type:‘post’,

data:formData,

processData:false,

contentType:false,

success:function(res){

console.log(res);

}

})

})

  1. 登陆后端

//登陆

router.post(‘/login’,function(req,res,next){

//接受数据 formData

// 创建formidable 解析表单数据对象

var form = new formidable.IncomingForm();

form.parse(req,function(err,filds,files){// err:错误参数, filds:普通form表单数据, files:文件数据。

if(!err){

console.log(filds);

//登陆逻辑

/*

第一步:查询数据库,看数据库是否存在该用户。

第二步:如果不存在该用户,向前进响应jons,登陆失败。

第三步:存在该用户。

第四部:进一步判断,该用户提交的密码,和数据中的密码是否一致:

如果不一致:向前端响应josn,登陆失败。

如果一致:向前端响应josn,登陆成功。

*/

User.findOne({user:filds.user},function(err,data){

if(!err){

if(data){

if(data.pass==filds.pass){ //密码页一致

res.json({code:1,msg:‘登陆成功’})

}else{

res.json({code:2,msg:‘密码错误’})

}

}else{

res.json({code:0,msg:‘该用户不存在’})

}

}

})

}

})

})

五、cookie


HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

HTTP是无状态的。每次发送的http请求,都是一次独立请求,跟上次没有任何关系。

用户登录—> 服务器验证登录----->登录成功----->给前端响应josn + 向前端响应cookie({user:xxx,isAdmin:false})------>请求首页(携带cookie)----->服务器端 劫持 cookie---->根据cookie的内容渲染不同页面。

  1. 登录成功,向浏览器返回cookie

//先响应cookie(设置相应头) ,再josn

// cookie —> {userInfo:{user:xxx,isAdmin:false}}

// 参数一:属性名

//参数二:属性值

// 参数三:配置 path:‘/a’ 设置写入cookie的路径

//magAge:毫秒, 设置cookie的有效期。30天免登录 100060602430

res.cookie(‘userInfo’,{user:data.user,isAdmin:data.isAdmin},{path:‘/a/b’,maxAge:100060602430})

res.json({code:1,msg:‘登陆成功’})

  1. 前端 收到 res响应

if(res.code==1){

//跳转到首页。?, cookie

location.href=‘/’; // 携带cookie

}

  1. 根路由,劫持cookie,根据登录状态,和用户权限。渲染不同页面

router.get(‘/’, function(req, res, next) {

//劫持cookie

console.log(req.cookies)

if(req.cookies.userInfo){ //用户刚才登录成功了

if(req.cookies.userInfo.isAdmin){ //管理员

res.render(‘admin/home.ejs’)

}else{ //普通用户

res.render(‘main/home.ejs’)

}

}else{ // 用户没有登录

res.render(‘index’, { title: ‘Express’ });

}

});

六、管理员页面开发


  1. admin/home.ejs
管理员页面

返回首页

  • 用户列表 (current)

  • 分类

    添加分类

    查看分类

  • 内容

    添加内容

    查看内容

    退出

    <% if(tip==0){ %>

    <% include ./one.ejs %>

    <% }else if(tip==1){ %>

    <% include ./userList.ejs %>

    <% }else if(tip==2){ %>

    <% include ./userEdit.ejs %>

    <% } %>

    1. 退出

    //退出

    router.get(‘/out’,function(req,res,next){

    //清除 cookie

    res.clearCookie(‘userInfo’);

    res.redirect(‘/’);

    })

    1. 后端接口

    // 用户列表查询

    router.get(‘/findUser’,function(req,res,next){

    //查询用户信息

    User.find({},function(err,datas){

    if(!err){

    res.render(‘admin/home.ejs’,{tip:1,userList:datas})

    }

    })

    })

    //用户删除

    router.get(‘/del’,function(req,res,next){

    User.remove({_id:req.query._id},function(err){

    if(!err){

    //查询用户信息

    User.find({},function(err,datas){

    if(!err){

    res.render(‘admin/home.ejs’,{tip:1,userList:datas})

    }

    })

    }

    })

    })

    //用户修改

    router.get(‘/edit’,function(req,res,next){

    User.findOne({_id:req.query._id},function(err,data){

    res.render(‘admin/home.ejs’,{tip:2,userOne:data})

    })

    })

    //确认修改

    router.post(‘/update’,function(req,res,next){

    console.log(req.body)

    var aa=req.body.isAdmin==1?true:false;

    User.update({_id:req.body._id},{$set:{user:req.body.user,pass:req.body.pass,isAdmin:aa}},function(err){

    if(!err){

    //查询用户信息

    User.find({},function(err,datas){

    if(!err){

    res.render(‘admin/home.ejs’,{tip:1,userList:datas})

    }

    })

    }

    })

    })

    1. one.ejs

    欢迎您超级管理员!

    This is a modified jumbotron that occupies the entire horizontal space of its parent.

    1. userList.ejs
    编号 用户名 密码 是否是管理员 注册时间 操作

    <% for(var index in userList){ %>

    <%= index*1+1 %>

    <%= userList[index].user %>

    <%= userList[index].pass %>

    <%= userList[index].isAdmin?“是”:“否” %>

    <%= userList[index].createdAt?userList[index].createdAt.toLocaleString():‘2020-12-12 12:12:20’ %>

    删除

    修改

    <% } %>

    1. userEdit.ejs

    管理员 普通用户

    确认修改

    1. 分类

    创建schema模型

    var mongoose = require(‘mongoose’);

    module.exports=new mongoose.Schema({

    fenlei:{type:String,required:true}

    })

    创建model模型

    var mongoose = require(‘mongoose’);

    var fenleiSchema = require(‘…/schema/fenlei’);

    module.exports=mongoose.model(‘Fenlei’,fenleiSchema);

    分类页面

    <% if(onOff){ %>

    操作成功!

    <% } %>

    确认添加

    后端接口文件

    // 展示 分类添加模块

    router.get(‘/showFenlei’,function(req,res,next){

    res.render(‘admin/home.ejs’,{tip:3,onOff:false})

    })

    // 添加分类

    router.post(‘/addFenlei’,function(req,res,next){

    //?接收数据。写入数据。

    //创建entity模型 (文档模型)

    var entity = new Fenlei({fenlei:req.body.fenlei});

    entity.save(function(err){

    if(!err){

    console.log(‘添加成功’)

    res.render(‘admin/home.ejs’,{tip:3,onOff:4})

    }

    })

    })

    home.ejs中也要修改

    <% if(tip==0){ %>

    <% include ./one.ejs %>

    <% }else if(tip==1){ %>

    <% include ./userList.ejs %>

    <% }else if(tip==2){ %>

    <% include ./userEdit.ejs %>

    <% }else if(tip==3){%>

    <% include ./fenlei.ejs %>

    <% }else if(tip==4){%>

    <% } %>

    1. 内容

    创建schema模型

    var mongoose = require(‘mongoose’);

    module.exports=new mongoose.Schema({

    fenlei:{ //集合关联

    // 类型

    type:mongoose.Schema.Types.ObjectId,

    // 引用

    ref:‘Fenlei’

    },

    title:{

    type:String,

    default:‘’

    },

    description:{

    type:String,

    default:‘’

    },

    content:{

    type:String,

    default:‘’

    }

    },{timestamps:true})

    model模型

    var mongoose = require(‘mongoose’);

    var contentSchema = require(“…/schema/content”);

    module.exports=mongoose.model(‘Content’,contentSchema);

    admin/home.ejs

  • 内容

    添加内容

    查看内容


    <% if(tip==0){ %>

    <% include ./one.ejs %>

    <% }else if(tip==1){ %>

    <% include ./userList.ejs %>

    <% }else if(tip==2){ %>

    <% include ./userEdit.ejs %>

    <% }else if(tip==3){%>

    <% include ./fenlei.ejs %>

    <% }else if(tip==4){%>

    <% include ./findFenlei.ejs %>

    <% }else if(tip==5){%>

    <% include ./content.ejs %>

    <% } %>

    总结

    技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

    网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

    需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
    img

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
    var contentSchema = require(“…/schema/content”);

    module.exports=mongoose.model(‘Content’,contentSchema);

    admin/home.ejs

  • 内容

    添加内容

    查看内容


    <% if(tip==0){ %>

    <% include ./one.ejs %>

    <% }else if(tip==1){ %>

    <% include ./userList.ejs %>

    <% }else if(tip==2){ %>

    <% include ./userEdit.ejs %>

    <% }else if(tip==3){%>

    <% include ./fenlei.ejs %>

    <% }else if(tip==4){%>

    <% include ./findFenlei.ejs %>

    <% }else if(tip==5){%>

    <% include ./content.ejs %>

    <% } %>

    总结

    技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

    [外链图片转存中…(img-qhhl7aEc-1713298617572)]

    网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

    需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
    [外链图片转存中…(img-XlnU1oWX-1713298617572)]

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值