本周的主题并非是不鼓励自主创新,而是推崇自主创新,毕竟只有自主创新才能创造出属于自己的技能,才能提前避免一些风险,对抗现实天下的变革带来的动荡与不安,提高抗风险能力。“不要重复造轮子”并不是适用核心技能和空缺领域,这方面还是鼓励与支持“造轮”一说。
只是时至今日,海内的软件行业已然不同于过往的空缺期,为了在更快的韶光内进步,我们须要快速学习造轮子的套路。换句话说, “站在巨人的肩膀上会让你事半功倍” 。如果你碰着问题,可以考试测验这样一个角度:不要只想着自己从头搞定,先去看看有没有古人履历,看看是否有什么人在什么地方碰着过类似的问题,找到这个人,和对方建立联系获取干系信息,能够帮助你节约非常多的韶光来做更主要的事情。
这个中学习新技能、新框架是十分主要一方面,另一方面便是不能只是大略地学习这些技能、框架是怎么用的,要知其然,还要知其以是然。如果想要开拓一套稳定的,随意马虎掩护的系统,在利用“轮子”的时候,就须要对轮子有足够的理解。知道这个“轮子”适用于什么样的场景,有什么样的特点、优点,会有什么样缺陷。这样才能做到扬长避短,更好地利用轮子。因此本日,我们以此为契机,给大家分享一些精良的开源 Web 开拓框架,在先行者的履历上,一同学习、进步。如果你对“不必重复造轮子”或者下列“ Web 开拓框架”项目有更深入的见地,欢迎大家在评论中一同谈论
JavaJFinal
开源容许证: Apache-2.0
项目作者: JFinal
项目地址: https://gitee.com/jfinal/jfinal
推举缘故原由: JFinal 是一款基于 Java 措辞的极速 WEB + ORM 框架,拥有 Java 措辞上风的同时再拥有 Ruby、Python 等动态措辞的开拓效率。
紧张编程措辞: Java
项目示例:
1.掌握器(支持 Enjoy、JSP、Velocity、JSON 等等以及自定义视图渲染)
@Before(BlogInterceptor.class)public class BlogController extends Controller { @Inject BlogService service; public void index() { set("blogPage", service.paginate(getParaToInt(0, 1), 10)); render("blog.html"); } public void add() { } @Before(BlogValidator.class) public void save() { getModel(Blog.class).save(); redirect("/blog"); } public void edit() { set("blog", service.findById(getParaToInt())); } @Before(BlogValidator.class) public void update() { getModel(Blog.class).update(); redirect("/blog"); } public void delete() { service.deleteById(getParaToInt()); redirect("/blog"); }}
2.Service 所有业务与 sql 全部放在 Service 层。
public class BlogService { private Blog dao = new Blog().dao(); public Page<Blog> paginate(int pageNumber, int pageSize) { return dao.paginate(pageNumber, pageSize, "select ", "from blog order by id asc"); } public Blog findById(int id) { return dao.findById(id); } public void deleteById(int id) { dao.deleteById(id); }}
3.Model(无 xml、无 annotaion、无 attribute)
public class Blog extends Model<Blog> {}
4.Validator(API 勾引式校验,比 xml 校验方便 N 倍,有代码检讨不易出错)
public class BlogValidator extends Validator { protected void validate(Controller controller) { validateRequiredString("blog.title", "titleMsg", "请输入Blog标题!"); validateRequiredString("blog.content", "contentMsg", "请输入Blog内容!"); } protected void handleError(Controller controller) { controller.keepModel(Blog.class); }}
5.拦截器(在此 demo 中仅为示例,本 demo 不须要此拦截器)
public class BlogInterceptor implements Interceptor { public void intercept(Invocation inv) { System.out.println("Before invoking " + inv.getActionKey()); inv.invoke(); System.out.println("After invoking " + inv.getActionKey()); }}
ymate-platform-v2
开源容许证: Apache-2.0
项目作者: 有空想的鱼
项目地址: https://gitee.com/suninformation/ymate-platform-v2
推举缘故原由: ymate-platform-v2 是一个大略、易用的轻量级 Java 运用开拓框架
紧张编程措辞: Java
项目模块功能:
HServer
开源容许证: Apache-2.0
项目作者: HServer
项目地址: https://gitee.com/HServer/HServer
推举缘故原由: HServer 是一个开拓灵巧,轻量级,低入侵,高并发的新型 Web 开拓框架。
紧张编程措辞: Java
项目事理及流程:
C++drogon
开源容许证: MIT
项目作者: an-tao
项目地址: https://gitee.com/an-tao/drogon
推举缘故原由: 基于 C++14/17 的跨平台、高性能 HTTP Web 运用框架
紧张编程措辞: C++
操作案例:
1.创建一个 HttpSimpleController 工具。
/// The TestCtrl.h file#pragma once#include <drogon/HttpSimpleController.h>using namespace drogon;class TestCtrl:public drogon::HttpSimpleController<TestCtrl>{public: virtual void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override; PATH_LIST_BEGIN PATH_ADD("/test",Get); PATH_LIST_END};/// The TestCtrl.cc file#include "TestCtrl.h"void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback){ //write your application logic here auto resp = HttpResponse::newHttpResponse(); resp->setBody("<p>Hello, world!</p>"); resp->setExpiredTime(0); callback(resp);}
2.代码都可以由 drogon_ctl命令创建后这样创建掌握器:
/// The header file#pragma once#include <drogon/HttpSimpleController.h>using namespace drogon;class JsonCtrl : public drogon::HttpSimpleController<JsonCtrl>{ public: virtual void asyncHandleHttpRequest(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) override; PATH_LIST_BEGIN //list path definitions here; PATH_ADD("/json", Get); PATH_LIST_END};/// The source file#include "JsonCtrl.h"void JsonCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback){ Json::Value ret; ret["message"] = "Hello, World!"; auto resp = HttpResponse::newHttpJsonResponse(ret); callback(resp);}
3.通过 HttpController 类创建一个 RESTful API:
/// The header file#pragma once#include <drogon/HttpController.h>using namespace drogon;namespace api{namespace v1{class User : public drogon::HttpController<User>{ public: METHOD_LIST_BEGIN //use METHOD_ADD to add your custom processing function here; METHOD_ADD(User::getInfo, "/{id}", Get); //path is /api/v1/User/{arg1} METHOD_ADD(User::getDetailInfo, "/{id}/detailinfo", Get); //path is /api/v1/User/{arg1}/detailinfo METHOD_ADD(User::newUser, "/{name}", Post); //path is /api/v1/User/{arg1} METHOD_LIST_END //your declaration of processing function maybe like this: void getInfo(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int userId) const; void getDetailInfo(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int userId) const; void newUser(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, std::string &&userName); public: User() { LOG_DEBUG << "User constructor!"; }};} // namespace v1} // namespace api
cppweb
项目作者: 寻根
项目地址: https://gitee.com/xungen/cppweb
推举缘故原由: cppweb 是基于 C++ 开拓的 Web 做事器,支持 C/C++、Python、Java 等多措辞稠浊开拓 Web 运用。
紧张编程措辞: C++
项目功能展示:
PHPHyperf
开源容许证: MIT
项目作者: hyperf
项目地址: https://gitee.com/hyperf/hyperf
推举缘故原由: Hyperf 是一款基于 Swoole 4.5+ 实现的高性能、高灵巧性的 PHP 持久化框架,特殊适用于微做事和中间件的开拓。
紧张编程措辞: PHP
实操教程: 请参考 https://course.swoole-cloud.com/videos/5/new?from=hyperf.io 查看详细教程进行操作。
ThinkPHP开源容许证: Apache-2.0
项目作者: ThinkPHP
项目地址: https://gitee.com/top-think/think
推举缘故原由: ThinkPHP 是一家拥有 15 年历史的老牌 PHP 开源框架
紧张编程措辞: PHP
项目操作方法演示:
这是一个范例的 Index 掌握器的操作方法定义,包含了两个操作方法:若不该用任何参数,如果定义了一个非可选参数,并且不是工具类型,则该参数必须通过用户要求传入,如果是 URL 要求,则常日是通过当前的要求传入,操作方法的参数支持依赖注入。
<?phpnamespace app\controller;class Index{ public function index() { return 'index'; } public function hello(string $name) { return 'Hello,'.$name; }}
TimoPHP
开源容许证: BSD-3-Clause
项目作者: tomener
项目地址: https://gitee.com/tomener/TimoPHP
推举缘故原由: TimoPHP 是一个快速、灵巧的 PHP Web 开拓框架。
紧张编程措辞: PHP
目录构造:
/data |-TimoSNS 项目目录(自己项目名称,比如用TimoPHP开拓的社区运用,叫TimoSNS,自定义) | |-app 运用目录 | | |-cli 命令行 | | |-api 移动端 | | | |-controller 掌握器目录 | | | |_config.php 项目配置文件 | |-business 公共业务逻辑 | |-cache 运行时缓存目录 | |-middleware 中间件 | |-provider 做事供应者目录 | |-component 组件目录 | |-config 公共配置目录 | | |-dev 开拓环境配置目录 | | |-pro 线上环境配置目录 | | |-test 测试环境配置目录 | |-lib 自定义类库 | |-logs 日志目录 | |-model 模型目录 | |-public WEB目录(对外访问目录)名称自定义,如wwwroot、public | | |-api 小程序 | | | |_index.php 小程序入口文件 | |-send 推送(微信、小程序、android、IOS) | |-service 公共做事目录 | |-task 异步任务 | |-vendor composer安装类库目录 | |-bootstrap.php 全体项目的启动文件 | |_composer.json |-TimoPHP 框架,和项目在同一级目录
JavaScripttitbit
开源容许证: MulanPSL-2.0
项目作者: 猖獗的机器键盘
项目地址: https://gitee.com/daoio/titbit
推举缘故原由: titbit 是一款 Node.js 环境的 Web 后端框架,支持 HTTP/HTTPS/HTTP2,也支持配置切换。
紧张编程措辞: JavaScript
流程展示:
GoGinSkeleton
开源容许证: MIT
项目作者: 张奇峰
项目地址: https://gitee.com/daitougege/GinSkeleton
推举缘故原由: 这是一个基于 Go 措辞 Gin 框架封装的 Web 项目骨架。
紧张编程措辞: Go
项目流程展示:
1.主线逻辑图:
2.核心主线调用链图
3.后台骨架图
go-zero
开源容许证: MIT
项目作者: kevwan
项目地址: https://gitee.com/kevwan/go-zero
推举缘故原由: go-zero 是一个集成了各种工程实践的 Web 和 RPC 框架。
紧张编程措辞: Go
项目架构展示:
orange
开源容许证: Apache-2.0
项目作者: qiqi
项目地址: https://gitee.com/zhucheer/orange
推举缘故原由: orange 是一款基于 Golang 措辞的 web 开拓框架
编程措辞: Go
项目事理演示:
DelphiDelphiWebMVC
开源容许证: Apache-2.0
项目作者: PRSoft
项目地址: https://gitee.com/pearroom/DelphiWebMVC
推举缘故原由: 据项目作者表示,Delphi 在 Web 系统开拓上没有像 Java 或 PHP 这样方便,对付一贯利用 Delphi 的工程师来说是个遗憾,因此利用 Delphi 技能开拓了一套 Web 框架,利用 MVC 模式,让工程师只需把精力放在模型与视图的设计上。
紧张编程措辞: Delphi
项目 Demo 演示:
注:此项目详细操作请参考作者博客:https://my.oschina.net/delphimvc