前端
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#show{
margin: 10px;
}
#show>table{
border: 1px solid red;
border-collapse: collapse;
}
#show>table th,
#show>table td
{
border: 1px solid red;
}
</style>
</head>
<body>
<div id="app">
<div id="entry">
<div>
<label>
姓名:<input type="text" id="user"/>
</label>
<label>
年龄:<input type="number" id="age"/>
</label>
</div>
<div>
<button type="button" id="addGet">addGet</button>
<button type="button" id="addPost">addPost</button>
</div>
</div>
<div id="show">
<table>
<thead>
<tr>
<th>序号</th>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>添加时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- <tr>
<td>1</td>
<td>123</td>
<td>kky</td>
<td>18</td>
<td>2021-12-02 10:55:01</td>
<td>
<button type="button">getDel 删除</button>
<button type="button">postDel 删除</button>
</td>
</tr> -->
</tbody>
</table>
</div>
</div>
<script>
/*
KKY P3 学员信息系统(kkyP3)
根据业务决定
1网站功能:
1. 添加 两种方式GET和POST
2. 获取 get方式 和 POST ,渲染到一个表格中
3. 删除 两种方式 GET 和 POST
2.字段
姓名 user
年龄 age
前后端商量出来的
3.接口文档
接口1 添加 addGet GET /addGet user,age必填 返回{code:200,msg:"addGet 添加成功"}
接口1 添加 addPost POST /addPost user,age必填 返回{code:200,msg:"addPost 添加成功"}
接口2 获取 getData GET /getData 无 返回{code:200,msg:"getData 获取成功",data:data} ,data=[{user:"kky",age:18}],user,age
接口4 获取 postData POST /postData 无 返回{code:200,msg:"postData 获取成功",data:data} ,data=[{user:"kky",age:18}],user,age
接口5 删除 getDel GET /getDel id 必填 返回{code:200,msg:"getDel 删除成功"}
接口6 删除 postDel POST /postDel id 必填 返回{code:200,msg:"getDel 删除成功"}
*/
//全局
;(function(){
var user = document.getElementById("user");
var age = document.getElementById("age");
var addGet = document.getElementById("addGet");
var addPost = document.getElementById("addPost");
//调用getDataAjax
var getDataUrl="http://127.0.0.1:85/getData";
getDataAjax(getDataUrl);
//调用postDataAjax
var postDataUrl="http://127.0.0.1:85/postData";
// postDataAjax(postDataUrl)
//通过get方式添加
addGet.onclick=function(){
var userV=user.value;
var ageV=age.value;
if(userV&&ageV){
//序列化 数据
var data="user="+userV+"&age="+ageV;
// var data=`user=${userV}&age=${ageV}`;
//接口地址+数据
var url="http://127.0.0.1:85/addGet?"+data;
//调用 addGetAjax
addGetAjax(url);
}else{
alert("姓名或年龄不能为空");
}
}
//通过post方式添加
addPost.onclick=function(){
var userV=user.value;
var ageV=age.value;
if(userV&&ageV){
var data="user="+userV+"&age="+ageV;
var url="http://127.0.0.1:85/addPost";
//调用addPostAjax
addPostAjax(url,data);
}else{
alert("姓名或年龄不能为空");
}
}
}());
//通过ajax get 方式添加数据
function addGetAjax(url){
var xhr=new XMLHttpRequest();
xhr.open("get",url);
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
// console.log("str:",str);
var strObj=JSON.parse(str);
// console.log("strObj:",strObj);
if(strObj.code==2021){
// alert(strObj.msg);
//调用getDataAjax
var getDataUrl="http://127.0.0.1:85/getData";
getDataAjax(getDataUrl);
}
}
}
}
//通过ajax post 方式添加数据
function addPostAjax(url,data){
var xhr=new XMLHttpRequest();
xhr.open("post",url);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(data);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
// console.log("str:",str);
var strObj=JSON.parse(str);
// console.log("strObj:",strObj);
if(strObj.code==2021){
// alert(strObj.msg);
//调用postDataAjax
var postDataUrl="http://127.0.0.1:85/postData";
postDataAjax(postDataUrl)
}
}
}
}
//通过get方式获取数据
function getDataAjax(url){
var xhr=new XMLHttpRequest();
xhr.open("get",url);
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
// console.log('str:',str);
var obj=JSON.parse(str);
// console.log("obj:",obj);
var arr=obj.data;
// console.clear();//清除之前控制台所有的打印信息
// console.log("getData arr:",arr);
//调用showPage(arr);渲染页面
showPage(arr);
}
}
}
//通过post方式获取数据
function postDataAjax(url){
var xhr=new XMLHttpRequest();
xhr.open("post",url);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
// console.log('str:',str);
var obj=JSON.parse(str);
// console.log("obj:",obj);
var arr=obj.data;
// console.clear();//清除之前控制台所有的打印信息
// console.log("pstData arr:",arr);
//调用showPage(arr);渲染页面
showPage(arr);
}
}
}
//渲染页面
function showPage(arr){
var tbody=document.querySelector("#show>table>tbody");
var trs="";
for(var i=0;i<arr.length;i++){
trs+=`
<tr>
<td>${i+1}</td>
<td>${arr[i].id}</td>
<td>${arr[i].user}</td>
<td>${arr[i].age}</td>
<td>${timeFun(arr[i].time)}</td>
<td>
<button type="button" onclick=getDel('${arr[i].id}')>getDel 删除</button>
<button type="button" onclick=postDel('${arr[i].id}')>postDel 删除</button>
</td>
</tr>
`;
}
tbody.innerHTML=trs;
}
//通过get方式将id传给后端,后端将根据id删除指定数据
function getDel(id){
// console.log("getDel id:",id);
var url="http://127.0.0.1:85/getDel?id="+id;
var xhr=new XMLHttpRequest();
xhr.open("get",url);
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
// console.log("str:",str);
var strObj=JSON.parse(str);
// console.log("strObj:",strObj);
if(strObj.code==2021){
// alert(strObj.msg);
//调用getDataAjax
var getDataUrl="http://127.0.0.1:85/getData";
getDataAjax(getDataUrl);
}
}
}
}
//通过post方式将id传给后端,后端将根据id删除指定数据
function postDel(id){
// console.log("postDel id:",id);
var url="http://127.0.0.1:85/postDel";
var xhr=new XMLHttpRequest();
xhr.open("post",url);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("id="+id);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var str=xhr.responseText;
console.log("str:",str);
var strObj=JSON.parse(str);
// console.log("strObj:",strObj);
if(strObj.code==2021){
// alert(strObj.msg);
//调用postDataAjax
var postDataUrl="http://127.0.0.1:85/postData";
postDataAjax(postDataUrl)
}
}
}
}
function timeFun(time){
var d=new Date(time);
var year=d.getFullYear();
var month=d.getMonth()+1;
var date=d.getDate();
var hours=d.getHours();
var minustes=d.getMinutes();
var seconds=d.getSeconds();
return year+"-"+bu0(month)+"-"+bu0(date)+" "+bu0(hours)+":"+bu0(minustes)+":"+bu0(seconds);
}
function bu0(n){
return n>10?n:('0'+n);
}
</script>
</body>
</html>
后端
var http = require('http');
var url = require('url');
var fs = require('fs');
var querystring = require('querystring');
const PROT = 85;
var filePath="./data/data01.json";
var app = http.createServer(function(req,res){
res.writeHead(200,{
"content-type":"text/html;charset=utf-8",
"Access-Control-Allow-Origin":"*",解决跨域问题
"Access-Control-Allow-Methods": "POST,GET",
'Access-Control-Allow-Headers':'Content-type',
});
// res.end("0后端服务创建成功");
var pathname = url.parse(req.url).pathname;
if(pathname=="/addGet"){
var addGetObj=url.parse(req.url,true).query;
console.log("01 addGet 前后端通信成功 addGetObj:",addGetObj);
addReadWriteFile(filePath,addGetObj,function(){
res.end(JSON.stringify({code:2021,msg:"addGet 添加成功"}));
});
}else if(pathname=="/addPost"){
var str1="";
req.on("data",function(s){
str1+=s;
});
req.on("end",function(){
var addPostObj=querystring.parse(str1);
// console.log("02 addPost 前后端通信成功 addPostObj:",addPostObj);
addReadWriteFile(filePath,addPostObj,function(){
res.end(JSON.stringify({code:2021,msg:"addPost 添加成功"}));
});
})
}else if(pathname=="/getData"){
fs.readFile(filePath,'utf-8',function(err,data){
if(err){
console.log("getData 读取失败:\n",err);
}else{
// console.log("data:",data,typeof data);
var obj1={code:2021,msg:"getData 获取数据成功",data:data};
// res.end(JSON.stringify(obj1));
var arr=JSON.parse(data);
var obj2={code:2021,msg:"getData 获取数据成功",data:arr};
res.end(JSON.stringify(obj2));
}
})
}else if(pathname=="/postData"){
fs.readFile(filePath,'utf-8',function(err,data){
if(err){
console.log("postData 读取失败:\n",err);
}else{
console.log("data:",data,typeof data);
var arr=JSON.parse(data);
var obj2={code:2021,msg:"postData 获取数据成功",data:arr};
res.end(JSON.stringify(obj2));
}
})
}else if(pathname=="/getDel"){
var getDelObj=url.parse(req.url,true).query;
console.log("01 getDel 前后端通信成功 getDelObj:",getDelObj);
delReadWriteFile(filePath,getDelObj.id,function(){
res.end(JSON.stringify({code:2021,msg:"getDel 删除成功"}));
})
}else if(pathname=="/postDel"){
// console.log("1我是postDel,我执行了吗?");
var str2="";
req.on("data",function(s){
str2+=s;
});
// console.log("2我是postDel,我执行了吗?");
req.on("end",function(){
// console.log("3我是postDel,我执行了吗?");
var postDelObj=querystring.parse(str2);
// console.log("01 postDel 前后端通信成功 postDelObj:",postDelObj);
delReadWriteFile(filePath,postDelObj.id,function(){
res.end(JSON.stringify({code:2021,msg:"postDel 删除成功"}));
})
})
}else{
res.end("2.接口不存在或空页面");
}
});
app.listen(PROT,function(){
console.log("服务创建成功 http://127.0.0.1:"+PROT);
});
//将前台发送的数据,添加到data02.json
function addReadWriteFile(filePath,obj,cb){
// console.log("99999obj:",obj);
fs.readFile(filePath,'utf-8',function(err,data){
if(err){
console.log("读取失败:\n",err);
}else{
console.log("data:",data);
var arr=JSON.parse(data);
obj.id=+new Date();
obj.time=+new Date();
arr.push(obj);
var str=JSON.stringify(arr);
fs.writeFile(filePath,str,function(err){
if(err){
console.log("写入失败:\n",err);
}else{
console.log("写入成功");
cb();
}
})
}
});
}
//根据前台发送的id,将data02.json中特定数据删除
function delReadWriteFile(filePath,id,cb){
//
fs.readFile(filePath,'utf-8',function(err,data){
if(err){
console.log("读取失败:\n",err);
}else{
console.log("data:",data);
var arr=JSON.parse(data);
console.log("delReadWriteFilearr:",arr);
for(var i=0;i<arr.length;i++){
if(arr[i].id==id){
arr.splice(i,1);
break;
}
}
var str=JSON.stringify(arr);
fs.writeFile(filePath,str,function(err){
if(err){
console.log("写入失败:\n",err);
}else{
console.log("写入成功");
cb();
}
})
}
});
//
}