** 项目一共有 16 个页面,是一个电商网销项目,自己在网上的某网上找的一个要做的网站的设计图;

页面主要包括:  登录页 -- 注册页 -- 首页 -- 产品列表页 -- 产品详情页 -- 会员中心页 -- 我的购物车页 -- 支付页 -- 支付成功页 -- 支付失败页 -- 评价页 -- 评价详情页 -- 我的订单页 -- 订单详情页 -- 确认订单页 -- 收货地址列表页;

后端技术: node express  mongo;

前端技术:vue-cli  elementui  axios ;

编辑器: vscode;

项目的暂时github地址:https://github.com/13476075014/node-vue/tree/master/mynodeproject/10.moon  ; 纯属个人记录下这个整个项目的过程,并非教程。 **

一:配置基本的接口controller地址

  ** 后台项目前面有说过是用的express生成器直接生成的一个后台项目 **

  1.1 进入主入口文件 app.js ,对请求头做一些处理,来跨域保存session ,在该文件加入下面的代码(红色是需要新加的代码,黑色为位置参照物):

var app = express(); //在这个下面,加上下面的代码
  //session
  var session = require('express-session');
  app.use(cookieParser());
  app.use(session({
      secret: 'classweb531234', //设置 session 签名
      name: 'classweb',
      cookie: {
          maxAge: 60 * 1000 * 60 * 24
      }, // 储存的时间 24小时
      resave: false, // 每次请求都重新设置session
      saveUninitialized: true
  }));
 
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:8081"); //为了跨域保持session,所以指定地址,;第二个参数是自己前台的express项目的网址头;
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Credentials', true); //是否允许发送cookie
next();
});

  1.2 对路由的设置,还是修改app.js文件,在该文件加上下面的代码:

var router = require('./routes/routes');
var app = express(); app.use(express.static(path.join(__dirname, 'public'))); router(app);//路由的使用,所有的路由都写在这个router中

  1.3 进入 router文件夹  新建router.js 文件,在这个文件里面写所有的路由地址指向,代码如下:

// 主要的路由文件

module.exports = function(app) {
app.use('/', require('./index'))
app.use('/users', require('./users')) //用户表路由
}

 1.4 安装上面session需要的npm包 ,控制台输入 npm i   express-session  --save-dev

最后整个app.js文件如下:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser'); var router = require('./routes/routes');
var app = express(); //跨域 后期删
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:8081"); //为了跨域保持session,所以指定地址,不能用*
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Credentials', true); //是否允许发送cookie
next();
}); //session
var session = require('express-session');
app.use(cookieParser());
app.use(session({
secret: 'classweb531234', //设置 session 签名
name: 'classweb',
cookie: {
maxAge: 60 * 1000 * 60 * 24
}, // 储存的时间 24小时
resave: false, // 每次请求都重新设置session
saveUninitialized: true
})); // view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); // uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); router(app);//路由的使用 // catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
res.status(err.status || 500);
res.render('error');
}); module.exports = app;

二:用对mongodb封装好的增删改查,方便后面对数据库的操作,进入 routes文件夹,新建 dbhandler.js文件,具体代码如下:

/*网上别人写好的针对mongodb@3.0.8版本的增删改查的封装,后面有改成mongoose,后面会提到 */

var mongo = require("mongodb");
var MongoClient = mongo.MongoClient;
var assert = require('assert');
var url = require('url');
var host = "localhost";
var port = "27017";
var Urls = 'mongodb://localhost:27017/moon'; // moon ===> 是自己要连接的这个项目的数据库名 //add一条数据
var add = function(db, collections, selector, fn) {
var collection = db.collection(collections);
collection.insertMany([selector], function(err, result) {
try {
assert.equal(err, null)
} catch (e) {
console.log(e);
result = [];
}; fn(result);
db.close();
});
}
//delete
var deletes = function(db, collections, selector, fn) {
var collection = db.collection(collections);
collection.deleteOne(selector, function(err, result) {
try {
assert.equal(err, null);
assert.notStrictEqual(0, result.result.n);
} catch (e) {
console.log(e);
result.result = "";
}; fn(result.result ? [result.result] : []); //如果没报错且返回数据不是0,那么表示操作成功。
db.close;
});
};
//find
var find = function(db, collections, selector, fn) {
//collections="hashtable";
var collection = db.collection(collections); collection.find(selector).toArray(function(err, result) {
//console.log(docs);
try {
assert.equal(err, null);
} catch (e) {
console.log(e);
result = [];
} fn(result);
db.close();
}); } //page
var page = function(db, collections, selector, fn) { var collection = db.collection(collections);
var count = 0;
collection.count({}, function(err1, count1) {
try {
assert.equal(err1, null);
} catch (e) {
console.log(e);
}
count = count1;
});
collection.find(selector[0], selector[1]).toArray(function(err, result) {
try {
assert.equal(err, null);
} catch (e) {
console.log(e);
result = [];
} fn(result, count); //回掉函数可接收两个参数,查询的数据 和 总数据条数
db.close();
}); } //update
var updates = function(db, collections, selector, fn) {
var collection = db.collection(collections); collection.updateOne(selector[0], selector[1], function(err, result) {
try {
assert.equal(err, null);
assert.notStrictEqual(0, result.result.n);
} catch (e) {
console.log("update错啦:" + e);
result.result = "";
}; fn(result.result ? [result.result] : []); //如果没报错且返回数据不是0,那么表示操作成功。
db.close();
}); }
/*var methodType = {
// 项目所需
login:find,
// type ---> 不放在服务器上面
// 放入到服务器
// 请求---> 根据传入进来的请求 数据库操作
// req.query req.body
show:find, //后台部分
add:add,
find:find,
courseList:updates,
update:updates,
delete:deletes,
updatePwd:updates,
//portal部分
showCourse:find,
register:add,
page:page //分页
};*/ //主逻辑 服务器 , 请求 --》
// req.route.path ==》 防止前端的请求 直接操作你的数据库
/*module.exports = function(req,res,collections,selector,fn){
MongoClient.connect(Urls, function(err, db) {
assert.equal(null, err);
console.log("Connected correctly to server");
// 根据 请求的地址来确定是什么操作 (为了安全,避免前端直接通过请求url操作数据库)
methodType[req.route.path.substr(1)](db,collections,selector,fn); db.close();
}); };*/ /*自己修改的向外暴露的增删改的接口*/
var methodType = {
login: find,
show: find, //后台部分
add: add,
find: find,
courseList: updates,
update: updates,
delete: deletes,
updatePwd: updates,
//portal部分
showCourse: find,
register: add,
page: page //分页
}; module.exports = function(req, res, i, collections, selector, fn) { //i是要执行的操作,例如find,delete和上面的methodType对应 //collections 要操作的表名 //selector要传的参数 //fn回调函数
MongoClient.connect(Urls, function(err, db) {
assert.equal(null, err);
console.log("Connected correctly to server");
// 根据 请求的地址来确定是什么操作 (为了安全,避免前端直接通过请求url操作数据库)
methodType[i](db, collections, selector, fn); db.close();
}); };

三:新增user用户表的操作,还是进入routes文件夹,把自动生成的users.js换成下面的代码:

var express = require('express');
var router = express.Router();
var crypto = require('crypto');
var ObjectId = require('mongodb').ObjectId;
var handler = require('./dbhandler.js'); //极客验证
var slide = require('../public/javascripts/slide.js'); router.get("/gt/register-slide", function(req, res) {
// 向极验申请每次验证所需的challenge
slide.register(null, function(err, data) {
if (err) {
console.error(err);
res.status(500);
res.send(err);
return;
} if (!data.success) {
req.session.fallback = true;
res.send(data); // 2. 使用自己提供的备用方案
// todo } else {
// 正常模式
req.session.fallback = false;
res.send(data);
}
});
}); /* GET users listing. */
router.post('/login', function(req, res, next) {
var username = req.body.username;
var password = req.body.password;
slide.validate(req.session.fallback, {
geetest_challenge: req.body.geetest_challenge,
geetest_validate: req.body.geetest_validate,
geetest_seccode: req.body.geetest_seccode
}, function(err, success) { if (err) {
// 网络错误
res.send({
status: "error",
info: err
}); } else if (!success) { // 二次验证失败
res.send({
status: "fail",
info: '登录失败'
});
} else { //验证成功后就对账号密码进行验证 /*res.send({
status: "success",
info: '登录成功'
});*/
var md5 = crypto.createHash('md5');
var password = md5.update(req.body.password).digest('base64');
handler(req, res, "login", "user", { username: req.body.username }, function(data) {
if (data.length === 0) { //没有这个账号
res.send({
status: "error",
info: "账号或密码错误"
});
} else if (data[0].pass !== password) {
res.send({
status: "error",
info: "账号或密码错误"
});
} else if (data.length !== 0 && data[0].pass === password) {
req.session.username = username; //存session
req.session.password = password; //存密码
req.session._id = data[0]._id;
res.send({
status: "success",
info: "成功"
});
} });
}
}); }); /* 注册接口 */
router.post('/register', function(req, res, next) {
var user = req.body.user;
delete(user["pass2"]);
var md5 = crypto.createHash('md5');
req.body.user.pass = md5.update(req.body.user.pass).digest('base64'); //对密码加密 //查询是否这个账号已经存在,需要更换账号去注册
handler(req, res, "find", "user", { 'username': user.username }, function(data) {
if (data.length == 0) { //没有找到有相同用户民的;
handler(req, res, "add", "user", user, function(data) {
if (data.length == 0) {
res.end('{"err":"抱歉,添加失败"}');
} else {
res.end('{"success":"添加成功"}');
}
});
} else { //账号已经存在了
res.end('{"err":"抱歉,添加失败,这个账号已经存在了!"}');
}
}) }) /*分页的接口 */
router.post('/getpage', function(req, res, next) {
console.log(req.body)
var page = req.body.page || 1; //当前页数
var rows = req.body.rows || 5; //一页显示的条数
handler(req, res, "page", "user", [{}, { limit: rows, skip: (page - 1) * rows }], function(data, count) {
var obj = {
data: data,
total: count,
success: "成功"
};
var str = JSON.stringify(obj);
res.send(str);
});
}) module.exports = router;

三:后台的登录注册接口(moon项目,前面有一,二)的更多相关文章

  1. 路飞-Redis的使用,登录注册接口

    复习 """ 1.git项目开发 提供公钥成为开发者.copy项目.开发项目 先commit.再pull(可能出现冲突).最后push 特殊功能可以新建dev的子分支进行 ...

  2. 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)

    d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过  git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目  p ...

  3. 一个关于vue+mysql+express的全栈项目(三)------ 登录注册功能的实现(已经密码安全的设计)

    本系列文章,主要是一个前端的视角来实现一些后端的功能,所以不会讲太多的前端东西,主要是分享做这个项目学到的一些东西,,,,, 好了闲话不多说,我们开始搭建后端服务,这里我们采用node的express ...

  4. Owin+ASP.NET Identity浅析系列(一)用户登录注册

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 使用VS2015创建MVC项 ...

  5. App的登陆注册接口安全设计

    最近一APP产品,我担任的主要模块之一是后台登录注册模块的接口开发.基本完成,就说说并记录一下关于登录注册接口的一些东西,因为也涉及到接口的安全方面的问题. 1.先一般的app的登录注册接口安全设计上 ...

  6. vue.js+koa2项目实战(三)登录注册模态框

    登录注册模态框 注: [Vue warn]: Do not use built-in or reserved HTML elements as component id: diaLog 原因:diaL ...

  7. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  8. 【招聘App】—— React/Nodejs/MongoDB全栈项目:登录注册

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  9. [ionic开源项目教程] - 第15讲 ionic用户个人中心登录注册的实现

    第15讲 ionic用户个人中心登录注册的实现 这一讲包括登陆.注册.个人中心.个人资料页面的实现. 在一讲的改动有四个地方: 在config.js里配置接口地址 完善个人中心的服务层(service ...

随机推荐

  1. requests与urllib.request

    requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...

  2. 解决 MYSQL CPU 占用 100% 的经验总结

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 ...

  3. $().attr() 和 $().css的区别

    使用jquery的.attr( )方法去给div隐藏,这样写的 $("#div_id").attr("display","none"),发现 ...

  4. Python3之高阶函数sorted

    排序算法 Python内置的sorted()函数可以对list进行排序 >>> sorted([36,5,-12,9,-21]) [-21, -12, 5, 9, 36] 此外,so ...

  5. Ehcache开启JMX支持

    Ehcache提供了基于JMX的监控支持,支持对以下几类信息的监控. CacheManager Cache CacheConfiguration CacheStatistics 按照JMX的规范,为了 ...

  6. Tools - Tcpdump

    Tcpdump homepage - tcpdump wiki - tcpdump 常用格式 tcpdump -i eth<网卡号> port <端口号> -s0 -w < ...

  7. 【c# 学习笔记】c#中的类

    1.什么是类: 在c#中类是一种数据结构,它可以包括数据成员.函数成员(方法.属性.事件.索引器.索引符.实例构造函数.静态构造函数和析构函数.及嵌套类型). 属性是,类中字段和方法的结合体,通过定义 ...

  8. Kotlin教程

    Kotlin是一种静态类型的编程语言,由JetBrains开发.如果你有Java的基础知识,你很快就能学会Kotlin.这个Kotlin教程是为初学者设计的,因此即使您不了解Java,也可以理解Kot ...

  9. ES6 中 let 和 const 总结

    目录 let const 1. let要好好用 1. 基本用法 2. let声明的变量不存在变量提升 3. TDZ(temporal dead zone)暂时性死区 4. 不允许重复声明 2. 块级作 ...

  10. 1024多人激情在线聊天室---select函数的使用

    效果展示 step1.服务器启动!端口号3006 step2.1号客户端启动!jack加入了群聊 step3.2号客户端启动!kelly加入了群聊 step4.3号客户端启动!zwj加入了群聊 ste ...