{"id":25905396,"url":"https://github.com/Umajs/Umajs","last_synced_at":"2025-03-03T05:15:01.786Z","repository":{"id":38321040,"uuid":"245317755","full_name":"Umajs/Umajs","owner":"Umajs","description":"UMajs，an easy-to-use framework base on Typescript","archived":false,"fork":false,"pushed_at":"2023-03-06T13:32:03.000Z","size":1736,"stargazers_count":307,"open_issues_count":38,"forks_count":33,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-05-13T17:26:32.739Z","etag":null,"topics":["koa","nodejs","typescript","webserver"],"latest_commit_sha":null,"homepage":"https://umajs.github.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Umajs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-06T03:02:40.000Z","updated_at":"2024-06-18T20:06:19.571Z","dependencies_parsed_at":"2024-06-18T20:05:20.577Z","dependency_job_id":"5c927d85-b02e-42f7-8e35-a36293aac9b7","html_url":"https://github.com/Umajs/Umajs","commit_stats":null,"previous_names":["wuba/umajs","ursajs/ursa"],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Umajs%2FUmajs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Umajs%2FUmajs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Umajs%2FUmajs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Umajs%2FUmajs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Umajs","download_url":"https://codeload.github.com/Umajs/Umajs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240516891,"owners_count":19814094,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["koa","nodejs","typescript","webserver"],"created_at":"2025-03-03T05:15:00.600Z","updated_at":"2025-03-03T05:15:01.778Z","avatar_url":"https://github.com/Umajs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `Umajs`（Launched by 58）\n\u003e An easy-to-use framework base on Typescript\n\n## 简介\n\nUmajs 是 58同城 推出的一款基于 Typescript 轻量级 Nodejs Web 框架。它的中文含义是大熊座，北斗七星都是它的组成部分；正如同 Umajs 也是由不同的 package 所组合在一起。我们希望 Umajs 的每一部分，都是优秀的、闪耀的、经受的住各种大型项目检验的。\n\n## Features\n* 基于 Koa2，兼容 middleware\n* 统一响应 (Result)， 让 Controller 响应数据更便捷清晰\n* 装饰器 (Decorator)，代码组织更优雅方便\n* 自定义装饰器 (createArgDecorator)， 可以快速的扩展参数装饰器，用于参数校验、参数转换、参数聚合等\n* 面向切面 (AOP)，基于装饰器的 `Aspect` 可以很方便的对任意方法进行拦截、修改等，并且能将中间件转换成 `Aspect.around` 使用\n* 依赖注入 (IOC)，模块依赖不再需要引入和实例化\n* 插件、切面形式让中间件(Middleware)使用更优雅\n* 高稳定高性能，单元测试覆盖全\n* 路由分层，优化路由寻址\n* 推荐 TS 开发，开发维护更清晰，对于依赖注入的方法使用也更便捷\n* 统一约束和规范\n\n## 使用方法\n\n请参考： [Umajs使用文档](https://umajs.github.io)\n\n备用站点【推荐】：[https://umajs.gitee.io/](https://umajs.gitee.io/)\n\n## 初始化项目\n\n```\nyarn install\nyarn run init\n```\n\n## 运行Sample\n\n```\ncd packages/app \u0026\u0026 npm run app\n```\n\n## 开发\n\n- 开发子项目时，在子项目根目录执行\n    ```\n    npm start\n    ```\n\n- 启动 web 工程，在 app 项目根录目执行\n    ```\n    npm run app\n    ```\n\n- 启动调试模式，在根目录按 F5 即可\n\n## 贡献\n\n欢迎提交 PR 或者 Issue，向我们反馈建议和问题。\n\n## 特性展示\n\n下面代码展示了以下几个特性：\n\u003e 1、通过 `createArgDecorator` 创建参数装饰器，对 `age` 参数进行校验和类型转换\n\u003e \n\u003e 2、controller 通过框架提供的 `Result` 便捷的响应数据\n\u003e \n\u003e 3、`Aspect` 通过 `around` 方法进行方法的拦截，对方法的 `参数` 进行校验, 对 `返回值` 进行校验/修改\n\n```js\n// index.controller.ts\nimport Method from './method.aspect';\nimport { AgeCheck } from './ArgDecorator';\n\n@Aspect(Method) // 可以装饰在类上对所有方法进行装饰\nexport default class extends  BaseController {\n\n    // @Aspect(Method) // 可以装饰在方法上对单一方法进行装饰\n    @Path('/hello')\n    index(@Query('name') name: string, @AgeCheck('age') age: number ) {\n        return Result.json({\n            name,\n            age,\n        });\n    }\n}\n```\n\n```js\n// ArgDecorator.ts\nexport const AgeCheck = createArgDecorator((ctx: IContext, ageKey: string) =\u003e {\n    let age = ctx.query[ageKey];\n\n    if (age === undefined) return Result.json({\n        code: 0,\n        msg: '请加上 age 参数',\n    });\n\n    age = +age;\n\n    if (Number.isNaN(age) || age \u003c 0 || age \u003e 120) return Result.json({\n        code: 0,\n        msg: '请传入正确的 age 参数',\n    });\n\n    return age;\n});\n```\n\n```js\n// method.aspect.ts\nimport { IAspect, IProceedJoinPoint } from '@umajs/core';\n\nexport default class implements IAspect {\n    async around(proceedPoint: IProceedJoinPoint) {\n        const { proceed, args } = proceedPoint;\n\n        // 校验参数\n        if (args[0] !== 'Umajs') return Result.send('name 必须为 Umajs');\n\n        const result = await proceed(...args);\n\n        if (result.type === 'json') {\n            // 为 JSON 返回值加上时间戳\n            result.data.time = new Date();\n        }\n\n        return result;\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUmajs%2FUmajs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FUmajs%2FUmajs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUmajs%2FUmajs/lists"}