关于lua:基于openresty的web-api框架

52次阅读

共计 4849 个字符,预计需要花费 13 分钟才能阅读完成。

用 openresty 搭建的一个繁难 web api 框架,不便之后用的时候疾速生成我的项目构造

我的项目地址

点击这里

目录构造

构造供蕴含 config、controller、libs、model 四个目录

  • config

    配置文件目录,用于 app、redis、database 相干的配置

    • app 利用相干
    return {
        default_controller = 'home', -- 默认控制器
        default_action       = 'index', -- 默认办法
    }
    • 数据库相干
    local mysql_config = {
        timeout = 5000,
        connect_config = {
            host = "127.0.0.1",
            port = 3306,
            database = "demo",
            user = "root",
            password = "a12345",
            max_packet_size = 1024 * 1024
        },
        pool_config = {
            max_idle_timeout = 20000, -- 20s
            pool_size = 50 -- connection pool size
        }
    }
    • redis 配置
    return {
        host = "127.0.0.1", -- redis host
        port = 6379, -- the port
        max_idle_timeout = 60000, -- max idle time
        pool_size = 1000, -- pool size
        timeout = 1000, -- timeout time
        db_index= 2, -- database index
        
    }
  • libs 目录

    libs 目录上面的公共的模块库,包含 redis、db、request、response 等

  • controller 目录

    这是控制器目录,外面有一个封装了一个基类 Base.lua, 业务控制器继承这个即可,根本的业务控制器代码如下

    -- home.lua
    local Base = require("controller.base")
    
    local Home = Base:extend()
    
    function Home:index() 
        self:json({data={}})
    end

    下面的代码就实现了一个控制器,拜访门路 hostname://home/index 即可申请 index 办法, 申请的 url 规定是 hostname+controller 文件夹下的文件名 +/+ 文件中的办法名(留神肯定要继承 Base 模块)

    controller 外面提供了几个根本属性

    • self.request 获取申请相干参数,如 self.request.query.xx 获取 get 参数,self.request.body.xx 获取 post 参数,self.request.headers.xx 获取 header 参数等
    • self.response 输入响应后果,次要有 self.response:json()返回 data 后果,以及 self.response:redirect()跳转,self.response.get_body()获取响应后果等

      为了不便开发,在 Base 外面封装了 response,提供了 self:json(),self:error(code,message)两个快捷办法

      self:json({data=self.redis:get("test")}) -- 返回后果设置 data
      self:error(2,"获取数据失败") -- 返回后果设置错误码,谬误音讯

      返回的构造蕴含 data,code,message 字段

      {"data":{"data":["BBBBB","B","AAAAA","A","BBBBB","B","AAAAA","A"]},"message":"","code":" 获取胜利 "}
    • self.redis 能够应用 redis,蕴含 self.redis:set,self.redis:get,self.redis:hset,self.redis:hget 等等,具体能够应用的函数能够参考 libs/redis.lua 文件的 15 到 72 行
    • self.controller 获取以后控制器名称
    • self.action 获取以后 action 操作名称
  • model 目录

    模型相干,为了便于操作,也封装了一个 Base 基类,业务 model 只须要继承即可

    -- good.lua
    local Base = require "model.base"
    
    local Good = Base:extend() -- 继承 Base
    
    return Good("test",'lgid') -- 第一个参数表名称, 第二个参数是表对应的主键(默认为 id)

    Base.lua 封装的基类提供了单表增删改查的办法

    • create(data)增加记录
    • delete(id)删除记录
    • update(data,id)批改记录
    • get()、all()过滤记录
    • where()过滤条件办法
    • columns()设置查找哪些列的办法
    • orderby()设置排序的办法
    • count()查找数据总条数的办法

    同时 Base.lua 也提供了一个办法用于自定义执行 sql 的办法,不便简单查问

    • query()

疾速开始

  • nginx.conf 增加相似如下代码

    worker_processes  1;
    error_log logs/error.log;
    events {worker_connections 1024;}
    http {
    
        lua_package_path 'E:/openresty/demo/src/?.lua;;';
        server {
            charset utf-8;        
            listen 8080;
            
            location = /favicon.ico {
              log_not_found off;# 敞开日志
              access_log off;# 不记录在 access.log
            }
    
            location / {
                default_type text/html;
                content_by_lua_file "E:/openresty/demo/src/main.lua";
            }
        }
    }
  • 增加控制器

    在 controller 目录增加 user.lua

    local Base = require("controller.base")
    
    local User = Base:extend()
    
    function User:index() 
        self:json({
            data={name = "hello world"}
        })
    end
    return User
  • 增加 model

    local Base = require "model.base"
    
    local User = Base:extend()
    
    return User("sls_p_user",'suid')
  • 控制器应用 model

    local userModel = require('model.user')
    
    function User:index() 
        self:json({
            data={name = userModel:columns('rname'):get(1)
            }
        })
    end

model 封装的快捷办法阐明

  • 增加

    local data = {
        name = "test",
        pwd = 123
    }
    local insertId = userModel:create(data)
  • 删除

    • 依据主键删除

      local affect_rows = userModel:delete(2)
    • 依据 where 条件删除

      local affect_rows = userModel:where("name","=",3):delete()
  • 批改

    • 依据主键批改

      local affect_rows = userModel:update(data,2)
      
      local data = {
          suid = "1", -- data 外面存在主键,依据主键更新
          name = "hello 我的测试",
      }
      local affect_rows = userModel:update(data)
    • 依据 where 条件批改

      local affect_rows = userModel:where("name","=",3):update(data)
  • 查找

    • 查找一条记录

      local info = userModel:where("name","=",3):get() -- 依据 where 条件查找
      local info = userModel:get(1) -- 依据主键查找
      local info = userModel:columns('suid,name'):get(1) -- 查找指定字段, 查找字段是字符串
      local info = userModel:columns({'suid','name'}):get(1) -- 查找指定字段, 查找字段是 table
    • 查找多条记录

      local list = userModel:where("name","=",3):all() -- 依据 where 条件查找
      local list = userModel:columns('suid,name'):all() -- 查找指定字段, 查找字段是字符串
      local list = userModel:columns({'suid','name'}):all() -- 查找指定字段, 查找字段是 table
  • 其它办法阐明

    • 查找数据条数

      local count = userModel:where("name","=","json"):count()
    • 排序

      local list = userModel:where("name","=",3):orderby("id"):all()
      
      local list = userModel:where("name","=",3):orderby("name","asc"):orderby("id","desc"):all() -- 多个排序
    • 查找指定字段(不应用指定字段,则是查找所有字段)

      local list = userModel:columns('suid,name'):all() --columns 外面能够是字符串,也能够是 table 构造
    • 依据 where 条件查找

      local list = userModel:columns('suid,rname'):where("suid","<","30"):orderby("suid"):all()
      
      local list = userModel:columns('suid,rname'):where("suid","<","30"):where("rname","like","test%"):orderby("suid"):all() -- 能够多个 where
    • 自定义执行的 sql

      -- 关联查问
      local sql = "select su.*,c.logincount from sls_p_user su join c_user c on su.suid=c.suid where su.suid=2"
      local result = userModel:query(sql)
      
      -- 动静参数查问
      local sql = "select * from sls_p_user where suid=? and username=?"
      local result = userModel:query(sql,{1,"json"})

命令行

为了不便疾速生成控制器 controller, 以及模型 model, 特开发了命令行, 命令行应用 luajit 编写,须要将 luajit 放入环境变量

 ./jframe -h
jframe v0.1.1, a Lua web framework based on OpenResty.
Usage: jframe COMMAND [OPTIONS]
Commands:
 controller [name]          Create a new controller
 model      [name]  [table] Create a new model
 version                    Show version of the framework
 help                       Show help tips

留神 windows 下命令是

luajit ./jframe -h
  • 生成控制器,主动生成到 controller 目录下

    jframe controller controllerName
  • 生成 model,主动生成到 model 目录下

    jframe model modelName -- 不指定表名称,生成的 model 表名称默认是给定的 modelname 的小写格局
    jframe model modelName table-- 指定 model 名称以及表名称
    

正文完
 0