module_index_act_mysql_setup.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package modules
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "os"
  6. "strconv"
  7. "golang-fave/engine/wrapper"
  8. "golang-fave/utils"
  9. )
  10. func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
  11. return this.newAction(AInfo{
  12. WantDB: false,
  13. Mount: "index-mysql-setup",
  14. }, func(wrap *wrapper.Wrapper) {
  15. pf_host := wrap.R.FormValue("host")
  16. pf_port := wrap.R.FormValue("port")
  17. pf_name := wrap.R.FormValue("name")
  18. pf_user := wrap.R.FormValue("user")
  19. pf_password := wrap.R.FormValue("password")
  20. if pf_host == "" {
  21. wrap.MsgError(`Please specify host for MySQL connection`)
  22. return
  23. }
  24. if pf_port == "" {
  25. wrap.MsgError(`Please specify host port for MySQL connection`)
  26. return
  27. }
  28. if _, err := strconv.Atoi(pf_port); err != nil {
  29. wrap.MsgError(`MySQL host port must be integer number`)
  30. return
  31. }
  32. if pf_name == "" {
  33. wrap.MsgError(`Please specify MySQL database name`)
  34. return
  35. }
  36. if pf_user == "" {
  37. wrap.MsgError(`Please specify MySQL user`)
  38. return
  39. }
  40. // Security, check if still need to run this action
  41. if wrap.ConfMysqlExists {
  42. wrap.MsgError(`CMS is already configured`)
  43. return
  44. }
  45. // Try connect to mysql
  46. db, err := sql.Open("mysql", pf_user+":"+pf_password+"@tcp("+pf_host+":"+pf_port+")/"+pf_name)
  47. if err != nil {
  48. wrap.MsgError(err.Error())
  49. return
  50. }
  51. defer db.Close()
  52. err = db.Ping()
  53. if err != nil {
  54. wrap.MsgError(err.Error())
  55. return
  56. }
  57. // Start transaction
  58. tx, err := db.Begin()
  59. if err != nil {
  60. wrap.MsgError(err.Error())
  61. return
  62. }
  63. // Table: blog_cats
  64. if _, err = tx.Exec(
  65. `CREATE TABLE blog_cats (
  66. id int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI',
  67. user int(11) NOT NULL COMMENT 'User id',
  68. name varchar(255) NOT NULL COMMENT 'Category name',
  69. alias varchar(255) NOT NULL COMMENT 'Category alias',
  70. lft int(11) NOT NULL COMMENT 'For nested set model',
  71. rgt int(11) NOT NULL COMMENT 'For nested set model',
  72. PRIMARY KEY (id)
  73. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  74. ); err != nil {
  75. tx.Rollback()
  76. wrap.MsgError(err.Error())
  77. return
  78. }
  79. if _, err = tx.Exec(
  80. `INSERT INTO blog_cats (id, user, name, alias, lft, rgt)
  81. VALUES
  82. (1, 0, 'ROOT', 'ROOT', 1, 24),
  83. (2, 1, 'Health and food', 'health-and-food', 2, 15),
  84. (3, 1, 'News', 'news', 16, 21),
  85. (4, 1, 'Hobby', 'hobby', 22, 23),
  86. (5, 1, 'Juices', 'juices', 3, 8),
  87. (6, 1, 'Nutrition', 'nutrition', 9, 14),
  88. (7, 1, 'Natural', 'natural', 4, 5),
  89. (8, 1, 'For kids', 'for-kids', 6, 7),
  90. (9, 1, 'For all', 'for-all', 10, 11),
  91. (10, 1, 'For athletes', 'for-athletes', 12, 13),
  92. (11, 1, 'Computers and technology', 'computers-and-technology', 17, 18),
  93. (13, 1, 'Film industry', 'film-industry', 19, 20);`,
  94. ); err != nil {
  95. tx.Rollback()
  96. wrap.MsgError(err.Error())
  97. return
  98. }
  99. if _, err = tx.Exec(`ALTER TABLE blog_cats ADD UNIQUE KEY alias (alias);`); err != nil {
  100. tx.Rollback()
  101. wrap.MsgError(err.Error())
  102. return
  103. }
  104. if _, err = tx.Exec(`ALTER TABLE blog_cats ADD KEY lft (lft), ADD KEY rgt (rgt);`); err != nil {
  105. tx.Rollback()
  106. wrap.MsgError(err.Error())
  107. return
  108. }
  109. // Table: blog_cat_post_rel
  110. if _, err = tx.Exec(
  111. `CREATE TABLE blog_cat_post_rel (
  112. id int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI',
  113. post_id int(11) NOT NULL COMMENT 'Post id',
  114. category_id int(11) NOT NULL COMMENT 'Category id',
  115. PRIMARY KEY (id)
  116. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  117. ); err != nil {
  118. tx.Rollback()
  119. wrap.MsgError(err.Error())
  120. return
  121. }
  122. if _, err = tx.Exec(`ALTER TABLE blog_cat_post_rel ADD KEY post_id (post_id), ADD KEY category_id (category_id);`); err != nil {
  123. tx.Rollback()
  124. wrap.MsgError(err.Error())
  125. return
  126. }
  127. if _, err = tx.Exec(`ALTER TABLE blog_cat_post_rel ADD UNIQUE KEY post_category (post_id,category_id) USING BTREE;`); err != nil {
  128. tx.Rollback()
  129. wrap.MsgError(err.Error())
  130. return
  131. }
  132. // Table: blog_posts
  133. if _, err = tx.Exec(
  134. `CREATE TABLE blog_posts (
  135. id int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI',
  136. user int(11) NOT NULL COMMENT 'User id',
  137. name varchar(255) NOT NULL COMMENT 'Post name',
  138. alias varchar(255) NOT NULL COMMENT 'Post alias',
  139. content text NOT NULL COMMENT 'Post content',
  140. datetime datetime NOT NULL COMMENT 'Creation date/time',
  141. active int(1) NOT NULL COMMENT 'Is active post or not',
  142. PRIMARY KEY (id)
  143. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  144. ); err != nil {
  145. tx.Rollback()
  146. wrap.MsgError(err.Error())
  147. return
  148. }
  149. if _, err = tx.Exec(`ALTER TABLE blog_posts ADD UNIQUE KEY alias (alias);`); err != nil {
  150. tx.Rollback()
  151. wrap.MsgError(err.Error())
  152. return
  153. }
  154. // Table: pages
  155. if _, err = tx.Exec(
  156. `CREATE TABLE pages (
  157. id int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI',
  158. user int(11) NOT NULL COMMENT 'User id',
  159. name varchar(255) NOT NULL COMMENT 'Page name',
  160. alias varchar(255) NOT NULL COMMENT 'Page url part',
  161. content text NOT NULL COMMENT 'Page content',
  162. meta_title varchar(255) NOT NULL DEFAULT '' COMMENT 'Page meta title',
  163. meta_keywords varchar(255) NOT NULL DEFAULT '' COMMENT 'Page meta keywords',
  164. meta_description varchar(510) NOT NULL DEFAULT '' COMMENT 'Page meta description',
  165. datetime datetime NOT NULL COMMENT 'Creation date/time',
  166. active int(1) NOT NULL COMMENT 'Is active page or not',
  167. PRIMARY KEY (id)
  168. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  169. ); err != nil {
  170. tx.Rollback()
  171. wrap.MsgError(err.Error())
  172. return
  173. }
  174. if _, err = tx.Exec(
  175. `INSERT INTO pages SET
  176. id = ?,
  177. user = ?,
  178. name = ?,
  179. alias = ?,
  180. content = ?,
  181. datetime = ?,
  182. active = ?
  183. ;`,
  184. 1,
  185. 1,
  186. "Home",
  187. "/",
  188. "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p><p>Ante metus dictum at tempor commodo ullamcorper a. Facilisis mauris sit amet massa vitae. Enim neque volutpat ac tincidunt vitae. Tempus quam pellentesque nec nam aliquam sem. Mollis aliquam ut porttitor leo a diam sollicitudin. Nunc pulvinar sapien et ligula ullamcorper. Dignissim suspendisse in est ante in nibh mauris. Eget egestas purus viverra accumsan in. Vitae tempus quam pellentesque nec nam aliquam sem et. Sodales ut etiam sit amet nisl. Aliquet risus feugiat in ante. Rhoncus urna neque viverra justo nec ultrices dui sapien. Sit amet aliquam id diam maecenas ultricies. Sed odio morbi quis commodo odio aenean sed adipiscing diam.</p>",
  189. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  190. 1,
  191. ); err != nil {
  192. tx.Rollback()
  193. wrap.MsgError(err.Error())
  194. return
  195. }
  196. if _, err = tx.Exec(
  197. `INSERT INTO pages SET
  198. id = ?,
  199. user = ?,
  200. name = ?,
  201. alias = ?,
  202. content = ?,
  203. datetime = ?,
  204. active = ?
  205. ;`,
  206. 2,
  207. 1,
  208. "Another",
  209. "/another/",
  210. "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p><p>Ante metus dictum at tempor commodo ullamcorper a. Facilisis mauris sit amet massa vitae. Enim neque volutpat ac tincidunt vitae. Tempus quam pellentesque nec nam aliquam sem. Mollis aliquam ut porttitor leo a diam sollicitudin. Nunc pulvinar sapien et ligula ullamcorper. Dignissim suspendisse in est ante in nibh mauris. Eget egestas purus viverra accumsan in. Vitae tempus quam pellentesque nec nam aliquam sem et. Sodales ut etiam sit amet nisl. Aliquet risus feugiat in ante. Rhoncus urna neque viverra justo nec ultrices dui sapien. Sit amet aliquam id diam maecenas ultricies. Sed odio morbi quis commodo odio aenean sed adipiscing diam.</p>",
  211. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  212. 1,
  213. ); err != nil {
  214. tx.Rollback()
  215. wrap.MsgError(err.Error())
  216. return
  217. }
  218. if _, err = tx.Exec(
  219. `INSERT INTO pages SET
  220. id = ?,
  221. user = ?,
  222. name = ?,
  223. alias = ?,
  224. content = ?,
  225. datetime = ?,
  226. active = ?
  227. ;`,
  228. 3,
  229. 1,
  230. "About",
  231. "/about/",
  232. "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p><p>Ante metus dictum at tempor commodo ullamcorper a. Facilisis mauris sit amet massa vitae. Enim neque volutpat ac tincidunt vitae. Tempus quam pellentesque nec nam aliquam sem. Mollis aliquam ut porttitor leo a diam sollicitudin. Nunc pulvinar sapien et ligula ullamcorper. Dignissim suspendisse in est ante in nibh mauris. Eget egestas purus viverra accumsan in. Vitae tempus quam pellentesque nec nam aliquam sem et. Sodales ut etiam sit amet nisl. Aliquet risus feugiat in ante. Rhoncus urna neque viverra justo nec ultrices dui sapien. Sit amet aliquam id diam maecenas ultricies. Sed odio morbi quis commodo odio aenean sed adipiscing diam.</p>",
  233. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  234. 1,
  235. ); err != nil {
  236. tx.Rollback()
  237. wrap.MsgError(err.Error())
  238. return
  239. }
  240. if _, err = tx.Exec(`ALTER TABLE pages ADD UNIQUE KEY alias (alias);`); err != nil {
  241. tx.Rollback()
  242. wrap.MsgError(err.Error())
  243. return
  244. }
  245. // Table: users
  246. if _, err = tx.Exec(
  247. `CREATE TABLE users (
  248. id int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI',
  249. first_name varchar(64) NOT NULL DEFAULT '' COMMENT 'User first name',
  250. last_name varchar(64) NOT NULL DEFAULT '' COMMENT 'User last name',
  251. email varchar(64) NOT NULL COMMENT 'User email',
  252. password varchar(32) NOT NULL COMMENT 'User password (MD5)',
  253. admin int(1) NOT NULL COMMENT 'Is admin user or not',
  254. active int(1) NOT NULL COMMENT 'Is active user or not',
  255. PRIMARY KEY (id)
  256. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  257. ); err != nil {
  258. tx.Rollback()
  259. wrap.MsgError(err.Error())
  260. return
  261. }
  262. if _, err = tx.Exec(`ALTER TABLE users ADD UNIQUE KEY email (email);`); err != nil {
  263. tx.Rollback()
  264. wrap.MsgError(err.Error())
  265. return
  266. }
  267. // Commit all changes
  268. err = tx.Commit()
  269. if err != nil {
  270. wrap.MsgError(err.Error())
  271. return
  272. }
  273. // Save mysql config file
  274. err = utils.MySqlConfigWrite(wrap.DConfig+string(os.PathSeparator)+"mysql.json", pf_host, pf_port, pf_name, pf_user, pf_password)
  275. if err != nil {
  276. wrap.MsgError(err.Error())
  277. return
  278. }
  279. // Reload current page
  280. wrap.Write(`window.location.reload(false);`)
  281. })
  282. }