Go 語言,開源服務端程式碼自動生成 框架 - EasyGoServer

林冠巨集發表於2017-08-26

EasyGoServer

作者:林冠巨集 / 指尖下的幽靈

掘金:juejin.im/user/587f0d…

部落格:www.cnblogs.com/linguanh/

GitHub : github.com/af913337456…

聯絡方式 / Contact:913337456@qq.com


[TOC]

----- 概述

----- 指令碼介紹

--------- Linux

--------- Windows

--------- Mac

----- 使用流程

----- 部分程式碼說明

----- TODO

概述

一個能夠僅僅依賴你建立好的 sql 檔案,就能 自動幫你生成基礎服務端框架程式碼 的 go server 框架。包含有:

1,基礎的 增刪改查

2,擴充性強的API

3,客戶端的資料傳入 與 服務端的輸出 全部依賴 struct

  • 例如你的一個輸入結構體 inputStruct 設定為

    type inputStruct struct {
       // nullTag==1 指明 id 必須要求在客戶端傳入 {"id":123}
       Id   int64   `json:"id"   nullTag:"1"` 
       // nullTag==0 指明 name 在客戶端輸入的時候可以不必要
       Name string  `json:"name" nullTag:"0"` 
    }複製程式碼

    對應上例,客戶端 post 過來的 json : {"id":666, "name":"lgh"}

  • 當你在使用 select 的時候,你的 sql 如果是這樣的:
    select User.id , User.age from User
    那麼你的對應輸出結構體 outputStruct 應該是:

    type outputStruct struct {
       Id   int64  `json:"id"`   
       Age  int64  `json:"age"` 
    }複製程式碼

    最終輸出給客戶端:[{"id":xxx,"age":xxx}]

4,真正需要你寫的程式碼極少,例如第三點的例子,你要寫的就那麼多,其中預設的 struct 會自動幫你生成


指令碼介紹


根據 sql 檔案,自動生成程式碼檔案,包含有 struct.go,每張表對應生成一個包含有增刪改查的基礎方法檔案
one_key_create_code

根據內建的 makefile 或者 .bat 編譯並執行預設的 go server 程式,注意是預設的
make_server

Linux OS

one_key_create_code.sh
make_server.sh
Makefile

Windows OS

one_key_create_code.bat
make_server.bat

Mac OS

參照 linux 的

使用流程

1,在你的 伺服器 安裝 mysql 或者 mariadb

2,編寫好的你的 sql 檔案,可以參照我原始碼裡面的 this.sql

3,執行步驟2編寫好的 sql 檔案

4,修改 sql_2_api.go 裡面 main 內的 sql 檔名稱

5,執行 one_key_create_code 指令碼,成功後會在同級目錄生成下面檔案,記得重新整理目錄

  • struct.go,裡面包含註釋規範
  • 對應你 sql 檔案裡面的表名稱生成的函式檔案,格式:func_表名稱.go

6,自己寫好,main.go 或者 使用我提供的預設 LghSampleMain.go,在裡面 新增你自己的路由

    router.HandleFunc("/insert",insert_luser_sample).Methods("POST")
    router.HandleFunc("/select",select_luser_sample).Methods("GET")
    router.HandleFunc("/update",update_luser_sample).Methods("POST")
    router.HandleFunc("/delete",delete_luser_sample).Methods("POST")複製程式碼

7,配置好 conf.json 檔案,我裡面有例子

// Host 是絕對路徑
// Port 是要被監聽的埠
{
  "Host": "127.0.0.1",
  "Port": ":8884",
  "FilePort":":8885",
  "DbName":"database",
  "DbUser":"root",
  "DbPw":"123456",
  "DbPort":"3306"
}複製程式碼

8,現在執行 make_server 指令碼,觀察控制檯的輸出,即可。

部分程式碼說明

核心的引數結構體

type LghRequest struct {
    w http.ResponseWriter
    r *http.Request

    // 標記使用,當前的方法名稱
    funcName string

    // 輸入的結構體,與客戶端輸入的 json 成對應關係
    inputStruct  interface{}

    // 自定義 slices 的回撥,方便你做引數處理,返回 true 意味著此次操作終止,例如 update
    slicesCallBack func(slices []interface{}) bool

    // 根據傳入的 jsonObj 生成的 slices 來回撥,方法生成自定義 sql
    getSqlCallBack func(slices []interface{},inputStruct interface{}) string
}複製程式碼

例子方法

1,演示不需要引數的形式

/** 演示不需要引數的形式 */
func update_0(w http.ResponseWriter,r *http.Request)  {
    request := LghRequest{
        w,
        r,
        "update_luser",
        nil, /** nil 表示沒輸入結構體 */
        func(slices *[]interface{}) bool{
            return false
        },
        func(slices *[]interface{},inputStruct interface{}) string {
            return "update LUser set u_user_id='444' where id='1'"
        }}
    updateDataByStruct(request)
}複製程式碼

2,演示當有引數輸入的時候,引數僅做判斷,但是不需要組合到 sql 的情況

/** 演示當有引數輸入的時候,引數僅做判斷,但是不需要組合到 sql的情況 */
func update_1(w http.ResponseWriter,r *http.Request)  {
    type testS struct {
        Id int64 `json:"id" nullTag:"1"` // nullTag==1 指明 id 必須要求在客戶端傳入 {"id":123}
    }
    request := LghRequest{
        w,
        r,
        "update_luser",
        new (testS),
        func(slices []interface{}) bool{
            // 在這裡對 slices 做你想做的操作,增加或者刪除等等
            if slices[0] == -1{
                return true /** 返回 true,終止插入,提示錯誤或者其它 */
            }
            slices = append(slices[:0], nil) /** 自己做完處理刪除掉 */
            return false
        },
        func(slices []interface{},inputStruct interface{}) string {
            // 如果你想根據輸入的 json 資料來特定生成 sql,那麼就可以在這裡使用 slices 來操作
            return "update LUser set u_user_id='444' where id='2'"
        }}
    updateDataByStruct(request)
}複製程式碼

3,演示使用輸入引數的情況

/** 演示使用輸入引數的情況 */
func update_luser_sample(w http.ResponseWriter,r *http.Request)  {
    type testS struct {
        Id int64 `json:"id" nullTag:"1"`
    }
    request := LghRequest{
        w,
        r,
        "update_luser",
        new (testS),
        func(slices []interface{}) bool{
            return false
        },
        func(slices []interface{},inputStruct interface{}) string {
            return "update LUser set u_user_id='444' where id=?" /** 對應 id */
        }}
    updateDataByStruct(request)
}複製程式碼

開源地址

github.com/af913337456…

相關文章