-
Notifications
You must be signed in to change notification settings - Fork 60
paozhu 数据业务模型
数据业务模型是什么呢,其实paozhu c++ web framework框架 是吸取orm和数据库关系模型思想,java好像用xml来定义。
paozhu以后可以实现xml定义,然后生成数据业务代码 对象模型。目前paozhu是手动建立,这个思想是10年前根据作者业务妥协弄出来的想法,目前还是按照之前做法,没有做自动orm mapper,以前想法是对照mysql里面建模的关系做,但是后来感觉还是快进快出好点,容易命中缓存。所以把控制权交给程序员自己把握。
未来将用cli导出数据库表定义到xml文件,也方便导回mysql。
现在先用手工定义数据业务类型。
本内容要在之前orm入门基础上完成。
我们打开models cms 目录 User.cpp文件。添加一个方法,include/User.h 也添加一个方法定义
业务目标上取得用户5条最新内容
#ifndef ORM_CMS_USER_H
#define ORM_CMS_USER_H
#include "mysqlmodel.hpp"
#include "cms/include/userbase.h"
#include "cms/include/Article.h"
/* 如果此文件存在不会自动覆盖,没有则会自动生成。
*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */
namespace orm {
namespace cms {
class User : public mysqlclientDB<User,userbase>{
public:
User(std::string dbtag);
User();
User &get();
std::vector<orm::cms::articlebase::meta> gettoparticle(int userid);
};
}
};
#endif
这两个文件是如果没有cli生成orm文件时候自动生成,如果有了不会生成。所以要注意本文件。 我们加入两个内容
#include "cms/include/Article.h"
std::vector<orm::cms::articlebase::meta> gettoparticle(int userid);
#include "mysqlmodel.hpp"
#include "cms/include/userbase.h"
#include "cms/include/User.h"
#include "cms/include/articlebase.h"
/* 如果此文件存在不会自动覆盖,没有则会自动生成。
*If this file exists, it will not be overwritten automatically. If not, it will be generated automatically. */
namespace orm{
namespace cms{
User::User(std::string dbtag):mysqlclientDB(dbtag){}
User::User():mysqlclientDB(){}
User &User::get(){ return *this; }
std::vector<orm::cms::articlebase::meta> User::gettoparticle(int userid)
{
auto art = orm::cms::Article();
userid=this->data.userid;
art.where("userid",userid).order(" aid desc ").limit(5).fetch();
//art.where("userid",userid).whereOr("userid",0).order(" aid desc ").limit(5).fetch();
std::cout<<art.sqlstring;
return art.record;
}
}
}
加入引用定义文件
#include "cms/include/articlebase.h"
gettoparticle 方法业务代码我们定义好了
放到控制器里面使用
我们到controller 创建两个文件测试
一个是 testmodel.h testmodel.cpp 不懂可以看hello worl入门文章
#pragma once
#include <chrono>
#include <thread>
#include "httppeer.h"
#include "orm.h"
namespace http
{
std::string testmodel(std::shared_ptr<httppeer> peer);
std::string testmodelsmartptr(std::shared_ptr<httppeer> peer);
}
我加了两个,一个测试下智能指针
#include <chrono>
#include <thread>
#include "httppeer.h"
#include "testmodel.h"
namespace http
{
std::string testmodel(std::shared_ptr<httppeer> peer)
{
httppeer &client = peer->getpeer();
client << "testmodel ";
auto users = orm::cms::User();
users.where("name","admin").limit(1).fetch();
client << "userid: "<<users.getUserid();
auto artlists=users.gettoparticle(1);
for(int i=0;i<artlists.size();i++)
{
client << "<p> title "<<artlists[i].title<<"</p>";
}
return "";
}
std::string testmodelsmartptr(std::shared_ptr<httppeer> peer)
{
httppeer &client = peer->getpeer();
client << "testmodel ";
auto users = std::make_shared<orm::cms::User>();
users->where("name","admin").limit(1).fetch();
client << "userid: "<<users->getUserid();
auto artlists=users->gettoparticle(1);
for(int i=0;i<artlists.size();i++)
{
client << "<p> title "<<artlists[i].title<<"</p>";
}
return "";
}
}
实现代码是一样的
common/reghttpmethod.hpp
#ifndef __HTTP_REGHTTPMETHOD_HPP
#define __HTTP_REGHTTPMETHOD_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
#pragma once
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
#include "httppeer.h"
#include "testmodel.h"
namespace http
{
void _inithttpmethodregto(std::map<std::string, regmethold_t> &methodcallback)
{
struct regmethold_t temp;
temp.pre = nullptr;
temp.regfun = testmodel;
methodcallback.emplace("testmodel", temp);
temp.regfun = testmodelsmartptr;
methodcallback.emplace("testmodelsmartptr", temp);
}
}
在项目目录build里面 执行
cmake ..
make
cd ..
退回 根目录
sudo ./bin/paozhu
没有问题可以
看到结果
testmodel userid: 1
title Web 开发框架,拥有近十年的开源历史
测试智能指针方法也是一样 http://localhost/testmodelsmartptr
当然实际业务流程会很复杂,需要你自己构思了,这个可以实现了orm mapper的思想
以后这些业务可以用xml来表示,然后生成cpp代码。
就是用流程图画完可以生成xml然后生成cpp代码。
所以paozhu 框架提供插件化能力,然后这个流程可以无缝在线完成,不用写代码就可以了。