Index.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 中闽 < 1464674022@qq.com >
  5. * Date: 2020/2/4
  6. * Time: 12:47
  7. */
  8. namespace app\install\controller;
  9. use mysqli;
  10. use think\Controller;
  11. use think\Env;
  12. class Index extends Controller
  13. {
  14. protected function _initialize()
  15. {
  16. if (is_installed()) {
  17. $this->error('无法重复安装,请删除install.lock才能再次安装!', '/');
  18. }
  19. }
  20. public function index()
  21. {
  22. return $this->fetch('step1');
  23. }
  24. public function step2()
  25. {
  26. $data['pdo'] = class_exists('pdo') ? 1 : 0;
  27. $data['pdo_mysql'] = extension_loaded('pdo_mysql') ? 1 : 0;
  28. $data['curl'] = extension_loaded('curl') ? 1 : 0;
  29. $data['putenv'] = function_exists('putenv') ? 1 : 0;
  30. $data['upload_size'] = ini_get('file_uploads') ? ini_get('upload_max_filesize') : 0;
  31. $data['session'] = function_exists('session_start') ? 1 : 0;
  32. return $this->fetch('', ['data' => $data]);
  33. }
  34. public function step3()
  35. {
  36. $this->assign('db_host', Env::get('db_host', '127.0.0.1'));
  37. $this->assign('db_port', Env::get('db_port', '3306'));
  38. $this->assign('db_name', Env::get('db_name', 'tplay'));
  39. $this->assign('db_username', Env::get('db_username', 'root'));
  40. $this->assign('db_password', Env::get('db_password', ''));
  41. $this->assign('db_prefix', Env::get('db_prefix', 'tplay_'));
  42. return $this->fetch();
  43. }
  44. private function initEnvConfig($data)
  45. {
  46. $env_str = "app_debug = false
  47. app_trace = false
  48. db_host = {$data['DB_HOST']}
  49. db_port = {$data['DB_PORT']}
  50. db_name = {$data['DB_NAME']}
  51. db_username = {$data['DB_USER']}
  52. db_password = {$data['DB_PWD']}
  53. db_prefix = {$data['DB_PREFIX']}";
  54. if (false == file_put_contents(ROOT_PATH . ".env", $env_str)) {
  55. $this->error('创建env配置文件失败,请检查目录权限');
  56. }
  57. }
  58. public function createData()
  59. {
  60. if ($this->request->isPost()) {
  61. $data = $this->request->param();
  62. $validate = new \think\Validate([
  63. ['DB_TYPE|数据库类型', 'require|eq:mysql'],
  64. ['DB_HOST|数据库地址', 'require'],
  65. ['DB_PORT|数据库端口', 'require'],
  66. ['DB_USER|数据库用户名', 'require'],
  67. // ['DB_PWD|数据库密码', 'require'],
  68. ['DB_NAME|数据库名字', 'require'],
  69. ['DB_PREFIX|表前缀', 'require'],
  70. ['username|管理员账户', 'require'],
  71. ['password|密码', 'require|confirm'],
  72. ]);
  73. if (!$validate->check($data)) {
  74. $this->error('提交失败:' . $validate->getError());
  75. }
  76. // create .env
  77. $this->initEnvConfig($data);
  78. // connect db
  79. $link = @new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}", $data['DB_USER'], $data['DB_PWD']);
  80. $error = $link->connect_error;
  81. if (!is_null($error)) {
  82. // 转义防止和alert中的引号冲突
  83. $error = addslashes($error);
  84. $this->error('数据库链接失败:' . $error);
  85. }
  86. $link->query("SET NAMES 'utf8'");
  87. if ($link->server_info < 5.0) {
  88. $this->error('请将您的mysql升级到5.0以上');
  89. }
  90. if (!$link->select_db($data['DB_NAME'])) {
  91. //创建库
  92. $create_sql = 'CREATE DATABASE IF NOT EXISTS ' . $data['DB_NAME'] . ' DEFAULT CHARACTER SET utf8;';
  93. if (!$link->query($create_sql)) {
  94. $this->error('数据库链接失败');
  95. }
  96. $link->select_db($data['DB_NAME']);
  97. }
  98. // 导入sql
  99. if (file_exists(APP_PATH . 'install/data/db.sql')) {
  100. $tplay_sql = file_get_contents(APP_PATH . 'install/data/db.sql');
  101. } else {
  102. $tplay_sql = file_get_contents(APP_PATH . 'install/data/tplay.sql');
  103. }
  104. $search = [
  105. "tplay_",
  106. "USE `tplay`",
  107. "CREATE DATABASE IF NOT EXISTS `tplay`",
  108. ];
  109. $replace = [
  110. $data['DB_PREFIX'],
  111. "USE `" . $data['DB_NAME'] . "`",
  112. "CREATE DATABASE IF NOT EXISTS `" . $data['DB_NAME'] . "`",
  113. ];
  114. $sql_array = preg_split("/;[\r\n]+/", str_replace($search, $replace, $tplay_sql));
  115. foreach ($sql_array as $k => $v) {
  116. if (!empty($v)) {
  117. $link->query($v);
  118. }
  119. }
  120. // create install.lock
  121. $salt = random_string();
  122. if (false == file_put_contents(ROOT_PATH . "install.lock", "安装鉴定文件,请勿删除,勿修改,勿泄露此文件!!!此次安装时间:" . date('Y-m-d H:i:s', time()) . " - {$salt}")) {
  123. $this->error('创建安装鉴定文件失败,请检查目录权限');
  124. }
  125. // update admin password
  126. $link->query("UPDATE `{$data['DB_PREFIX']}admin` SET `name` = '{$data['username']}',`password` = '" . password($data['password']) . "' WHERE `id` = 1");
  127. $link->close();
  128. $this->success('安装成功');
  129. }
  130. }
  131. }