本周的主题并非是不鼓励自主创新,而是推崇自主创新,毕竟只有自主创新才能创造出属于自己的技术,才能提前避免一些风险,对抗现实世界的变化带来的动荡与不安,提高抗风险能力。“不要重复造轮子”并不是适用核心技术和空白领域,这方面还是鼓励与支持“造轮”一说。
只是时至今日,国内的软件行业已然不同于过往的空白期,为了在更快的时间内进步,我们需要快速学习造轮子的套路。换句话说, “站在巨人的肩膀上会让你事半功倍” 。如果你遇到问题,可以尝试这样一个角度:不要只想着自己从头搞定,先去看看有没有前人经验,看看是否有什么人在什么地方遇到过类似的问题,找到这个人,和对方建立联系获取相关信息,能够帮助你节约非常多的时间来做更重要的事情。
这其中学习新技术、新框架是十分重要一方面,另一方面就是不能只是简单地学习这些技术、框架是怎么用的,要知其然,还要知其所以然。如果想要开发一套稳定的,容易维护的系统,在使用“轮子”的时候,就需要对轮子有足够的了解。知道这个“轮子”适用于什么样的场景,有什么样的特点、优点,会有什么样缺点。这样才能做到扬长避短,更好地使用轮子。因此今天,我们以此为契机,给大家分享一些优秀的开源 Web 开发框架,在先行者的经验上,一同学习、进步。如果你对“不必重复造轮子”或者下列“ Web 开发框架”项目有更深入的见解,欢迎大家在评论中一同讨论

开源许可证: 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