module_index.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package modules
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "fmt"
  6. "os"
  7. "strconv"
  8. "golang-fave/assets"
  9. "golang-fave/consts"
  10. "golang-fave/engine/wrapper"
  11. "golang-fave/utils"
  12. )
  13. func (this *Modules) RegisterModule_Index() *Module {
  14. return this.newModule(MInfo{
  15. WantDB: true,
  16. Mount: "index",
  17. Name: "Pages",
  18. Order: 0,
  19. Icon: assets.SysSvgIconPage,
  20. Sub: &[]MISub{
  21. {Mount: "default", Name: "List of pages", Icon: assets.SysSvgIconList},
  22. {Mount: "add", Name: "Add new page", Icon: assets.SysSvgIconPlus},
  23. },
  24. }, func(wrap *wrapper.Wrapper) {
  25. // Front-end
  26. wrap.RenderFrontEnd("index", consts.TmplDataModIndex{
  27. MetaTitle: "Meta Title",
  28. MetaKeywords: "Meta Keywords",
  29. MetaDescription: "Meta Description",
  30. MainMenuItems: []consts.TmplDataMainMenuItem{
  31. {Name: "Home", Link: "/", Active: true},
  32. {Name: "Item 1", Link: "/#1", Active: false},
  33. {Name: "Item 2", Link: "/#2", Active: false},
  34. {Name: "Item 3", Link: "/#3", Active: false},
  35. },
  36. })
  37. }, func(wrap *wrapper.Wrapper) (string, string, string) {
  38. // Back-end
  39. return this.getSidebarModules(wrap), "Index", "Index Sidebar"
  40. })
  41. }
  42. func (this *Modules) RegisterAction_MysqlSetup() *Action {
  43. return this.newAction(AInfo{
  44. WantDB: false,
  45. Mount: "mysql",
  46. }, func(wrap *wrapper.Wrapper) {
  47. pf_host := wrap.R.FormValue("host")
  48. pf_port := wrap.R.FormValue("port")
  49. pf_name := wrap.R.FormValue("name")
  50. pf_user := wrap.R.FormValue("user")
  51. pf_password := wrap.R.FormValue("password")
  52. if pf_host == "" {
  53. wrap.MsgError(`Please specify host for MySQL connection`)
  54. return
  55. }
  56. if pf_port == "" {
  57. wrap.MsgError(`Please specify host port for MySQL connection`)
  58. return
  59. }
  60. if _, err := strconv.Atoi(pf_port); err != nil {
  61. wrap.MsgError(`MySQL host port must be integer number`)
  62. return
  63. }
  64. if pf_name == "" {
  65. wrap.MsgError(`Please specify MySQL database name`)
  66. return
  67. }
  68. if pf_user == "" {
  69. wrap.MsgError(`Please specify MySQL user`)
  70. return
  71. }
  72. // Try connect to mysql
  73. db, err := sql.Open("mysql", pf_user+":"+pf_password+"@tcp("+pf_host+":"+pf_port+")/"+pf_name)
  74. if err != nil {
  75. wrap.MsgError(err.Error())
  76. return
  77. }
  78. defer db.Close()
  79. err = db.Ping()
  80. if err != nil {
  81. wrap.MsgError(err.Error())
  82. return
  83. }
  84. // Try to install all tables
  85. _, err = db.Query(fmt.Sprintf(
  86. "CREATE TABLE `%s`.`users` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI', `first_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'User first name', `last_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'User last name', `email` VARCHAR(64) NOT NULL COMMENT 'User email', `password` VARCHAR(32) NOT NULL COMMENT 'User password (MD5)', PRIMARY KEY (`id`)) ENGINE = InnoDB;",
  87. pf_name))
  88. if err != nil {
  89. wrap.MsgError(err.Error())
  90. return
  91. }
  92. _, err = db.Query(fmt.Sprintf(
  93. "CREATE TABLE `%s`.`pages` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI', `user` int(11) NOT NULL COMMENT 'User id', `name` varchar(255) NOT NULL COMMENT 'Page name', `slug` varchar(255) NOT NULL COMMENT 'Page url part', `content` text NOT NULL COMMENT 'Page content', `meta_title` varchar(255) NOT NULL DEFAULT '' COMMENT 'Page meta title', `meta_keywords` varchar(255) NOT NULL DEFAULT '' COMMENT 'Page meta keywords', `meta_description` varchar(510) NOT NULL DEFAULT '' COMMENT 'Page meta description', `datetime` datetime NOT NULL COMMENT 'Creation date/time', `status` enum('draft','public','trash') NOT NULL COMMENT 'Page status', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;",
  94. pf_name))
  95. if err != nil {
  96. wrap.MsgError(err.Error())
  97. return
  98. }
  99. // Save mysql config file
  100. err = utils.MySqlConfigWrite(wrap.DConfig+string(os.PathSeparator)+"mysql.json", pf_host, pf_port, pf_name, pf_user, pf_password)
  101. if err != nil {
  102. wrap.MsgError(err.Error())
  103. return
  104. }
  105. // Reload current page
  106. wrap.Write(`window.location.reload(false);`)
  107. })
  108. }
  109. func (this *Modules) RegisterAction_CpFirstUser() *Action {
  110. return this.newAction(AInfo{
  111. WantDB: true,
  112. Mount: "first-user",
  113. }, func(wrap *wrapper.Wrapper) {
  114. pf_first_name := wrap.R.FormValue("first_name")
  115. pf_last_name := wrap.R.FormValue("last_name")
  116. pf_email := wrap.R.FormValue("email")
  117. pf_password := wrap.R.FormValue("password")
  118. if pf_email == "" {
  119. wrap.MsgError(`Please specify user email`)
  120. return
  121. }
  122. if !utils.IsValidEmail(pf_email) {
  123. wrap.MsgError(`Please specify correct user email`)
  124. return
  125. }
  126. if pf_password == "" {
  127. wrap.MsgError(`Please specify user password`)
  128. return
  129. }
  130. _, err := wrap.DB.Query(
  131. "INSERT INTO `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?);",
  132. pf_first_name, pf_last_name, pf_email, pf_password)
  133. if err != nil {
  134. wrap.MsgError(err.Error())
  135. return
  136. }
  137. // Reload current page
  138. wrap.Write(`window.location.reload(false);`)
  139. })
  140. }
  141. func (this *Modules) RegisterAction_CpUserLogin() *Action {
  142. return this.newAction(AInfo{
  143. WantDB: true,
  144. Mount: "signin",
  145. }, func(wrap *wrapper.Wrapper) {
  146. pf_email := wrap.R.FormValue("email")
  147. pf_password := wrap.R.FormValue("password")
  148. if pf_email == "" {
  149. wrap.MsgError(`Please specify user email`)
  150. return
  151. }
  152. if !utils.IsValidEmail(pf_email) {
  153. wrap.MsgError(`Please specify correct user email`)
  154. return
  155. }
  156. if pf_password == "" {
  157. wrap.MsgError(`Please specify user password`)
  158. return
  159. }
  160. if wrap.S.GetInt("UserId", 0) > 0 {
  161. wrap.MsgError(`You already logined`)
  162. return
  163. }
  164. var user_id int
  165. err := wrap.DB.QueryRow(
  166. "SELECT `id` FROM `users` WHERE `email` = ? and `password` = MD5(?) LIMIT 1;",
  167. pf_email, pf_password).Scan(&user_id)
  168. if err != nil && err != sql.ErrNoRows {
  169. wrap.MsgError(err.Error())
  170. return
  171. }
  172. if err == sql.ErrNoRows {
  173. wrap.MsgError(`Incorrect email or password`)
  174. return
  175. }
  176. // Save to current session
  177. wrap.S.SetInt("UserId", user_id)
  178. // Reload current page
  179. wrap.Write(`window.location.reload(false);`)
  180. })
  181. }
  182. func (this *Modules) RegisterAction_CpUserLogout() *Action {
  183. return this.newAction(AInfo{
  184. WantDB: true,
  185. Mount: "singout",
  186. WantUser: true,
  187. }, func(wrap *wrapper.Wrapper) {
  188. // Reset session var
  189. wrap.S.SetInt("UserId", 0)
  190. // Reload current page
  191. wrap.Write(`window.location.reload(false);`)
  192. })
  193. }
  194. func (this *Modules) RegisterAction_CpUserSettings() *Action {
  195. return this.newAction(AInfo{
  196. WantDB: true,
  197. Mount: "user-settings",
  198. WantUser: true,
  199. }, func(wrap *wrapper.Wrapper) {
  200. pf_first_name := wrap.R.FormValue("first_name")
  201. pf_last_name := wrap.R.FormValue("last_name")
  202. pf_email := wrap.R.FormValue("email")
  203. pf_password := wrap.R.FormValue("password")
  204. if pf_email == "" {
  205. wrap.MsgError(`Please specify user email`)
  206. return
  207. }
  208. if !utils.IsValidEmail(pf_email) {
  209. wrap.MsgError(`Please specify correct user email`)
  210. return
  211. }
  212. if pf_password != "" {
  213. // Update with password if set
  214. _, err := wrap.DB.Query(
  215. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?) WHERE `id` = ?;",
  216. pf_first_name, pf_last_name, pf_email, pf_password, wrap.User.A_id)
  217. if err != nil {
  218. wrap.MsgError(err.Error())
  219. return
  220. }
  221. } else {
  222. // Update without password if not set
  223. _, err := wrap.DB.Query(
  224. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ? WHERE `id` = ?;",
  225. pf_first_name, pf_last_name, pf_email, wrap.User.A_id)
  226. if err != nil {
  227. wrap.MsgError(err.Error())
  228. return
  229. }
  230. }
  231. // Reload current page
  232. wrap.Write(`window.location.reload(false);`)
  233. })
  234. }