InstallerController.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: sdf_sky
  5. * Date: 16/6/6
  6. * Time: 下午5:40
  7. */
  8. namespace App\Http\Controllers\Installer;
  9. use App\Repositories\UserRepository;
  10. use Exception;
  11. use App\Models\Setting;
  12. use App\Http\Controllers\Controller;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Artisan;
  15. use Illuminate\Support\Str;
  16. class InstallerController extends Controller
  17. {
  18. /*欢迎使用*/
  19. public function welcome(){
  20. return view("installer.welcome");
  21. }
  22. public function requirement(){
  23. $requirements = $this->checkRequirements();
  24. $folders = $this->checkPermissions();
  25. $result = true;
  26. if(isset($requirements['errors']) || isset($folders['errors'])){
  27. $result = false;
  28. }
  29. return view("installer.environment")->with(compact('requirements','folders','result'));
  30. }
  31. public function config(Request $request){
  32. if($request->isMethod('post')){
  33. $validateRules = [
  34. 'database_host' => 'required|max:128',
  35. 'database_port' => 'required|digits_between:0,65535',
  36. 'database_username' => 'required|max:128',
  37. 'database_password' => 'sometimes|max:128',
  38. 'database_name' => 'required|max:128',
  39. 'database_prefix' => 'required|max:64',
  40. ];
  41. $request->flash();
  42. $this->validate($request,$validateRules);
  43. $envData = [
  44. 'APP_NAME'=>str_random(12),
  45. 'APP_ENV'=>'local',
  46. 'APP_DEBUG'=>'false',
  47. 'APP_KEY'=>str_random(32),
  48. 'DB_CONNECTION'=>$request->input('database_driver'),
  49. 'DB_HOST'=>$request->input('database_host'),
  50. 'DB_PORT'=>$request->input('database_port'),
  51. 'DB_DATABASE'=>$request->input('database_name'),
  52. 'DB_USERNAME'=>$request->input('database_username'),
  53. 'DB_PASSWORD'=>$request->input('database_password'),
  54. 'DB_PREFIX'=>$request->input('database_prefix'),
  55. ];
  56. /*写入配置文件*/
  57. $env_path = base_path('.env');
  58. if (!file_exists($env_path)){
  59. if(!touch($env_path)){
  60. return $this->error(route('website.installer.config'),'配置文件创建失败,请在网站根目录创建名称 .env 空文件文件并添加读写权限!');
  61. }
  62. }
  63. $env_content = '';
  64. foreach($envData as $key => $value ){
  65. $env_content .= $key.'='.$value."\n";
  66. }
  67. try {
  68. file_put_contents($env_path,$env_content);
  69. }catch(Exception $e) {
  70. return $this->error(route('website.installer.config'),'配置文件写入失败,请将网站根目录创建名称为 .env 的文件添加读写权限!');
  71. }
  72. return redirect()->route('website.installer.initDB');
  73. }
  74. return view('installer.config');
  75. }
  76. public function initDB(){
  77. set_time_limit(0);//不限制执行时间
  78. /*创建表结构*/
  79. try{
  80. Artisan::call('migrate');
  81. }catch(Exception $e) {
  82. return $this->error(route('website.installer.config'),'数据库连接出错:'.$e->getMessage());
  83. }
  84. /*导入数据*/
  85. try{
  86. Artisan::call('db:seed');
  87. }catch(Exception $e){
  88. return $this->error(route('website.installer.config'),'数据插入失败:'.$e->getMessage());
  89. }
  90. return redirect()->route('website.installer.website');
  91. }
  92. public function website(Request $request,UserRepository $userRepository)
  93. {
  94. if($request->isMethod('post')){
  95. $validateRules = [
  96. 'website_name' => 'required|max:256',
  97. 'website_url' => 'required|max:128',
  98. 'website_admin_name' => 'required|max:128',
  99. 'website_admin_email' => 'required|email',
  100. 'website_admin_pass' => 'required|min:6|max:32',
  101. ];
  102. $request->flash();
  103. $this->validate($request,$validateRules);
  104. $registerData = [
  105. 'name' => $request->input('website_admin_name'),
  106. 'email' => $request->input('website_admin_email'),
  107. 'password' => $request->input('website_admin_pass'),
  108. 'status' => 1,
  109. 'visit_ip' => $request->getClientIp(),
  110. ];
  111. Setting::set('website_name',$request->input('website_name'));
  112. Setting::set('website_url',$request->input('website_url'));
  113. Setting::set('website_admin_email',$request->input('website_admin_email'));
  114. $envParams = [];
  115. $envParams['APP_URL'] = $request->input('website_url','');
  116. $envParams['WEBSITE_ADMIN_EMAIL'] = $request->input('website_admin_email','');
  117. Setting()->setEnvParams($envParams);
  118. $admin = $userRepository->register($registerData);
  119. $admin->attachRole(1);
  120. return redirect()->route('website.installer.finished');
  121. }
  122. return view('installer.website');
  123. }
  124. public function finished(){
  125. file_put_contents(storage_path('installed'), '');
  126. return view('installer.finished');
  127. }
  128. private function checkRequirements(){
  129. $requirements = config('installer.requirements');
  130. $results = [];
  131. foreach($requirements as $requirement)
  132. {
  133. $results['requirements'][$requirement] = true;
  134. if(!extension_loaded($requirement))
  135. {
  136. $results['requirements'][$requirement] = false;
  137. $results['errors'] = true;
  138. }
  139. }
  140. return $results;
  141. }
  142. private function checkPermissions(){
  143. $folders = config('installer.permissions');
  144. $results = [];
  145. foreach($folders as $folder => $permission)
  146. {
  147. $results['folders'][$folder]['status'] = true;
  148. $results['folders'][$folder]['permission'] = $this->getPermission($folder);
  149. if(!($results['folders'][$folder]['permission'] >= $permission))
  150. {
  151. $results['folders'][$folder]['status'] = false;
  152. $results['errors'] = true;
  153. }
  154. }
  155. return $results;
  156. }
  157. /**
  158. * Get a folder permission.
  159. *
  160. * @param $folder
  161. * @return string
  162. */
  163. private function getPermission($folder)
  164. {
  165. return substr(sprintf('%o', fileperms(base_path($folder))), -4);
  166. }
  167. }