nodej+expess搭建简单的展示页和后台信息管理页

近日学习nodejs,就写了个简单的前端页面和后台管理页面,先来看看成果
首先,前端展示页
在这里插入图片描述
然后,后台管理页
在这里插入图片描述
进入修改页
在这里插入图片描述
就是这些,最主要这三个页面,接下来说一下我的思路(这里欢迎各位大神批评指正)

  1. 利用json文件来存储页面上所展示的信息(文字,图片等),当然也可以用数据库来存储(像用户信息等就用数据库存储,在这里用来展示的我就简单用json来存储),然后前端利用ajax发送get请求到nodejs后台,nodejs将json文件的信息发送回给前端。
  2. 后台管理页方面,用HTML做个页面出来,里面的信息也是像展示页那样用ajax读取json文件,修改的时候用nodejs读文件操作读出整个信息片段并转化为对象格式方便修改,修改完后再用nodejs写文件操作将新的数据保存,这样json文件里面的信息就可以被修改了,再次刷新展示页后上面的信息页随之被修改。

先来看一下文件夹结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里最主要的是app.js、index.js这两个js文件,app.js用来配置一些最基本的声明,如变量声明什么的,index.js则配置页面链接的跳转和后台功能的实现


详细过程:

  1. html+bootstrap写个简单的页面结构出来,代码如下:
<div class="container">
  <div class="row">
  	  <div class="col-sm-4">
  	  	<div class="row">
	  	  	<div class="col-sm-12"><h1 class="name">名字</h1></div>
	  	  	<div class="col-sm-12">
	  	  		<img class="img-responsive pic" src="" alt="">
	  	  	</div>
	  	  	<div class="col-sm-12">
	  	  		<div class="row">
	  	  			<div class="col-xs-5"><h4>国家 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="country"></h4></div>
	  	  		</div>
	  	  		<div class="row">
	  	  			<div class="col-xs-5"><h4>俱乐部 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="club"></h4></div>
	  	  		</div>
	  	  	</div>	
  	  	</div>
  	  </div>
  	  <div class="col-sm-4">
		<div class="row">
			<div class="col-sm-12"><h1 class="name">名字</h1></div>
  	  		<div class="col-sm-12">
  	  			<img class="img-responsive pic" src="" alt="">
  	  		</div>
  	  		<div class="col-sm-12">
  	  			<div class="row">
	  	  			<div class="col-xs-5"><h4>国家 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="country"></h4></div>
	  	  		</div>
	  	  		<div class="row">
	  	  			<div class="col-xs-5"><h4>俱乐部 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="club"></h4></div>
	  	  		</div>
  	  		</div>
		</div>	  	  	
  	  </div>
  	  <div class="col-sm-4">
  	  	<div class="row">
	  	  	<div class="col-sm-12"><h1 class="name">名字</h1></div>
	  	  	<div class="col-sm-12">
	  	  		<img class="img-responsive pic" src="" alt="">
	  	  	</div>
	  	  	<div class="col-sm-12">
	  	  		<div class="row">
	  	  			<div class="col-xs-5"><h4>国家 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="country"></h4></div>
	  	  		</div>
	  	  		<div class="row">
	  	  			<div class="col-xs-5"><h4>俱乐部 : </h4></div>
	  	  			<div class="col-xs-7"><h4 class="club"></h4></div>
	  	  		</div>
	  	  	</div>	  	  		
  	  	</div>
  	  </div>
  </div>
</div>

javascript代码(用的jquery):
这里发送get请求 /getinfo 这个路由信息到nodejs。

$(function(){
	$.get("/getinfo", function(data){
		$.each(data, function(index, info){
			$(".name:eq(" + index + ")").text(info.name);
			$(".country:eq(" + index + ")").text(info.country);
			$(".club:eq(" + index + ")").text(info.club);
			$(".pic:eq(" + index + ")").attr('src',info.picture);
		})
		$('.name').css('color','#000');
	})
})
  1. 后台信息管理页
<div class="container">
	<h1>信息管理</h1>
	<form action="" role="form" class="info-list">
		<div class="form-group">
			<label for="name"><h2>名字</h2></label>
			<input type="text" class="form-control" id="name">
			<label for="country"><h2>国家</h2></label>
			<input type="text" class="form-control" id="country">
			<label for="Club"><h2>俱乐部</h2></label>
			<input type="text" class="form-control" id="club">
			<label for="picture"></label><h2>照片</h2>
			<input type="file" class="form-control" id="upload"><br>
			<img src="" alt="" class="picM">
			<input type="text" class="form-control" id="index" style="display:none">
		</div>
		<button class="btn btn-primary" type="button" id="modi">修改</button>
		<button class="btn btn-primary" type="button" id="back">返回</button>
	</form>
	
	<table class="table table-bordered table-hover">
		<thead>
			<tr>
				<th>名字</th>
				<th>国家</th>
				<th>俱乐部</th>
				<th>照片</th>
				<th>操作</th>
			</tr>
		</thead>
		<tbody id="info">
			<tr>
				<td></td>
				<td></td>
				<td></td>
				<td><img class="img-reponsive pic" src="" alt=""></td>
				<td><button class="btn btn-primary modify" id="first">修改</button></td>
			</tr>
			<tr>
				<td></td>
				<td></td>
				<td></td>
				<td><img class="img-reponsive pic" src="" alt=""></td>
				<td><button class="btn btn-primary modify" id="second">修改</button></td>
			</tr>
			<tr>
				<td></td>
				<td></td>
				<td></td>
				<td><img class="img-reponsive pic" src="" alt=""></td>
				<td><button class="btn btn-primary modify" id="third">修改</button></td>
			</tr>
		</tbody>
	</table>
</div>

这里打开后台管理页的时候先隐藏了form标签里面的内容,当点击修改的时候隐藏table的内容,显示form的内容

javascript代码:

和展示页一样,先发送get请求到nodejs后台获取数据

$.ajax({
	url : '/getinfo',
	type : 'get',
	error : function(err){
		console.log(err);
	},
	success : function(data){
		//console.log(data);		
		//console.log(data.length);
		for (var i=0; i<3; i++){
			$("#info tr:eq(" + i + ") td:eq(0)").text(data[i].name);
			$("#info tr:eq(" + i + ") td:eq(1)").text(data[i].country);
			$("#info tr:eq(" + i + ") td:eq(2)").text(data[i].club);
			$(".pic:eq(" + i + ")").attr('src', data[i].picture);
		}
	}
})

绑定input[type=file]的变化,当有文件上传时执行,并将图片转为base64格式存到res

var res = '';//用于上传图片时转化为base64格式
$("#upload").bind("input propertychange",function(event){
	var file = document.querySelector('input[type=file]').files[0];
	var reader = new FileReader();
	reader.readAsDataURL(file);		
	reader.onload = function(e) {
		res = e.target.result;
		$(".picM").attr('src',res);
	}
});

点击table标签里面的修改时,隐藏table标签,显示form标签

$('.modify').click(function(){
	var info = {//利用id名来确定index
		"first" : 1,
		"second" : 2,
		"third" : 3
	}
	var index = info[$(this).attr("id")]-1;
	var name = $("#info tr:eq(" + index + ") td:eq(0)").text();
	var country = $("#info tr:eq(" + index + ") td:eq(1)").text();
	var club = $("#info tr:eq(" + index + ") td:eq(2)").text();
	var picture = $(".pic:eq(" + index + ")").attr('src');

	$(".table").css('display','none');
	$(".info-list").css('display','block');

	$("#name").val(name);
	$("#country").val(country);
	$("#club").val(club);
	$("#index").val(index);
	$(".picM").attr('src',picture);
})

点击form里面的修改时,用post传数据到路由 /modifyData

$("#modi").click(function(){
	var playerName = $("#name").val();
	var playerCountry = $("#country").val();
	var playerClub = $("#club").val();
	var playerIndex = $("#index").val();//index表示是第几个信息
	var isFile = 'false';

	function ajaxData(playerName, playerCountry, playerClub, playerIndex, playerPic){
		$.ajax({
			url : '/modifyData',
			type : 'post',
			dataType : 'json',
			data : {
				name : playerName,
				country : playerCountry,
				club : playerClub,
				index : playerIndex,
				picture : playerPic
			},
			error : function(err){
				console.log(err);
			},
			success : function(data){
				window.location.href = "http://127.0.0.1:3000/managment";
			}
		})
	}

	var fileName = $('input[type=file]').val();
	if (fileName == ''){//如果有新的文件上传
		ajaxData(playerName, playerCountry, playerClub, playerIndex, isFile);
	}
	else{//如果没有
		ajaxData(playerName, playerCountry, playerClub, playerIndex, res);
	}			
})
  1. 后端nodejs
    首先在app.js里声明一些变量,如果使用mongodb,要使用npm安装一下(cnpm install mongodb)
global.fs = require("fs");
global.MongoClient = require('mongodb').MongoClient
global.url = 'mongodb://localhost:27017';

然后进入index.js编辑代码

前端信息展示页 ↓

router.route('/index').get(function(req, res){
	res.render('display');
})
```js
后台信息管理页 ↓

```js
router.route('/managment').get(function(req, res){
	res.render('managment');
})

/getinfo 路由,后端收到get请求,就会执行以下代码
fs.readFile读取文件信息,然后用res.send(JSON.parse(data))将信息以JSON对象的格式发送给前端

router.get('/getinfo', function(req, res){
	fs.readFile( './public/json/info.json', 'utf8', function(err, data){
		if (err){
			return console.log(err);
		} 
		//console.log(JSON.parse(data));
		res.send(JSON.parse(data));
		res.end();
	})
})

/modifyData理由 post请求,在信息管理页修改完信息后点击修改按钮,会以post的方式向后端发送数据信息

router.post('/modifyData', function(req, res){
	var name = req.body.name;
	var country = req.body.country;
	var club = req.body.club;
	var index = req.body.index;
	var file = req.body.picture;
	//console.log(isNaN(index));

	function modifyPlayerData(file){
		fs.readFile( './public/json/info.json', 'utf8', function(err, data){
			if (err){
				return console.log(err);
			}

			var playinfo = data.toString();
			playinfo = JSON.parse(playinfo);
			playinfo[index].name = name;
			playinfo[index].country = country;
			playinfo[index].club = club;
			if (file != 0){
				playinfo[index].picture = file;
			}

			var str = JSON.stringify(playinfo);

			fs.writeFile( './public/json/info.json', str, function(error, newdata){
				if (error){
					console.log(error);
				}
				console.log('success');
				res.send('1');
				res.end();
			})
		})
	}

	if (file == 'false'){
		console.log('no file');
		modifyPlayerData(0);
	}
	else {
		console.log('new picture')
		modifyPlayerData(file)
	}
})

最后在git中cnpm start开启项目
展示页 http://127.0.0.1:3000/index
后台管理页 http://127.0.0.1:3000/managment
源代码地址:https://github.com/jtbss/Website-Backstage(这里面没有node_modules文件,要自己cnpm安装一些依赖包)

欢迎批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值