main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/gin-gonic/contrib/sessions"
  6. "github.com/gin-gonic/contrib/static"
  7. "github.com/gin-gonic/gin"
  8. _ "github.com/lib/pq"
  9. )
  10. var router *gin.Engine
  11. var db *sql.DB
  12. func main() {
  13. // Подключение к базе данных
  14. connect()
  15. // Создаем роутер по умолчанию
  16. router = gin.Default()
  17. // Загружаем файлы шаблонов HTML страниц
  18. router.LoadHTMLFiles(
  19. cfg.Template+"index.html",
  20. cfg.Template+"footer.html",
  21. cfg.Template+"header.html",
  22. cfg.Template+"authorization.html",
  23. cfg.Template+"admin.html",
  24. cfg.Template+"404.html",
  25. )
  26. // Указываем папку статических файлов
  27. router.Static("/assets", cfg.Assets)
  28. // Указываем путь к различным локальным файлам (картинки, документы, видео и тд). Папка data
  29. router.Use(static.Serve("/", static.LocalFile(cfg.Data, false)))
  30. // Создаем сессию (необходимо для сохранения авторизации на сайте)
  31. word := sessions.NewCookieStore([]byte("my-private-key"))
  32. router.Use(sessions.Sessions("session", word))
  33. // Обработчик запроса, если пользователь будет долбиться по не существующему адресу
  34. router.NoRoute(notFound)
  35. router.GET("/", index)
  36. router.GET("/page/:page", indexPage)
  37. router.GET("/authorization", authorization)
  38. router.POST("/login", login)
  39. router.GET("/logout", logout)
  40. router.Run(cfg.ServerHost + ":" + cfg.ServerPort)
  41. }
  42. func notFound(c *gin.Context) {
  43. c.HTML(404, "404", gin.H{})
  44. }
  45. func indexPage(c *gin.Context) {
  46. page := c.Param("page")
  47. s := sessions.Default(c)
  48. admin := false
  49. isLogin := false
  50. role, ok := s.Get("MySecretKey").(string)
  51. if ok {
  52. if role == "admin" {
  53. admin = true
  54. }
  55. isLogin = true
  56. }
  57. c.HTML(200, "index", gin.H{
  58. "Title": "Мой сайт",
  59. "IsAdmin": admin,
  60. "IsLogin": isLogin,
  61. "Page": page,
  62. })
  63. }
  64. func index(c *gin.Context) {
  65. s := sessions.Default(c)
  66. admin := false
  67. isLogin := false
  68. role, ok := s.Get("MySecretKey").(string)
  69. if ok {
  70. if role == "admin" {
  71. admin = true
  72. }
  73. isLogin = true
  74. }
  75. c.HTML(200, "index", gin.H{
  76. "Title": "Мой сайт",
  77. "IsAdmin": admin,
  78. "IsLogin": isLogin,
  79. "Page": "main",
  80. })
  81. }
  82. func authorization(c *gin.Context) {
  83. c.HTML(200, "authorization", gin.H{})
  84. }
  85. func login(c *gin.Context) {
  86. s := sessions.Default(c)
  87. _, ok := s.Get("MySecretKey").(string)
  88. if ok {
  89. s.Clear()
  90. }
  91. var u user
  92. e := c.BindJSON(&u)
  93. if e != nil {
  94. fmt.Println(e.Error())
  95. c.JSON(200, gin.H{
  96. "Result": false,
  97. })
  98. return
  99. }
  100. row := db.QueryRow(`SELECT "Role", "Name" FROM "User" WHERE "Phone"=$1 AND "Password"=$2`, u.Phone, u.Password)
  101. e = row.Scan(&u.Role, &u.Name)
  102. if e != nil {
  103. fmt.Println(e.Error())
  104. c.JSON(200, gin.H{
  105. "Result": false,
  106. })
  107. return
  108. }
  109. s.Set("MySecretKey", u.Role)
  110. e = s.Save()
  111. if e != nil {
  112. fmt.Println(e.Error())
  113. c.JSON(200, gin.H{
  114. "Result": false,
  115. })
  116. return
  117. }
  118. c.JSON(200, gin.H{
  119. "Result": true,
  120. "Name": u.Name,
  121. })
  122. }
  123. func logout(c *gin.Context) {
  124. s := sessions.Default(c)
  125. role, ok := s.Get("MySecretKey").(string)
  126. if ok {
  127. s.Delete(role)
  128. s.Clear()
  129. s.Save()
  130. }
  131. c.HTML(200, "index", gin.H{
  132. "Title": "Мой сайт",
  133. "IsAdmin": false,
  134. "IsLogin": false,
  135. })
  136. }