c++ web framework很少,

随着c++ 热度升温,c++ 在人工智能 自然语言处理 加快应用。

最近一款国产 c++ web framework 问世

写业务速度跟脚步语言一样速度

  1. 自带json内置支持

  2. 支持多域名网站

  3. 支持多域名ssl 服务端

  4. 支持http1.1、http2协议

  5. 支持websocket服务端,

  6. 框架自带websocket推送,支持定时推送到webscoket客户端

  7. 支持同步httpclient get post

  8. 框架自带ORM,使用链接池方式,目前支持mysql

  9. 框架自带线程池,和用户代码运行的线程池

  10. 框架使用asio自带的协程

  11. 框架特色是I/O 使用协程池 运行使用线程池

  12. 框架支持普通文件gzip br

  13. 框架解析URL和POST,解析结果类似PHP GET POST方式获取内容

  14. 集成sendmail

  15. 生成二维码(qrcode),需要gd、qrencode库

目前支持mac linux

具体可以看官方github

https://github.com/hggq/paozhu

主要是写业务代码优雅,方便 CURD例子

#include "orm.h"#include #include #include "md5.h"#include "func.h"#include "httppeer.h"#include "testcurd.h"namespace http{   std::string articlelogin(std::shared_ptr peer)   {      // step1  show login page      peer->view("login/login");      return "";   }   std::string articleloginpost(std::shared_ptr peer)   {      // step2      // get login/login post field      httppeer &client = peer->getpeer();      std::string username = client.post["username"].to_string();      std::string password = client.post["password"].to_string();      auto users = orm::cms::User();      std::string md5string;       try      {         md5string = md5(password);         users.where("name=", username).whereAnd("password=", md5string).limit(1).fetch();         // view orm create sql         // client<<"

"<<users.sqlstring<<"

"; if (users.getUserid() > 0) { // save session,other page get int userid= client.session["userid"].to_int(); client.session["userid"] = users.getUserid(); client.save_session(); client.goto_url("/cms/list"); return ""; } else { client.goto_url("/cms/login",3,"用户名或密码错误!"); return ""; } } catch (std::exception &e) { client << "

" << e.what() << "

"; return ""; } return ""; } std::string articlelist(std::shared_ptr peer) { // step3 content list httppeer &client = peer->getpeer(); int userid = client.session["userid"].to_int(); if (userid == 0) { // client.goto_url("/cms/login"); client.val["msg"] = "Please login "; } auto articles = orm::cms::Article(); int page = client.get["page"].to_int(); if (page 0) { for (auto &bb : articles) { OBJ_ARRAY item; item["aid"] = bb.aid; item["title"] = bb.title; item["createtime"] = bb.createtime; item["summary"] = bb.summary; // client<<"

<a href=\"/cms/show?id="<<bb.aid<"<<bb.title<<" "<<bb.createtime<<"

"; client.val["list"].push(std::move(item)); } } peer->view("cms/list"); return ""; } std::string articleshow(std::shared_ptr peer) { // step4 httppeer &client = peer->getpeer(); auto articles = orm::cms::Article(); int aid = client.get["id"].to_int(); articles.where("isopen=1").where(" aid=", aid).limit(1).fetch(); client.val["title"] = articles.getTitle(); client.val["content"] = articles.getContent(); peer->view("cms/show"); return ""; } std::string articleedit(std::shared_ptr peer) { // same the show content httppeer &client = peer->getpeer(); auto articles = orm::cms::Article(); int aid = client.get["id"].to_int(); articles.where("isopen=1").where(" aid=", aid).limit(1).fetch(); client.val["title"] = articles.getTitle(); client.val["content"] = html_encode(articles.getRefContent()); client.val["aid"] = articles.getAid(); peer->view("cms/edit"); return ""; } std::string articleeditpost(std::shared_ptr peer) { httppeer &client = peer->getpeer(); std::string title = client.post["title"].to_string(); std::string content = client.post["content"].to_string(); unsigned int aid = client.post["aid"].to_int(); auto articles = orm::cms::Article(); // articles.where("isopen=1").where(" aid=",aid).limit(1).fetch(); // articles.data.aid=aid; // articles.data.title=title; // articles.setAid(aid); articles.setTitle(title); // articles.setTitle("直接标题"); articles.setContent(content); articles.where(" aid=", aid); int effectnum = 0; try { effectnum = articles.update("title,content"); } catch (std::exception &e) { client << "

" << articles.sqlstring << "

"; client << "

" << e.what() << "

"; return ""; } if (effectnum > 0) { client.goto_url("/cms/list", 3, "内容已经更新"); return ""; } else { client.goto_url("/cms/list", 3, "更新出错(error)"); return ""; } return ""; } std::string articleadd(std::shared_ptr peer) { httppeer &client = peer->getpeer(); peer->view("cms/add"); return ""; } std::string articleaddpost(std::shared_ptr peer) { httppeer &client = peer->getpeer(); std::string title = client.post["title"].to_string(); std::string content = client.post["content"].to_string(); unsigned int aid = 0; auto articles = orm::cms::Article(); // articles.data.aid=aid; // articles.data.title=title; // articles.setAid(aid); articles.setIsopen(1); articles.setCreatetime(date("%Y-%m-%d %X")); // Y-m-d H:i:s articles.setAddtime(timeid()); // unix timestamp articles.setAddip(client.client_ip); // client ip articles.setTitle(title); // articles.setTitle("直接标题"); articles.setContent(content); int effectnum = 0; try { effectnum = articles.save(); aid = articles.getAid(); client << "

新(new)id " << aid << " 或 新(new)id " << effectnum << "

"; } catch (std::exception &e) { client << "

" << articles.sqlstring << "

"; client << "

" << e.what() << "

"; return ""; } if (effectnum > 0) { client.goto_url("/cms/list", 3, "内容已经添加"); return ""; } else { client.goto_url("/cms/list", 3, "添加出错(error)"); return ""; } return ""; } std::string articledelete(std::shared_ptr peer) { httppeer &client = peer->getpeer(); unsigned int aid = client.get["id"].to_int(); auto articles = orm::cms::Article(); // 可以先查询是否存在或有权限之类 // articles.where("isopen=1").where(" aid=",aid).limit(1).fetch(); int effectnum = 0; try { effectnum = articles.remove(aid); } catch (std::exception &e) { client << "

" << articles.sqlstring << "

"; client << "

" << e.what() << "

"; return ""; } if (effectnum > 0) { client.goto_url("/cms/list", 3, "内容已经删除"); return ""; } else { client.goto_url("/cms/list", 3, "删除出错(error)"); return ""; } return ""; }}

更看官方controller例子