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. var_dump(111);exit;
  126. file_put_contents(storage_path('installed'), '');
  127. return view('installer.finished');
  128. }
  129. private function checkRequirements(){
  130. $requirements = config('installer.requirements');
  131. $results = [];
  132. foreach($requirements as $requirement)
  133. {
  134. $results['requirements'][$requirement] = true;
  135. if(!extension_loaded($requirement))
  136. {
  137. $results['requirements'][$requirement] = false;
  138. $results['errors'] = true;
  139. }
  140. }
  141. return $results;
  142. }
  143. private function checkPermissions(){
  144. $folders = config('installer.permissions');
  145. $results = [];
  146. foreach($folders as $folder => $permission)
  147. {
  148. $results['folders'][$folder]['status'] = true;
  149. $results['folders'][$folder]['permission'] = $this->getPermission($folder);
  150. if(!($results['folders'][$folder]['permission'] >= $permission))
  151. {
  152. $results['folders'][$folder]['status'] = false;
  153. $results['errors'] = true;
  154. }
  155. }
  156. return $results;
  157. }
  158. /**
  159. * Get a folder permission.
  160. *
  161. * @param $folder
  162. * @return string
  163. */
  164. private function getPermission($folder)
  165. {
  166. return substr(sprintf('%o', fileperms(base_path($folder))), -4);
  167. }
  168. }