前端学习(1392):多人管理项目12加密

blog.js

//管理页面
//展示页面
const express = require('express');const admin = express.Router();admin.get('/login', (req, res) => {res.render('admin/login')
});
admin.get('/user', (req, res) => {res.render('admin/user')
});
admin.post('/login', async(req, res) => {const { email, password } = req.body;if (email.trim().length == 0 || password.trim().length == 0)return res.status(400).render('admin/error', { msg: '地址或者邮件错误' });let user = await User.findOne({ email });if (user) {if (password == user.password) {res.send('成功了');} else {res.status(400).render('admin/error', { msg: '地址或者邮件错误' });}} else {res.status(400).render('admin/error', { msg: '地址或者邮件错误' });}})module.exports = admin;

admingeyao.js

//管理页面
//展示页面
const express = require('express');const admin = express.Router();admin.get('/login', (req, res) => {res.render('admin/login')
});
admin.get('/user', (req, res) => {res.render('admin/user')
});module.exports = admin;

homegeyao.js

//展示页面
const express = require('express');const home = express.Router();home.get('/', (req, res) => {res.send('欢迎来到博客首页');
});module.exports = home;

 connect.js

// 引入mongoose第三方模块
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/blog', {useNewUrlParser: true }).then(() => console.log('数据库连接成功')).catch(() => console.log('数据库连接失败'))

user.js

// 创建用户集合
// 引入mongoose第三方模块
const mongoose = require('mongoose');
// 导入bcrypt
const bcrypt = require('bcrypt');
// 引入joi模块
const Joi = require('joi');
// 创建用户集合规则
const userSchema = new mongoose.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},// 0 启用状态// 1 禁用状态state: {type: Number,default: 0}
});// 创建集合
const User = mongoose.model('User', userSchema);async function createUser () {const salt = await bcrypt.genSalt(10);const pass = await bcrypt.hash('123456', salt);const user = await User.create({username: 'iteheima',email: 'itheima@itcast.cn',password: pass,role: 'admin',state: 0});
}// createUser();// 验证用户信息
const validateUser = user => {// 定义对象的验证规则const schema = {username: Joi.string().min(2).max(12).required().error(new Error('用户名不符合验证规则')),email: Joi.string().email().required().error(new Error('邮箱格式不符合要求')),password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/).required().error(new Error('密码格式不符合要求')),role: Joi.string().valid('normal', 'admin').required().error(new Error('角色值非法')),state: Joi.number().valid(0, 1).required().error(new Error('状态值非法'))};// 实施验证return Joi.validate(user, schema);
}// 将用户集合做为模块成员进行导出
module.exports = {User,validateUser
}

login.art

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>用户登录</title><link rel="stylesheet" href="/admin/lib/bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="/admin/css/base.css">
</head><body><div class="login-body"><div class="login-container"><h4 class="title">黑马程序员 - 博客管理员登录</h4><div class="login"><form action="/admin/login" method="post" id="loginForm"><div class="form-group"><label>邮件</label><input name="email" type="email" class="form-control" placeholder="请输入邮件地址"></div><div class="form-group"><label>密码</label><input name="password" type="password" class="form-control" placeholder="请输入密码"></div><button type="submit" class="btn btn-primary">登录</button></form></div><div class="tips"></div></div></div><script src="/admin/lib/jquery/dist/jquery.min.js"></script><script src="/admin/lib/bootstrap/js/bootstrap.min.js"></script><script src="/admin/js/common.js"></script><script type="text/javascript">// 为表单添加提交事件$('#loginForm').on('submit', function () {// 获取到表单中用户输入的内容var result = serializeToJson($(this))// 如果用户没有输入邮件地址的话if (result.email.trim().length == 0) {alert('请输入邮件地址');// 阻止程序向下执行return false;}// 如果用户没有输入密码if (result.password.trim().length == 0) {alert('请输入密码')// 阻止程序向下执行return false;}});</script>
</body>
</html>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c++ primer读书笔记】【第2章】变量和基本类型

1、 无符号类型 含有无符号类型的表达式&#xff0c;当一个算式表达式中既有unsigned int&#xff0c;又有int时&#xff0c;int会转化为unsigned int&#xff0c; 如int a-1&#xff0c;unsigned b1&#xff0c;则在我的机器中a*b4294967295。 无符号数不会小于0也关系到循环…

java 注入 循环_spring依赖注入——循环依赖

上一篇博客简单地分析了下依赖注入。但是对于依赖注入的很多细节&#xff0c;都没有深入的分析。这一篇博客会继续分析spring的依赖注入。这篇博客会解决分析getBean缓存时候遗留下来的循环依赖问题。循环依赖分析首先明确下&#xff0c;只有单例情况下&#xff0c;spring才会试…

前端学习(1393):多人管理项目13加密实现

blog.js //管理页面 //展示页面 const express require(express);const admin express.Router();admin.get(/login, (req, res) > {res.render(admin/login) }); admin.get(/user, (req, res) > {res.render(admin/user) }); admin.post(/login, async(req, res) >…

Python的逻辑运算符and小析

近期突然对验证码的识别感兴趣了,然后就研究了一些图像识别和处理的资料,其中有一种图像处理是关于字体的细化和骨架提取的,但是这种算法没有现成的java代码实现,那些号称的java版代码多半都是效果很差或是根本不行的..搜索的途中看到一个用python实现的细化提骨架算法,效果很不…

java二叉树的深度_java 二叉树的最大深度

二叉树的最大深度Given a binary tree, find its maximum depth.The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.Note: A leaf is a node with no children.Example:Given binary tree [3,9,20,null,nul…

前端学习(1394):多人管理项目14多人加密使用

users.js // 创建用户集合 // 引入mongoose第三方模块 const mongoose require(mongoose); // 导入bcrypt const bcrypt require(bcrypt); // 引入joi模块 const Joi require(joi); // 创建用户集合规则 const userSchema new mongoose.Schema({username: {type: String,r…

【卡法电子商务】-常用手机屏幕尺寸 ★★★★★

iPhone4/iPhone4s 320 * 372 / 320 * 441 (已隐藏URL与状态栏) iPhone5/iPhone5s 320 * 460 / 320 * 529 (已隐藏URL与状态栏) Note2 360 * 567 (未隐藏URL与状态栏) iPad 3/4 768*928 (未隐藏URL与状态栏) GALAXY SIII 360 * 567 (未隐藏URL与状态栏) 小米2A 360…

java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态

面向对象编程有三大特性&#xff1a;封装、继承、多态。封装隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据。对外界而已它的内部细节是隐藏的&#xff0c;暴露给外界的只是它的访问方法。继承是为了重用父类代码。…

前端学习(1395):多人管理项目15建立请求

{{extend ./common/layout.art}}{{block main}}<!-- 子模板的相对路径相对的就是当前文件 因为它是由模板引擎解析的 而不是浏览器 -->{{include ./common/header.art}}<!-- 主体内容 --><div class"content">{{include ./common/aside.art}}<d…

CreateProcess的使用方法

使用编译器vs2008。 第一、第二个參数的使用方法&#xff1a; 样例&#xff1a; 使用ie打开指定的网页。 注意第二个參数是 可运行文件命令行參数 #include "stdafx.h" #include <windows.h> #include <stdio.h> int main(int argc, char* argv[]) { STA…

学生成绩查询java版_学生成绩查询系统,基于ssm的JAVA系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天记录的项目是学生成绩查询系统&#xff0c;这个项目是这么回事&#xff1a;介绍了在Internet/WWW环境下构建学生成绩查询系统的设计思路与方法 ,阐述了在学生成绩查询系统中的JSP技术和WEB数据库技术的运用 ,描述了学生成绩查…

技术积累

1、TCP/IP HTTP协议 &#xff08;1&#xff09;TCP报文头格式 &#xff08;2&#xff09;TCP连接的建立与终止&#xff0c;三次握手、四次挥手 &#xff08;3&#xff09;TCP的状态转移图 2、UNIX网络编程 &#xff08;1&#xff09;并发服务器&#xff0c;多进程、多线程编程…

前端学习(1397):项目包含的知识点cookie和session2

const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); //引入 const bodyPaser require(body-parser);const session require(express-session); require(./model/connect)//处理post app.use(bodyPase…

jmeter校验结果_Jenkins在实际失败时验证JMeter构建是否成功

我有类似的问题,阻止我.我需要用Jenkins运行我的JMeter测试.但Jenkins验证JMeter构建在实际失败时是否成功.我想知道我做错了什么,以便当断言失败时jmeter不会返回失败.我运行一个调用jMeter的Windows Batch脚本.这是如何做&#xff1a;命令行cd C:\apache-jmeter-3.1\binjmete…

[Unity3D]unity3d5.0简单的调用摄像头

Unity3D中新建一个工程&#xff0c;加一个Plane&#xff0c;新建一个C# 脚本,将这个脚本添加到Plane上&#xff0c;调用摄像头。(如果显示的图片居然是翻转的&#xff0c;Plane的Rotation 值就可以了) 以下是脚本内容&#xff1a; using UnityEngine; using System.Collections…

java 分析excel模板_java如何读取Excel简单模板

场景&#xff1a;对于经常需要导入excel模板或数据来解析后加以应用的&#xff0c;使用频率非常之高&#xff0c;做了一个比较稳定的版本&#xff0c;体现在这些地方工具&#xff1a;org.apache.poi使用前必须了解这些&#xff1a;1、要解析&#xff0c;那肯定先判断是不是exce…

前端学习(1399):多人管理19项目拦截器

const guard (req, res, next) > {// 判断用户访问的是否是登录页面// 判断用户的登录状态// 如果用户是登录的 将请求放行// 如果用户不是登录的 将请求重定向到登录页面if (req.url ! /login && !req.session.username) {res.redirect(/admin/login);} else {// …

4种kill某个用户所有进程的方法

4种kill某个用户所有进程的方法 在linux系统管理中&#xff0c;我们有时候需要kill掉某个用户的所有进程&#xff0c;初学者一般先查询出用户的所有pid&#xff0c;然后一条条kill掉&#xff0c;或者写好一个脚本&#xff0c;实际上方法都有现成的&#xff0c;这边有4种方法&am…