first commit

This commit is contained in:
编码猿
2024-09-27 02:06:13 +08:00
commit 852d94fbb9
36760 changed files with 3274413 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
var db = require("../db/index")
class Interceptor {
public adminPageInterceptor(req: any, res: any, next: Function) {
console.log(req.session.user)
if (req.session.user == undefined) {
// res.redirect("/admin/login")
res.json({
status: 404,
message: '您还未登录, 请访问 /admin/login 登录'
})
} else {
next()
}
}
public async adminInterceptor(req: any, res: any, next: Function) {
if(req.headers.token != undefined) {
var data = await db.query({
sql: 'SELECT * from user where token = ?',
par: [req.headers.token]
});
if( data.length != 0) {
next()
} else {
res.json({
status: 500,
message: 'token已经失效请重新登录'
})
}
} else {
res.json({
status: 500,
message: '请勿非法访问接口缺少token'
})
}
}
}
module.exports = new Interceptor()

View File

@@ -0,0 +1,71 @@
var createError = require('http-errors');
var express = require('express');
var session = require('express-session')
var path = require('path');
var cookieParser = require('cookie-parser');
// var lessMiddleware = require('less-middleware');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var AdminUsersRouter = require('./routes/admin/page/user');
var AdminHomeRouter = require('./routes/admin/page/home');
var AdminArticleRouter = require('./routes/admin/page/article');
var AdminApiUsersRouter = require('./routes/admin/api/userApi');
var AdminApiArticleRouter = require('./routes/admin/api/articleApi');
var app = express();
app.use(session({
secret: '!@#$%&*()cvb<??>',
resave: true,
saveUninitialized: true,
cookie: {
maxAge : 1000 * 60 * 3
}
}))
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
// app.use(lessMiddleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
// 后台管理页面的路由
app.use('/admin', AdminUsersRouter);
app.use('/admin', AdminHomeRouter);
app.use('/admin', AdminArticleRouter);
// 后台管理的ajax接口
app.use('/admin/api', AdminApiUsersRouter);
app.use('/admin/api', AdminApiArticleRouter);
// catch 404 and forward to error handler
app.use(function(req: any, res: any, next: Function) {
next(createError(404));
});
// error handler
app.use(function(err: any, req: any, res: any, next: Function) {
// 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;

View File

@@ -0,0 +1,90 @@
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('blog:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val: string) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error: { syscall: null , code: null} ) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

View File

@@ -0,0 +1,16 @@
module.exports = {
mysql: {
host: 'localhost',
user: 'root',
password: 'lb714500',
database: 'news'
},
sql: {
login: 'SELECT id,username,token from user where username = ? and userpassword = ?',
add: 'INSERT INTO `user` (username,userpassword) VALUES (?, ?)'
}
}
// nodejs + babel
// module.exports

View File

@@ -0,0 +1,29 @@
var mysql = require('mysql');
var config = require('../config/index');
// 表示定义类 db
class DB {
public connection: any;
// 构造函数,类第一个运行的方法
// 做变量的初始化,或者方法的调用
constructor() {
this.connection = mysql.createConnection(config.mysql);
this.connection.connect();
}
public query(params: { sql: String, par: [] }): any {
return new Promise((reject,resove) => {
this.connection.query(params.sql, params.par, (error: any, results: any, fields: any) => {
console.log(results)
if (error) throw error;
reject(results);
});
})
}
}
module.exports = new DB()

View File

@@ -0,0 +1,11 @@
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
div {
margin: 100px;
}
}
a {
color: #00B7FF;
}

View File

@@ -0,0 +1,32 @@
$(".submitAdd").click(function() {
var name = $(".name").val();
var pwd = $(".pwd").val();
var repwd = $(".repwd").val();
if((name.length !=0 && pwd.length !=0 && repwd.length !=0) && pwd == repwd) {
$.ajax({
url: 'http://127.0.0.1:3000/admin/api/add',
type: 'POST',
data: {
name: name,
pwd: repwd
},
success: function(res) {
if(res.status == 200) {
if(confirm("注册成功,点击确定登录")) {
location.href = "/admin/login"
}
} else {
alert(res.message)
}
},
error: function(err) {
}
})
} else {
alert("有信息未填写,或者两次密码不相同")
}
})

View File

@@ -0,0 +1,31 @@
var E = window.wangEditor
var editor = new E('#editor')
editor.create()
$(".pushArticel").click(function() {
var title = $(".title").val()
var introduction = $(".introduction").val()
var author = $(".author").val()
var content = editor.txt.html()
// 验证用户是否输入内容,有没填写的给提示
// 对push接口实现token验证的调用
// 登录成功本地保存 token发送ajax请求头携带token
//
$.ajax({
url: 'http://127.0.0.1:3000/admin/api/push',
type: 'POST',
data: {
title: title,
introduction: introduction,
author: author,
content: content
},
success: function(res) {
console.log(res);
},
error: function(err) {}
})
});

View File

@@ -0,0 +1,34 @@
$(".submitLogin").click(function() {
var userName = $("input[type='text']").val()
var userPassword = $("input[type='password']").val()
if(userName.length == 0 || userPassword.length ==0) {
alert("账户密码为空")
} else {
$.ajax({
url: 'http://127.0.0.1:3000/admin/api/login',
type: 'POST',
headers: {
token: '645e8c56a66e32792f224730fd238711'
},
data: {
name: userName,
pwd: userPassword
},
success: function(res) {
if (res.status == 200) {
location.href = "/admin/home"
} else {
alert(res.message)
}
},
error: function(err) {
}
})
}
});

View File

@@ -0,0 +1 @@
console.log("js")

View File

@@ -0,0 +1,16 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index')
router.post('/push',function (req: any, res: any, next: Function) {
var title = req.body.title,
introduction = req.body.introduction,
author = req.body.author,
content = req.body.content;
console.log(title,content);
});
module.exports = router;

View File

@@ -0,0 +1,67 @@
var express = require('express');
var router = express.Router();
var db = require("../../../db/index")
var utils = require("../../../utils/index")
var admin = require("../../../Interceptor/index")
var config = require("../../../config/index")
// 页面访问权限控制,
// 未登录方位页面的时候,强制去登录
// 已登录:直接访问页面
// express-session + express 路由拦截器 实现
// api 接口 token 的实现
router.post('/login',async function (req: any, res: any, next: Function) {
var username = req.body.name;
var pwd = req.body.pwd;
var data = await db.query({
sql: config.sql.login,
par: [username, utils.password(pwd)]
});
if (data.length != 0) {
// 生成token + 随机字符串
var token = utils.md5token(JSON.stringify(data[0]))
req.session.user = data[0]
console.log("req.session.user ", req.session.user);
await db.query({ sql: 'UPDATE user set token = ? WHERE id = ?', par: [token, data[0].id] });
res.json({
status: 200,
message: '登录成功',
data: data[0]
});
} else {
res.json({
status: 404,
message: '用户名或密码错误',
data: null
});
}
});
router.post('/add', async function (req: any, res: any, next: Function) {
var name = req.body.name;
var pwd = req.body.pwd;
var result = await db.query({ sql: config.sql.add, par: [name, utils.password(pwd) ] });
console.log(result);
if (result.hasOwnProperty("insertId")) {
res.json({
status: 200,
message: '注册成功',
data: null
});
} else {
res.json({
status: 500,
message: '注册失败,重新尝试',
data: result
});
}
});
module.exports = router;

View File

@@ -0,0 +1,17 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index')
router.get('/push',function (req: any, res: any, next: Function) {
console.log("wewfwefwr");
res.render("admin/page/push", {
showHeader: true,
showLeftMenu: true,
showFooter: true,
user: req.session.user
})
});
module.exports = router;

View File

@@ -0,0 +1,22 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index')
router.get('/home',admin.adminPageInterceptor,function (req: any, res: any, next: Function) {
res.render("admin/page/home",{
showHeader: true,
showLeftMenu: false,
showFooter: true,
user: req.session.user
})
});
router.get('/logout',function (req: any, res: any, next: Function) {
// 清除用户的登录信息
req.session.user = null
// 重定向到登录页面
res.redirect("/admin/login")
});
module.exports = router;

View File

@@ -0,0 +1,23 @@
var express = require('express');
var router = express.Router();
router.get('/login', function (req: any, res: any, next: Function) {
res.render('admin/page/login', {
title: '用户登录',
showHeader: false,
showLeftMenu: false,
showFooter: false
});
});
router.get('/add', function (req: any, res: any, next: Function) {
res.render('admin/page/add', {
title: '用户注册',
showHeader: false,
showLeftMenu: false,
showFooter: false
});
});
module.exports = router;

View File

@@ -0,0 +1,15 @@
var express = require('express');
var router = express.Router();
var db = require('../db/index');
router.get('/', function(req:any, res: any, next: Function) {
var id = req.query.id
db.query({
sql: 'SELECT * from user where id = ?',
par: [ id ]
}, (result: Object) => {
res.json(result);
});
});
module.exports = router;

View File

@@ -0,0 +1,9 @@
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req:any, res: any, next: Function) {
res.send('respond with a resource');
});
module.exports = router;

View File

@@ -0,0 +1,20 @@
var md5 = require("md5");
class Utils {
/**
* 生成token
* @param message
*/
public md5token (message: string): string {
return md5(message + Date.now());
}
public password(str: string): string {
return md5(str);
}
}
module.exports = new Utils()

View File

@@ -0,0 +1,19 @@
doctype html
html
head
title= title
script(src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js")
block assets
body
if showHeader
include tpl/header.pug
if showLeftMenu
include tpl/leftMenu.pug
block content
if showFooter
include tpl/footer.pug
block js

View File

@@ -0,0 +1,14 @@
extends ../layout
block assets
link(rel="stylesheet", href="")
block content
h2 用户注册
input(class="name" type="text" placeholder="请输入用户名")
input(class="pwd" type="password" placeholder="请输入密码")
input(class="repwd" type="password" placeholder="请输入确认密码")
input(class="submitAdd" type="button" value=" 注 册 ")
block js
script(src="/js/admin/add.js")

View File

@@ -0,0 +1,9 @@
extends ../layout
block assets
link(rel="stylesheet", href="")
block content
h2 欢迎管理员 #{user.username} 登录
block js

View File

@@ -0,0 +1,13 @@
extends ../layout
block assets
link(rel="stylesheet", href="")
block content
h2 登录
input(type="text" placeholder="请输入用户名")
input(type="password" placeholder="请输入密码")
input(class="submitLogin" type="button" value="登录")
block js
script(src="/js/admin/user.js")

View File

@@ -0,0 +1,21 @@
extends ../layout
block assets
link(rel="stylesheet", href="")
block content
.push
input(class="title" placeholder="文章标题")
br
input(class="introduction" placeholder="文章简介")
br
input(class="author" placeholder="文章作者")
br
#editor
p 请开始你的文章创作
br
button(class="pushArticel") 发布
block js
script(src="/js/admin/push.js")

View File

@@ -0,0 +1,3 @@
h2 底部版权
script(src="https://unpkg.com/wangeditor@3.1.1/release/wangEditor.min.js")

View File

@@ -0,0 +1,17 @@
div(style="float:right")
//- #{user.username}
a(href="/admin/logout") 退出登录
ul
li
a(href="/") 首页
li
a(href="/admin/all") 所有文章
li
a(href="/admin/push") 发布文章
li
a(href="/admin/UserCenter") 用户管理
li
a(href="/admin/comment") 评论管理
li
a(href="/admin/setting") 网站设置

View File

@@ -0,0 +1 @@
h2 左边菜单

View File

@@ -0,0 +1,6 @@
extends layout
block content
h1= message
h2= error.status
pre #{error.stack}

View File

@@ -0,0 +1,5 @@
extends layout
block content
h1= title
p 测试你好wwww #{title}

View File

@@ -0,0 +1,7 @@
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content