当前位置: 首页 > Web前端 > JavaScript

多人后台管理博客DAY03

时间:2023-03-27 17:08:56 JavaScript

(3)新建用户BLOG实现项目功能——源码目录└──model——数据库操作└──user.js——用户管理├──public——静态资源└——route——路由└──admin--博客管理├──user-edit-fn.js--用户添加页面路由└──user-edit.js--用户编辑页面路由└──admin.js--博客管理页面路由└──views--模板└──admin--博客管理页面美工模板├──user-edit.art--用户编辑页面└──user.art--用户列表页面├──app.js--创建网站服务└──joi.js--JavaScript对象规则描述语言和验证器1.user.art为新用户添加跳转到user-edit.art的链接{{extend'./common/layout.art'}}{{block'main'}}{{include'./common/header.art'}}{{include'./common/aside.art'}}

Users

1个用户找到Addnewuser
{{/block}}2.user-edit.art为新用户指定请求地址和请求form方法,给表单项添加name属性(method\value\name\action){{message}}

表示用户提交的错误信息的显示{{extend'./common/layout.art'}}{{block'main'}}{{include'./common/header.art'}}{{include'./common/aside.art'}}{{@user&&user._id}}{{message}}

普通用户超级管理员启用禁止使用{{/block}}admin.js创建用户编辑页面路由,渲染user-edit增加添加用户的功能路由,user-edit-fn//引用expess框架constexpress=require('express');//创建博客展示页面routeconstadmin=express.Router();//渲染登录页面admin.get('/login',require('./admin/loginPage'));//实现登录功能admin.post('/login',require('./admin/login'));//创建用户列表routeadmin.get('/user',require('./admin/userPage'));//实现退出函数admin.get('/logout',require('./admin/logout'));//创建用户编辑页面路由admin.get('/user-edit',require('./admin/user-edit'));//创建路由实现添加用户功能admin.post('/user-edit',require('./admin/user-edit-fn'));//使用作为模块成员的路由对象被导出module.exports=admin;user.js导入joi模块,定义校验规则,抛出模块对象//创建用户集合//导入mongoose第三方模块constmongoose=require('mongoose');//导入bcryptconstbcrypt=require('bcrypt');//导入joi模块constJoi=require('joi');//创建用户集合规则constuserSchema=newmongoose.Schema({username:{type:String,required:true,minlength:2,maxlength:20},email:{type:String,//保证邮箱地址插入数据库时??不重复unique:true,required:true},password:{type:String,required:true},//admin超级管理员//normal普通用户role:{type:String,required:true},//0enabledstate//1disabledstatestate:{type:Number,default:0}});//创建集合constUser=mongoose.model('User',userSchema);asyncfunctioncreateUser(){constsalt=awaitbcrypt.genSalt(10);constpass=awaitbcrypt.hash('123456',盐);constuser=awaitUser.create({username:'iteheima',email:'itheima@itcast.cn',password:pass,role:'admin',state:0});}//createUser();//验证用户信息constvalidateUser=user=>{//定义对象验证规则constschema={username:Joi.string().min(2).max(12).required().error(newError('用户名不符合验证规则')),email:Joi.string().email().required().error(newError('邮箱格式不符合不符合要求')),password:Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/).required().error(newError('密码格式不符合要求')),role:Joi.string().valid('normal','admin').required().error(newError('rolevalueisinvalid')),state:Joi.nu??mber().valid(0,1).required().error(newError('非法状态值'))};//实现验证returnJoi.validate(user,schema);}//将用户集合导出为模块成员module.exports={User,validateUser}5.joi.jsJavaScript对象规则描述语言和验证器npminstalljoi//importjoimoduleconstJoi=require('joi');//定义对象验证规则constschema={username:Joi.string().min(2).max(5).required().error(newError('用户名属性验证失败')),birth:Joi.number().min(1900).max(2020).error(newError('birthfailedverification'))};asyncfunctionrun(){try{//实现验证awaitJoi.validate({username:'ab',birth:1800},schema);}catch(ex){console.log(ex.message);返回;}console.log('验证通过')}run();7.user-edit.js通过req.query获取消息并渲染到user-edit.artmodule.exports=async(req,res)=>{//在地址栏中获取id参数const{message}=请求查询;//渲染res.render('admin/user-edit',{message:message,});8.user-edit-fn.js引入validateUser构造函数,验证失败,获取e.message并重定向回用户添加页面,根据邮箱地址判断用户是否存在。如果用户已存在,则邮箱地址已被他人占用,重定向回用户添加页面。如果没有问题说明可以添加用户,然后加密密码,引入bcrypt,将用户信息添加到数据库,添加用户后重定向回用户列表页面//引入用户集合const的构造函数{User,validateUser}=require('../../model/user');//导入加密模块constbcrypt=require('bcrypt');module.exports=async(req,res,next)=>{try{awaitvalidateUser(req.body)}catch(e){//验证失败//e.message//重定向回用户添加页面//returnres.redirect(`/admin/user-edit?message=${e.message}`);//JSON.stringify()将对象数据类型转换为字符串数据类型returnnext(JSON.stringify({path:'/admin/user-edit',message:e.message}))}//根据查询用户是否存在电子邮件地址letuser=awaitUser.findOne({email:req.body.email});//如果用户已经存在,则邮箱地址已被他人占用if(user){//重定向回用户添加页面//returnres.redirect(`/admin/user-edit?message=邮箱地址已经被占用`);returnnext(JSON.stringify({path:'/admin/user-edit',message:'Emailaddressisalreadytaken'}))}//加密密码//生成随机字符串constsalt=awaitbcrypt.genSalt(10);//加密constpassword=awaitbcrypt.hash(req.body.password,salt);//替换密码req.body.password=password;//向数据库添加用户信息awaitUser.create(req.body);//将页面重定向到用户列表页面res.redirect('/admin/user');}