module_index.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package modules
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "fmt"
  6. "html/template"
  7. "os"
  8. "strconv"
  9. "golang-fave/assets"
  10. "golang-fave/consts"
  11. "golang-fave/engine/wrapper"
  12. "golang-fave/utils"
  13. )
  14. func (this *Modules) RegisterModule_Index() *Module {
  15. return this.newModule(MInfo{
  16. WantDB: true,
  17. Mount: "index",
  18. Name: "Pages",
  19. }, func(wrap *wrapper.Wrapper) {
  20. // Front-end
  21. wrap.RenderFrontEnd("index", consts.TmplDataModIndex{
  22. MetaTitle: "Meta Title",
  23. MetaKeywords: "Meta Keywords",
  24. MetaDescription: "Meta Description",
  25. MainMenuItems: []consts.TmplDataMainMenuItem{
  26. {Name: "Home", Link: "/", Active: true},
  27. {Name: "Item 1", Link: "/#1", Active: false},
  28. {Name: "Item 2", Link: "/#2", Active: false},
  29. {Name: "Item 3", Link: "/#3", Active: false},
  30. },
  31. })
  32. }, func(wrap *wrapper.Wrapper) {
  33. // Back-end
  34. //page_sb_left := mdl.GetSidebarLeft()
  35. //nav_bar_modules_all := mdl.GetNavMenuModules()
  36. //nav_bar_modules_sys := mdl.GetNavMenuModulesSys()
  37. // If right sidebar and content need to show
  38. /*
  39. if page_sb_left != "" {
  40. body_class = body_class + " cp-sidebar-left"
  41. }
  42. if page_content == "" {
  43. body_class = body_class + " cp-404"
  44. page_content = "Panel 404"
  45. }
  46. if page_sb_right != "" {
  47. body_class = body_class + " cp-sidebar-right"
  48. }
  49. */
  50. body_class := "cp"
  51. nav_bar_modules_sys := ""
  52. page_sb_left := "Left"
  53. page_content := "Content"
  54. page_sb_right := "Right"
  55. wrap.RenderBackEnd(assets.TmplCpBase, consts.TmplDataCpBase{
  56. Title: "Fave " + consts.ServerVersion,
  57. BodyClasses: body_class,
  58. UserId: wrap.User.A_id,
  59. UserFirstName: wrap.User.A_first_name,
  60. UserLastName: wrap.User.A_last_name,
  61. UserEmail: wrap.User.A_email,
  62. UserPassword: "",
  63. UserAvatarLink: "https://s.gravatar.com/avatar/" + utils.GetMd5(wrap.User.A_email) + "?s=80&r=g",
  64. NavBarModules: template.HTML(this.getNavMenuModules(wrap)),
  65. NavBarModulesSys: template.HTML(nav_bar_modules_sys),
  66. ModuleCurrentAlias: "index",
  67. SidebarLeft: template.HTML(page_sb_left),
  68. Content: template.HTML(page_content),
  69. SidebarRight: template.HTML(page_sb_right),
  70. })
  71. })
  72. }
  73. func (this *Modules) RegisterAction_MysqlSetup() *Action {
  74. return this.newAction(AInfo{
  75. WantDB: false,
  76. Mount: "mysql",
  77. }, func(wrap *wrapper.Wrapper) {
  78. pf_host := wrap.R.FormValue("host")
  79. pf_port := wrap.R.FormValue("port")
  80. pf_name := wrap.R.FormValue("name")
  81. pf_user := wrap.R.FormValue("user")
  82. pf_password := wrap.R.FormValue("password")
  83. if pf_host == "" {
  84. wrap.MsgError(`Please specify host for MySQL connection`)
  85. return
  86. }
  87. if pf_port == "" {
  88. wrap.MsgError(`Please specify host port for MySQL connection`)
  89. return
  90. }
  91. if _, err := strconv.Atoi(pf_port); err != nil {
  92. wrap.MsgError(`MySQL host port must be integer number`)
  93. return
  94. }
  95. if pf_name == "" {
  96. wrap.MsgError(`Please specify MySQL database name`)
  97. return
  98. }
  99. if pf_user == "" {
  100. wrap.MsgError(`Please specify MySQL user`)
  101. return
  102. }
  103. // Try connect to mysql
  104. db, err := sql.Open("mysql", pf_user+":"+pf_password+"@tcp("+pf_host+":"+pf_port+")/"+pf_name)
  105. if err != nil {
  106. wrap.MsgError(err.Error())
  107. return
  108. }
  109. defer db.Close()
  110. err = db.Ping()
  111. if err != nil {
  112. wrap.MsgError(err.Error())
  113. return
  114. }
  115. // Try to install all tables
  116. _, err = db.Query(fmt.Sprintf(
  117. "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;",
  118. pf_name))
  119. if err != nil {
  120. wrap.MsgError(err.Error())
  121. return
  122. }
  123. _, err = db.Query(fmt.Sprintf(
  124. "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;",
  125. pf_name))
  126. if err != nil {
  127. wrap.MsgError(err.Error())
  128. return
  129. }
  130. // Save mysql config file
  131. err = utils.MySqlConfigWrite(wrap.DConfig+string(os.PathSeparator)+"mysql.json", pf_host, pf_port, pf_name, pf_user, pf_password)
  132. if err != nil {
  133. wrap.MsgError(err.Error())
  134. return
  135. }
  136. // Reload current page
  137. wrap.Write(`window.location.reload(false);`)
  138. })
  139. }
  140. func (this *Modules) RegisterAction_CpFirstUser() *Action {
  141. return this.newAction(AInfo{
  142. WantDB: true,
  143. Mount: "first-user",
  144. }, func(wrap *wrapper.Wrapper) {
  145. pf_first_name := wrap.R.FormValue("first_name")
  146. pf_last_name := wrap.R.FormValue("last_name")
  147. pf_email := wrap.R.FormValue("email")
  148. pf_password := wrap.R.FormValue("password")
  149. if pf_email == "" {
  150. wrap.MsgError(`Please specify user email`)
  151. return
  152. }
  153. if !utils.IsValidEmail(pf_email) {
  154. wrap.MsgError(`Please specify correct user email`)
  155. return
  156. }
  157. if pf_password == "" {
  158. wrap.MsgError(`Please specify user password`)
  159. return
  160. }
  161. _, err := wrap.DB.Query(
  162. "INSERT INTO `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?);",
  163. pf_first_name, pf_last_name, pf_email, pf_password)
  164. if err != nil {
  165. wrap.MsgError(err.Error())
  166. return
  167. }
  168. // Reload current page
  169. wrap.Write(`window.location.reload(false);`)
  170. })
  171. }
  172. func (this *Modules) RegisterAction_CpUserLogin() *Action {
  173. return this.newAction(AInfo{
  174. WantDB: true,
  175. Mount: "signin",
  176. }, func(wrap *wrapper.Wrapper) {
  177. pf_email := wrap.R.FormValue("email")
  178. pf_password := wrap.R.FormValue("password")
  179. if pf_email == "" {
  180. wrap.MsgError(`Please specify user email`)
  181. return
  182. }
  183. if !utils.IsValidEmail(pf_email) {
  184. wrap.MsgError(`Please specify correct user email`)
  185. return
  186. }
  187. if pf_password == "" {
  188. wrap.MsgError(`Please specify user password`)
  189. return
  190. }
  191. if wrap.S.GetInt("UserId", 0) > 0 {
  192. wrap.MsgError(`You already logined`)
  193. return
  194. }
  195. var user_id int
  196. err := wrap.DB.QueryRow(
  197. "SELECT `id` FROM `users` WHERE `email` = ? and `password` = MD5(?) LIMIT 1;",
  198. pf_email, pf_password).Scan(&user_id)
  199. if err != nil && err != sql.ErrNoRows {
  200. wrap.MsgError(err.Error())
  201. return
  202. }
  203. if err == sql.ErrNoRows {
  204. wrap.MsgError(`Incorrect email or password`)
  205. return
  206. }
  207. // Save to current session
  208. wrap.S.SetInt("UserId", user_id)
  209. // Reload current page
  210. wrap.Write(`window.location.reload(false);`)
  211. })
  212. }
  213. func (this *Modules) RegisterAction_CpUserLogout() *Action {
  214. return this.newAction(AInfo{
  215. WantDB: true,
  216. Mount: "singout",
  217. WantUser: true,
  218. }, func(wrap *wrapper.Wrapper) {
  219. // Reset session var
  220. wrap.S.SetInt("UserId", 0)
  221. // Reload current page
  222. wrap.Write(`window.location.reload(false);`)
  223. })
  224. }
  225. func (this *Modules) RegisterAction_CpUserSettings() *Action {
  226. return this.newAction(AInfo{
  227. WantDB: true,
  228. Mount: "user-settings",
  229. WantUser: true,
  230. }, func(wrap *wrapper.Wrapper) {
  231. pf_first_name := wrap.R.FormValue("first_name")
  232. pf_last_name := wrap.R.FormValue("last_name")
  233. pf_email := wrap.R.FormValue("email")
  234. pf_password := wrap.R.FormValue("password")
  235. if pf_email == "" {
  236. wrap.MsgError(`Please specify user email`)
  237. return
  238. }
  239. if !utils.IsValidEmail(pf_email) {
  240. wrap.MsgError(`Please specify correct user email`)
  241. return
  242. }
  243. if pf_password != "" {
  244. // Update with password if set
  245. _, err := wrap.DB.Query(
  246. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ?, `password` = MD5(?) WHERE `id` = ?;",
  247. pf_first_name, pf_last_name, pf_email, pf_password, wrap.User.A_id)
  248. if err != nil {
  249. wrap.MsgError(err.Error())
  250. return
  251. }
  252. } else {
  253. // Update without password if not set
  254. _, err := wrap.DB.Query(
  255. "UPDATE `users` SET `first_name` = ?, `last_name` = ?, `email` = ? WHERE `id` = ?;",
  256. pf_first_name, pf_last_name, pf_email, wrap.User.A_id)
  257. if err != nil {
  258. wrap.MsgError(err.Error())
  259. return
  260. }
  261. }
  262. // Reload current page
  263. wrap.Write(`window.location.reload(false);`)
  264. })
  265. }