1.出身本人是一名前端攻城狮。本着对全栈工程师的向往,学习了nodejs搭建web服务器。学习知识设计制作了一个简单的小说阅读系统——阅读。先睹为快:悦读本系统包括:后台服务、数据库存储、后台管理端、客户端APP。后台管理包括:图书管理(增删改查)、用户管理(添加、冻结、解冻)客户端包括:注册、登录、添加书架、阅读、分享等2、技术栈服务器:nodejs、express数据库:mongodb后台管理:layui、jquery客户端:react三、开发过程申明:以下安装开发过程均在Windows操作系统下进行。1.安装nodejsnodejs的安装超级简单。到nodejs官网下载对应版本的nodejs安装包。下载完成后点击安装,一直点击下一步直到安装完成。安装完成后,打开命令行工具(win+r,然后输入cmd),在命令行中执行node-v命令。如果输出版本号,则安装成功。否则安装失败,可自行检查失败原因。2、安装MongoDBnodejs的mongodb模块,这个模块只是用来连接mongodb数据库的,不是真正的数据库。下载安装地址【MongoDB】[4]2.1下载完成后双击安装,可以选择custom自定义安装目录:2.2点击浏览器选择安装目录2.3点击next进入下一步,然后取消勾选installmongodbcompass,否则可能需要很长时间才能执行安装。MongoDBCompass是一个图形界面的管理工具。后面我们可以到官网下载安装。下载地址为:https://www.mongodb.com/downl...。2.4创建数据目录。MongoDB将数据存放在db目录下,但不会主动创建这个数据目录。安装完成后我们需要创建一个data/db目录。请注意数据目录要放在根目录下(如:C:datadb或D:datadb等)。2.5启动数据库,cd到mongodb安装目录的bin目录,cdc:mongodbbin,执行mongod--dbpathc:datadb,其中c:datadb是你创建的数据存放目录。3、安装expresscd到项目目录,在命令行执行npminstallexpress--save安装express安装包执行npminstallbody-parser--save处理JSON、Raw、Text和URL编码数据执行npminstallcookie-parser--save解析cookies的工具。可以通过req.cookies获取传递过来的cookies,并转化为对象。执行npminstallmulter--save处理enctype="multipart/form-data"的表单数据(设置表单的MIME编码)4.配置路由和http设置新建文件app.js,内容如下如下:varexpress=require("express");varbodyParser=require("body-parser");varapp=express();//设置跨域访问app.all('*',function(req,res,next){res.header("Access-Control-Allow-Origin","*");//res.header("access-control-expose-headers","Authorization");res.header("Access-Control-Allow-Headers","Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE");next();});//bodyapp.use(bodyParser.json()));//字符串类型bodyapp.use(bodyParser.urlencoded({extended:false}));//静态文件目录app.use(express.static(__dirname+'/public'));//图书图书馆系统后台管理终端路由和业务逻辑app.use('/baseWeb/book/',require('./routes/baseweb_book'));//图书馆系统app客户端路由和业务逻辑app.use('/webphone/bookPhone/',require('./routes/webPhone_book'));app.listen(8080);4、nodejs连接mongodb数据库服务,执行npminstallmongodb安装依赖包constMongoClient=require('mongodb').MongoClient;constObjectID=require('mongodb').ObjectID;consturl="mongodb://localhost:27017/books";MongoClient.connect(url,{useNewUrlParser:true},function(err,db){如果(err)throwerr;constDBO=db.db("books");//在books数据库的user表中添加数据//插入一行letdata={name:'lilei',sex:1};DBO.collection("user").insertOne(data,function(err,result){if(err)throwerr;console.log("Addedsuccessfully");});//插入多个项目letdata=[{name:'lilei',sex:1},{name:'hanmeimei',sex:0}];DBO.collection("user").insertMany(data,function(err,res){if(err)throwerr;console.log("Inserted"+res.insertedCount+"一条数据");});//删除数据//删除一条varwhereStr={name:'lilei'};//查询条件DBO.collection("user").deleteOne(whereStr,function(err,result){if(err)throwerr;console.log("deletesuccessful");});//删除多个varwhereStr={name:'lilei'};//查询条件DBO.collection("user").deleteMany(whereStr,function(err,result){if(err)throwerr;console.log("删除成功");});//修改//修改一个letwhereStr={"name":'hanmeimei'};//查询条件letupdateStr={$set:{"name":"missDeng"}};DBO.collection("user").updateOne(whereStr,updateStr,function(err,res){if(err)throwerr;console.log("更新成功");});//修改多个项目letwhereStr={"name":'hanmeimei'};//查询条件letupdateStr={$set:{"name":"missDeng"}};DBO.collection("user").updateMany(whereStr,updateStr,function(err,res){if(err)throwerr;console.log("更新成功");});//queryletobj={};//查询条件,空对象是查询所有DBO.collection("user").find(obj).toArray(function(err,result){if(err)throwerr;console.log(结果);});});5.新建routes目录,在routes目录下创建webPhone_book.js文件,内容如下:constexpress=require("express");constfs=require('fs');constpath=require('路径');constcrypto=require('加密o');//加载加密文件constrouter=express.Router();constMongoClient=require('mongodb').MongoClient;constObjectID=require('mongodb').ObjectID;consturl="mongodb://localhost:27017/books";//bufferconstbuf=newBuffer.alloc(2048);//连接到数据库MongoClient.connect(url,{useNewUrlParser:true},function(err,db){if(err)throwerr;constDBO=db.db("books");//注册router.post('/enroll',function(req,res){letdata={userName:req.body.userName,sex:req.body.sex,userPhone:req.body.userPhone,userEmail:req.body.userEmail,password:req.body.password,status:1}for(letkindata){if(!data[k]){res.json({code:4,content:"参数异常"});返回false}}DBO.collection("user").find({userPhone:data.userPhone}).count(function(err,num){if(err)抛出错误;如果(num==0){//密码加密letpwObj=encrypt(data.password);data.password=pwObj.pw;data.key=pwObj.key;DBO.collection("user").insertOne(data,function(err,result){if(err){res.json({code:4,content:"Serverexception"});throwerr;}res.json({code:1,content:"添加成功"});})}else{res.json({code:2,content:"此电话号码已注册"})}});});//App端认证登录router.post('/login',function(req,res){letuserPhone=req.body.userPhone;letpassword=req.body.password;if(userPhone&&password){DBO.collection("user").find({userPhone:userPhone}).toArray(function(err,resArr){if(err)throwerr;if(resArr.length>0){密码=密码+resArr[0].key;让md5=crypto.createHash('md5');让r=md5.update(password).digest('hex');if(r==resArr[0].password){res.json({code:1,content:resArr[0]._id});}else{res.json({code:2,content:"密码错误"});}}else{res.json({code:2,content:"此手机号尚未注册"});}})}else{res.json({code:4,content:"参数异常"});}});});module.exports=路由器;6.使用layui创建后台管理前端页面并绑定界面7.使用react创建APP客户端工程,使用hbuilder打包成apk安装包4.总结与收获还没有系统学习过server之前是端开发,所以在开发过程中遇到了很多问题,比如:跨域问题、文件读写、上传文件、下载文件、数据库设计等等,这些问题并没有让我感到沮丧。之后部署在云服务器上,推荐给朋友使用。成就感是压倒性的。当然,这个系统还是一个新生儿,还有很多不足和需要优化的地方。希望各位朋友不吝赐教。完整项目github地址:https://github.com/jaxlix/hap...Android安装包下载二维码:
