8、路由 router
路由:router
用户功能
/user ----> index.html
/user/login ----> login.html
/user/reg ----> reg.html
/user userRouter => express.Router();
app.use("/user",userRouter);
新闻功能
/news ----> index.html
/news/edit ----> edit.html
/news/add ----> add.html
router.js
var express = require("express");
var app = express();
app.listen(9000);
var userRouter = express.Router();
var newsRouter = express.Router();
// /user /news
app.use("/user",userRouter);
app.use("/news",newsRouter);
userRouter.get("/",function(req,res){
res.send("user--->index.html");
});
userRouter.get("/login",function(req,res){
res.send("user--->login.html");
});
userRouter.get("/reg",function(req,res){
res.send("user--->reg.html");
});
newsRouter.get("/",function(req,res){
res.send("news--->index.html");
});
newsRouter.get("/edit",function(req,res){
res.send("user--->edit.html");
});
newsRouter.get("/add",function(req,res){
res.send("user--->add.html");
});
express
Express 应用生成器
npm install express-generator -g
创建应用
express myapp -e
下载模块
cnpm i
启动服务:
npm start
node bin/www
npm run script名字
cnpm i -S cookie-session multer consolidate mysql
连接池:
utils/pool.js
mysql.createConnection({})
mysql.createPool({
connectionLimit:10默认是10条
})
app.js:
var createError = require("http-errors");
var logger = require("morgan");
var express = require("express");
var path = require("path");
var cookieParser = require("cookie-parser");
var cookieSession = require("cookie-session");
var consolidate = require("consolidate");
var multer = require("multer");
var indexRouter = require("./routes/index");
var usersRouter = require("./routes/users");
var app = express();
//文件上传
var multerMiddleware = multer({dest:"upload"}).any();
app.use(multerMiddleware);
// 模板引擎
app.set("view engine", "html");
app.set("views", "views");
app.engine("html", consolidate.ejs);
//日志
app.use(logger("dev"));
//处理post数据
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
//cookie-session
app.use(cookieParser());
var keys = [];
for(var i = 0; i < 10000; i++){
keys.push("sessionid"+Math.random());
}
app.use(cookieSession({
name:"sid",
keys,
maxAge:30*60*1000 //ms
}));
//静态服务器
app.use(express.static("public"));
app.use("/", indexRouter);
app.use("/users", usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// 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;
users.js:
var express = require("express");
var pool = require("../utils/pool");
var md5 = require("../utils/md5");
var router = express.Router();
var pageSize = 10;
/* /users ---> index.html */
router.get("/", function(req, res) {
if(!req.session.isLogin){
res.redirect("/users/login");
}
var pageNo = req.query.pageNo || 1;
//总页数
var totalSql = "select count(*) as count from user_table";
pool.query(totalSql,function(err,data){
console.log(data);
if(data.length == 0){//没有数据
res.render("./users/index.html",{pageCount:0});
} else {//有数据
var count = data[0].count;
var pageCount = Math.ceil(count/pageSize);
//做分页
var beginIndex = (pageNo-1)*pageSize;
var querySql = `select * from user_table limit ${beginIndex},${pageSize}`;
console.log(1111,querySql);
pool.query(querySql,function(err,data){
console.log(111,data,pageCount);
res.render("./users/index.html",{data,pageCount,pageNo});
});
}
});
});
//渲染页面
router.get("/login", function(req, res) {
res.render("./users/login2",{error:1,msg:""});
});
//处理接口
router.post("/login", function(req, res) {
var {user,pass} = req.body;
pass = md5(pass);
var sql = `select * from user_table where username="${user}" and password="${pass}"`;
pool.query(sql,function(err,data){
if(data.length == 0){//用户名或者密码错误
//res.send({error:0,msg:"用户名或者密码错误"});
res.render("./users/login2",{error:0,msg:"用户名或者密码错误"});
} else {
//res.send({error:1,msg:"登陆成功"});
req.session.isLogin = true;
res.redirect("/");
}
});
});
router.get("/reg", function(req, res) {
res.render("./users/reg");
});
//处理接口
router.post("/reg", function(req, res) {
var {user,pass} = req.body;
pass = md5(pass);
var querySql = `select * from user_table where username="${user}"`;
pool.query(querySql,function(err,data){
if(data.length == 0){//用户不存在 可以注册
var inserSql = `insert into user_table(username,password) values("${user}","${pass}")`
pool.query(inserSql,function(err){
res.send({error:1,msg:"注册成功"});
});
} else {//用户已经存在
res.send({error:0,msg:"用户已存在"});
}
});
});
module.exports = router;
SSR
分页:
select * from user_table; 查询所有
每页显示10条数据 pageSize = 10;
select * from user_table limit beginIndex,pageSize;
select * from user_table limit 1,10;
页数pageNo beginIndex
1 0 - 9
2 10 - 19
3 20 - 29
beginIndex = (pageNo-1)*pageSize
pageCount总页数 = Math.ceil(总数据/每页显示多少条) = Math.ceil(count/pageSize)
count? ===> select count(*) as count from user_table;
get --- req.query /url?name=value ----> /url?name=aaa
req.params /url/:name ----> /url/aaa
post --- req.body
8、路由 router的更多相关文章
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- vue-router同路由$router.push不跳转一个简单解决方案
vue-router同路由$router.push不跳转一个简单解决方案 vue-router跳转一般是这么写: toCurrentPage: function(thisId){ this.$rout ...
- vue项目创建步骤 和 路由router知识点
菜单快捷导航: vue项目创建 vue路由router知识点(路径参数.查询参数.命名路由.嵌套路由.命名视图.hash/history模式) 1.创建一个vue项目步骤 (windows环境下).创 ...
- Vue学习笔记-Vue.js-2.X 学习(七)===>脚手架Vue-CLI(路由Router)
脚手架Vue-CLI(路由Router) 一 按装(通过新创建脚手架按装),如果在原来的脚手架上按装直接进图型化界面vue ui的插件按装. 二 使用(上面按装下面步骤自动会生成) 第一步:导入路由对 ...
- 前端 JS 原生 javascript 和 location.hash 实现一个单页应用的路由 router
开篇日常立个flag-- 前言 最近在做一些应用,类似于单页应用,想实现类似于 Vue 路由的效果. 但是个人 Vue 基础四舍五入约等于无,而且看着 Vue-router 吃力+用不起来(因为我的项 ...
- VUE-008-通过路由 router.push 传递 query 参数(路由 path 识别,请求链接显示参数传递)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- VUE-007-通过路由 router.push 传递 query 参数(路由 name 识别,请求链接显示参数传递)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- VUE-006-通过路由 router.push 传递 params 参数(路由 name 识别,请求链接不显示)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- Angular4中路由Router类的跳转navigate
最近一直在学习angular4,它确实比以前有了很大的变化和改进,好多地方也不是那么容易就能理解,好在官方的文档和例子是中文,对英文不太好的还是有很大帮助去学习. 官方地址:https://angul ...
随机推荐
- SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
摘自: http://blog.csdn.net/xiaoyaotan_111/article/details/53817918 一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回 ...
- Gradle sync failed: /Applications/Android Studio.app/Contents/gradle/gradle-2.14.1/lib/plugins/gradle-diagnostics-2.14.1.jar (No such file or directory) Consult IDE log for more details (Help | Sh
上面出现的错误是,我从Android Studio 2.2 升级到2.3后,出现的问题, 找到方法: http://stackoverflow.com/questions/30526613/andro ...
- Android 安全开发之 ZIP 文件目录遍历
1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原 ...
- shell编程学习笔记(五):Shell中脚本的参数
在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...
- 一步步教你轻松学支持向量机SVM算法之案例篇2
一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- MVP模式在Android中的使用
转载了一篇博客.博客来自:http://www.liuling123.com/2015/12/mvp-pattern-android.html 觉得博主写的非常好 曾经在写项目的时候.没有过多考虑架构 ...
- easylog -- Linux 下的简单日志库
之前使用 log4c 或者 log4cpp 的时候, 总需要配置一些文件和链接库之类复杂的配置. 虽然越复杂越说明这个软件支持的功能多.可选择性强, 但是对于一个小的项目,或者要研究他人的代码而加点儿 ...
- 【C#】C#线程_计算限制的异步操作
目录结构: contents structure [+] 线程池简介 执行上下文(Execution Context) CancelTokenSource的使用 ThreadPool Task和Tas ...
- centos7磁盘挂载及取消
磁盘挂载查看已经挂载磁盘数 cat /proc/scsi/scsi | grep HostHost: scsi1 Channel: 00 Id: 00 Lun: 00Host: scsi2 Chann ...
- [转]Kqueue与epoll机制
首先介绍阻塞与非阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做):那么你可以去睡觉了,因为你知道快递把货送来 ...