添加 eggjs web-server,初步支持多宝短信
This commit is contained in:
28
web-server/.autod.conf.js
Normal file
28
web-server/.autod.conf.js
Normal file
@@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
write: true,
|
||||
plugin: 'autod-egg',
|
||||
prefix: '^',
|
||||
devprefix: '^',
|
||||
exclude: [
|
||||
'test/fixtures',
|
||||
'coverage',
|
||||
],
|
||||
dep: [
|
||||
'egg',
|
||||
'egg-scripts',
|
||||
],
|
||||
devdep: [
|
||||
'autod',
|
||||
'autod-egg',
|
||||
'egg-bin',
|
||||
'tslib',
|
||||
'typescript',
|
||||
],
|
||||
keep: [
|
||||
],
|
||||
semver: [
|
||||
],
|
||||
test: 'scripts',
|
||||
};
|
||||
2
web-server/.eslintignore
Normal file
2
web-server/.eslintignore
Normal file
@@ -0,0 +1,2 @@
|
||||
**/*.d.ts
|
||||
node_modules/
|
||||
6
web-server/.eslintrc
Normal file
6
web-server/.eslintrc
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "eslint-config-egg/typescript",
|
||||
"parserOptions": {
|
||||
"project": "./tsconfig.json"
|
||||
}
|
||||
}
|
||||
31
web-server/.github/workflows/nodejs.yml
vendored
Normal file
31
web-server/.github/workflows/nodejs.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [8.x]
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm i -g npminstall && npminstall
|
||||
- run: npm run ci
|
||||
env:
|
||||
CI: true
|
||||
20
web-server/.gitignore
vendored
Normal file
20
web-server/.gitignore
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
logs/
|
||||
npm-debug.log
|
||||
node_modules/
|
||||
coverage/
|
||||
.idea/
|
||||
run/
|
||||
logs/
|
||||
.DS_Store
|
||||
.vscode
|
||||
*.swp
|
||||
*.lock
|
||||
*.js
|
||||
!.autod.conf.js
|
||||
|
||||
app/**/*.js
|
||||
test/**/*.js
|
||||
config/**/*.js
|
||||
app/**/*.map
|
||||
test/**/*.map
|
||||
config/**/*.map
|
||||
12
web-server/.travis.yml
Normal file
12
web-server/.travis.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
language: node_js
|
||||
node_js:
|
||||
- '8'
|
||||
before_install:
|
||||
- npm i npminstall -g
|
||||
install:
|
||||
- npminstall
|
||||
script:
|
||||
- npm run ci
|
||||
after_script:
|
||||
- npminstall codecov && codecov
|
||||
33
web-server/README.md
Normal file
33
web-server/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# hackernews-async-ts
|
||||
|
||||
[Hacker News](https://news.ycombinator.com/) showcase using typescript && egg
|
||||
|
||||
## QuickStart
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
$ npm i
|
||||
$ npm run dev
|
||||
$ open http://localhost:7001/
|
||||
```
|
||||
|
||||
Don't tsc compile at development mode, if you had run `tsc` then you need to `npm run clean` before `npm run dev`.
|
||||
|
||||
### Deploy
|
||||
|
||||
```bash
|
||||
$ npm run tsc
|
||||
$ npm start
|
||||
```
|
||||
|
||||
### Npm Scripts
|
||||
|
||||
- Use `npm run lint` to check code style
|
||||
- Use `npm test` to run unit test
|
||||
- se `npm run clean` to clean compiled js at development mode once
|
||||
|
||||
### Requirement
|
||||
|
||||
- Node.js 8.x
|
||||
- Typescript 2.8+
|
||||
3
web-server/app/consts/consts.ts
Normal file
3
web-server/app/consts/consts.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export const TURBO_CORE_URL = 'https://coresrv.tgamebox.cn';
|
||||
export const APP_ID = 'KbZMUfUfppLFDG7dXtNkLWbyapK0JTHY';
|
||||
export const PARM_SECRET = 'ipqw05du6ob4x130w89t31yrqd6xs005zzltcmg2zpqnvrjp1s';
|
||||
9
web-server/app/controller/account.ts
Normal file
9
web-server/app/controller/account.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { Controller } from 'egg';
|
||||
|
||||
export default class AccountController extends Controller {
|
||||
public async getSms() {
|
||||
const { ctx } = this;
|
||||
console.log(ctx.request.body);
|
||||
ctx.body = await ctx.service.turboCore.getSms(ctx.request.body.telNo);
|
||||
}
|
||||
}
|
||||
8
web-server/app/controller/home.ts
Normal file
8
web-server/app/controller/home.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { Controller } from 'egg';
|
||||
|
||||
export default class HomeController extends Controller {
|
||||
public async index() {
|
||||
const { ctx } = this;
|
||||
ctx.body = await ctx.service.test.sayHi('egg');
|
||||
}
|
||||
}
|
||||
8
web-server/app/router.ts
Normal file
8
web-server/app/router.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { Application } from 'egg';
|
||||
|
||||
export default (app: Application) => {
|
||||
const { controller, router } = app;
|
||||
|
||||
router.get('/', controller.home.index);
|
||||
router.post('/user/getsms', controller.account.getSms);
|
||||
};
|
||||
15
web-server/app/service/Test.ts
Normal file
15
web-server/app/service/Test.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { Service } from 'egg';
|
||||
|
||||
/**
|
||||
* Test Service
|
||||
*/
|
||||
export default class Test extends Service {
|
||||
|
||||
/**
|
||||
* sayHi to you
|
||||
* @param name - your name
|
||||
*/
|
||||
public async sayHi(name: string) {
|
||||
return `hi, ${name}`;
|
||||
}
|
||||
}
|
||||
57
web-server/app/service/TurboCore.ts
Normal file
57
web-server/app/service/TurboCore.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { TURBO_CORE_URL, APP_ID, PARM_SECRET } from './../consts/consts';
|
||||
import { Service } from 'egg';
|
||||
const crypto = require('crypto');
|
||||
/**
|
||||
* Test Service
|
||||
*/
|
||||
export default class TurboCore extends Service {
|
||||
|
||||
/**
|
||||
* sayHi to you
|
||||
* @param name - your name
|
||||
*/
|
||||
|
||||
public async getSms(telNo: string) {
|
||||
const ctx = this.ctx;
|
||||
let body = {
|
||||
'telNo':telNo
|
||||
}
|
||||
const result = await ctx.curl(`${TURBO_CORE_URL}/user/getSms`, {
|
||||
// 必须指定 method
|
||||
method: 'POST',
|
||||
// 通过 contentType 告诉 HttpClient 以 JSON 格式发送
|
||||
contentType: 'json',
|
||||
headers: {
|
||||
'AppId': APP_ID,
|
||||
'sign': this.getTurboSign( body, PARM_SECRET)
|
||||
},
|
||||
data: body,
|
||||
// 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
|
||||
dataType: 'json',
|
||||
});
|
||||
return result.data;
|
||||
}
|
||||
|
||||
private getTurboSign(params, secret) {
|
||||
let paramsString = this.joinParamsStr(params);
|
||||
let stringToSign = paramsString;
|
||||
|
||||
if (secret) {
|
||||
stringToSign = `${stringToSign}&secret=${secret}`;
|
||||
return crypto.createHmac('sha256', secret)
|
||||
.update(stringToSign)
|
||||
.digest('hex');
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private joinParamsStr(params) {
|
||||
let signString = Object.keys(params).filter(function (key) {
|
||||
return params[key] !== undefined && params[key] !== '' && ['pfx', 'partner_key', 'sign', 'key'].indexOf(key) < 0;
|
||||
}).sort().map(function (key) {
|
||||
return key + '=' + params[key];
|
||||
}).join("&");
|
||||
return signString;
|
||||
}
|
||||
}
|
||||
14
web-server/appveyor.yml
Normal file
14
web-server/appveyor.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
environment:
|
||||
matrix:
|
||||
- nodejs_version: '8'
|
||||
|
||||
install:
|
||||
- ps: Install-Product node $env:nodejs_version
|
||||
- npm i npminstall && node_modules\.bin\npminstall
|
||||
|
||||
test_script:
|
||||
- node --version
|
||||
- npm --version
|
||||
- npm run test
|
||||
|
||||
build: off
|
||||
27
web-server/config/config.default.ts
Normal file
27
web-server/config/config.default.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg';
|
||||
|
||||
export default (appInfo: EggAppInfo) => {
|
||||
const config = {} as PowerPartial<EggAppConfig>;
|
||||
|
||||
// override config from framework / plugin
|
||||
// use for cookie sign key, should change to your own and keep security
|
||||
config.keys = appInfo.name + '_1597499383757_3508';
|
||||
config.security = {
|
||||
csrf: {
|
||||
enable: false,
|
||||
},
|
||||
};
|
||||
// add your egg config in here
|
||||
config.middleware = [];
|
||||
|
||||
// add your special config in here
|
||||
const bizConfig = {
|
||||
sourceUrl: `https://github.com/eggjs/examples/tree/master/${appInfo.name}`,
|
||||
};
|
||||
|
||||
// the return config will combines to EggAppConfig
|
||||
return {
|
||||
...config,
|
||||
...bizConfig,
|
||||
};
|
||||
};
|
||||
6
web-server/config/config.local.ts
Normal file
6
web-server/config/config.local.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { EggAppConfig, PowerPartial } from 'egg';
|
||||
|
||||
export default () => {
|
||||
const config: PowerPartial<EggAppConfig> = {};
|
||||
return config;
|
||||
};
|
||||
6
web-server/config/config.prod.ts
Normal file
6
web-server/config/config.prod.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { EggAppConfig, PowerPartial } from 'egg';
|
||||
|
||||
export default () => {
|
||||
const config: PowerPartial<EggAppConfig> = {};
|
||||
return config;
|
||||
};
|
||||
11
web-server/config/plugin.ts
Normal file
11
web-server/config/plugin.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { EggPlugin } from 'egg';
|
||||
|
||||
const plugin: EggPlugin = {
|
||||
// static: true,
|
||||
// nunjucks: {
|
||||
// enable: true,
|
||||
// package: 'egg-view-nunjucks',
|
||||
// },
|
||||
};
|
||||
|
||||
export default plugin;
|
||||
10844
web-server/package-lock.json
generated
Normal file
10844
web-server/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
57
web-server/package.json
Normal file
57
web-server/package.json
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"name": "zyz",
|
||||
"version": "1.0.0",
|
||||
"description": "zyz-web-server",
|
||||
"private": true,
|
||||
"egg": {
|
||||
"typescript": true,
|
||||
"declarations": true
|
||||
},
|
||||
"scripts": {
|
||||
"start": "egg-scripts start --daemon --title=egg-server-zyz",
|
||||
"stop": "egg-scripts stop --title=egg-server-zyz",
|
||||
"dev": "egg-bin dev",
|
||||
"debug": "egg-bin debug",
|
||||
"test-local": "egg-bin test",
|
||||
"test": "npm run lint -- --fix && npm run test-local",
|
||||
"cov": "egg-bin cov",
|
||||
"tsc": "ets && tsc -p tsconfig.json",
|
||||
"ci": "npm run lint && npm run cov && npm run tsc",
|
||||
"autod": "autod",
|
||||
"lint": "eslint . --ext .ts",
|
||||
"clean": "ets clean"
|
||||
},
|
||||
"dependencies": {
|
||||
"egg": "^2.6.1",
|
||||
"egg-scripts": "^2.6.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^2.2.40",
|
||||
"@types/node": "^7.0.12",
|
||||
"@types/supertest": "^2.0.0",
|
||||
"autod": "^3.0.1",
|
||||
"autod-egg": "^1.1.0",
|
||||
"egg-ci": "^1.8.0",
|
||||
"egg-bin": "^4.11.0",
|
||||
"egg-mock": "^3.16.0",
|
||||
"tslib": "^1.9.0",
|
||||
"eslint": "^6.7.2",
|
||||
"eslint-config-egg": "^8.0.0",
|
||||
"typescript": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.9.0"
|
||||
},
|
||||
"ci": {
|
||||
"version": "8"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": ""
|
||||
},
|
||||
"eslintIgnore": [
|
||||
"coverage"
|
||||
],
|
||||
"author": "liangtongchuan",
|
||||
"license": "MIT"
|
||||
}
|
||||
9
web-server/test/app/controller/home.test.ts
Normal file
9
web-server/test/app/controller/home.test.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import * as assert from 'assert';
|
||||
import { app } from 'egg-mock/bootstrap';
|
||||
|
||||
describe('test/app/controller/home.test.ts', () => {
|
||||
it('should GET /', async () => {
|
||||
const result = await app.httpRequest().get('/').expect(200);
|
||||
assert(result.text === 'hi, egg');
|
||||
});
|
||||
});
|
||||
16
web-server/test/app/service/Test.test.ts
Normal file
16
web-server/test/app/service/Test.test.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import * as assert from 'assert';
|
||||
import { Context } from 'egg';
|
||||
import { app } from 'egg-mock/bootstrap';
|
||||
|
||||
describe('test/app/service/Test.test.js', () => {
|
||||
let ctx: Context;
|
||||
|
||||
before(async () => {
|
||||
ctx = app.mockContext();
|
||||
});
|
||||
|
||||
it('sayHi', async () => {
|
||||
const result = await ctx.service.test.sayHi('egg');
|
||||
assert(result === 'hi, egg');
|
||||
});
|
||||
});
|
||||
30
web-server/tsconfig.json
Normal file
30
web-server/tsconfig.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"target": "es2017",
|
||||
"module": "commonjs",
|
||||
"strict": true,
|
||||
"noImplicitAny": false,
|
||||
"experimentalDecorators": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"charset": "utf8",
|
||||
"allowJs": false,
|
||||
"pretty": true,
|
||||
"noEmitOnError": false,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"allowUnreachableCode": false,
|
||||
"allowUnusedLabels": false,
|
||||
"strictPropertyInitialization": false,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"skipLibCheck": true,
|
||||
"skipDefaultLibCheck": true,
|
||||
"inlineSourceMap": true,
|
||||
"importHelpers": true
|
||||
},
|
||||
"exclude": [
|
||||
"app/public",
|
||||
"app/views",
|
||||
"node_modules*"
|
||||
]
|
||||
}
|
||||
13
web-server/typings/app/controller/index.d.ts
vendored
Normal file
13
web-server/typings/app/controller/index.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
// This file is created by egg-ts-helper@1.25.8
|
||||
// Do not modify this file!!!!!!!!!
|
||||
|
||||
import 'egg';
|
||||
import ExportAccount from '../../../app/controller/account';
|
||||
import ExportHome from '../../../app/controller/home';
|
||||
|
||||
declare module 'egg' {
|
||||
interface IController {
|
||||
account: ExportAccount;
|
||||
home: ExportHome;
|
||||
}
|
||||
}
|
||||
6
web-server/typings/app/index.d.ts
vendored
Normal file
6
web-server/typings/app/index.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
// This file is created by egg-ts-helper@1.25.8
|
||||
// Do not modify this file!!!!!!!!!
|
||||
|
||||
import 'egg';
|
||||
export * from 'egg';
|
||||
export as namespace Egg;
|
||||
17
web-server/typings/app/service/index.d.ts
vendored
Normal file
17
web-server/typings/app/service/index.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
// This file is created by egg-ts-helper@1.25.8
|
||||
// Do not modify this file!!!!!!!!!
|
||||
|
||||
import 'egg';
|
||||
type AnyClass = new (...args: any[]) => any;
|
||||
type AnyFunc<T = any> = (...args: any[]) => T;
|
||||
type CanExportFunc = AnyFunc<Promise<any>> | AnyFunc<IterableIterator<any>>;
|
||||
type AutoInstanceType<T, U = T extends CanExportFunc ? T : T extends AnyFunc ? ReturnType<T> : T> = U extends AnyClass ? InstanceType<U> : U;
|
||||
import ExportTest from '../../../app/service/Test';
|
||||
import ExportTurboCore from '../../../app/service/TurboCore';
|
||||
|
||||
declare module 'egg' {
|
||||
interface IService {
|
||||
test: AutoInstanceType<typeof ExportTest>;
|
||||
turboCore: AutoInstanceType<typeof ExportTurboCore>;
|
||||
}
|
||||
}
|
||||
11
web-server/typings/config/index.d.ts
vendored
Normal file
11
web-server/typings/config/index.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
// This file is created by egg-ts-helper@1.25.8
|
||||
// Do not modify this file!!!!!!!!!
|
||||
|
||||
import 'egg';
|
||||
import { EggAppConfig } from 'egg';
|
||||
import ExportConfigDefault from '../../config/config.default';
|
||||
type ConfigDefault = ReturnType<typeof ExportConfigDefault>;
|
||||
type NewEggAppConfig = ConfigDefault;
|
||||
declare module 'egg' {
|
||||
interface EggAppConfig extends NewEggAppConfig { }
|
||||
}
|
||||
33
web-server/typings/config/plugin.d.ts
vendored
Normal file
33
web-server/typings/config/plugin.d.ts
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
// This file is created by egg-ts-helper@1.25.8
|
||||
// Do not modify this file!!!!!!!!!
|
||||
|
||||
import 'egg';
|
||||
import 'egg-onerror';
|
||||
import 'egg-session';
|
||||
import 'egg-i18n';
|
||||
import 'egg-watcher';
|
||||
import 'egg-multipart';
|
||||
import 'egg-security';
|
||||
import 'egg-development';
|
||||
import 'egg-logrotator';
|
||||
import 'egg-schedule';
|
||||
import 'egg-static';
|
||||
import 'egg-jsonp';
|
||||
import 'egg-view';
|
||||
import { EggPluginItem } from 'egg';
|
||||
declare module 'egg' {
|
||||
interface EggPlugin {
|
||||
onerror?: EggPluginItem;
|
||||
session?: EggPluginItem;
|
||||
i18n?: EggPluginItem;
|
||||
watcher?: EggPluginItem;
|
||||
multipart?: EggPluginItem;
|
||||
security?: EggPluginItem;
|
||||
development?: EggPluginItem;
|
||||
logrotator?: EggPluginItem;
|
||||
schedule?: EggPluginItem;
|
||||
static?: EggPluginItem;
|
||||
jsonp?: EggPluginItem;
|
||||
view?: EggPluginItem;
|
||||
}
|
||||
}
|
||||
5
web-server/typings/index.d.ts
vendored
Normal file
5
web-server/typings/index.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import 'egg';
|
||||
|
||||
declare module 'egg' {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user