Skip to content

paozhu 数据业务模型

Huang ziquan edited this page Dec 13, 2022 · 4 revisions

paozhu 数据业务模型

数据业务模型是什么呢,其实paozhu c++ web framework框架 是吸取orm和数据库关系模型思想,java好像用xml来定义。

paozhu以后可以实现xml定义,然后生成数据业务代码 对象模型。目前paozhu是手动建立,这个思想是10年前根据作者业务妥协弄出来的想法,目前还是按照之前做法,没有做自动orm mapper,以前想法是对照mysql里面建模的关系做,但是后来感觉还是快进快出好点,容易命中缓存。所以把控制权交给程序员自己把握。

未来将用cli导出数据库表定义到xml文件,也方便导回mysql。

现在先用手工定义数据业务类型。

1、 编写业务代码

本内容要在之前orm入门基础上完成。

我们打开models cms 目录 User.cpp文件。添加一个方法,include/User.h 也添加一个方法定义

业务目标上取得用户5条最新内容

User.h

#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);

User.cpp

#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 方法业务代码我们定义好了

放到控制器里面使用

2、 控制器使用业务数据模型

我们到controller 创建两个文件测试

一个是 testmodel.h testmodel.cpp 不懂可以看hello worl入门文章

testmodel.h

#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);
}

我加了两个,一个测试下智能指针

testmodel.cpp

#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 "";
      }
}

实现代码是一样的

3、注册到回调函数文件

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);
  }
}

4、编译测试

在项目目录build里面 执行

cmake ..
make
cd .. 

退回 根目录

sudo ./bin/paozhu

没有问题可以

http://localhost/testmodel

看到结果

testmodel userid: 1

title Web 开发框架,拥有近十年的开源历史

测试智能指针方法也是一样 http://localhost/testmodelsmartptr

当然实际业务流程会很复杂,需要你自己构思了,这个可以实现了orm mapper的思想

以后这些业务可以用xml来表示,然后生成cpp代码。

就是用流程图画完可以生成xml然后生成cpp代码。

所以paozhu 框架提供插件化能力,然后这个流程可以无缝在线完成,不用写代码就可以了。