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

23
.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

1
.pydio Normal file
View File

@@ -0,0 +1 @@
342ce74d-87d3-4892-84cf-bed789760a4d

View File

@@ -0,0 +1,89 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var db = require("../db/index");
var Interceptor = (function () {
function Interceptor() {
}
Interceptor.prototype.adminPageInterceptor = function (req, res, next) {
console.log(req.session.user);
if (req.session.user == undefined) {
res.json({
status: 404,
message: '您还未登录, 请访问 /admin/login 登录'
});
}
else {
next();
}
};
Interceptor.prototype.adminInterceptor = function (req, res, next) {
return __awaiter(this, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!(req.headers.token != undefined)) return [3, 2];
return [4, db.query({
sql: 'SELECT * from user where token = ?',
par: [req.headers.token]
})];
case 1:
data = _a.sent();
if (data.length != 0) {
next();
}
else {
res.json({
status: 500,
message: 'token已经失效请重新登录'
});
}
return [3, 3];
case 2:
res.json({
status: 500,
message: '请勿非法访问接口缺少token'
});
_a.label = 3;
case 3: return [2];
}
});
});
};
return Interceptor;
}());
module.exports = new Interceptor();

View File

@@ -0,0 +1,46 @@
var createError = require('http-errors');
var express = require('express');
var session = require('express-session');
var path = require('path');
var cookieParser = require('cookie-parser');
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
}
}));
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(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);
app.use('/admin/api', AdminApiUsersRouter);
app.use('/admin/api', AdminApiArticleRouter);
app.use(function (req, res, next) {
next(createError(404));
});
app.use(function (err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
});
module.exports = app;

47
历届学生/17届课程/blog/dist/bin/www.js vendored Executable file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env node
var app = require('../app');
var debug = require('debug')('blog:server');
var http = require('http');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
return val;
}
if (port >= 0) {
return port;
}
return false;
}
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
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;
}
}
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,12 @@
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 (?, ?)'
}
};

View File

@@ -0,0 +1,21 @@
var mysql = require('mysql');
var config = require('../config/index');
var DB = (function () {
function DB() {
this.connection = mysql.createConnection(config.mysql);
this.connection.connect();
}
DB.prototype.query = function (params) {
var _this = this;
return new Promise(function (reject, resove) {
_this.connection.query(params.sql, params.par, function (error, results, fields) {
console.log(results);
if (error)
throw error;
reject(results);
});
});
};
return DB;
}());
module.exports = new DB();

View File

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

View File

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,8 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index');
router.post('/push', function (req, res, next) {
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,113 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
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");
router.post('/login', function (req, res, next) {
return __awaiter(this, void 0, void 0, function () {
var username, pwd, data, token;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
username = req.body.name;
pwd = req.body.pwd;
return [4, db.query({
sql: config.sql.login,
par: [username, utils.password(pwd)]
})];
case 1:
data = _a.sent();
if (!(data.length != 0)) return [3, 3];
token = utils.md5token(JSON.stringify(data[0]));
req.session.user = data[0];
console.log("req.session.user ", req.session.user);
return [4, db.query({ sql: 'UPDATE user set token = ? WHERE id = ?', par: [token, data[0].id] })];
case 2:
_a.sent();
res.json({
status: 200,
message: '登录成功',
data: data[0]
});
return [3, 4];
case 3:
res.json({
status: 404,
message: '用户名或密码错误',
data: null
});
_a.label = 4;
case 4: return [2];
}
});
});
});
router.post('/add', function (req, res, next) {
return __awaiter(this, void 0, void 0, function () {
var name, pwd, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
name = req.body.name;
pwd = req.body.pwd;
return [4, db.query({ sql: config.sql.add, par: [name, utils.password(pwd)] })];
case 1:
result = _a.sent();
console.log(result);
if (result.hasOwnProperty("insertId")) {
res.json({
status: 200,
message: '注册成功',
data: null
});
}
else {
res.json({
status: 500,
message: '注册失败,重新尝试',
data: result
});
}
return [2];
}
});
});
});
module.exports = router;

View File

@@ -0,0 +1,13 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index');
router.get('/push', function (req, res, next) {
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,16 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index');
router.get('/home', admin.adminPageInterceptor, function (req, res, next) {
res.render("admin/page/home", {
showHeader: true,
showLeftMenu: false,
showFooter: true,
user: req.session.user
});
});
router.get('/logout', function (req, res, next) {
req.session.user = null;
res.redirect("/admin/login");
});
module.exports = router;

View File

@@ -0,0 +1,6 @@
var express = require('express');
var router = express.Router();
var admin = require('../../../Interceptor/index');
router.get('/push', admin.adminPageInterceptor, function (req, res, next) {
});
module.exports = router;

View File

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

View File

@@ -0,0 +1,14 @@
var express = require('express');
var router = express.Router();
router.get('/login', function (req, res, next) {
res.render('admin/page/login', {
title: '用户登录',
showHeader: false,
showLeftMenu: false,
showFooter: false
});
});
router.get('/add', function (req, res, next) {
res.send('respond with a resource');
});
module.exports = router;

View File

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

View File

@@ -0,0 +1,6 @@
var express = require('express');
var router = express.Router();
router.get('/', function (req, res, next) {
res.send('respond with a resource');
});
module.exports = router;

View File

@@ -0,0 +1,13 @@
var md5 = require("md5");
var Utils = (function () {
function Utils() {
}
Utils.prototype.md5token = function (message) {
return md5(message + Date.now());
};
Utils.prototype.password = function (str) {
return md5(str);
};
return Utils;
}());
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

View File

@@ -0,0 +1,37 @@
const gulp = require("gulp");
const less = require('gulp-less');
/**
* 编译less为css
*/
gulp.task('less', function () {
return gulp.src('./src/public/css/**/*.less')
.pipe(less())
.pipe(gulp.dest('./dist/public/css/'));
});
gulp.task('copyImg', function () {
return gulp.src('./src/public/img/**/*')
.pipe(gulp.dest('./dist/public/img/'));
});
gulp.task('copyJS', function () {
return gulp.src('./src/public/js/**/*')
.pipe(gulp.dest('./dist/public/js/'));
});
gulp.task('copyPug', function () {
return gulp.src('./src/views/**/*')
.pipe(gulp.dest('./dist/views/'));
});
gulp.task('file', function () {
gulp.watch("./src/public", gulp.parallel('less','copyImg','copyJS','copyPug'))
gulp.watch("./src/views", gulp.parallel('copyPug'))
})
gulp.task('default', gulp.series('file'))

View File

@@ -0,0 +1,16 @@
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'lb714500',
database : 'demos'
});
connection.connect();
connection.query('SELECT * from user where id = 1', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
});
connection.end();

View File

@@ -0,0 +1,28 @@
{
"name": "blog",
"version": "0.0.0",
"private": true,
"scripts": {
"tsc": "tsc -w",
"dev": "concurrently \"gulp\" \"npm run start\"",
"start": "node-dev ./dist/bin/www.js"
},
"dependencies": {
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"express-session": "^1.17.0",
"http-errors": "~1.6.3",
"less-middleware": "~2.2.1",
"md5": "^2.2.1",
"morgan": "~1.9.1",
"mysql": "^2.17.1",
"pug": "2.0.0-beta11"
},
"devDependencies": {
"@types/mysql": "^2.15.8",
"@types/node": "^12.12.11",
"gulp": "^4.0.2",
"gulp-less": "^4.0.1"
}
}

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

View File

@@ -0,0 +1,8 @@
POST http://127.0.0.1:3000/admin/api/add HTTP/1.1
content-type: application/json
token: 645e8c56a66e32792f224730fd238711
{
"name": "sample",
"pwd": "567890"
}

View File

@@ -0,0 +1,17 @@
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": false,
"outDir": "dist/"
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}

View File

@@ -0,0 +1 @@
gulp

View File

@@ -0,0 +1,36 @@
.DS_Store
shop_backend/node_modules/
shop_fontend/node_modules/
shop_fontend/dist
ApiTest/ApiTest/node_modules
ApiTest/ApiTest-Mac/node_modules
shop_fontend/*.iml
shop_fontend/.gradle
shop_fontend/local.properties
shop_fontend/.idea/libraries
shop_fontend/.idea/modules.xml
shop_fontend/.idea/workspace.xml
shop_fontend/.DS_Store
shop_fontend/build
shop_fontend/captures
shop_fontend/.externalNativeBuild
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/.idea/
/shop_android/app/src/main/assets/

View File

@@ -0,0 +1,6 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>夜色社区Api调试工具</title><style>textarea,
input,
button,
.el-popover--plain{
-webkit-app-region: no-drag;
}</style><link href=./static/css/app.926d2c721d951ea0fd744c2204f0d754.css rel=stylesheet></head><body style="-webkit-app-region: drag"><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.9171202457a637e0497a.js></script><script type=text/javascript src=./static/js/app.d188f0af736e0d308107.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a<e.length;a++)i=e[a],o[i]&&l.push(o[i][0]),o[i]=0;for(f in u)Object.prototype.hasOwnProperty.call(u,f)&&(r[f]=u[f]);for(n&&n(e,u,c);l.length;)l.shift()();if(c)for(a=0;a<c.length;a++)p=t(t.s=c[a]);return p};var e={},o={2:0};function t(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return r[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=r,t.c=e,t.d=function(r,n,e){t.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:e})},t.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return t.d(n,"a",n),n},t.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},t.p="./",t.oe=function(r){throw console.error(r),r}}([]);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,53 @@
const { app, BrowserWindow } = require('electron')
// 保持对window对象的全局引用如果不这么做的话当JavaScript对象被
// 垃圾回收的时候window对象将会自动的关闭
let win
function createWindow () {
// 创建浏览器窗口。
win = new BrowserWindow({
title: 'YeSeApiTest',
width: 955,
height: 620,
resizable: false,
titleBarStyle: 'hidden',
allowRunningInsecureContent: true
})
// 然后加载应用的 index.html。
win.loadFile('dist/index.html')
// 当 window 被关闭,这个事件会被触发。
win.on('closed', () => {
// 取消引用 window 对象,如果你的应用支持多窗口的话,
// 通常会把多个 window 对象存放在一个数组里面,
// 与此同时,你应该删除相应的元素。
win = null
})
}
require('./menu');
// Electron 会在初始化后并准备
// 创建浏览器窗口时,调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.on('ready', createWindow)
// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
// 在 macOS 上,除非用户用 Cmd + Q 确定地退出,
// 否则绝大部分应用及其菜单栏会保持激活。
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
// 在macOS上当单击dock图标并且没有其他窗口打开时
// 通常在应用程序中重新创建一个窗口。
if (win === null) {
createWindow()
}
})

View File

@@ -0,0 +1,88 @@
const { app, Menu } = require('electron')
const template = [
{
label: '编辑',
submenu: [
{ role: 'undo' },
{ role: 'redo' },
{ type: 'separator' },
{ role: 'cut' },
{ role: 'copy' },
{ role: 'paste' },
{ role: 'delete' },
{ role: 'selectall' }
]
},
{
label: '视图',
submenu: [
{ role: 'reload' },
{ role: 'forcereload' },
{ type: 'separator' },
{ type: 'separator' },
{ role: 'togglefullscreen' }
]
},
{
label: '窗口',
submenu: [
{ role: 'minimize' },
{ role: 'close' }
]
},
{
label: '帮助',
submenu: [
{
label: '接口文档',
click () { require('electron').shell.openExternal('https://geekhelp.cn/docs/index.html') }
},
{
label: 'Github',
click () { require('electron').shell.openExternal('https://github.com/helpcode') }
}
]
}
]
if (process.platform === 'darwin') {
template.unshift({
label: app.getName(),
submenu: [
{ role: 'about' },
{ type: 'separator' },
{ role: 'services' },
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideothers' },
{ role: 'unhide' },
{ type: 'separator' },
{ role: 'quit' }
]
})
// Edit menu
template[1].submenu.push(
{ type: 'separator' },
{
label: 'Speech',
submenu: [
{ role: 'startspeaking' },
{ role: 'stopspeaking' }
]
}
)
// Window menu
template[3].submenu = [
{ role: 'close' },
{ role: 'minimize' },
{ role: 'zoom' },
{ type: 'separator' },
{ role: 'front' }
]
}
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)

View File

@@ -0,0 +1,17 @@
{
"name": "ApiTest-Mac",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "electron .",
"win": "electron-packager ./ 'YeSeApiTest' --platform=win32 --arch=x64 --electron-version=7.1.3 --icon=logo.icns --out=./build --asar --overwrite",
"build": "electron-packager . 'YeSeApiTest' --electronVersion=7.1.3 --platform=darwin --arch=x64 --icon=logo.icns --out=./build --asar --app-version=1.2.1 --ignore='(src|docs|.gitignore|LICENSE|README.md|webpack.config*|node_modules)' --overwrite"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"electron-packager": "^13.0.1"
}
}

View File

@@ -0,0 +1,12 @@
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"]
}

View File

@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

View File

@@ -0,0 +1,14 @@
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

View File

@@ -0,0 +1,10 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

View File

@@ -0,0 +1,21 @@
# apitest
> A Vue.js project
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
```
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

View File

@@ -0,0 +1,41 @@
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

Some files were not shown because too many files have changed in this diff Show More