router.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. package back
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. "github.com/gin-gonic/contrib/sessions"
  9. "github.com/gin-gonic/contrib/static"
  10. "github.com/gin-gonic/gin"
  11. )
  12. var router *gin.Engine
  13. var month map[string]string
  14. func init() {
  15. initSetting()
  16. initLog()
  17. initPostgreSQL()
  18. m := manager{}
  19. fmt.Println("ADMIN EXISTS:", m.SelectTest())
  20. month = make(map[string]string)
  21. month["01"] = " января "
  22. month["02"] = " февраля "
  23. month["03"] = " марта "
  24. month["04"] = " апреля "
  25. month["05"] = " мая "
  26. month["06"] = " июня "
  27. month["07"] = " июля "
  28. month["08"] = " августа "
  29. month["09"] = " сентября "
  30. month["10"] = " октября "
  31. month["11"] = " ноября "
  32. month["12"] = " декабря "
  33. prepareNews()
  34. prepareNewsPagination()
  35. prepareNotice()
  36. loadSession()
  37. router = gin.Default()
  38. word := sessions.NewCookieStore([]byte("RepairToSecretKey"))
  39. router.Use(sessions.Sessions("session", word))
  40. router.Static("/css/"+Setting.ServerVersion, Setting.Assets+"css/")
  41. router.Static("/js/"+Setting.ServerVersion, Setting.Assets+"js/")
  42. router.Static("/fonts", Setting.Assets+"font/")
  43. router.Static("/img", Setting.Assets+"img/")
  44. router.Use(static.Serve("/", static.LocalFile(Setting.Data, false)))
  45. router.LoadHTMLFiles(
  46. Setting.HTML+"index.html",
  47. Setting.HTML+"404.html",
  48. Setting.HTML+"position.html",
  49. Setting.HTML+"BigBoss.html",
  50. Setting.HTML+"Zapis.html",
  51. Setting.HTML+"Mass.html",
  52. Setting.HTML+"PageZap.html",
  53. )
  54. router.GET("/", handlerIndex)
  55. // "/данные/материал/hello world"
  56. // "/данные/новость/f9a8c99c874"
  57. // "/данные/объявление/89c304af9f7e"
  58. router.GET("/данные/:category/:link", handlerMaterial)
  59. router.GET("/страница/:page", handlerIndexPage)
  60. router.GET("/page/:page", handlerPages)
  61. router.POST("/order-select-time", handleGetTimeRecord)
  62. router.POST("/order-insert", handlerInsertOrder)
  63. router.POST("/order-select", handlerSelectOrder)
  64. router.POST("/get-materials", func(c *gin.Context) {
  65. infa := informationMass{}
  66. e := infa.Select()
  67. if e != nil {
  68. c.JSON(200, gin.H{
  69. "Error": e.Error(),
  70. })
  71. return
  72. }
  73. m := material{}
  74. var materials []material
  75. for _, link := range infa.Rows {
  76. m.Link = link
  77. e = m.SelectOne()
  78. if e != nil {
  79. continue
  80. }
  81. materials = append(materials, m)
  82. }
  83. c.JSON(200, gin.H{
  84. "Materials": materials,
  85. })
  86. })
  87. router.POST("/login", handlerLogin)
  88. router.POST("/logout", handlerLogout)
  89. router.POST("/set-material-list", handleSetMaterialList)
  90. // router.POST("/get-material-list", handleGetMaterialList)
  91. router.NoRoute(handlerNoRoute)
  92. prepareRouterMaterial()
  93. // buildTimeRecord()
  94. }
  95. // Run запустить сервер
  96. func Run() {
  97. var e error
  98. if Setting.ServerSSL {
  99. e = router.RunTLS(Setting.ServerHost+":"+Setting.ServerPort, Setting.ServerSSLCert, Setting.ServerSSLKey)
  100. } else {
  101. e = router.Run(Setting.ServerHost + ":" + Setting.ServerPort)
  102. }
  103. logger.Println(e)
  104. }
  105. func handlerIndex(c *gin.Context) {
  106. isMain := true
  107. isAdmin := false
  108. isLogin := false
  109. isSecreter := false
  110. role := getRoleFromContext(c)
  111. if len(role) != 0 {
  112. if role == "__admin" {
  113. isAdmin = true
  114. } else if role == "_secretary" {
  115. isSecreter = true
  116. }
  117. isLogin = true
  118. }
  119. h := gin.H{}
  120. h["IsMain"] = isMain
  121. h["isSecreter"] = isSecreter
  122. h["IsLogin"] = isLogin
  123. h["IsAdmin"] = isAdmin
  124. if isAdmin {
  125. h["Menu"] = templateMenuAll
  126. h["MenuTop"] = templateMenuAllTop
  127. } else {
  128. h["Menu"] = templateMenu
  129. h["MenuTop"] = templateMenuTop
  130. }
  131. h["News"] = templateNews
  132. h["Pagination"] = templateNewsPagination
  133. h["Notice"] = templateNotice
  134. h["ServerVersion"] = Setting.ServerVersion
  135. c.HTML(200, "index.html", h)
  136. }
  137. func handlerPages(c *gin.Context) {
  138. isMain := false
  139. isAdmin := false
  140. isLogin := false
  141. isSecreter := false
  142. role := getRoleFromContext(c)
  143. if len(role) != 0 {
  144. if role == "__admin" {
  145. isAdmin = true
  146. } else if role == "_secretary" {
  147. isSecreter = true
  148. }
  149. isLogin = true
  150. }
  151. h := gin.H{}
  152. h["IsMain"] = isMain
  153. h["IsLogin"] = isLogin
  154. h["IsAdmin"] = isAdmin
  155. h["isSecreter"] = isSecreter
  156. // h["News"] = templateNews
  157. // h["Pagination"] = templateNewsPagination
  158. // h["Notice"] = templateNotice
  159. h["ServerVersion"] = Setting.ServerVersion
  160. h["AvailableMaterial"] = false
  161. h["Page"] = c.Param("page")
  162. c.HTML(200, "index.html", h)
  163. }
  164. func handlerIndexPage(c *gin.Context) {
  165. isMain := true
  166. isAdmin := false
  167. isLogin := false
  168. isSecreter := false
  169. role := getRoleFromContext(c)
  170. if len(role) != 0 {
  171. if role == "__admin" {
  172. isAdmin = true
  173. } else if role == "_secretary" {
  174. isSecreter = true
  175. }
  176. isLogin = true
  177. }
  178. page, e := strconv.ParseInt(c.Param("page"), 10, 64)
  179. if e != nil {
  180. logger.Println(e)
  181. page = 0
  182. }
  183. h := gin.H{}
  184. h["IsMain"] = isMain
  185. h["isSecreter"] = isSecreter
  186. h["IsLogin"] = isLogin
  187. h["IsAdmin"] = isAdmin
  188. if isAdmin {
  189. h["Menu"] = templateMenuAll
  190. h["MenuTop"] = templateMenuAllTop
  191. } else {
  192. h["Menu"] = templateMenu
  193. h["MenuTop"] = templateMenuTop
  194. }
  195. h["News"] = getNewsByPage(int(page))
  196. h["Pagination"] = getNewsPaginationByPage(int(page))
  197. h["Notice"] = templateNotice
  198. h["ServerVersion"] = Setting.ServerVersion
  199. c.HTML(200, "index.html", h)
  200. }
  201. func handlerLogin(c *gin.Context) {
  202. var m manager
  203. e := c.BindJSON(&m)
  204. if e != nil {
  205. fmt.Println(e.Error())
  206. c.JSON(200, gin.H{
  207. "Error": "Неверный логин/пароль",
  208. })
  209. return
  210. }
  211. e = m.Select()
  212. if e != nil {
  213. fmt.Println(e.Error())
  214. c.JSON(200, gin.H{
  215. "Error": "Неверный логин/пароль",
  216. })
  217. return
  218. }
  219. s := sessions.Default(c)
  220. hash, e := GenerateHash(m.Login)
  221. if e != nil {
  222. logger.Println(e)
  223. c.JSON(200, gin.H{
  224. "Error": "Ошибка сервера",
  225. })
  226. return
  227. }
  228. newSession := session{}
  229. newSession.Hash = hash
  230. newSession.Manager = m.ID
  231. e = newSession.Insert()
  232. if e != nil {
  233. logger.Println(e)
  234. c.JSON(200, gin.H{
  235. "Error": "Ошибка сервера",
  236. })
  237. return
  238. }
  239. s.Set(sessionKey, hash)
  240. e = s.Save()
  241. if e != nil {
  242. fmt.Println(e.Error())
  243. c.JSON(200, gin.H{
  244. "Error": "Ошибка сохранения сессии в куки",
  245. })
  246. return
  247. }
  248. c.JSON(200, gin.H{
  249. "Error": nil,
  250. "Name": m.FirstName,
  251. })
  252. }
  253. func handlerLogout(c *gin.Context) {
  254. clearSessionFromContext(c)
  255. c.JSON(200, gin.H{
  256. "Error": nil,
  257. })
  258. }
  259. func handlerNoRoute(c *gin.Context) {
  260. h := gin.H{}
  261. h["Page"] = "400"
  262. isAdmin := false
  263. isLogin := false
  264. isSecreter := false
  265. role := getRoleFromContext(c)
  266. if len(role) != 0 {
  267. if role == "__admin" {
  268. isAdmin = true
  269. } else if role == "_secretary" {
  270. isSecreter = true
  271. }
  272. isLogin = true
  273. }
  274. h["IsMain"] = false
  275. h["isSecreter"] = isSecreter
  276. h["IsLogin"] = isLogin
  277. h["IsAdmin"] = isAdmin
  278. if isAdmin {
  279. h["Menu"] = templateMenuAll
  280. h["MenuTop"] = templateMenuAllTop
  281. } else {
  282. h["Menu"] = templateMenu
  283. h["MenuTop"] = templateMenuTop
  284. }
  285. h["AvailableMaterial"] = false
  286. h["ServerVersion"] = Setting.ServerVersion
  287. c.HTML(200, "index.html", h)
  288. }
  289. func handlerCatalog(c *gin.Context) {
  290. isMain := false
  291. isAdmin := false
  292. isLogin := false
  293. role := getRoleFromContext(c)
  294. if len(role) != 0 {
  295. if role == "__admin" {
  296. isAdmin = true
  297. }
  298. isLogin = true
  299. }
  300. h := gin.H{}
  301. h["IsMain"] = isMain
  302. h["IsLogin"] = isLogin
  303. h["IsAdmin"] = isAdmin
  304. h["Page"] = "catalog"
  305. h["AvailableMaterial"] = false
  306. h["ServerVersion"] = Setting.ServerVersion
  307. c.HTML(200, "index.html", h)
  308. }
  309. func handleSetMaterialList(c *gin.Context) {
  310. man := getManagerFromContext(c)
  311. if man.Role != "__admin" {
  312. c.JSON(200, gin.H{
  313. "Error": errorAccessRestricted,
  314. })
  315. return
  316. }
  317. m := informationMass{}
  318. e := c.BindJSON(&m)
  319. if e != nil {
  320. c.JSON(200, gin.H{
  321. "Error": e.Error(),
  322. })
  323. return
  324. }
  325. e = m.Insert()
  326. if e != nil {
  327. c.JSON(200, gin.H{
  328. "Error": "Материал с указанной ссылкой не существует",
  329. })
  330. return
  331. }
  332. c.JSON(200, gin.H{
  333. "Error": nil,
  334. })
  335. }
  336. type timerecord struct {
  337. Date string
  338. Time int64
  339. Record sql.NullInt64
  340. Times []int64
  341. }
  342. func (m *timerecord) Insert() error {
  343. stmt, ok := queries["Insert@TimeRecord@"]
  344. if !ok {
  345. return errors.New("Insert@TimeRecord@ not found")
  346. }
  347. _, e := stmt.Exec(m.Date, m.Time, m.Record)
  348. if e != nil {
  349. return e
  350. }
  351. return nil
  352. }
  353. func (m *timerecord) Select() error {
  354. stmt, ok := queries["Select@TimeRecord@Times"]
  355. if !ok {
  356. return errors.New("ERROR: stmt[Select@TimeRecord@Times] IS NULL")
  357. }
  358. rows, e := stmt.Query(m.Date)
  359. if e != nil {
  360. return e
  361. }
  362. defer rows.Close()
  363. for rows.Next() {
  364. e = rows.Scan(&m.Time)
  365. if e != nil {
  366. return e
  367. }
  368. m.Times = append(m.Times, m.Time)
  369. }
  370. return nil
  371. }
  372. func (m *timerecord) Update() error {
  373. stmt, ok := queries["Update@TimeRecord@"]
  374. if !ok {
  375. return errors.New("ERROR: stmt[Update@TimeRecord@] IS NULL")
  376. }
  377. _, e := stmt.Exec(m.Record, m.Date, m.Time)
  378. if e != nil {
  379. return e
  380. }
  381. return nil
  382. }
  383. func handlerInsertOrder(c *gin.Context) {
  384. role := getRoleFromContext(c)
  385. if role != "__admin" {
  386. c.JSON(200, gin.H{
  387. "Error": "Отказано в доступе",
  388. })
  389. }
  390. n := timerecord{}
  391. m := record{}
  392. e := c.BindJSON(&m)
  393. if e != nil {
  394. fmt.Println(e)
  395. c.JSON(200, gin.H{
  396. "Error": e.Error(),
  397. })
  398. return
  399. }
  400. n.Date = m.Date
  401. n.Time = m.Time
  402. n.Record.Valid = true
  403. e = m.Insert()
  404. if e != nil {
  405. fmt.Println(e)
  406. c.JSON(200, gin.H{
  407. "Error": e.Error(),
  408. })
  409. return
  410. }
  411. n.Record.Int64 = m.ID
  412. e = n.Update()
  413. if e != nil {
  414. c.JSON(200, gin.H{
  415. "Error": "Не удалось создать запись. Возможно выбранное время уже кто-то успел занять несколькими секундами ранее :(",
  416. })
  417. return
  418. }
  419. c.JSON(200, gin.H{
  420. "Error": nil,
  421. })
  422. }
  423. func handlerSelectOrder(c *gin.Context) {
  424. m := record{}
  425. e := c.BindJSON(&m)
  426. if e != nil {
  427. fmt.Println(e)
  428. c.JSON(200, gin.H{
  429. "Error": e.Error(),
  430. })
  431. return
  432. }
  433. e = m.Select()
  434. if e != nil {
  435. fmt.Println(e)
  436. c.JSON(200, gin.H{
  437. "Error": e.Error(),
  438. })
  439. return
  440. }
  441. c.JSON(200, gin.H{
  442. "Error": nil,
  443. "Data": m.Rows,
  444. })
  445. }
  446. func (m *record) Select() error {
  447. stmt, ok := queries["Select#Order#"]
  448. if !ok {
  449. return errors.New("Запрос Select#Order# не найден")
  450. }
  451. rows, e := stmt.Query(m.Date)
  452. if e != nil {
  453. return e
  454. }
  455. defer rows.Close()
  456. n := record{}
  457. for rows.Next() {
  458. //o."ID", o."Name", o."Passport", o."Phone", o."Cause", a."Date", a."Time"
  459. e = rows.Scan(
  460. &n.ID,
  461. &n.Name,
  462. &n.Passport,
  463. &n.Phone,
  464. &n.Cause,
  465. &n.Date,
  466. &n.Time,
  467. )
  468. if e != nil {
  469. return e
  470. }
  471. m.Rows = append(m.Rows, n)
  472. }
  473. return nil
  474. }
  475. type record struct {
  476. ID int64 `json:"ID"`
  477. Name string `json:"Name"`
  478. Passport string `json:"Passport"`
  479. Phone string `json:"Phone"`
  480. Cause string `json:"Cause"`
  481. Date string `json:"Date"`
  482. Time int64 `json:"Time"`
  483. Rows []record
  484. }
  485. func (m *record) Insert() error {
  486. stmt, ok := queries["Insert@Record@"]
  487. if !ok {
  488. return errors.New("ERROR: Insert@Record@ IS NULL")
  489. }
  490. row := stmt.QueryRow(m.Name, m.Passport, m.Phone, m.Cause)
  491. e := row.Scan(&m.ID)
  492. if e != nil {
  493. return e
  494. }
  495. return nil
  496. }
  497. func handleGetTimeRecord(c *gin.Context) {
  498. m := timerecord{}
  499. e := c.BindJSON(&m)
  500. if e != nil {
  501. c.JSON(200, gin.H{
  502. "Time": nil,
  503. })
  504. return
  505. }
  506. e = m.Select()
  507. if e != nil {
  508. c.JSON(200, gin.H{
  509. "Time": nil,
  510. })
  511. return
  512. }
  513. c.JSON(200, gin.H{
  514. "Time": m.Times,
  515. })
  516. }
  517. func buildTimeRecord() {
  518. m := timerecord{}
  519. d := time.Date(2020, time.June, 1, 0, 0, 0, 0, time.UTC)
  520. for i := 0; i < 90; i++ {
  521. if d.Weekday() == 0 || d.Weekday() == 6 {
  522. d = d.Add(8.64e+13)
  523. continue
  524. }
  525. var k int64
  526. for k = 0; k < 5; k++ {
  527. m.Date = d.String()[:10]
  528. m.Time = k
  529. m.Record.Valid = false
  530. m.Insert()
  531. }
  532. d = d.Add(8.64e+13)
  533. }
  534. }