@mvx/model

@mvx/model is model for mvc frameworker on server.
model type-mvc typemvc boot frameworks Application AOP aop tsdi @tsdi tsioc ioc IoC type container dependency injection


Summary

Project Name @mvx/model Project Url https://github.com/zhouhoujun/type-mvc#readme
InceptionYear 2019-02-27 06:43:51 更新时间 2020-03-18 22:47:50
IssueManagement https://github.com/zhouhoujun/type-mvc/issues Licenses MIT
仓库地址 git+https://github.com/zhouhoujun/type-mvc.git 用户数 0
Node Engine 文件大小 17.6 KB
install postinstall build

项目介绍

# packaged @mvx/model This repo is for distribution on `npm`. The source for this module is in the [main repo](https://github.com/zhouhoujun/type-mvc). `@mvx/model` is Decorator, Ioc, AOP MVC frameworker. base on ioc [`@tsdi`](https://www.npmjs.com/package/@tsdi/core). help you develop your project easily. ## Install You can install this package either with `npm` ### npm ```shell npm install @mvx/mvc ``` ## Documentation create application ```ts import { MvcApplication, DefaultMvcMiddlewares, MvcModule, MvcServer } from '@mvx/mvc'; // 1. use MvcHostBuilder to boot application. MvcApplication.run(); // 2. use bootstrap module to boot application @MvcModule({ // baseURL: __dirname, imports: [ //... you service, or controller, some extends module. ], debug: true }) class MvcApi { constructor() { console.log('boot application'); } } // 3. use MvcHostBuilder to boot application module. @MvcModule({ imports: [ // ... /... you service, or controller, some extends module. // DebugLogAspect ], middlewares: DefaultMvcMiddlewares, // bootstrap: MvcServer }) class MvcApi { } MvcApplication.run(MvcApi); //4. use bootstrap module to boot application by main. @MvcModule({ imports: [ // ... ], // bootstrap: MvcServer, debug: true }) class MvcApi { constructor() { console.log('boot application'); } static main() { console.log('run mvc api...'); MvcApplication.run(MvcApi); } } ``` ### Define Model * third ORM Model: Configuration ModelOptions in your config file. like: ```ts { ... /** * model parser. * * @type {ModelOptions} * @memberof IConfiguration */ modelParser?: Token; ... } ``` ```ts import { Model, Field } from '@mvx/mvc'; @Model export class User { @Field name: string; @Field sex: string; @Field age: number; } @Model export class AccountUser extends User { @Field account: string; @Field passwd: string; } @Model export class ShoppingCart{ @Field owner: User; .... } ``` ### Define Middlewares default setting load middlewares in your project folder `/middlewares` ```ts import { Middleware, IMiddleware, IContext, MvcMiddleware, ForbiddenError } from '@mvx/mvc'; import { IContainer, Injectable } from '@tsdi/core'; @Middleware({ name: 'log-test', after: MiddlewareTypes.BodyParser }) export class Logger implements IMiddleware { constructor() { } async execute (ctx, next) { let start = Date.now(); await next(); const ms = Date.now() - start; console.log(`mylog: ${ctx.method} ${ctx.url} - ${ms}ms`); let end = new Date(); } } @Middleware({ name: 'rightCheck', scope: 'route' }) export class RoleRightCheck extends MvcMiddleware { async execute(ctx: IContext, next: () => Promise): Promise { // let user = ctx.session.user; // todo check user right; console.log('check user right.......'); let hasRight = true; if (hasRight) { await next(); } else { throw new ForbiddenError(); } } } ``` ### Auth use `@Authorization` pointcut * aop pointcut to to dynamic check the controller with `@Authorization` decorator, use your custom auth validation. eg. ```ts @Aspect export class YourSecrityAspect { // before AuthorizationAspect.authProcess check some. @Before(AuthorizationPointcut, 'authAnnotation') sessionCheck(authAnnotation: AuthorizationMetadata[], joinPoint: Joinpoint) { //TODO: you check by authAnnotation } } ``` ### Define Controller default setting load controllers in your project folder `/controllers` * Each Controller action should return type `ResultValue`, also you can return base type or object, it deal with JsonResult. * The action can be `async` or `sync`. Have provide `FileResult`, `JsonResult`, `RedirectResult`, `ViewResult` or mvc Middleware. * Also, you can extend with `BaseController`, it has implements some mothod to create the `ResultValue` types. * Model can auto create in action, it auto load value from request body. * Restfull params or Query String params can auto set to Controller action(Controller method) via the name of param matched. * Cors by `@Cors` decorator in class or method. * Your can set some special middlewares for route via decorator: `@Controller`, `@Put`, `@Post`, `@Get`, `@Delete`, `@Patch`, `@Head`, `@Route`. define as: ```ts import { Controller, Get, Post, IContext, ContextToken, RequestMethod, Model, Field, Cors } from '@mvx/mvc'; import { Inject } from '@tsdi/core'; import { Mywork } from '../bi/Mywork'; import { User } from '../models'; @Cors // @Authorization() @Controller('/users') export class UserController { // @Inject(ContextToken) // context: IContext; constructor(private work: Mywork) { } @Get('') index() { console.log('home index invorked', this.work); return this.work.workA(); } @Authorization() // @Cors([RequestMethod.Post]) @Post('/add', ['your-auth-middleware', 'rightCheck']) async addUser(user: User, @Inject(ContextToken) ctx: IContext) { console.log('user:', user); console.log('request body', ctx.request.body); return this.work.save(user); } @Get('/sub') sub() { return this.work.workB(); } @Cors // @Authorization() @Get('/:name') getPerson(name: string) { return this.work.find(name); } @Get('/find/:name') find(@Inject(ContextToken) ctx, name: string) { console.log(ctx); return this.work.find(name); } // match request query param name. @Get('/query') query(key: string, role: string, age?: number) { return { key: key, age: age, role: role } } @Get('/test/:id') parmtest(id: number) { if (id === 1) { return this.work.workA(); } else if (id === 2) { return this.work.workB(); } else { return 'notFound'; } } @Post('/posttest/:id', ['rightAuth']) postTest(id: number) { return { id: id } } } @Controller('/') export class HomeController extends BaseController { // @Inject(ContextToken) // context: IContext; constructor() { super(); } @Get('') index(): ResultValue { return this.view('index.html'); } @Get('/index2') home2(): ResultValue { return this.view('index2.html'); } @Post('/goto/:pageName') gotoPage(pageName: string): ResultValue { return this.redirect( '/' + pageName); } } ``` ### startup extension Service imports class extends `StartupService`, will inovke your configure service code. socket.io sample. ```ts @Singleton export class RealtimeService extends StartupService { io: Server; @Inject(RootMessageQueueToken) queue: MessageQueue; constructor() { super(); } async configureService(ctx: MvcContext): Promise { let logger = ctx.logManager.getLogger(); logger.info('create socket server...'); this.io = SockerServer(ctx.httpServer); this.io.on('connection', sock => { logger.info('socket client connected', sock.id); }); } } @MvcModule({ // port: 8000, imports: [ IdentityModule, TypeOrmModule, RealtimeService ] // middlewares: DefaultMvcMiddlewares, // debug: true }) class MvcApp { constructor() { console.log('boot application'); } // static main() { // console.log('run mvc api...'); // MvcApplication.run(MvcApp); // } } MvcApplication.run(MvcApp); ``` ### configuration * default use config file `./config.ts` or `./config.js`. ```ts /** * Configuration. * * Mvc applaction configuration. * * @export * @interface IConfiguration * @extends {ObjectMap} */ export interface MvcConfiguration extends RunnableConfigure { /** * cookies keys * * @type {(Keygrip | string[])} * @memberof IConfiguration */ keys?: Keygrip | string[]; /** * https server options. * * @type {ServerOptions} * @memberof IConfiguration */ httpsOptions?: ServerOptions; /** * server hostname * * @type {string} * @memberof IConfiguration */ hostname?: string; /** * server port. * * @type {number} * @memberof IConfiguration */ port?: number; /** * session config. * * @type {SessionConfig} * @memberof IConfiguration */ session?: SessionConfig; /** * contents path of files, static files. default in 'public' * * @type {(string | string[])} * @memberof Configuration */ contents?: string[]; /** * web site base url path. route prefix. * * @type {string} * @memberOf Configuration */ routePrefix?: string; /** * sub sites. * * @type {SubSite[]} * @memberof IConfiguration */ subSites?: SubSite[]; /** * custom config key value setting. * * @type {ObjectMap} * @memberOf Configuration */ setting?: ObjectMap; /** * db config connections. * * @type {IConnectionOptions} * @memberof Configuration */ connections?: IConnectionOptions; /** * global cors default options. * * @type {CorsOptions} * @memberof Configuration */ corsOptions?: CorsOptions; /** * auto load middlewares match. default `[./middlewares\/**\/*{.js,.ts}, , '!./\**\/*.d.ts']` in your project.. * * @type {(string | string[])} * @memberOf Configuration */ loadMiddlewares?: string | string[]; /** * auto load controllers match. default `[./controllers\/**\/*{.js,.ts}, , '!./\**\/*.d.ts']` in your project.. * * @type {(string | string[])} * @memberOf Configuration */ loadControllers?: string | string[]; /** * aspect service path. default: './aop' * * @type {(string | string[])} * @memberof IConfiguration */ aop?: string | string[]; /** * used aops. * * @type {Type[]} * @memberof IConfiguration */ usedAops?: Type[]; /** * views folder, default `./views` in your project. * * @memberof Configuration */ views?: string; /** * render view options. * * @memberof Configuration */ viewsOptions?: IViewOptions; /** * models match. default `['.\/models\/**\/*{.js,.ts}', '!.\/**\/*.d.ts']` in your project.. * * @type {(string[] | Type[])} * @memberOf Configuration */ models?: string[] | Type[]; /** * in debug log. defult false. * * @memberof IConfiguration */ debug?: boolean; /** * log config * * @type {(LogConfigure | Type)} * @memberof IConfiguration */ logConfig?: LogConfigure | Type; } /** * Configuration * * @export * @interface IConfiguration * @extends {MvcConfiguration} */ export interface IConfiguration extends MvcConfiguration { } ``` ### Define Model * third ORM Model: register yourself module parser extends `ModelParser`. * typeorm model use : [`@tsdi/typeorm-adapter`](https://www.npmjs.com/package/@tsdi/typeorm-adapter) * default load module in `./models` folder, with exp `['.\/models\/**\/*{.js,.ts}', '!.\/**\/*.d.ts']` * default load repositories in `./repositories` folder, with exp `['.\/repositories\/**\/*{.js,.ts}', '!.\/**\/*.d.ts']` ```ts import { Model, Field } from '@mvx/mvc'; @Model export class User { @Field name: string; @Field sex: string; @Field age: number; } @Model export class AccountUser extends User { @Field account: string; @Field passwd: string; } @Model export class ShoppingCart{ @Field owner: User; .... } ``` ### Define AOP Auto load Aspect service from folder `/aop` in your project. see simple demo ```ts import { Aspect, Around, Joinpoint, Before } from '@tsdi/aop'; @Aspect export class DebugLog { @Around('execution(*Controller.*)') log(joinPoint: Joinpoint) { console.log('aspect append log, method name:', joinPoint.fullName, ' state:', joinPoint.state, ' Args:', joinPoint.args , ' returning:', joinPoint.returning, ' throwing:', joinPoint.throwing); } @Before(/Controller.\*$/) Beforlog(joinPoint: Joinpoint) { console.log('aspect Befor log:', joinPoint.fullName); } } ``` ## Simples [see simples](https://github.com/zhouhoujun/type-mvc/tree/master/packages/simples) ## Documentation Documentation is available on the * [@mvx/cli document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/cli). * [@mvx/mvc document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/mvc). * [@mvx/identity document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/identity). * [@tsdi/ioc document](https://github.com/zhouhoujun/tsioc/tree/master/packages/ioc). * [@tsdi/aop document](https://github.com/zhouhoujun/tsioc/tree/master/packages/aop). * [@tsdi/core document](https://github.com/zhouhoujun/tsioc/tree/master/packages/core). * [@tsdi/boot document](https://github.com/zhouhoujun/tsioc/tree/master/packages/boot). * [@tsdi/components document](https://github.com/zhouhoujun/tsioc/tree/master/packages/components). * [@tsdi/compiler document](https://github.com/zhouhoujun/tsioc/tree/master/packages/compiler). * [@tsdi/activities document](https://github.com/zhouhoujun/tsioc/tree/master/packages/activities). * [@tsdi/pack document](https://github.com/zhouhoujun/tsioc/tree/master/packages/pack). * [@tsdi/typeorm-adapter document](https://github.com/zhouhoujun/tsioc/tree/master/packages/typeorm-adapter). * [@tsdi/unit document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit). * [@tsdi/unit-console document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit-console). * [@tsdi/cli document](https://github.com/zhouhoujun/tsioc/tree/master/packages/cli). ## License MIT © [Houjun](https://github.com/zhouhoujun/)