nodejs+mysql实现小型web后台程序

项目地址

主要实现功能:

1.用户名密码登录
2.增删改查管理员发布的网页数据

具体小功能:

1.对用户名数据进行哈希加密(签名)
2.强制登录页面(重定向)
3.浏览器与服务器传输数据

图片

界面丑了点,当时主要把后台功能搭起来,功能基本齐全,后面会把界面做起来

登录界面
"登录界面"

首页
"首页"

发布信息
"发布信息"

用户评价
"用户评价"

项目结构:

"项目结构"

/server.js

其功能是建服务器监听8080端口。
具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var server=express();
server.listen(8080);

//1.获取请求数据
//get自带
server.use(bodyParser.urlencoded());
server.use(multerObj.any());

//2.cookie、session
server.use(cookieParser());
(function (){
var keys=[];
for(var i=0;i<100000;i++){
keys[i]='a_'+Math.random();
}
server.use(cookieSession({
name: 'sess_id',
keys: keys,
maxAge: 20*60*1000 //20min
}));
})();

//3.模板
server.engine('html', consolidate.ejs);
server.set('views', 'template');
server.set('view engine', 'html');

//4.route
server.use('/', require('./route/web')());
server.use('/admin/', require('./route/admin')());

//5.default:static
server.use(static('./static/'));

console.log('server is running at port 8080...');

各段代码作用如下:

1.解析请求数据
2.并发给请求方cookie,
3.声明调用的模板
4.路由功能,区分请求并转入相应界面
5.处理静态文件请求

/libs/common.js

该文件封装模板,其功能是将登录时的用户输入的用户名密码等数据用哈希算法加密(签名),让该数据不可见,避免他人获取用户名密码。
代码如下:

1
2
3
4
5
6
7
  MD5_SUFFIX: '*****',
md5: function (str){
var obj=crypto.createHash('md5');

obj.update(str);

return obj.digest('hex');

其中,MD5_SUFFIX加在数据后面,再进行md5加密,该MD5_SUFFIX是自定义的数据的

/route/index.js

在服务器运行后,服务器一直监听8080端口,当有请求访问,首先对该用户的登录状态和请求进行判定,如果不是管理
员,就重定向返回登录界面。如果想访问其他页面,也不行,重定向回登录界面。只有当既是管理员,请求访问的又是
登录界面才对请求予以响应。

1
2
3
4
5
6
7
8
9
//检查登录状态
router.use((req, res, next)=>{
if(!req.session['admin_id'] && req.url!='/login'){ //没有登录
//转向登录界面(重定向)
res.redirect('/admin/login');
}else{
next();
}
});

如果已确定是管理员,就再来判定其访问请求。

1
2
3
4
//根据不同http请求,转向不同页面
router.use('/login', require('./login')());
router.use('/banners', require('./banners')());
router.use('/custom',require('./custom')());

/route/login.js

那是怎么判断是否为管理员?
当管理员登录时,后台就拿着页面获取的用户名密码和数据库的进行比对,成功就给浏览器发session,不成功就不发,
判定管理员的时候就是看有没有session。
为什么不直接不直接用用户名密码验证,而要再加一个session?
session可以理解为cookie的加强版,具有生存期,可以控制用户在一定时间内免登陆。若采用用户名密码验证,那每
退一次,就得输入一次密码,这在实际操作中是很不方便的。

1
2
3
4
5
if(data[0].password==password){
//成功
req.session['admin_id']=data[0].ID;
res.redirect('/admin/');
}

route和template

登录后,就对数据进行操作。route和template分别是存放js和静态文件的文件夹,文件夹内的js文件实现的功能相似,都是将页面和数据库连接起来,对数据进行增删改查的操作。就banners页面来说,其具体代码如下:

1
2
//连接数据库
var db=mysql.createPool({host: 'localhost', user: 'root', password: '***', database: 'learner'});

修改banner数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db.query(`SELECT * FROM banner_table WHERE id=${req.query.id}`, (err, data)=>{
if(err){
console.error(err);
res.status(500).send('database error').end();
}else if(data.length==0){
res.status(404).send('data not found').end();
}else{
db.query('SELECT * FROM banner_table', (err, banners)=>{
if(err){
console.error(err);
res.status(500).send('database error').end();
}else{
res.render('admin/banners.ejs', {banners, mod_data: data[0]});
}
});
}
});

其他数据操作功能同理

-------------本文结束感谢您的阅读-------------
显示 Gitment 评论