给我代码好嘛,第三项我选择数据库
时间: 2024-04-15 19:29:44 浏览: 14
当然,以下是一个使用Go语言和MySQL数据库实现IP封堵和解封的代码示例:
```go
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
)
type IP struct {
ID int
Addr string
}
var db *sql.DB
func main() {
// 连接数据库
err := connectDB()
if err != nil {
log.Fatal(err)
}
// 创建IP黑名单表
err = createTable()
if err != nil {
log.Fatal(err)
}
// 初始化路由
router := gin.Default()
router.LoadHTMLGlob("templates/*")
router.GET("/", getIndex)
router.POST("/block", blockIP)
router.POST("/unblock", unblockIP)
// 启动服务器
err = router.Run(":8080")
if err != nil {
log.Fatal(err)
}
}
func connectDB() error {
var err error
db, err = sql.Open("mysql", "username:password@tcp(localhost:3306)/database")
if err != nil {
return err
}
err = db.Ping()
if err != nil {
return err
}
fmt.Println("Connected to database")
return nil
}
func createTable() error {
createTableSQL := `
CREATE TABLE IF NOT EXISTS ip_blacklist (
id INT AUTO_INCREMENT PRIMARY KEY,
addr VARCHAR(45) NOT NULL UNIQUE
);`
_, err := db.Exec(createTableSQL)
return err
}
func getIndex(c *gin.Context) {
var ips []IP
rows, err := db.Query("SELECT * FROM ip_blacklist")
if err != nil {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"error": err.Error()})
return
}
defer rows.Close()
for rows.Next() {
var ip IP
err := rows.Scan(&ip.ID, &ip.Addr)
if err != nil {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"error": err.Error()})
return
}
ips = append(ips, ip)
}
c.HTML(http.StatusOK, "index.html", gin.H{"ips": ips})
}
func blockIP(c *gin.Context) {
ip := c.PostForm("ip")
_, err := db.Exec("INSERT INTO ip_blacklist (addr) VALUES (?)", ip)
if err != nil {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"error": err.Error()})
return
}
c.Redirect(http.StatusSeeOther, "/")
}
func unblockIP(c *gin.Context) {
ip := c.PostForm("ip")
_, err := db.Exec("DELETE FROM ip_blacklist WHERE addr = ?", ip)
if err != nil {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"error": err.Error()})
return
}
c.Redirect(http.StatusSeeOther, "/")
}
```
请注意,上述代码示例仅供参考,您需要根据实际情况进行适当的修改和优化。确保替换`username`、`password`和`database`为自己的数据库信息,并在相应目录下创建正确的HTML模板文件(index.html和error.html)。还需要安装`gin`和`go-sql-driver/mysql`库,可以使用以下命令进行安装:
```
go get github.com/gin-gonic/gin
go get github.com/go-sql-driver/mysql
```
希望对您有所帮助!如果有任何问题,请随时提问。