Основной функционал готов. Аутентификация, создание и отображение профиля, отображение списка профилей.
parent
58e31116e8
commit
5c6fd7ebd8
|
@ -54,8 +54,8 @@ func main() {
|
||||||
})
|
})
|
||||||
|
|
||||||
// Регистрация пользователя, после которой нас перебрасывает на страницу логина
|
// Регистрация пользователя, после которой нас перебрасывает на страницу логина
|
||||||
m.Get("/signup", handlers.GetSigned)
|
m.Get("/signup", handlers.GetSignup)
|
||||||
m.Post("/signup", binding.Bind(auth.UserModel{}), handlers.PostSigned)
|
m.Post("/signup", binding.Bind(auth.UserModel{}), handlers.PostSignup)
|
||||||
|
|
||||||
//Анкета текущего пользователя
|
//Анкета текущего пользователя
|
||||||
m.Get("/", auth.LoginRequired, handlers.GetHome)
|
m.Get("/", auth.LoginRequired, handlers.GetHome)
|
||||||
|
|
|
@ -13,6 +13,7 @@ type UserModel struct {
|
||||||
Name string `db:"name" form:"name"`
|
Name string `db:"name" form:"name"`
|
||||||
Surname string `db:"surname" form:"surname"`
|
Surname string `db:"surname" form:"surname"`
|
||||||
BirthDate time.Time `db:"birthdate"`
|
BirthDate time.Time `db:"birthdate"`
|
||||||
|
YearsOld int `db:"-" form:"-"`
|
||||||
FormBirthDate string `form:"birthdate"`
|
FormBirthDate string `form:"birthdate"`
|
||||||
Gender string `db:"gender" form:"gender"`
|
Gender string `db:"gender" form:"gender"`
|
||||||
City string `db:"city" form:"city"`
|
City string `db:"city" form:"city"`
|
||||||
|
|
|
@ -13,17 +13,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetHome(r render.Render, user auth.User) {
|
func GetHome(r render.Render, user auth.User) {
|
||||||
|
h := user.(*auth.UserModel).BirthDate
|
||||||
|
user.(*auth.UserModel).YearsOld = int(time.Since(h).Hours()/8760)
|
||||||
r.HTML(200, "index", user)
|
r.HTML(200, "index", user)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSigned(r render.Render) {
|
func GetSignup(r render.Render) {
|
||||||
doc := map[string]interface{}{
|
r.HTML(200, "signup", nil)
|
||||||
"PageTitle": "page not exists",
|
|
||||||
}
|
|
||||||
r.HTML(200, "signup", doc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func PostSigned(app application.App, session sessions.Session, postedUser auth.UserModel, r render.Render, req *http.Request) {
|
func PostSignup(app application.App, postedUser auth.UserModel, r render.Render) {
|
||||||
t, err := time.Parse("2006-1-2", postedUser.FormBirthDate)
|
t, err := time.Parse("2006-1-2", postedUser.FormBirthDate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := fmt.Errorf("can't parce date: %w", err)
|
e := fmt.Errorf("can't parce date: %w", err)
|
||||||
|
@ -46,20 +45,32 @@ func PostSigned(app application.App, session sessions.Session, postedUser auth.U
|
||||||
)
|
)
|
||||||
_, err = app.DB.Exec(query)
|
_, err = app.DB.Exec(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := fmt.Errorf("can't create account in DB: %w", err)
|
err500("can't create account in DB: ", err, r)
|
||||||
log.Println(e)
|
|
||||||
doc := map[string]interface{}{
|
|
||||||
"Error": e,
|
|
||||||
}
|
|
||||||
r.HTML(500, "500", doc)
|
|
||||||
}
|
}
|
||||||
r.Redirect("/login")
|
r.Redirect("/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserList(r render.Render) {
|
func GetUserList(app application.App, user auth.User, r render.Render) {
|
||||||
doc := map[string]interface{}{
|
doc := make(map[string]interface{})
|
||||||
"PageTitle": "page not exists",
|
doc["user"]=user.(*auth.UserModel)
|
||||||
|
var users []auth.UserModel
|
||||||
|
var tmp auth.UserModel
|
||||||
|
var tmpTime string
|
||||||
|
var results, err = app.DB.Query(`SELECT name, surname, birthdate, gender, city FROM users`)
|
||||||
|
if err != nil || results==nil {
|
||||||
|
err500("can't get user list from DB: ", err, r)
|
||||||
}
|
}
|
||||||
|
defer results.Close()
|
||||||
|
for results.Next() {
|
||||||
|
err = results.Scan(&tmp.Name, &tmp.Surname, &tmpTime, &tmp.Gender, &tmp.City)
|
||||||
|
if err != nil {
|
||||||
|
err500("can't scan result from DB: ", err, r)
|
||||||
|
}
|
||||||
|
tmp.BirthDate = str2Time(tmpTime, r)
|
||||||
|
tmp.YearsOld = int(time.Since(tmp.BirthDate).Hours()/8760)
|
||||||
|
users = append(users,tmp)
|
||||||
|
}
|
||||||
|
doc["table"]=users
|
||||||
r.HTML(200, "list", doc)
|
r.HTML(200, "list", doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,12 +86,28 @@ func PostLogin(app application.App, session sessions.Session, postedUser auth.Us
|
||||||
} else {
|
} else {
|
||||||
err := auth.AuthenticateSession(session, &user)
|
err := auth.AuthenticateSession(session, &user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.JSON(500, err)
|
err500("can't auth session: ", err, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
params := req.URL.Query()
|
params := req.URL.Query()
|
||||||
redirect := params.Get(auth.RedirectParam)
|
redirect := params.Get(auth.RedirectParam)
|
||||||
r.Redirect(redirect)
|
r.Redirect(redirect)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func str2Time(s string, r render.Render) time.Time {
|
||||||
|
t, err := time.Parse("2006-01-02 15:04:05", s)
|
||||||
|
if err != nil {
|
||||||
|
err500("can't parce date: ", err, r)
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
func err500(s string, err error, r render.Render) {
|
||||||
|
e := fmt.Errorf("s% %w", s, err)
|
||||||
|
log.Println(e)
|
||||||
|
doc := map[string]interface{}{
|
||||||
|
"Error": e,
|
||||||
|
}
|
||||||
|
r.HTML(500, "500", doc)
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
<p>404. Page not found</p>
|
<h2>404. Page not found</h2>
|
||||||
<a href="/">Home</a><br/>
|
<a href="/">Home</a><br/>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
<p>500. INTERNAL SERVER ERROR!</p>
|
<h2>500. INTERNAL SERVER ERROR!</h2>
|
||||||
<p>{{ .Error }}</p>
|
<p>{{ .Error }}</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -1,9 +1,10 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
|
<h2> Your account data</h2>
|
||||||
<p> Hello <b>{{ .Name }} {{ .Surname }}</b></p>
|
<p> Hello <b>{{ .Name }} {{ .Surname }}</b></p>
|
||||||
<p>You gender is <b>{{ .Gender }}</b></p>
|
<p>You gender is <b>{{ .Gender }}</b></p>
|
||||||
<p>You <b>{{ .BirthDate }}</b> years old</p>
|
<p>You <b>{{ .YearsOld }}</b> years old</p>
|
||||||
<p>You now live in <b>{{ .City }}</b></p>
|
<p>You now live in <b>{{ .City }}</b></p>
|
||||||
<p>You interests is: <b>{{ .Interests }}</b></p>
|
<p>You interests is: <b>{{ .Interests }}</b></p>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border: 1px solid black;
|
||||||
|
width: 100%;
|
||||||
|
background-color: azure;
|
||||||
|
}
|
||||||
|
table th {
|
||||||
|
border: 1px solid black;
|
||||||
|
background-color: aquamarine;
|
||||||
|
}
|
||||||
|
table td {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>List of all users</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Years Old</th>
|
||||||
|
<th>Gender</th>
|
||||||
|
<th>City</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{ range $value:=.table }}
|
||||||
|
<tr>
|
||||||
|
<td><a>{{ $value.Name }} {{ $value.Surname }}</a></td>
|
||||||
|
<td><a>{{ $value.YearsOld }}</a></td>
|
||||||
|
<td><a>{{ $value.Gender }}</a></td>
|
||||||
|
<td><a>{{ $value.City }}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{ end }}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<input type="button" onclick="location.href='/';" value="Home" />
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue