From 99a8dc78dbe4eb058aa17379cc2b7a802c383e16 Mon Sep 17 00:00:00 2001 From: whyour Date: Mon, 15 Mar 2021 21:09:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 8 ++ .gitignore | 1 + back/api/auth.ts | 42 ++++++++++ back/api/config.ts | 70 ++++++++++++++++ back/api/cookie.ts | 28 +++++++ back/api/index.ts | 12 +++ back/app.ts | 28 +++++++ back/config/index.ts | 44 ++++++++++ back/interfaces/ICommon.ts | 27 +++++++ back/interfaces/IContent.ts | 7 ++ back/loaders/dependencyInjector.ts | 15 ++++ back/loaders/express.ts | 55 +++++++++++++ back/loaders/index.ts | 15 ++++ back/loaders/logger.ts | 32 ++++++++ back/services/cookie.ts | 125 +++++++++++++++++++++++++++++ back/types/express/index.d.ts | 9 +++ nodemon.json | 6 ++ package.json | 49 ++++++++++- src/pages/code/index.tsx | 9 ++- src/pages/config/index.tsx | 9 ++- src/pages/cookie/index.tsx | 19 +++-- src/pages/crontab/index.tsx | 9 ++- src/pages/diff/index.tsx | 34 ++++---- src/pages/diy/index.tsx | 9 ++- src/pages/login/index.tsx | 6 +- src/utils/config.ts | 2 +- src/utils/http.ts | 24 ++++-- tsconfig.json | 19 ++++- 28 files changed, 664 insertions(+), 49 deletions(-) create mode 100644 .env.example create mode 100644 back/api/auth.ts create mode 100644 back/api/config.ts create mode 100644 back/api/cookie.ts create mode 100644 back/api/index.ts create mode 100644 back/app.ts create mode 100644 back/config/index.ts create mode 100644 back/interfaces/ICommon.ts create mode 100644 back/interfaces/IContent.ts create mode 100644 back/loaders/dependencyInjector.ts create mode 100644 back/loaders/express.ts create mode 100644 back/loaders/index.ts create mode 100644 back/loaders/logger.ts create mode 100644 back/services/cookie.ts create mode 100644 back/types/express/index.d.ts create mode 100644 nodemon.json diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..b54c315d --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +MONGODB_URI='mongodb://' +YIYAN_MONGODB_URI='' + +PORT=8080 + +LOG_LEVEL='debug' + +SECRET='test' diff --git a/.gitignore b/.gitignore index bfb0df96..233d0950 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ /src/.umi-test /.env.local /config +.env \ No newline at end of file diff --git a/back/api/auth.ts b/back/api/auth.ts new file mode 100644 index 00000000..f78b3291 --- /dev/null +++ b/back/api/auth.ts @@ -0,0 +1,42 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { Container } from 'typedi'; +import { Logger } from 'winston'; +import * as fs from 'fs'; +import config from '../config'; +import jwt from 'jsonwebtoken'; +const route = Router(); + +export default (app: Router) => { + app.use('/', route); + route.post( + '/auth', + async (req: Request, res: Response, next: NextFunction) => { + const logger: Logger = Container.get('logger'); + try { + let username = req.body.username; + let password = req.body.password; + fs.readFile(config.authConfigFile, 'utf8', function (err, data) { + if (err) console.log(err); + var con = JSON.parse(data); + if (username && password) { + if (username == con.user && password == con.password) { + let token = jwt.sign( + { username, password }, + config.secret as any, + { expiresIn: 60 * 60 * 24 * 7, algorithm: 'HS384' }, + ); + res.send({ err: 0, token }); + } else { + res.send({ err: 1, msg: config.authError }); + } + } else { + res.send({ err: 1, msg: '请输入用户名密码!' }); + } + }); + } catch (e) { + logger.error('🔥 error: %o', e); + return next(e); + } + }, + ); +}; diff --git a/back/api/config.ts b/back/api/config.ts new file mode 100644 index 00000000..c3f264ca --- /dev/null +++ b/back/api/config.ts @@ -0,0 +1,70 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { Container } from 'typedi'; +import { Logger } from 'winston'; +import * as fs from 'fs'; +import config from '../config'; +const route = Router(); + +export default (app: Router) => { + app.use('/', route); + route.get( + '/config/:key', + async (req: Request, res: Response, next: NextFunction) => { + const logger: Logger = Container.get('logger'); + try { + let content = '未找到文件'; + switch (req.params.key) { + case 'config': + content = getFileContentByName(config.confFile); + break; + case 'sample': + content = getFileContentByName(config.sampleFile); + break; + case 'crontab': + content = getFileContentByName(config.crontabFile); + break; + case 'shareCode': + let shareCodeFile = getLastModifyFilePath(config.shareCodeDir); + content = getFileContentByName(shareCodeFile); + break; + case 'diy': + content = getFileContentByName(config.diyFile); + break; + default: + break; + } + res.send({ code: 200, content }); + } catch (e) { + logger.error('🔥 error: %o', e); + return next(e); + } + }, + ); +}; + +function getFileContentByName(fileName) { + if (fs.existsSync(fileName)) { + return fs.readFileSync(fileName, 'utf8'); + } + return ''; +} +function getLastModifyFilePath(dir) { + var filePath = ''; + + if (fs.existsSync(dir)) { + var lastmtime = 0; + + var arr = fs.readdirSync(dir); + + arr.forEach(function (item) { + var fullpath = path.join(dir, item); + var stats = fs.statSync(fullpath); + if (stats.isFile()) { + if (stats.mtimeMs >= lastmtime) { + filePath = fullpath; + } + } + }); + } + return filePath; +} diff --git a/back/api/cookie.ts b/back/api/cookie.ts new file mode 100644 index 00000000..3891c576 --- /dev/null +++ b/back/api/cookie.ts @@ -0,0 +1,28 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { Container } from 'typedi'; +import CookieService from '../services/cookie'; +import { celebrate, Joi } from 'celebrate'; +import { Logger } from 'winston'; +const route = Router(); + +export default (app: Router) => { + app.use('/', route); + route.get( + '/qrcode', + async (req: Request, res: Response, next: NextFunction) => { + const logger: Logger = Container.get('logger'); + try { + if (req) { + const cookieService = Container.get(CookieService); + const { shici } = await cookieService.getYiYan(); + return res.status(200).json({ code: 200, data: shici }); + } else { + return res.status(200).json({ err: 1, msg: 'loginFaild' }); + } + } catch (e) { + logger.error('🔥 error: %o', e); + return next(e); + } + }, + ); +}; diff --git a/back/api/index.ts b/back/api/index.ts new file mode 100644 index 00000000..dd93bf02 --- /dev/null +++ b/back/api/index.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import auth from './auth'; +import cookie from './cookie'; +import config from './config'; + +export default () => { + const app = Router(); + auth(app); + cookie(app); + config(app); + return app; +}; diff --git a/back/app.ts b/back/app.ts new file mode 100644 index 00000000..632bb413 --- /dev/null +++ b/back/app.ts @@ -0,0 +1,28 @@ +import 'reflect-metadata'; // We need this in order to use @Decorators + +import config from './config'; + +import express from 'express'; + +import Logger from './loaders/logger'; + +async function startServer() { + const app = express(); + + await require('./loaders').default({ expressApp: app }); + + app + .listen(config.port, () => { + Logger.info(` + ################################################ + 🛡️ Server listening on port: ${config.port} 🛡️ + ################################################ + `); + }) + .on('error', (err) => { + Logger.error(err); + process.exit(1); + }); +} + +startServer(); diff --git a/back/config/index.ts b/back/config/index.ts new file mode 100644 index 00000000..48a9e867 --- /dev/null +++ b/back/config/index.ts @@ -0,0 +1,44 @@ +import dotenv from 'dotenv'; +import path from 'path'; + +process.env.NODE_ENV = process.env.NODE_ENV || 'development'; + +const envFound = dotenv.config(); +const rootPath = path.resolve(__dirname, '../../'); +const confFile = path.join(rootPath, 'config/config.sh'); +const sampleFile = path.join(rootPath, 'sample/config.sh.sample'); +const crontabFile = path.join(rootPath, 'config/crontab.list'); +const confBakDir = path.join(rootPath, 'config/bak/'); +const authConfigFile = path.join(rootPath, 'config/auth.json'); +const shareCodeDir = path.join(rootPath, 'log/jd_get_share_code/'); +const diyFile = path.join(rootPath, 'config/diy.sh'); +const logPath = path.join(rootPath, 'log/'); +const authError = '错误的用户名密码,请重试'; +const loginFaild = '请先登录!'; +const configString = 'config sample crontab shareCode diy'; + +if (envFound.error) { + throw new Error("⚠️ Couldn't find .env file ⚠️"); +} + +export default { + port: parseInt(process.env.PORT, 10), + secret: process.env.SECRET, + logs: { + level: process.env.LOG_LEVEL || 'silly', + }, + api: { + prefix: '/api', + }, + configString, + loginFaild, + authError, + logPath, + diyFile, + shareCodeDir, + authConfigFile, + confBakDir, + crontabFile, + sampleFile, + confFile, +}; diff --git a/back/interfaces/ICommon.ts b/back/interfaces/ICommon.ts new file mode 100644 index 00000000..a88687f7 --- /dev/null +++ b/back/interfaces/ICommon.ts @@ -0,0 +1,27 @@ +export interface ICommon { + _id: string; + value: String; + name: String; + type: Number; +} + +export interface ICommonInputDTO { + value: String; + name: String; + type: Number; +} + +export enum ShareCodeType { + ddFactory = 1, + ddXw, + jxCfd, + jxFactory, + jxFactoryTuan, + jxNc, + jxStory, + jxCfdGroup, + jdZz, + jdZjdTuan, + didi, + jd818, +} diff --git a/back/interfaces/IContent.ts b/back/interfaces/IContent.ts new file mode 100644 index 00000000..4a6dc538 --- /dev/null +++ b/back/interfaces/IContent.ts @@ -0,0 +1,7 @@ +export interface IContent { + author: String; + paragraphs: [String]; + title: String; + id: String; + created_at: Number; +} diff --git a/back/loaders/dependencyInjector.ts b/back/loaders/dependencyInjector.ts new file mode 100644 index 00000000..744057e9 --- /dev/null +++ b/back/loaders/dependencyInjector.ts @@ -0,0 +1,15 @@ +import { Container } from 'typedi'; +import LoggerInstance from './logger'; + +export default ({ models }: { models: { name: string; model: any }[] }) => { + try { + models.forEach((m) => { + Container.set(m.name, m.model); + }); + + Container.set('logger', LoggerInstance); + } catch (e) { + LoggerInstance.error('🔥 Error on dependency injector loader: %o', e); + throw e; + } +}; diff --git a/back/loaders/express.ts b/back/loaders/express.ts new file mode 100644 index 00000000..f576c860 --- /dev/null +++ b/back/loaders/express.ts @@ -0,0 +1,55 @@ +import { Request, Response, NextFunction, Application } from 'express'; +import bodyParser from 'body-parser'; +import cors from 'cors'; +import routes from '../api'; +import config from '../config'; +import jwt from 'express-jwt'; + +export default ({ app }: { app: Application }) => { + app.enable('trust proxy'); + app.use(cors()); + + app.use(bodyParser.json()); + app.use( + jwt({ secret: config.secret as string, algorithms: ['HS384'] }).unless({ + path: ['/api/auth'], + }), + ); + app.use(config.api.prefix, routes()); + + app.use((req, res, next) => { + const err: any = new Error('Not Found'); + err['status'] = 404; + next(err); + }); + + app.use( + ( + err: Error & { status: number }, + req: Request, + res: Response, + next: NextFunction, + ) => { + if (err.name === 'UnauthorizedError') { + return res.status(err.status).send({ message: err.message }).end(); + } + return next(err); + }, + ); + + app.use( + ( + err: Error & { status: number }, + req: Request, + res: Response, + next: NextFunction, + ) => { + res.status(err.status || 500); + res.json({ + errors: { + message: err.message, + }, + }); + }, + ); +}; diff --git a/back/loaders/index.ts b/back/loaders/index.ts new file mode 100644 index 00000000..dfc14c0d --- /dev/null +++ b/back/loaders/index.ts @@ -0,0 +1,15 @@ +import expressLoader from './express'; +import dependencyInjectorLoader from './dependencyInjector'; +import Logger from './logger'; + +export default async ({ expressApp }) => { + Logger.info('✌️ DB loaded and connected!'); + + await dependencyInjectorLoader({ + models: [], + }); + Logger.info('✌️ Dependency Injector loaded'); + + await expressLoader({ app: expressApp }); + Logger.info('✌️ Express loaded'); +}; diff --git a/back/loaders/logger.ts b/back/loaders/logger.ts new file mode 100644 index 00000000..7b65e3ca --- /dev/null +++ b/back/loaders/logger.ts @@ -0,0 +1,32 @@ +import winston from 'winston'; +import config from '../config'; + +const transports = []; +if (process.env.NODE_ENV !== 'development') { + transports.push(new winston.transports.Console()); +} else { + transports.push( + new winston.transports.Console({ + format: winston.format.combine( + winston.format.cli(), + winston.format.splat(), + ), + }), + ); +} + +const LoggerInstance = winston.createLogger({ + level: config.logs.level, + levels: winston.config.npm.levels, + format: winston.format.combine( + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss', + }), + winston.format.errors({ stack: true }), + winston.format.splat(), + winston.format.json(), + ), + transports, +}); + +export default LoggerInstance; diff --git a/back/services/cookie.ts b/back/services/cookie.ts new file mode 100644 index 00000000..6dc262bc --- /dev/null +++ b/back/services/cookie.ts @@ -0,0 +1,125 @@ +import { Service, Inject } from 'typedi'; +import winston from 'winston'; +import fetch from 'node-fetch'; + +@Service() +export default class CookieService { + private cookies: string = ''; + private s_token: string = ''; + private guid: string = ''; + private lsid: string = ''; + private lstoken: string = ''; + private okl_token: string = ''; + private token: string = ''; + constructor(@Inject('logger') private logger: winston.Logger) {} + + public async getYiYan(): Promise { + return { yiYan: 'test' }; + } + + private async step1() { + try { + let timeStamp = new Date().getTime(); + let url = + 'https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=' + + timeStamp + + '&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport'; + const text = await fetch(url, { + method: 'get', + headers: { + Connection: 'Keep-Alive', + 'Content-Type': 'application/x-www-form-urlencoded', + Accept: 'application/json, text/plain, */*', + 'Accept-Language': 'zh-cn', + Referer: + 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=' + + timeStamp + + '&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport', + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', + Host: 'plogin.m.jd.com', + }, + }); + this.praseSetCookies(text); + } catch (error) { + this.logger.error(error.response.body); + } + } + + private async step2() { + try { + if (this.cookies == '') { + return 0; + } + let timeStamp = new Date().getTime(); + let url = + 'https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=' + + this.s_token + + '&v=' + + timeStamp + + '&remember=true'; + const response = await fetch(url, { + method: 'post', + body: JSON.stringify({ + lang: 'chs', + appid: 300, + returnurl: + 'https://wqlogin2.jd.com/passport/LoginRedirect?state=' + + timeStamp + + '&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action', + source: 'wq_passport', + }), + headers: { + Connection: 'Keep-Alive', + 'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8', + Accept: 'application/json, text/plain, */*', + Cookie: this.cookies, + Referer: + 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=' + + timeStamp + + '&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport', + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', + Host: 'plogin.m.jd.com', + }, + }).then((res) => res.json); + // this.token = response.body.token + // this.okl_token = response.headers['set-cookie'][0] + // this.okl_token = this.okl_token.substring(this.okl_token.indexOf("=") + 1, this.okl_token.indexOf(";")) + var qrUrl = + 'https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=' + + this.token; + return qrUrl; + } catch (error) { + console.log(error.response.body); + return 0; + } + } + + private praseSetCookies(response: any) { + this.s_token = response.body.s_token; + this.guid = response.headers['set-cookie'][0]; + this.guid = this.guid.substring( + this.guid.indexOf('=') + 1, + this.guid.indexOf(';'), + ); + this.lsid = response.headers['set-cookie'][2]; + this.lsid = this.lsid.substring( + this.lsid.indexOf('=') + 1, + this.lsid.indexOf(';'), + ); + this.lstoken = response.headers['set-cookie'][3]; + this.lstoken = this.lstoken.substring( + this.lstoken.indexOf('=') + 1, + this.lstoken.indexOf(';'), + ); + this.cookies = + 'guid=' + + this.guid + + '; lang=chs; lsid=' + + this.lsid + + '; lstoken=' + + this.lstoken + + '; '; + } +} diff --git a/back/types/express/index.d.ts b/back/types/express/index.d.ts new file mode 100644 index 00000000..d9942f50 --- /dev/null +++ b/back/types/express/index.d.ts @@ -0,0 +1,9 @@ +import { Document, Model } from 'mongoose'; +import { IContent } from '../../interfaces/IContent'; +import { ICommon } from '../../interfaces/ICommon'; +declare global { + namespace Models { + export type IContentModel = Model; + export type ICommonModel = Model; + } +} diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 00000000..02fed196 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["back", ".env"], + "ext": "js,ts,json", + "ignore": ["src/**/*.spec.ts"], + "exec": "ts-node --transpile-only ./back/app.ts" +} diff --git a/package.json b/package.json index 34d7c932..e9e815d5 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "scripts": { "start": "umi dev", "build": "umi build", + "build-back": "tsc", + "start-back": "nodemon", + "pm2": "npm run build && node build/app.js", "postinstall": "umi generate tmp", "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", "test": "umi-test", @@ -22,22 +25,66 @@ "dependencies": { "@ant-design/pro-layout": "^6.5.0", "@umijs/preset-react": "1.x", + "agenda": "^3.1.0", + "agendash": "^1.0.0", + "argon2": "^0.27.0", + "body-parser": "^1.19.0", + "celebrate": "^13.0.3", "codemirror": "^5.59.4", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "errorhandler": "^1.5.1", + "event-dispatch": "^0.4.1", + "eventemitter3": "^4.0.7", + "express": "^4.17.1", + "express-basic-auth": "^1.2.0", + "express-jwt": "^6.0.0", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.20", + "mailgun-js": "^0.22.0", + "method-override": "^3.0.0", + "moment": "^2.29.0", + "moment-timezone": "^0.5.31", + "mongoose": "^5.10.6", + "morgan": "^1.10.0", + "node-fetch": "^2.6.1", "qrcode.react": "^1.0.1", "react-codemirror2": "^7.2.1", "react-diff-viewer": "^3.1.1", + "reflect-metadata": "^0.1.13", + "socks-proxy-agent": "^4.0.2", + "telegraf": "^4.0.3", + "typedi": "^0.8.0", "umi": "^3.3.9", - "umi-request": "^1.3.5" + "umi-request": "^1.3.5", + "winston": "^3.3.3" }, "devDependencies": { + "@types/agenda": "^2.0.9", + "@types/cors": "^2.8.10", + "@types/express": "^4.17.8", + "@types/express-jwt": "^6.0.1", + "@types/jsonwebtoken": "^8.5.0", + "@types/lodash": "^4.14.161", + "@types/mongoose": "^5.7.36", + "@types/node": "^14.11.2", + "@types/node-fetch": "^2.5.8", "@types/qrcode.react": "^1.0.1", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", + "@typescript-eslint/eslint-plugin": "^4.2.0", + "@typescript-eslint/parser": "^4.2.0", "@umijs/test": "^3.3.9", + "eslint": "^7.9.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-prettier": "^3.1.4", "lint-staged": "^10.0.7", + "nodemon": "^2.0.4", "prettier": "^2.2.0", "react": "17.x", "react-dom": "17.x", + "ts-node": "^9.0.0", + "tslint": "^5.20.1", "typescript": "^4.1.2", "yorkie": "^2.0.0" } diff --git a/src/pages/code/index.tsx b/src/pages/code/index.tsx index 69fa9615..a206f3a2 100644 --- a/src/pages/code/index.tsx +++ b/src/pages/code/index.tsx @@ -14,9 +14,12 @@ const Crontab = () => { const getConfig = () => { setLoading(true); - request.get(`${config.apiPrefix}config/shareCode`).then((data) => { - setValue(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/shareCode`) + .then((data) => { + setValue(data.content); + }) + .finally(() => setLoading(false)); }; const updateConfig = () => { diff --git a/src/pages/config/index.tsx b/src/pages/config/index.tsx index 39b56382..a8d719a2 100644 --- a/src/pages/config/index.tsx +++ b/src/pages/config/index.tsx @@ -15,9 +15,12 @@ const Config = () => { const getConfig = () => { setLoading(true); - request.get(`${config.apiPrefix}config/config`).then((data) => { - setValue(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/config`) + .then((data) => { + setValue(data.content); + }) + .finally(() => setLoading(false)); }; const updateConfig = () => { diff --git a/src/pages/cookie/index.tsx b/src/pages/cookie/index.tsx index feeadecf..b9f9c427 100644 --- a/src/pages/cookie/index.tsx +++ b/src/pages/cookie/index.tsx @@ -25,9 +25,7 @@ const columns = [ title: '状态', key: 'status', dataIndex: 'status', - render: (text: string, record: any) => ( - success - ), + render: (text: string, record: any) => success, }, { title: '操作', @@ -74,9 +72,12 @@ const Config = () => { const getConfig = () => { setLoading(true); - request.get(`${config.apiPrefix}config/config`).then((data) => { - setValue(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/config`) + .then((data) => { + setValue(data.content); + }) + .finally(() => setLoading(false)); }; const updateConfig = () => { @@ -182,7 +183,11 @@ const Config = () => { height: '100vh', }} > - +
); }; diff --git a/src/pages/crontab/index.tsx b/src/pages/crontab/index.tsx index b32ea4fd..c8b53364 100644 --- a/src/pages/crontab/index.tsx +++ b/src/pages/crontab/index.tsx @@ -14,9 +14,12 @@ const Crontab = () => { const getConfig = () => { setLoading(true); - request.get(`${config.apiPrefix}config/crontab`).then((data) => { - setValue(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/crontab`) + .then((data) => { + setValue(data.content); + }) + .finally(() => setLoading(false)); }; const updateConfig = () => { diff --git a/src/pages/diff/index.tsx b/src/pages/diff/index.tsx index 970f365d..edbab5cd 100644 --- a/src/pages/diff/index.tsx +++ b/src/pages/diff/index.tsx @@ -16,15 +16,18 @@ const Crontab = () => { const getConfig = () => { request.get(`${config.apiPrefix}config/config`).then((data) => { - setValue(data); + setValue(data.content); }); }; const getSample = () => { setLoading(true); - request.get(`${config.apiPrefix}config/sample`).then((data) => { - setSample(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/sample`) + .then((data) => { + setSample(data.content); + }) + .finally(() => setLoading(false)); }; useEffect(() => { @@ -63,16 +66,19 @@ const Crontab = () => { }} > { const getConfig = () => { setLoading(true); - request.get(`${config.apiPrefix}config/diy`).then((data) => { - setValue(data); - }).finally(() => setLoading(false)); + request + .get(`${config.apiPrefix}config/diy`) + .then((data) => { + setValue(data.content); + }) + .finally(() => setLoading(false)); }; const updateConfig = () => { diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx index b82e5a57..eac0d084 100644 --- a/src/pages/login/index.tsx +++ b/src/pages/login/index.tsx @@ -18,7 +18,7 @@ const Login = () => { }) .then((data) => { if (data.err == 0) { - localStorage.setItem(config.authKey, 'true'); + localStorage.setItem(config.authKey, data.token); history.push('/cookie'); } else { notification.open({ @@ -36,7 +36,7 @@ const Login = () => { if (isAuth) { history.push('/cookie'); } - }, []) + }, []); return ( @@ -50,7 +50,7 @@ const Login = () => { rules={[{ required: true, message: '请输入用户名' }]} hasFeedback > - + { - const res = await response.clone().text() - if (res === '请先登录!') { +_request.interceptors.request.use((url, options) => { + const token = localStorage.getItem(config.authKey); + if (token) { + const headers = { + Authorization: `Bearer ${token}`, + }; + return { url, options: { ...options, headers } }; + } + return { url, options }; +}); + +_request.interceptors.response.use(async (response) => { + const res = await response.clone(); + if (res.status === 401) { setTimeout(() => { - localStorage.removeItem('whyour'); history.push('/login'); }); } return response; -}) +}); export const request = _request; diff --git a/tsconfig.json b/tsconfig.json index 6d8f1937..b10bab10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "esnext", - "module": "esnext", + "target": "es2017", + "module": "commonjs", "moduleResolution": "node", "importHelpers": true, "jsx": "react-jsx", @@ -13,11 +13,22 @@ "@/*": ["src/*"], "@@/*": ["src/.umi/*"] }, + "lib": ["dom", "es2017", "esnext.asynciterable"], + "typeRoots": [ + "./node_modules/@types", + "./back/types", + "./node_modules/celebrate/lib/index.d.ts" + ], "allowSyntheticDefaultImports": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "forceConsistentCasingInFileNames": true, + "pretty": true, + "allowJs": true, + "noEmit": false }, "include": [ - "mock/**/*", + "back/**/*", "src/**/*", "config/**/*", ".umirc.ts",