Core app
This commit is contained in:
parent
dbec9460ee
commit
58e31116e8
@ -55,7 +55,7 @@ func main() {
|
|||||||
|
|
||||||
// Регистрация пользователя, после которой нас перебрасывает на страницу логина
|
// Регистрация пользователя, после которой нас перебрасывает на страницу логина
|
||||||
m.Get("/signup", handlers.GetSigned)
|
m.Get("/signup", handlers.GetSigned)
|
||||||
m.Post("/signup", handlers.PostSigned)
|
m.Post("/signup", binding.Bind(auth.UserModel{}), handlers.PostSigned)
|
||||||
|
|
||||||
//Анкета текущего пользователя
|
//Анкета текущего пользователя
|
||||||
m.Get("/", auth.LoginRequired, handlers.GetHome)
|
m.Get("/", auth.LoginRequired, handlers.GetHome)
|
||||||
|
@ -1,24 +1,23 @@
|
|||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/tiburon-777/OTUS_HighLoad/internal/application"
|
"github.com/tiburon-777/OTUS_HighLoad/internal/application"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UserModel struct {
|
type UserModel struct {
|
||||||
Id int64 `form:"id" db:"id"`
|
Id int64 `db:"id" form:"id"`
|
||||||
Username string `form:"name" db:"username"`
|
Username string `db:"username" form:"username"`
|
||||||
Password string `form:"password" db:"password"`
|
Password string `db:"password" form:"password"`
|
||||||
Name string `form:"name" db:"name"`
|
Name string `db:"name" form:"name"`
|
||||||
Surname string `form:"surname" db:"surname"`
|
Surname string `db:"surname" form:"surname"`
|
||||||
BirthDate time.Time `form:"birthdate" db:"birthdate"`
|
BirthDate time.Time `db:"birthdate"`
|
||||||
Male bool `form:"male" db:"male"`
|
FormBirthDate string `form:"birthdate"`
|
||||||
City string `form:"city" db:"city"`
|
Gender string `db:"gender" form:"gender"`
|
||||||
Interests string `form:"interests" db:"interests"`
|
City string `db:"city" form:"city"`
|
||||||
authenticated bool `form:"-" db:"-"`
|
Interests string `db:"interests" form:"interests"`
|
||||||
Db *sql.DB
|
authenticated bool `db:"-" form:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateAnonymousUser() User {
|
func GenerateAnonymousUser() User {
|
||||||
@ -49,11 +48,16 @@ func (u *UserModel) UniqueId() interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserModel) GetById(app application.App, id interface{}) error {
|
func (u *UserModel) GetById(app application.App, id interface{}) error {
|
||||||
query := fmt.Sprintf("SELECT username FROM users WHERE id=%d", id)
|
var v string
|
||||||
var v []uint8
|
query := fmt.Sprintf("SELECT username, name, surname, birthdate, gender, city, interests FROM users WHERE id=%d", id)
|
||||||
err := app.DB.QueryRow(query).Scan(&v)
|
err := app.DB.QueryRow(query).Scan(&u.Username, &u.Name, &u.Surname, &v, &u.Gender, &u.City, &u.Interests)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
u.BirthDate, err = time.Parse("2006-01-02 15:04:05", v)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
u.Id=id.(int64)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
@ -1,34 +1,61 @@
|
|||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/codegangsta/martini-contrib/render"
|
"github.com/codegangsta/martini-contrib/render"
|
||||||
"github.com/codegangsta/martini-contrib/sessions"
|
"github.com/codegangsta/martini-contrib/sessions"
|
||||||
"github.com/tiburon-777/OTUS_HighLoad/internal/application"
|
"github.com/tiburon-777/OTUS_HighLoad/internal/application"
|
||||||
"github.com/tiburon-777/OTUS_HighLoad/internal/auth"
|
"github.com/tiburon-777/OTUS_HighLoad/internal/auth"
|
||||||
"net"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetHome(r render.Render) {
|
func GetHome(r render.Render, user auth.User) {
|
||||||
doc := map[string]interface{}{
|
r.HTML(200, "index", user)
|
||||||
"PageTitle": "Вы имеете доступ к проектам",
|
|
||||||
}
|
|
||||||
r.HTML(200, "index", doc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSigned(r render.Render) {
|
func GetSigned(r render.Render) {
|
||||||
doc := map[string]interface{}{
|
doc := map[string]interface{}{
|
||||||
"PageTitle": "page not exists",
|
"PageTitle": "page not exists",
|
||||||
}
|
}
|
||||||
r.HTML(200, "signin", doc)
|
r.HTML(200, "signup", doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PostSigned(app application.App, r render.Render) {
|
func PostSigned(app application.App, session sessions.Session, postedUser auth.UserModel, r render.Render, req *http.Request) {
|
||||||
r.Redirect(net.JoinHostPort(app.Config.Server.Address, app.Config.Server.Port)+"/login")
|
t, err := time.Parse("2006-1-2", postedUser.FormBirthDate)
|
||||||
|
if err != nil {
|
||||||
|
e := fmt.Errorf("can't parce date: %w", err)
|
||||||
|
log.Println(e)
|
||||||
|
doc := map[string]interface{}{
|
||||||
|
"Error": e,
|
||||||
|
}
|
||||||
|
r.HTML(500, "500", doc)
|
||||||
|
}
|
||||||
|
query := fmt.Sprintf(`INSERT INTO users (username, password, name, surname, birthdate, gender, city, interests)
|
||||||
|
values ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")`,
|
||||||
|
postedUser.Username,
|
||||||
|
base64.StdEncoding.EncodeToString([]byte(postedUser.Username + ":" + postedUser.Password)),
|
||||||
|
postedUser.Name,
|
||||||
|
postedUser.Surname,
|
||||||
|
t.Format("2006-01-02 15:04:05"),
|
||||||
|
postedUser.Gender,
|
||||||
|
postedUser.City,
|
||||||
|
postedUser.Interests,
|
||||||
|
)
|
||||||
|
_, err = app.DB.Exec(query)
|
||||||
|
if err != nil {
|
||||||
|
e := fmt.Errorf("can't create account in DB: %w", err)
|
||||||
|
log.Println(e)
|
||||||
|
doc := map[string]interface{}{
|
||||||
|
"Error": e,
|
||||||
|
}
|
||||||
|
r.HTML(500, "500", doc)
|
||||||
|
}
|
||||||
|
r.Redirect("/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func GetUserList(r render.Render) {
|
func GetUserList(r render.Render) {
|
||||||
doc := map[string]interface{}{
|
doc := map[string]interface{}{
|
||||||
"PageTitle": "page not exists",
|
"PageTitle": "page not exists",
|
||||||
@ -37,9 +64,10 @@ func GetUserList(r render.Render) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func PostLogin(app application.App, session sessions.Session, postedUser auth.UserModel, r render.Render, req *http.Request) {
|
func PostLogin(app application.App, session sessions.Session, postedUser auth.UserModel, r render.Render, req *http.Request) {
|
||||||
|
hash := base64.StdEncoding.EncodeToString([]byte(postedUser.Username + ":" + postedUser.Password))
|
||||||
user := auth.UserModel{}
|
user := auth.UserModel{}
|
||||||
query := fmt.Sprintf("SELECT * FROM users WHERE username=\"%s\" and password =\"%s\"", postedUser.Username, postedUser.Password)
|
query := fmt.Sprintf("SELECT id FROM users WHERE username=\"%s\" and password =\"%s\"", postedUser.Username, hash)
|
||||||
err := app.DB.QueryRow(query).Scan(&user.Id, &user.Username, &user.Password)
|
err := app.DB.QueryRow(query).Scan(&user.Id)
|
||||||
|
|
||||||
if err != nil || user.Id==0 {
|
if err != nil || user.Id==0 {
|
||||||
r.Redirect(auth.RedirectUrl)
|
r.Redirect(auth.RedirectUrl)
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<p>404. Page not found</p>
|
||||||
|
<a href="/">Home</a><br/>
|
||||||
|
</body>
|
||||||
|
</html>
|
7
templates/500.tmpl
Normal file
7
templates/500.tmpl
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<p>500. INTERNAL SERVER ERROR!</p>
|
||||||
|
<p>{{ .Error }}</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,8 +1,13 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
<p>This is a private link!</p>
|
<p> Hello <b>{{ .Name }} {{ .Surname }}</b></p>
|
||||||
<p> Hello {{ .Username }}</p>
|
<p>You gender is <b>{{ .Gender }}</b></p>
|
||||||
<a href="/logout">Logout</a><br/>
|
<p>You <b>{{ .BirthDate }}</b> years old</p>
|
||||||
|
<p>You now live in <b>{{ .City }}</b></p>
|
||||||
|
<p>You interests is: <b>{{ .Interests }}</b></p>
|
||||||
|
|
||||||
|
<input type="button" onclick="location.href='/list';" value="User list" />
|
||||||
|
<input type="button" onclick="location.href='/logout';" value="Logout" /><br />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -3,9 +3,10 @@
|
|||||||
<body>
|
<body>
|
||||||
<h2>You must login!</h2>
|
<h2>You must login!</h2>
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
<input type="text" placeholder="Username" name="name" /><br />
|
<input type="text" placeholder="Username" name="username" /><br />
|
||||||
<input type="password" placeholder="Password" name="password" />
|
<input type="password" placeholder="Password" name="password" /><br />
|
||||||
<button>Login</button>
|
<button>Login</button>
|
||||||
|
<input type="button" onclick="location.href='/signup';" value="or Sign Up" />
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
50
templates/signup.tmpl
Normal file
50
templates/signup.tmpl
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Create account</h2>
|
||||||
|
<form method="POST">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Логин</td>
|
||||||
|
<td><input type="text" name="username" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Имя</td>
|
||||||
|
<td><input type="text" name="name" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Фамилия</td>
|
||||||
|
<td><input type="text" name="surname" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Дата рождения</td>
|
||||||
|
<td><input type="date" name="birthdate" placeholder="dd-mm-yyyy" class="form-control" id="date" required /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Пол</td>
|
||||||
|
<td>
|
||||||
|
<a><input name="gender" type="radio" value="male"> Мужской</a>
|
||||||
|
<a><input name="gender" type="radio" value="female"> Женский</a>
|
||||||
|
<a><input name="gender" type="radio" value="other"> Другое</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Интересы</td>
|
||||||
|
<td><input type="text"name="interests" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Город</td>
|
||||||
|
<td><input type="text"name="city" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Пароль</td>
|
||||||
|
<td><input type="password" name="password" /></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<button>Sign Up</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user