module_index.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. content := ""
  39. sidebar := ""
  40. if wrap.CurrSubModule == "" || wrap.CurrSubModule == "default" {
  41. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  42. {Name: "List of Pages"},
  43. })
  44. } else if wrap.CurrSubModule == "add" {
  45. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  46. {Name: "Add New Page"},
  47. })
  48. }
  49. return this.getSidebarModules(wrap), content, sidebar
  50. })
  51. }
  52. func (this *Modules) RegisterAction_MysqlSetup() *Action {
  53. return this.newAction(AInfo{
  54. WantDB: false,
  55. Mount: "mysql",
  56. }, func(wrap *wrapper.Wrapper) {
  57. pf_host := wrap.R.FormValue("host")
  58. pf_port := wrap.R.FormValue("port")
  59. pf_name := wrap.R.FormValue("name")
  60. pf_user := wrap.R.FormValue("user")
  61. pf_password := wrap.R.FormValue("password")
  62. if pf_host == "" {
  63. wrap.MsgError(`Please specify host for MySQL connection`)
  64. return
  65. }
  66. if pf_port == "" {
  67. wrap.MsgError(`Please specify host port for MySQL connection`)
  68. return
  69. }
  70. if _, err := strconv.Atoi(pf_port); err != nil {
  71. wrap.MsgError(`MySQL host port must be integer number`)
  72. return
  73. }
  74. if pf_name == "" {
  75. wrap.MsgError(`Please specify MySQL database name`)
  76. return
  77. }
  78. if pf_user == "" {
  79. wrap.MsgError(`Please specify MySQL user`)
  80. return
  81. }
  82. // Try connect to mysql
  83. db, err := sql.Open("mysql", pf_user+":"+pf_password+"@tcp("+pf_host+":"+pf_port+")/"+pf_name)
  84. if err != nil {
  85. wrap.MsgError(err.Error())
  86. return
  87. }
  88. defer db.Close()
  89. err = db.Ping()
  90. if err != nil {
  91. wrap.MsgError(err.Error())
  92. return
  93. }
  94. // Try to install all tables
  95. _, err = db.Query(fmt.Sprintf(
  96. "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;",
  97. pf_name))
  98. if err != nil {
  99. wrap.MsgError(err.Error())
  100. return
  101. }
  102. _, err = db.Query(fmt.Sprintf(
  103. "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;",
  104. pf_name))
  105. if err != nil {
  106. wrap.MsgError(err.Error())
  107. return
  108. }
  109. // Save mysql config file
  110. err = utils.MySqlConfigWrite(wrap.DConfig+string(os.PathSeparator)+"mysql.json", pf_host, pf_port, pf_name, pf_user, pf_password)
  111. if err != nil {
  112. wrap.MsgError(err.Error())
  113. return
  114. }
  115. // Reload current page
  116. wrap.Write(`window.location.reload(false);`)
  117. })
  118. }
  119. func (this *Modules) RegisterAction_CpFirstUser() *Action {
  120. return this.newAction(AInfo{
  121. WantDB: true,
  122. Mount: "first-user",
  123. }, func(wrap *wrapper.Wrapper) {
  124. pf_first_name := wrap.R.FormValue("first_name")
  125. pf_last_name := wrap.R.FormValue("last_name")
  126. pf_email := wrap.R.FormValue("email")
  127. pf_password := wrap.R.FormValue("password")
  128. if pf_email == "" {
  129. wrap.MsgError(`Please specify user email`)
  130. return
  131. }
  132. if !utils.IsValidEmail(pf_email) {
  133. wrap.MsgError(`Please specify correct user email`)
  134. return
  135. }
  136. if pf_password == "" {
  137. wrap.MsgError(`Please specify user password`)
  138. return
  139. }
  140. _, err := wrap.DB.Query(
  141. "INSERT INTO `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?);",
  142. pf_first_name, pf_last_name, pf_email, pf_password)
  143. if err != nil {
  144. wrap.MsgError(err.Error())
  145. return
  146. }
  147. // Reload current page
  148. wrap.Write(`window.location.reload(false);`)
  149. })
  150. }
  151. func (this *Modules) RegisterAction_CpUserLogin() *Action {
  152. return this.newAction(AInfo{
  153. WantDB: true,
  154. Mount: "signin",
  155. }, func(wrap *wrapper.Wrapper) {
  156. pf_email := wrap.R.FormValue("email")
  157. pf_password := wrap.R.FormValue("password")
  158. if pf_email == "" {
  159. wrap.MsgError(`Please specify user email`)
  160. return
  161. }
  162. if !utils.IsValidEmail(pf_email) {
  163. wrap.MsgError(`Please specify correct user email`)
  164. return
  165. }
  166. if pf_password == "" {
  167. wrap.MsgError(`Please specify user password`)
  168. return
  169. }
  170. if wrap.S.GetInt("UserId", 0) > 0 {
  171. wrap.MsgError(`You already logined`)
  172. return
  173. }
  174. var user_id int
  175. err := wrap.DB.QueryRow(
  176. "SELECT `id` FROM `users` WHERE `email` = ? and `password` = MD5(?) LIMIT 1;",
  177. pf_email, pf_password).Scan(&user_id)
  178. if err != nil && err != sql.ErrNoRows {
  179. wrap.MsgError(err.Error())
  180. return
  181. }
  182. if err == sql.ErrNoRows {
  183. wrap.MsgError(`Incorrect email or password`)
  184. return
  185. }
  186. // Save to current session
  187. wrap.S.SetInt("UserId", user_id)
  188. // Reload current page
  189. wrap.Write(`window.location.reload(false);`)
  190. })
  191. }
  192. func (this *Modules) RegisterAction_CpUserLogout() *Action {
  193. return this.newAction(AInfo{
  194. WantDB: true,
  195. Mount: "singout",
  196. WantUser: true,
  197. }, func(wrap *wrapper.Wrapper) {
  198. // Reset session var
  199. wrap.S.SetInt("UserId", 0)
  200. // Reload current page
  201. wrap.Write(`window.location.reload(false);`)
  202. })
  203. }
  204. func (this *Modules) RegisterAction_CpUserSettings() *Action {
  205. return this.newAction(AInfo{
  206. WantDB: true,
  207. Mount: "user-settings",
  208. WantUser: true,
  209. }, func(wrap *wrapper.Wrapper) {
  210. pf_first_name := wrap.R.FormValue("first_name")
  211. pf_last_name := wrap.R.FormValue("last_name")
  212. pf_email := wrap.R.FormValue("email")
  213. pf_password := wrap.R.FormValue("password")
  214. if pf_email == "" {
  215. wrap.MsgError(`Please specify user email`)
  216. return
  217. }
  218. if !utils.IsValidEmail(pf_email) {
  219. wrap.MsgError(`Please specify correct user email`)
  220. return
  221. }
  222. if pf_password != "" {
  223. // Update with password if set
  224. _, err := wrap.DB.Query(
  225. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?) WHERE `id` = ?;",
  226. pf_first_name, pf_last_name, pf_email, pf_password, wrap.User.A_id)
  227. if err != nil {
  228. wrap.MsgError(err.Error())
  229. return
  230. }
  231. } else {
  232. // Update without password if not set
  233. _, err := wrap.DB.Query(
  234. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ? WHERE `id` = ?;",
  235. pf_first_name, pf_last_name, pf_email, wrap.User.A_id)
  236. if err != nil {
  237. wrap.MsgError(err.Error())
  238. return
  239. }
  240. }
  241. // Reload current page
  242. wrap.Write(`window.location.reload(false);`)
  243. })
  244. }