七叶笔记 » golang编程 » 都2022了,程序员搞Web开发还要不要重复造轮子?

都2022了,程序员搞Web开发还要不要重复造轮子?

要不要重复造轮子?

有的人认为这是一种“拿来主义”的傲慢体现,因为你不造自己的轮子,就会缺乏核心技术,将一直受限,创新力也大幅度下降,发展空间将会一直被“卡脖子”,从而陷入落后于率先造轮者的步伐;而也有一部分人认为这是一种卓越的工作方式,他们认为并非每个人都能原创出核心的技术,也并非每个程序员都能成为项目的架构师或技术大牛,不重复造论,而是拿到一个框架,在上面进行二次开发然后拿来去用,学习过程种也提高了效率,这不是什么不屑一顾的事。

本周的主题并非是不鼓励自主创新,而是推崇自主创新,毕竟只有自主创新才能创造出属于自己的技术,才能提前避免一些风险,对抗现实世界的变化带来的动荡与不安,提高抗风险能力。“不要重复造轮子”并不是适用核心技术和空白领域,这方面还是鼓励与支持“造轮”一说。

只是时至今日,国内的软件行业已然不同于过往的空白期,为了在更快的时间内进步,我们需要快速学习造轮子的套路。换句话说, “站在巨人的肩膀上会让你事半功倍” 。如果你遇到问题,可以尝试这样一个角度:不要只想着自己从头搞定,先去看看有没有前人经验,看看是否有什么人在什么地方遇到过类似的问题,找到这个人,和对方建立联系获取相关信息,能够帮助你节约非常多的时间来做更重要的事情。

这其中学习新技术、新框架是十分重要一方面,另一方面就是不能只是简单地学习这些技术、框架是怎么用的,要知其然,还要知其所以然。如果想要开发一套稳定的,容易维护的系统,在使用“轮子”的时候,就需要对轮子有足够的了解。知道这个“轮子”适用于什么样的场景,有什么样的特点、优点,会有什么样缺点。这样才能做到扬长避短,更好地使用轮子。因此今天,我们以此为契机,给大家分享一些优秀的开源 Web 开发框架,在先行者的经验上,一同学习、进步。如果你对“不必重复造轮子”或者下列“ Web 开发框架”项目有更深入的见解,欢迎大家在评论中一同讨论

Java

JFinal

开源许可证: Apache-2.0

项目作者: JFinal

项目地址: 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

项目作者: 有理想的鱼

项目地址:

推荐原因: ymate-platform-v2 是一个简单、易用的轻量级 Java 应用开发框架

主要编程语言: Java

项目模块功能:

HServer

开源许可证: Apache-2.0

项目作者: HServer

项目地址:

推荐原因: HServer 是一个开发灵活,轻量级,低入侵,高并发的新型 Web 开发框架。

主要编程语言: Java

项目原理及流程:


C++

dro Go n

开源许可证: MIT

项目作者: an-tao

项目地址:

推荐原因: 基于 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 asyncHandleHttp Request (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

项目作者: 寻根

项目地址:

推荐原因: cppweb 是基于 C++ 开发的 Web 服务器,支持 C/C++、Python、Java 等多语言混合开发 Web 应用。

主要编程语言: C++

项目功能展示:


PHP

Hyperf

开源许可证: MIT

项目作者: hyperf

项目地址:

推荐原因: Hyperf 是一款基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 持久化框架,特别适用于微服务和中间件的开发。

主要编程语言: PHP

实操教程: 请参考 查看详细教程进行操作。

ThinkPHP

开源许可证: Apache-2.0

项目作者: ThinkPHP

项目地址:

推荐原因: ThinkPHP 是一家拥有 15 年历史的老牌 PHP 开源框架

主要编程语言: PHP

项目操作方法演示:

这是一个典型的 Index 控制器的操作方法定义,包含了两个操作方法:若不使用任何参数,如果定义了一个非可选参数,并且不是对象类型,则该参数必须通过用户请求传入,如果是 URL 请求,则通常是通过当前的请求传入,操作方法的参数支持依赖注入。

 <?php
namespace app\controller;

class Index
{
    public function index()
    {
        return 'index';
    }

    public function hello(string $name)
    {
        return 'Hello,'.$name;
    }
}
  

TimoPHP

开源许可证: BSD-3-Clause

项目作者: tomener

项目地址:

推荐原因: 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                         框架,和项目在同一级目录
  

JavaScript

titbit

开源许可证: MulanPSL-2.0

项目作者: 疯狂的机械键盘

项目地址:

推荐原因: titbit 是一款 Node.js 环境的 Web 后端框架,支持 HTTP/HTTPS/HTTP2,也支持配置切换。

主要编程语言: JavaScript

流程展示:


go

GinSkeleton

开源许可证: MIT

项目作者: 张奇峰

项目地址:

推荐原因: 这是一个基于 Go 语言 Gin 框架封装的 Web 项目骨架。

主要编程语言: Go

项目流程展示:

1.主线逻辑图:

2.核心主线调用链图

3.后台骨架图

go-zero

开源许可证: MIT

项目作者: kevwan

项目地址:

推荐原因: go-zero 是一个集成了各种工程实践的 Web 和 RPC 框架。

主要编程语言: Go

项目架构展示:

orange

开源许可证: Apache-2.0

项目作者: qiqi

项目地址:

推荐原因: orange 是一款基于 Golang 语言的 web 开发框架

编程语言: Go

项目原理演示:

Delphi

DelphiWebMVC

开源许可证: Apache-2.0

项目作者: PRSoft

项目地址:

推荐原因: 据项目作者表示,Delphi 在 Web 系统开发上没有像 Java 或 PHP 这样方便,对于一直使用 Delphi 的工程师来说是个遗憾,因此使用 Delphi 技术开发了一套 Web 框架,使用 MVC 模式,让工程师只需把精力放在模型与视图的设计上。

主要编程语言: Delphi

项目 Demo 演示:

注:此项目详细操作请参考作者博客:

相关文章