Commit 92a1804a authored by Xiaokang Shen's avatar Xiaokang Shen 💛
Browse files

initialize handler and other parts

parent 523010f8
package controller
import (
"go-svc-tpl/app/response"
"go-svc-tpl/model"
"go-svc-tpl/utils"
"strconv"
"github.com/labstack/echo/v4"
"github.com/sirupsen/logrus"
)
func Register(c echo.Context) error {
name := c.FormValue("name")
email := c.FormValue("email")
pwd := c.FormValue("pwd")
// !!! without validation now
err := model.RegisterUser(name, email, pwd)
if err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "register failed", "")
}
return response.SendResponse(c, 0, "register successfully", "")
}
// get token from (email, pwd)
func Login(c echo.Context) error {
email := c.FormValue("email")
pwd := c.FormValue("pwd")
data := make(map[string]interface{})
var msg string
var code int
// !!! without validation now
// judge whether the user exists
exist := model.CheckAuth(email, pwd)
if exist {
token, err := utils.GenToken(email, pwd)
if err != nil {
code = 1
msg = "can't generate token"
logrus.Error(err)
} else {
code = 0
msg = "generate token successfully"
data["token"] = token
}
} else {
code = 1
msg = "user not exist"
}
return response.SendResponse(c, code, msg, data)
}
// by frontend ?
func Logout(c echo.Context) error {
return nil
}
func Info(c echo.Context) error {
name := getName(c)
user, err := model.GetUser(name)
if err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "get user failed", "")
}
data := struct {
Name string `json:"name"`
Email string `json:"Email"`
}{name, user.Email}
return response.SendResponse(c, 0, "get info successfully", data)
}
func GetRecord(c echo.Context) error {
name := getName(c)
data, err := model.GetRecord(name)
if err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "get failed", "")
}
return response.SendResponse(c, 0, "get record successfully", data)
}
func GetUrl(c echo.Context) error {
name := getName(c)
data, err := model.GetUrl(name)
if err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "get failed", "")
}
return response.SendResponse(c, 0, "get url successfully", data)
}
func Create(c echo.Context) error {
// get data of shortlink from request
var link model.ShortLink
if err := c.Bind(&link); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "request error", "")
}
if link.Short == "" {
link.Short = utils.GenShort()
}
// create a new link to user by name
name := getName(c)
var id int
var err error
if id, err = model.CreateLink(name, link); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "create failed", "")
}
return response.SendResponse(c, 0, "create successfully", struct {
ID int `json:"id"`
}{id})
}
func Query(c echo.Context) error {
name := getName(c)
id, _ := strconv.Atoi(c.FormValue("id"))
var link model.ShortLink
var err error
if link, err = model.QueryLink(name, id); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "query error", "")
}
return response.SendResponse(c, 0, "query successfully", link)
}
func Update(c echo.Context) error {
// read update data
var data model.UpdateData
if err := c.Bind(&data); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "request error", "")
}
// update the data of user
name := getName(c)
if err := model.UpdateLink(name, data); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "update error", "")
}
return response.SendResponse(c, 0, "update successfully", "")
}
func Delete(c echo.Context) error {
name := getName(c)
id, _ := strconv.Atoi(c.FormValue("id"))
if err := model.DeleteLink(name, id); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "delete error", "")
}
return response.SendResponse(c, 0, "delete successfully", "")
}
func Pause(c echo.Context) error {
name := getName(c)
id, _ := strconv.Atoi(c.FormValue("id"))
if err := model.PauseLink(name, id); err != nil {
logrus.Error(err)
return response.SendResponse(c, 1, "puase error", "")
}
return response.SendResponse(c, 0, "pause succesfully", "")
}
// get the username by token
func getName(c echo.Context) string {
token := c.FormValue("token")
claims, _ := utils.ParseToken(token)
return claims.Username
}
package controller
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
package midware
import (
"go-svc-tpl/app/response"
"go-svc-tpl/utils"
"net/http"
"time"
"github.com/labstack/echo/v4"
"github.com/sirupsen/logrus"
)
// validate token
func Auth(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
token := c.FormValue("token")
var code int
var msg string
if token == "" {
code = 0 // no login but can use
msg = "not login yet"
} else {
claims, err := utils.ParseToken(token)
if err != nil {
code = 1
msg = "token check fail"
logrus.Error(err)
} else if time.Now().Unix() > claims.ExpiresAt {
code = 1
msg = "token expired"
} else {
code = 0
}
}
// if not success, abort the program
if code != 0 {
response.SendResponse(c, code, msg, "")
return echo.NewHTTPError(http.StatusUnauthorized, msg)
}
// check pass, continue
return next(c)
}
}
package response
import (
"net/http"
"github.com/labstack/echo/v4"
)
type Response struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"msg"`
}
func SendResponse(c echo.Context, code int, msg string, data ...interface{}) error {
return c.JSON(http.StatusOK, Response{
Code: code,
Msg: msg,
Data: data,
})
}
package app
import (
"go-svc-tpl/app/controller"
"github.com/labstack/echo/v4"
echoSwagger "github.com/swaggo/echo-swagger"
)
......@@ -13,4 +15,19 @@ func addRoutes() {
api := e.Group("api")
api.GET("/doc/*", echoSwagger.WrapHandler)
api.GET("/ping", ping)
user := e.Group("user")
user.POST("/register", controller.Register)
user.POST("/login", controller.Login)
user.POST("/logout", controller.Logout)
user.POST("/info", controller.Info)
user.POST("/record/get", controller.GetRecord)
user.POST("/url/get", controller.GetUrl)
url := e.Group("url")
url.POST("/create", controller.Create)
url.POST("/query", controller.Query)
url.POST("/update", controller.Update)
url.POST("/delete", controller.Delete)
url.POST("/pause", controller.Pause)
}
......@@ -4,10 +4,10 @@ go 1.17
require (
github.com/go-playground/validator/v10 v10.10.0
github.com/labstack/echo/v4 v4.6.3
github.com/labstack/echo/v4 v4.9.0
github.com/sirupsen/logrus v1.8.1
github.com/spf13/viper v1.10.1
github.com/swaggo/echo-swagger v1.2.0
github.com/swaggo/echo-swagger v1.3.5
gorm.io/driver/mysql v1.2.3
gorm.io/gorm v1.22.5
)
......@@ -16,6 +16,7 @@ require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
......@@ -41,15 +42,15 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 // indirect
github.com/swaggo/swag v1.7.6 // indirect
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a // indirect
github.com/swaggo/swag v1.8.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.1 // indirect
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.8 // indirect
golang.org/x/tools v0.1.10 // indirect
gopkg.in/ini.v1 v1.66.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
......@@ -99,6 +99,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
......@@ -288,6 +289,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/labstack/echo/v4 v4.1.0/go.mod h1:3LbYC6VkwmUnmLPZ8WFdHdQHG77e9GQbjyhWdb1QvC4=
github.com/labstack/echo/v4 v4.6.3 h1:VhPuIZYxsbPmo4m9KAkMU/el2442eB7EBFFhNTTT9ac=
github.com/labstack/echo/v4 v4.6.3/go.mod h1:Hk5OiHj0kDqmFq7aHe7eDqI7CUhuCrfpupQtLGGLm7A=
github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY=
github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
......@@ -410,10 +413,16 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/swaggo/echo-swagger v1.2.0 h1:f0i6xCdfQ5oumihLPaL2j9tDsVlXgXWHdJsyflLtAiM=
github.com/swaggo/echo-swagger v1.2.0/go.mod h1:0SobLdYEef/6Tei9I0M9cV8D3aaQAeqMjfGC4sWl8Q4=
github.com/swaggo/echo-swagger v1.3.5 h1:kCx1wvX5AKhjI6Ykt48l3PTsfL9UD40ZROOx/tYzWyY=
github.com/swaggo/echo-swagger v1.3.5/go.mod h1:3IMHd2Z8KftdWFEEjGmv6QpWj370LwMCOfovuh7vF34=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 h1:+iNTcqQJy0OZ5jk6a5NLib47eqXK8uYcPX+O4+cBpEM=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY=
github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
github.com/swaggo/swag v1.7.6 h1:UbAqHyXkW2J+cDjs5S43MkuYR7a6stB7Am7SK8NBmRg=
github.com/swaggo/swag v1.7.6/go.mod h1:7vLqNYEtYoIsD14wXgy9oDS65MNiDANrPtbk9rnLuj0=
github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI=
github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
......@@ -426,6 +435,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
......@@ -454,6 +464,9 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
......@@ -492,6 +505,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
......@@ -537,8 +552,11 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM=
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
......@@ -626,6 +644,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
......@@ -637,7 +656,10 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
......@@ -707,8 +729,11 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
......
......@@ -9,9 +9,13 @@ import (
"go-svc-tpl/app"
_ "go-svc-tpl/docs"
"go-svc-tpl/model"
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetReportCaller(true)
model.Init()
app.InitWebFramework()
app.StartServer()
......
package model
// 用于controller测试
type User struct {
Email string `json:"email"`
}
type ShortLink struct {
Origin string `json:"origin"`
Short string `json:"short"`
Comment string `json:"comment"`
StartTime int64 `json:"startTime`
ExpireTime int64 `json:"expireTime`
} // 创建的那五个参数设置form tag
type UpdateData struct {
Origin string `json:"origin"`
Comment string `json:"comment"`
StartTime int64 `json:"startTime`
ExpireTime int64 `json:"expireTime`
} // 修改的那四个参数设置form tag
func RegisterUser(name, email, pwd string) error {
return nil
}
func CheckAuth(email, pwd string) bool { // 检查是否有这个用户,密码对不对
return true
}
// 这三个返回一些信息的类型看数据库实现
func GetUser(name string) (User, error) {
return User{"1234@zju.edu.cn"}, nil
}
func GetRecord(name string) (interface{}, error) {
return ShortLink{
Origin: "1145141919",
Short: "114",
Comment: "henhenaaaa",
StartTime: 0,
ExpireTime: 10000,
}, nil
}
func GetUrl(name string) (interface{}, error) {
return "urlurlurl", nil
}
// 意义显然x
func CreateLink(name string, link ShortLink) (int, error) {
return 1, nil
}
func QueryLink(name string, id int) (ShortLink, error) {
return ShortLink{
Origin: "1145141919",
Short: "114",
Comment: "henhenaaaa",
StartTime: 0,
ExpireTime: 10000,
}, nil
}
func UpdateLink(name string, data UpdateData) error {
return nil
}
func DeleteLink(name string, id int) error {
return nil
}
func PauseLink(name string, id int) error {
return nil
}
func ExistShort(str string) bool { // 短链接是否已经存在
return false
}
......@@ -10,6 +10,7 @@ import (
var DB *gorm.DB
func Init() {
return
connectDatabase()
err := DB.AutoMigrate() // TODO: add table structs here
if err != nil {
......
package utils
import (
"fmt"
"go-svc-tpl/model"
)
var shortCounter int
var toChar map[int]string
func init() {
shortCounter = 1145141919
toChar = make(map[int]string)
// radix 62
for i := 0; i < 10; i++ {
toChar[i] = fmt.Sprintf("%d", i)
}
for i := 0; i < 26; i++ {
toChar[i+10] = fmt.Sprintf("%c", 'A'+i)
toChar[i+36] = fmt.Sprintf("%c", 'a'+i)
}
}
// generate shortlink
func GenShort() string {
short := ""
for i := shortCounter; i != 0; i /= 62 {
short = fmt.Sprintf("%s%s", short, toChar[i%62])
}
shortCounter++
// while short exists, generate again
for model.ExistShort(short) {
short = GenShort()
}
return short
}
package utils
import (
"time"
"github.com/dgrijalva/jwt-go"
)
type Claims struct {
Username string `json:"username"`
Password string `json:"password"`
jwt.StandardClaims
}
var jwtSecret = []byte("woshinibaba") // secret key used to gen token
// get token from (username, password)
func GenToken(username, password string) (string, error) {
nowTime := time.Now()
expireTime := nowTime.Add(2 * time.Hour) // expire after 2 hours
claims := Claims{
Username: username,
Password: password,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expireTime.Unix(),
Issuer: "nibaba",
},
}
// sign
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
token, err := tokenClaims.SignedString(jwtSecret)
return token, err
}
// take token into Claims{}, and then can get username and password
func ParseToken(token string) (*Claims, error) {
tokenClaims, err := jwt.ParseWithClaims(token, Claims{}, func(t *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if tokenClaims != nil {
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
return claims, nil
}
}
return nil, err
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment