Переглянути джерело

后端框架及部分api获取

lybenson 8 роки тому
батько
коміт
f301355229

+ 4 - 0
bilibili-api/.babelrc

@@ -0,0 +1,4 @@
+{
+  "presets": ["es2015", "stage-2"],
+  "plugins": ["transform-runtime"]
+}

+ 5 - 0
bilibili-api/.gitignore

@@ -0,0 +1,5 @@
+.DS_Store
+node_modules/
+npm-debug.log
+unitTest/
+

+ 19 - 0
bilibili-api/app/middlewares/index.js

@@ -0,0 +1,19 @@
+async function catchError(ctx, next) {
+  try {
+    await next();
+    if (ctx.status === 404) ctx.throw(404);
+  } catch(err) {
+    let status = err.status || 500;
+    // let message = e.message || 'Server Error!'
+    ctx.status = status;
+    ctx.state = {
+      status: status,
+      helpers: helpers,
+      currentUser: null
+    };
+    await ctx.render('error/error', {});
+    if (status == 500) {
+      console.log('server error', err, ctx);
+    }
+  }
+}

+ 13 - 0
bilibili-api/app/routes/banner.js

@@ -0,0 +1,13 @@
+import router from 'koa-router'
+import axios from 'axios'
+const router = Router({
+  prefix: '/banner'
+})
+router.post('/list', async (ctx, next) => {
+  let response = await axios.get('http://api.bilibili.com/x/web-show/res/loc?callback=jQuery17205969745067413896_1482805801285&jsonp=jsonp&pf=0&id=23&_=1482805801599')
+  ctx.body = response
+})
+
+
+
+export default router

+ 22 - 0
bilibili-api/app/routes/index.js

@@ -0,0 +1,22 @@
+import Router from 'koa-router'
+
+import banner from './banner'
+
+
+const router = Router()
+
+// koa-router 支持中间件来处理路由的 通过use方法注册中间件
+
+// 任何路由都会匹配此中间件  并通过next传递给下一个
+router.use(async (ctx, next) => {
+	await next()
+})
+
+// 根据请求方法匹配中间件
+// router.get().post()
+
+// routes表示的是路由的嵌套处理
+router.use(banner.routes(), account.allowedMethods())
+
+export default router
+

+ 20 - 0
bilibili-api/app/routes/urlConfig.js

@@ -0,0 +1,20 @@
+// 轮播图
+export const banner = 'http://api.bilibili.com/x/web-show/res/loc?callback=jQuery17205969745067413896_1482805801285&jsonp=jsonp&pf=0&id=23&_=1482805801599'
+
+// 默认搜索单词
+export const getSearchDefaultWords = 'http://www.bilibili.com/widget/getSearchDefaultWords'
+
+// 主站头部背景图
+export const topbg = 'http://api.bilibili.com/x/web-show/res/loc?callback=jQuery1720029742745197591347_1488209619074&pf=0&id=142&jsonp=jsonp&_=1488209619792'
+
+// 各分类热门内容
+export const hot = 'http://api.bilibili.com/x/web-show/res/locs?callback=jQuery1720029742745197591347_1488209619075&pf=0&ids=1550%2C1554%2C1556%2C1558%2C1560%2C1562%2C1564%2C1566%2C1568%2C1570%2C1572%2C1574%2C1624%2C1636&jsonp=jsonp&_=1488209619803'
+
+// 推广
+export const promote = 'http://api.bilibili.com/x/web-show/res/loc?callback=jQuery1720029742745197591347_1488209619076&jsonp=jsonp&pf=0&id=34&_=1488209619911'
+
+// 推广右侧广告
+export const promoteAd = 'http://api.bilibili.com/x/web-show/res/loc?callback=jQuery1720029742745197591347_1488209619077&jsonp=jsonp&pf=0&id=29&_=1488209619914'
+
+// 直播
+export const liveXhr = 'http://live.bilibili.com/bili/recom?callback=liveXhrDone'

+ 71 - 0
bilibili-api/app/server.js

@@ -0,0 +1,71 @@
+/////////////////MARK:必读////////////////
+//后来人,接受这个项目不要迷茫,不要彷徨
+//代码逻辑混乱,接口数据有问题,请你坚持下去
+//谨记,请勿辱骂前人
+
+import Koa from 'koa';
+import http from 'http'
+import convert from 'koa-convert'
+import logger from 'koa-logger'
+import cors from 'koa-cors' //跨域
+import bodyParser from 'koa-bodyparser' //请求体JSON解析
+import onerror from 'koa-onerror' //错误处理
+import resource from 'koa-static' //静态资源托管
+
+import path from 'path'
+
+import router from './routes'
+import config from '../config/config';
+
+// 同步已定义的模型到数据库
+// models.sync({force: true}).then(function () {
+// 	console.log('Server Success')
+// }).catch (function (error) {
+// 	console.log('Server Failed' + error)
+// })
+
+// import router from './routes';
+
+// import middlewares from './middlewares';
+// import cacheMiddle from './middlewares/cache';
+
+// const redisStore = koaRedis({
+//   url: config.redisUrl
+// });
+ 
+const app = new Koa();
+
+onerror(app)
+
+app.use(convert(cors()))
+
+app.use(convert(logger()))
+
+app.use(bodyParser())
+
+app.use(resource(path.join(__dirname, '../public')))
+console.log(path.join(__dirname, '../public'))
+// app.use(json({ pretty: false, param: 'pretty' }))
+
+app.use(async (ctx, next) => {
+	const start = new Date()
+	await next()
+	const ms = new Date() - start
+	console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
+})
+
+// router
+app.use(router.routes(), router.allowedMethods());
+
+
+app.on('error', (error, ctx) => {
+	console.log('奇怪的错误' + JSON.stringify(ctx.onerror))
+	console.log('server error:' + error)
+})
+
+http.createServer(app.callback()).listen(config.port).on('listening', function () {
+	console.log('正在监听端口' + config.port)
+})
+
+export default app;
+

+ 8 - 0
bilibili-api/app/utils/BaseResp.js

@@ -0,0 +1,8 @@
+class BaseResp {
+	constructor(status, msg) {
+    this.status = status;
+    this.msg = msg
+  }
+}
+
+export default BaseResp

+ 1 - 0
bilibili-api/app/utils/EnCodeKey

@@ -0,0 +1 @@
+34458910#;59363300#;

+ 52 - 0
bilibili-api/app/utils/EncryptUtil.js

@@ -0,0 +1,52 @@
+import crypto from 'crypto'
+
+// MD5加密
+function EncryptMD5 (data) {
+	let encryptMD5 = crypto.createHash('md5')
+	encryptMD5.update(data)
+	return encryptMD5.digest('hex')
+}
+
+
+// DES加密、解密,用来加密信息字段,无需App端解密
+// 私有方法
+function cipheriv (en, code, data) {
+	let buf1 = en.update(data, code)
+	let buf2 = en.final()
+	let r = new Buffer(buf1.length + buf2.length)
+	buf1.copy(r)
+	buf2.copy(r, buf1.length)
+	return r
+}
+
+// DES加密
+function DESEncrypt (data, key, vi) {
+	return data = cipheriv(crypto.createCipheriv('des', key, vi), 'utf8', data).toString('base64')
+}
+
+// DES解密
+function DESDecrypt (data, key, vi) {
+	return data = cipheriv(crypto.createDecipheriv('des', key, vi), 'base64', data).toString('utf8')
+}
+
+// AES加密
+function AESEncrypt (data, secretKey) {
+	let cipher = crypto.createCipher('aes-128-ecb', secretKey)
+	return cipher.update(data, 'utf8', 'hex') + cipher.final('hex')
+}
+
+// AES 解密
+function AESDecrypt (data, secretKey) {
+	let cipher = crypto.creatDecipher('aes-128-ecb', secretKey)
+	return cipher.update(data, 'hex', 'utf8') + cipher.final('utf8')
+}
+
+export {
+	EncryptMD5,
+	DESEncrypt,
+	DESDecrypt,
+	AESEncrypt,
+	AESDecrypt
+}
+
+

+ 9 - 0
bilibili-api/app/utils/ExcelHandler.js

@@ -0,0 +1,9 @@
+import XLSX from 'xlsx'
+
+// excel文件处理
+const parse = function() {
+	const workBook = XLSX.readFile('public/' + filename, {type: 'binary'})
+	const sheetNames = workBook.SheetNames
+
+	const workSheet = workBook.Sheets[sheetNames[0]] //获取单个表
+}

+ 16 - 0
bilibili-api/app/utils/resState.js

@@ -0,0 +1,16 @@
+const resState = {
+	re_success: 100, //正确的返回
+	re_error: 101, //未知错误
+	re_error_field: 102, //传入的字段不正确
+	re_error_custom: 103, //自定义错误
+	re_token_timeout: 104, //token过期
+	re_user_not_allowed: 201, //无权限
+	re_user_invalid: 202, //非法用户, token解密出来的userId和发送请求你的UserId不匹配
+	re_user_disable: 203, //账户已禁用
+	re_user_not_exist: 205, //用户不存在
+	re_user_psw_error: 206, //密码不正确
+	re_user_added: 207, //已添加的用户
+	re_news_delete_not_allow: 300 // 无权删除
+}
+
+export default resState

+ 20 - 0
bilibili-api/app/utils/smsCode.js

@@ -0,0 +1,20 @@
+import notp from 'notp'
+
+const opt = {
+    window: 0,
+}
+
+export default {
+  encode(key) { //生成短信验证码
+    return notp.totp.gen(key, opt)
+  },
+  decode(key, token) {  // 解码短信验证码
+    var login = notp.totp.verify(token, key, opt)
+    if (!login) {
+        return false
+    }
+    return true
+  }
+}
+
+

+ 95 - 0
bilibili-api/app/utils/utility.js

@@ -0,0 +1,95 @@
+import * as EncryptUtil from './EncryptUtil'
+import resState from './resState'
+import BaseResp from './BaseResp'
+
+import fs from 'fs'
+let file = fs.readFileSync('./app/utils/EnCodeKey', 'utf8')
+let key = file.split('#;')[0]
+let vi = file.split('#;')[1]
+
+// 响应结果
+let response = {
+	_errorResp(status, msg) {
+		return new BaseResp(status || resState.re_error, msg || '未知错误')
+	},
+	_successResp() {
+		return new BaseResp(resState.re_success, null)
+	},
+	fixErrorResp(reason) { //reason: {status, msg}
+		if (!reason) {
+			return this._errorResp()
+		}
+		if (reason.status && reason.msg) {
+			return this._errorResp(reason.status, reason.msg)
+		}
+		if (reason.status) {
+			return this._errorResp(reason.status)
+		}	
+		if (reason.msg) {
+			return this._errorResp(undefined, reason.msg)
+		}
+		return this._errorResp()
+	},
+	objSuccessResp(obj, resp) {
+		let res = resp || this._successResp()
+			res.data = obj
+		return res
+	},
+	listSuccessResp(list, resp) {
+		let res = resp || this._successResp()
+		res.list = list
+		return res
+	},
+	listCountSuccessResp(listCount, resp) {
+		let res = resp || this._successResp()
+		res.totalCount = listCount.count
+		res.list = listCount.rows
+		return res
+	}
+}
+
+//加密
+let encrypt = {
+	encryptMD5: (data) => {
+		return EncryptUtil.EncryptMD5(data)
+	},
+	desEncrypt: (data) => {
+		return EncryptUtil.DESEncrypt(data, key, vi)
+	},
+	desDecrypt: (data) => {
+		return EncryptUtil.DESDecrypt(data, key, vi)
+	}
+}
+
+//翻页
+let paginate = {
+	pageToOffsetLimit(page) {
+		var page = page || {offset: 0, limit: 10, page: 1}
+		if (page.page <= 0) {
+			page.page = 1
+		}
+		if (!page.pageSize || page.pageSize === undefined) {
+			page.pageSize = 10
+		}
+		return {offset: (page.page - 1) * page.pageSize, limit: page.pageSize}
+	},
+	getPage(reqObj, defaultPageSize) {
+		var page = {}
+		page.page = reqObj.page || 1
+		page.pageSize = reqObj.pageSize || defaultPageSize || 10
+		if (page.pageSize > 100) {
+			page.pageSize = 10
+		}
+		return page
+	}
+}
+
+// token
+let token = {
+	verifyToken(token, userId) {
+
+	},
+}
+export {
+	response, resState, encrypt, paginate, token
+}

+ 23 - 0
bilibili-api/config/config.js

@@ -0,0 +1,23 @@
+import _ from 'lodash'
+import development from './development'
+import production from './production'
+import test from './test'
+
+export const env = process.env.NODE_ENV || 'development'
+
+const configs = {
+  development: development,
+  test: test,
+  production: production
+}
+
+const defaultConfig = {
+  env: env
+}
+
+console.log(env + JSON.stringify(defaultConfig))
+
+// merge 组合两个对象成为一个对象
+const config = _.merge(defaultConfig, configs[env])
+
+export default config

+ 43 - 0
bilibili-api/config/database.js

@@ -0,0 +1,43 @@
+const database = {
+  test: {
+    username: process.env.DATABASE_USERNAME_TEST || '',
+    password: process.env.DATABASE_PASSWORD_TEST || '',
+    database: process.env.DATABASE_NAME_TEST || '',
+    appdatabase: process.env.DATABASE_APP_NAME_DEV || '',
+    host: process.env.DATABASE_HOST_TEST || '127.0.0.1',
+    dialect: 'mysql',
+    pool: {
+      max: 5,
+      min: 0,
+      idle: 10000
+    }
+  },
+  development: {
+    username: process.env.DATABASE_USERNAME_DEV || '',
+    password: process.env.DATABASE_PASSWORD_DEV || '',
+    database: process.env.DATABASE_NAME_DEV || '',
+    appdatabase: process.env.DATABASE_APP_NAME_DEV || '',
+    host: process.env.DATABASE_HOST_DEV || '',
+    dialect: 'mysql',
+    pool: {
+      max: 5,
+      min: 0,
+      idle: 10000
+    }
+  },
+  production: {
+    username: process.env.DATABASE_USERNAME_PRO || 'rongzhi',
+    password: process.env.DATABASE_PASSWORD_PRO || 'Rzmain!@123',
+    database: process.env.DATABASE_NAME_PRO || 'adviser_manager',
+    appdatabase: process.env.DATABASE_APP_NAME_DEV || 'rongzhi_dev',
+    host: process.env.DATABASE_HOST_PRO || '121.43.108.15',
+    dialect: 'mysql',
+    pool: {
+      max: 10,
+      min: 5,
+      idle: 30000
+    }
+  }
+}
+
+export default database

+ 11 - 0
bilibili-api/config/development.js

@@ -0,0 +1,11 @@
+const port = Number.parseInt(process.env.PORT) || 9050;
+
+export default {
+	registerUrl: 'http://121.43.108.15:9000/User/RegNewUser',
+  port: port,
+  hostName: 'http://localhost:' + port,
+  serveStatic: true,
+  assetHost: '',
+  redisUrl: 'redis://localhost:6379/1',
+  secretKeyBase: 'b90321d802cf09ef688b05eb6337efc3422b4e25fe42a311bc4e5ffb268c335590be89f464d3adabfbcfae4b431a5029ad6486bce777caa962d75a18322ea123'
+}

+ 11 - 0
bilibili-api/config/production.js

@@ -0,0 +1,11 @@
+const port = Number.parseInt(process.env.PORT) || 5000;
+
+export default {
+	registerUrl: 'http://app.topfundclub.com:9000/User/RegNewUser',
+  port: port,
+  hostName: process.env.HOST_NAME_PRO,
+  serveStatic: process.env.SERVE_STATIC_PRO || false,
+  assetHost: process.env.ASSET_HOST_PRO || '',
+  redisUrl: process.env.REDIS_URL_PRO,
+  secretKeyBase: process.env.SECRET_KEY_BASE
+}

+ 11 - 0
bilibili-api/config/test.js

@@ -0,0 +1,11 @@
+const port = Number.parseInt(process.env.PORT) || 9050;
+
+module.exports = {
+	registerUrl: 'http://121.43.108.15:9000/User/RegNewUser',
+  port: port,
+  hostName: '',
+  assetHost: '',
+  serveStatic: true,
+  redisUrl: 'redis://localhost:6379/1',
+  secretKeyBase: 'b90321d802cf09ef688b05eb6337efc3422b4e25fe42a311bc4e5ffb268c335590be89f464d3adabfbcfae4b431a5029ad6486bce555caa962d75a18322ea111'
+};

+ 5 - 0
bilibili-api/index.js

@@ -0,0 +1,5 @@
+// process.env.NODE_ENV="test"
+
+require('babel-core/register');
+require('babel-polyfill');
+require('./app/server.js');

+ 31 - 0
bilibili-api/package.json

@@ -0,0 +1,31 @@
+{
+  "name": "bilibili-api",
+  "version": "1.0.0",
+  "description": "",
+  "scripts": {
+    "start": "cross-env NODE_ENV=production ./node_modules/.bin/nodemon ./index.js",
+    "dev": "cross-env NODE_ENV=development ./node_modules/.bin/nodemon ./index.js",
+    "test": "cross-env NODE_ENV=test ./node_modules/.bin/nodemon ./index.js"
+  },
+  "dependencies": {
+    "axios": "^0.15.3",
+    "koa": "^2.0.0",
+    "koa-bodyparser": "^3.2.0",
+    "koa-convert": "^1.2.0",
+    "koa-cors": "0.0.16",
+    "koa-logger": "^2.0.0",
+    "koa-onerror": "^3.0.1",
+    "koa-response-time": "^1.0.2",
+    "koa-router": "^7.1.0",
+    "koa-static": "^2.1.0"
+  },
+  "devDependencies": {
+    "babel-core": "^6.21.0",
+    "babel-plugin-transform-runtime": "^6.15.0",
+    "babel-polyfill": "^6.20.0",
+    "babel-preset-es2015": "^6.18.0",
+    "babel-preset-stage-2": "^6.18.0",
+    "cross-env": "^3.1.4",
+    "nodemon": "^1.11.0"
+  }
+}