本文已参与「新人创作礼」活动,一起开启创作之路。

接上文:juejin.cn/post/710135…

写了这么多,可能有点乱,先看一下项目文件结构吧

go+solidity+web写一个简单的水龙头项目4
static文件夹中的是前端学什么web静态文件,就不过多阐述了。

路由配置

server.go

package logic
import (
"github.com/gin-gonic/gin" // 导入web服务框架
)
func Start(addr, webDir string) (err error) {
   // 使用gin框架提供的默认web服务引擎
   r := gin.Default()
   // 静态文件服务
   if len(webDir) > 0 {
      // 将一个目录下的静态文件,并注册到web服务器
      r.Static("/web", webDir)
   }
   // api接口服务,定义了路由组 /faucePath
      faucetPath := r.Group("awesomeProject")
   {
      //定义接口,并注册到web服务器
      faucetPath.POST("", gainData)
      faucetPath.POST("/getAccount",getAccount) 
      faucetPath.POST("/HaveAccount",haveAccount)
   }
   // 启动web服务
   err = r.Run(addr)
   return err
}
// 封装函数,用于向客户端返回正确信息
func respOK(c *gin.Context, data interface{}) {
   c.JSON(200, gin.H{
      "code": 0,
      "data": data,
   })
}
// 封装函数,用于向客户端返回错误消息
func respError(c *gin.Context, msg interface{}) {
   c.JSON(200, gin.H{
      "code":    1,
      "message": msg,
   })
}

2、 控制器方法分离

1、控制器方法 gainData.go

package logic
import (
   x "awesomeProject/db"
   "awesomeProject/solidity"
   "fmt"
   "github.com/ethereum/go-ethereum/common"
   "github.com/gin-gonic/gin"
)
func gainData(c *gin.Context) {
//结构体模板
     FaucetDB:=x.FAUCET{}
 //获取前端form表单传来的值
    Account :=c.PostForm("account")
   FaucetDB.Account=Account
    //使用链url
   client,err := solidity.HaveClient()
   if err != nil{
      respError(c,err)
      return
   }
   ins,_ :=solidity.HaveFaucet(client)
 //发送以太币  common.HexToAddress() :string转address
 add,err:=solidity.SendFaucetETH(client,ins,common.HexToAddress(FaucetDB.Account))
   if err != nil{
      respError(c,err)
      fmt.Println(err)
      return
   }else{
      fmt.Println(add)
      //数据库操作
      err= x.UpLimitTimes()
      if err != nil {
         respError(c,err)
         return
      }
      //数据库操作
        err= x.UpdataETH()
      if err != nil {
         respError(c,err)
         return
      }
      //数据库操作
   err =x.InsertFaucet(Account)
      if err != nil {
         respError(c,err)
         return
      }
   }
   //获取合约余额
   blance,err:=solidity.GetBlance(client)
   if err != nil {
      respError(c,err)
      return
   }else{
      fmt.Println(blance)
//合约余额存入数据库,数据库操作
      err=x.BlanceVal(blance)
   }
}

2、控制器方法 getAccount

package logic
import (
   "awesomeProject/db"
   "github.com/gin-gonic/gin"
)
func getAccount(c *gin.Context) {
//将数据库中的数据赋值给x
     x,err:=db.ListAcc()
   if err != nil {
      respError(c, err.Error())
      return
   }
//数据传给前端
   respOK(c, x)
}

3、控制器方法

package logic
import (
   "awesomeProject/db"
   "fmt"
   "github.com/gin-gonic/gin"
)
func haveAccount(c *gin.Context){
//把合约相关的数据库赋值给x
   x,err:=db.HaveAccount()
   fmt.Println("sssss",x)
   if err != nil {
      respError(c, err.Error())
      return
   }
//传值给前端展示
   respOK(c, x)
}