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,46 @@
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var typeRouter = require('./routes/type');
var app = express();
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Methods', '*');
res.header('Content-Type', 'application/json;charset=utf-8');
next();
});
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use('/index', indexRouter);
app.use('/users', usersRouter);
app.use('/class', typeRouter)
// 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);
});
module.exports = app;

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('myapp: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) {
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) {
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();
console.log('App is run this: http://127.0.0.1:' + addr.port);
}

View File

@@ -0,0 +1,19 @@
module.exports = {
HomeUrl: 'https://m.zongheng.com/h5/index?h5=1',
typeUrl: 'https://m.zongheng.com/h5/category/nav?h5=1',
classInfoUrl: 'https://m.zongheng.com/h5/ajax/category/details',
bookInfoUrl: 'https://m.zongheng.com/h5/book?bookid=',
chapterListInfo: 'https://m.zongheng.com/h5/ajax/chapter/list?h5=1&bookId=',
chapterRead: 'https://m.zongheng.com/h5/ajax/chapter?bookId=',
mysql: {
host : '127.0.0.1',
user : 'root',
password : 'lb714500',
database : 'xiaoshuo',
connectionLimit : 10
},
sql: {
userlogin: 'select id,user_name from user where user_name = ? and user_pwd = ?',
usercollect: 'INSERT INTO `like` ( user_userid , like_bookid ) VALUES (?,? )'
}
}

View File

@@ -0,0 +1,14 @@
const mysql = require('yn-mysql-utils');
const config = require('../config')
class DB {
constructor () {
this.db = new mysql(config.mysql)
}
async Query (params) {
return await this.db.Query(params)
}
}
module.exports = new DB()

View File

@@ -0,0 +1,24 @@
const request = require('request');
const config = require('../config');
class HttRequest {
get (params) {
return new Promise(function(resolve,reject){
var options = {
url: params.url,
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36'
}
};
request(options, function (error, response, body) {
if (error) {
reject(error.message);
} else {
resolve(body)
}
});
})
}
}
module.exports = new HttRequest();

View File

@@ -0,0 +1,18 @@
{
"name": "myapp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node-dev ./bin/www"
},
"dependencies": {
"cheerio": "^1.0.0-rc.3",
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"morgan": "~1.9.1",
"request": "^2.88.0",
"yn-mysql-utils": "^1.0.4"
}
}

View File

@@ -0,0 +1,80 @@
const express = require('express');
const router = express.Router();
const $http = require('../http');
const config = require('../config');
const utils = require('../utils');
router.get('/', async function(req, res, next) {
try {
let $ = utils.cheerioLoad(await $http.get({ url: config.HomeUrl }));
let MainData = {
banner: [],
booklist: []
};
// 抓取banner轮播图数据
let BannerData = []
$(".slider-top-pic li").each(function() {
BannerData.push({
imgUrl: $(this).find('img').attr("src"),
href: 'https://m.zongheng.com' + $(this).attr("data-url")
})
});
MainData.banner = BannerData
// 抓取 编辑力荐begin 的数据
let HomeTop = {}
HomeTop.title = $(".home-top .home-card-title i").text()
HomeTop.list = []
$('.home-top .home-book-item').each(function() {
HomeTop.list.push({
imgUrl: $(this).find("img").attr("src"),
title: $(this).find("img").attr("alt"),
id: utils.getUrlParam($(this).attr("data-url"),"bookid"),
desc: $(this).find(".desc").text(),
class: $(this).find(".item-label").text()
})
});
MainData.booklist.push(HomeTop)
// 男生必读 & 女生爱看
let HomeBoy = {}
HomeBoy.title = $(".home-boy .home-card-title i").text()
HomeBoy.list = []
$('.home-boy .home-book-box').each(function() {
HomeBoy.list.push({
imgUrl: $(this).find("img").attr("data-src"),
title: $(this).find("img").attr("alt"),
id: utils.getUrlParam($(this).attr("data-url"),"bookid"),
desc: "",
class: ""
})
});
MainData.booklist.push(HomeBoy)
// 仙侠奇幻
let xianBook = {}
let xian = $(".home-card")[3]
xianBook.title = $(xian).find(".home-card-title .flex--fluid").text()
xianBook.top = {
imgUrl: $(xian).find(".book-img-border img").attr("data-src"),
title: $(xian).find(".font-a").text(),
id: utils.getUrlParam($(xian).find(".home-book-item").attr("data-url"),"bookid"),
desc: $(xian).find(".desc").text(),
class: $(xian).find(".item-label").text(),
}
xianBook.list = []
$(xian).find(".home-row-line").each(function() {
xianBook.list.push({
title: $(this).find("span").text(),
id: utils.getUrlParam($(this).attr("href"),"bookid")
})
})
MainData.booklist.push(xianBook)
utils.JsonData({ res: res, status: 200, data: MainData })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
module.exports = router;

View File

@@ -0,0 +1,147 @@
const express = require('express');
const router = express.Router();
const $http = require('../http');
const config = require('../config');
const utils = require('../utils');
/**
* 获取小说所有分类
* http://127.0.0.1:3000/class/allClass
*/
router.get('/allClass', async function(req, res, next) {
try {
let $ = utils.cheerioLoad(await $http.get({ url: config.typeUrl }));
let typeList = []
$(".cat_box").each(function(i) {
typeList.push({
title: $(this).find(".cat_tit .cat_more").prev().text(),
pid: utils.getUrlParam($(this).find(".cat_tit .cat_more").prev().attr("href"), "cPid")
});
typeList[i]['child'] = []
$(this).find(".cat_list li").each(function() {
typeList[i]['child'].push({
text: $(this).find("a").text(),
cid: utils.getUrlParam($(this).find("a").attr("href"), "cid")
})
})
});
utils.JsonData({ res: res, status: 200, data: typeList })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
/**
* 获取对应小说分类的数据
* http://127.0.0.1:3000/class/classInfo?cPid=1&cid=1001&pageNum=1
* cid == -1 表示请求大分类数据
* cid != -1 表示请求大分类下小分类的数据
*/
router.get('/classInfo', async function(req, res, next) {
let cPid = parseInt(req.query.cPid),
cid = parseInt(req.query.cid),
pageNum = req.query.pageNum,
url = null;
if (cid == -1) {
url = `${config.classInfoUrl}?cPid=${cPid}&cid=-1&type=1&pageSize=10&pageNum=${pageNum}&bookType=0&callback=jsonp1`
} else {
url = `${config.classInfoUrl}?cPid=${cPid}&cid=${cid}&type=1&pageSize=10&pageNum=${pageNum}&bookType=0&callback=jsonp1`
}
try {
let data = JSON.parse((await $http.get({ url: url })).match(/jsonp1\(([\s\S]*?)\)/)[1]);
data.ranklist.forEach((val) => val.coverUrl = 'https://static.zongheng.com/upload/s_image'+val.coverUrl);
utils.JsonData({ res: res, status: 200, data: data })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
/**
* 进入小说详情
* http://127.0.0.1:3000/class/bookInfo?bookid=722486
*/
router.get('/bookInfo', async function(req, res, next) {
try {
let bookid = req.query.bookid;
let $ = utils.cheerioLoad(await $http.get({ url: config.bookInfoUrl+bookid }));
let bookInfo = {};
bookInfo.imgurl = $('.bookimg img').attr("src")
bookInfo.title = $('.booksite .bookname').text()
bookInfo.author = $($('.booksite .info div')[0]).find("span").text()
bookInfo.type = $($('.booksite .info div')[1]).find("span").text()
bookInfo.wordNum = $($('.booksite .info div')[2]).find("span").text()
bookInfo.readNum = $($('.booksite .info div')[3]).find("span").text()
bookInfo.desc = $(".book_intro").text()
bookInfo.newitem = {
text: $('.booksite #lastupdate .last_tit').text(),
zid: $('.booksite #lastupdate').attr("chapterid")
}
bookInfo.zjList = [];
$("#coverl_atz a").each(function() {
bookInfo.zjList.push({
text: $(this).text(),
zid: utils.getUrlParam($(this).attr("href"),"cid")
})
})
utils.JsonData({ res: res, status: 200, data: bookInfo })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
/**
* 获取小说的所有章节目录
* http://127.0.0.1:3000/class/chapterList?bookid=722486&pageNum=1
*/
router.get('/chapterList', async function(req, res, next) {
try {
let bookid = req.query.bookid,
pageNum = req.query.pageNum;
let url = `${config.chapterListInfo}${bookid}&pageNum=${pageNum}&pageSize=20&chapterId=&asc=0&callback=jsonp1`
let data = JSON.parse((await $http.get({ url: url })).match(/jsonp1\(([\s\S]*?)\)/)[1]);
utils.JsonData({ res: res, status: 200, data: data })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
/**
* 获取小说章节的内容
* http://127.0.0.1:3000/class/chapterRead?bookid=722486&chapterId=39865789
*/
router.get('/chapterRead', async function(req, res, next) {
try {
let bookid = req.query.bookid,
chapterId = req.query.chapterId;
let url = `${config.chapterRead}${bookid}&chapterId=${chapterId}&v=1565096009107&callback=jsonp1`
let data = JSON.parse((await $http.get({ url: url })).match(/jsonp1\(([\s\S]*?)\)/)[1]);
utils.JsonData({ res: res, status: 200, data: data })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
/**
* 点击章节目录开始阅读章节
* http://127.0.0.1:3000/class/chapterRead?bookid=722486&chapterId=39865789
*/
router.get('/chapterRead', async function(req, res, next) {
try {
let bookid = req.query.bookid,
chapterId = req.query.chapterId;
let url = `${config.chapterRead}${bookid}&chapterId=${chapterId}&callback=jsonp2`
console.log(url)
let data = JSON.parse((await $http.get({ url: url })).match(/jsonp2\(([\s\S]*?)\)/)[1]);
utils.JsonData({ res: res, status: 200, data: data })
} catch (error) {
utils.JsonData({ res: res, status: 404, data: error.message })
}
});
module.exports = router;

View File

@@ -0,0 +1,41 @@
var express = require('express');
var router = express.Router();
var db = require("../db");
var config = require("../config")
var utils = require('../utils');
router.get('/getAll', async function(req, res, next) {
let da = await db.Query({
sql: 'select * from user',
par: []
})
res.json(da);
});
router.post('/userLogin', async function(req, res, next) {
var username = req.body.username,
userpwd = req.body.userpwd;
let da = await db.Query({
sql: config.sql.userlogin,
par: [ username, userpwd ]
})
da.length ==0 ? utils.JsonData({ res: res, status: 404, data: "账户密码错误" }):
utils.JsonData({ res: res, status: 200, data: da[0] })
});
router.post('/collection', async function(req, res, next) {
var bookid = req.body.bookid,
uid = req.body.id;
console.log(uid,bookid)
let da = await db.Query({
sql: config.sql.usercollect,
par: [uid, bookid]
})
da.length == 0 ? utils.JsonData({ res: res, status: 404, data: "收藏出错" }):
utils.JsonData({ res: res, status: 200, data: '收藏成功' })
});
module.exports = router;

View File

@@ -0,0 +1,23 @@
const cheerio = require('cheerio')
class utils {
cheerioLoad(html) {
return cheerio.load(html)
}
JsonData (params) {
params.res.json({
status: params.status,
data: params.data
})
}
getUrlParam (path,name) {
path = "?"+path.split("?")[1]
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
var r = path.substr(1).match(reg);
if (r != null) return decodeURIComponent(r[2]); return null;
}
}
module.exports = new utils()

View File

@@ -0,0 +1,11 @@
明天实现 uniapp 首页界面
参考地址https://m.zongheng.com/
课下任务:
1实现 小说目录 的接口
小说接口:
https://m.zongheng.com/h5/ajax/chapter?bookId=576044&chapterId=33048748&v=1565096009107&callback=jsonp1