Index.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 海豚PHP框架 [ DolphinPHP ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2016~2019 广东卓锐软件有限公司 [ http://www.zrthink.com ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://dolphinphp.com
  8. // +----------------------------------------------------------------------
  9. namespace app\install\controller;
  10. use think\Controller;
  11. use think\Db;
  12. use think\facade\Env;
  13. define('INSTALL_APP_PATH', realpath('./') . '/');
  14. /**
  15. * 安装控制器
  16. * @package app\install\controller
  17. */
  18. class Index extends Controller
  19. {
  20. /**
  21. * 获取入口目录
  22. * @author 蔡伟明 <314013107@qq.com>
  23. */
  24. protected function initialize() {
  25. $this->assign('static_dir', 'static/');
  26. }
  27. /**
  28. * 安装首页
  29. * @author 蔡伟明 <314013107@qq.com>
  30. */
  31. public function index()
  32. {
  33. if (is_file(Env::get('app_path') . 'database.php')) {
  34. // 已经安装过了 执行更新程序
  35. session('reinstall', true);
  36. $this->assign('next', '重新安装');
  37. } else {
  38. session('reinstall', false);
  39. $this->assign('next', '下一步');
  40. }
  41. session('step', 1);
  42. session('error', false);
  43. return $this->fetch();
  44. }
  45. /**
  46. * 步骤二,检查环境
  47. * @author 蔡伟明 <314013107@qq.com>
  48. * @return mixed
  49. */
  50. public function step2()
  51. {
  52. if (session('step') != 1 && session('step') != 3) $this->redirect($this->request->baseFile());
  53. if(session('reinstall')){
  54. session('step', 2);
  55. $this->redirect($this->request->baseFile().'?s=/index/step4.html');
  56. }else{
  57. session('error', false);
  58. // 环境检测
  59. $env = check_env();
  60. // 目录文件读写检测
  61. $dirfile = check_dirfile();
  62. $this->assign('dirfile', $dirfile);
  63. // 函数检测
  64. $func = check_func();
  65. session('step', 2);
  66. $this->assign('env', $env);
  67. $this->assign('func', $func);
  68. return $this->fetch();
  69. }
  70. }
  71. /**
  72. * 步骤三,设置数据库连接
  73. * @author 蔡伟明 <314013107@qq.com>
  74. * @return mixed
  75. */
  76. public function step3()
  77. {
  78. // 检查上一步是否通过
  79. if ($this->request->isAjax()) {
  80. if (session('error')) {
  81. $this->error('环境检测没有通过,请调整环境后重试!');
  82. } else {
  83. $this->success('恭喜您环境检测通过', $this->request->baseFile().'?s=/index/step3.html');
  84. }
  85. }
  86. if (session('step') != 2) $this->redirect($this->request->baseFile());
  87. session('error', false);
  88. session('step', 3);
  89. return $this->fetch();
  90. }
  91. /**
  92. * 步骤四,创建数据库
  93. * @param null $db 数据库配置信息
  94. * @param int $cover 是否覆盖已存在数据库
  95. * @author 蔡伟明 <314013107@qq.com>
  96. * @return mixed
  97. */
  98. public function step4($db = null, $cover = 0)
  99. {
  100. // 检查上一步是否通过
  101. if ($this->request->isPost()) {
  102. // 检测数据库配置
  103. if(!is_array($db) || empty($db['type'])
  104. || empty($db['hostname'])
  105. || empty($db['database'])
  106. || empty($db['username'])
  107. || empty($db['prefix'])){
  108. $this->error('请填写完整的数据库配置');
  109. }
  110. // 缓存数据库配置
  111. session('db_config', $db);
  112. // 防止不存在的数据库导致连接数据库失败
  113. $db_name = $db['database'];
  114. unset($db['database']);
  115. // 创建数据库连接
  116. $db_instance = Db::connect($db);
  117. // 检测数据库连接
  118. try{
  119. $db_instance->execute('select version()');
  120. }catch(\Exception $e){
  121. $this->error('数据库连接失败,请检查数据库配置!');
  122. }
  123. // 用户选择不覆盖情况下检测是否已存在数据库
  124. if (!$cover) {
  125. // 检测是否已存在数据库
  126. $result = $db_instance->execute('SELECT * FROM information_schema.schemata WHERE schema_name="'.$db_name.'"');
  127. if ($result) {
  128. $this->error('该数据库已存在,请更换名称!如需覆盖,请选中覆盖按钮!');
  129. }
  130. }
  131. // 创建数据库
  132. $sql = "CREATE DATABASE IF NOT EXISTS `{$db_name}` DEFAULT CHARACTER SET utf8";
  133. $db_instance->execute($sql) || $this->error($db_instance->getError());
  134. // 跳转到数据库安装页面
  135. $this->success('参数正确开始安装', $this->request->baseFile().'?s=/index/step4.html');
  136. } else {
  137. if (session('step') != 3 && !session('reinstall')) {
  138. $this->redirect($this->request->baseFile());
  139. }
  140. session('step', 4);
  141. return $this->fetch();
  142. }
  143. }
  144. /**
  145. * 完成安装
  146. * @author 蔡伟明 <314013107@qq.com>
  147. * @return mixed
  148. */
  149. public function complete()
  150. {
  151. if (session('step') != 4) {
  152. $this->error('请按步骤安装系统', $this->request->baseFile());
  153. }
  154. if (session('error')) {
  155. $this->error('安装出错,请重新安装!', $this->request->baseFile());
  156. } else {
  157. // 写入安装锁定文件(只能在最后一步写入锁定文件,因为锁定文件写入后安装模块将无法访问)
  158. file_put_contents('../data/install.lock', 'lock');
  159. session('step', null);
  160. session('error', null);
  161. session('reinstall', null);
  162. return $this->fetch();
  163. }
  164. }
  165. }