本文已参与「新人创作礼」活动,一起开启创作之路。
接上文:/post/710135…
写了这么多,可能有点乱,先看一下项目文件结构吧 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)
}