| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 | <?phpnamespace install\controllers;use common\components\ModuleManager;use common\modules\user\models\User;use yii\web\Controller;use Yii;use install\models\DatabaseForm;use install\models\SiteForm;use install\models\AdminForm;class SiteController extends Controller{    protected function renderJson($status = true, $message = '')    {        Yii::$app->response->format = 'json';        return [            'status' => $status,            'message' => $message        ];    }    public $migrationPath = '@database/migrations';    public $migrationTable = '{{%migration}}';    public $envPath = '@root/.env';    public function init()    {        parent::init();        $this->migrationPath = Yii::getAlias($this->migrationPath);    }    /**     * Lists all Menu models.     *     * @return mixed     */    public function actionIndex()    {        return $this->render('index');    }    public function actionLanguage()    {        return $this->render('index');    }    public function actionLicenseAgreement()    {        if (\Yii::$app->getRequest()->isPost) {            if (\Yii::$app->getRequest()->post("license") == "on") {                return $this->renderJson(true);            } else {                return $this->renderJson(false, "同意安装协议才能继续安装!");            }        }        return $this->render('license');    }    public function actionCheckEnv()    {        $checkResult = include Yii::getAlias('@install/requirements.php');        // Render template        return $this->render('checkenv', [            "data" => $checkResult        ]);    }    public function actionCheckDirFile()    {        $items = [            ['dir',  '可写', 'success', '@root/cache'],            ['dir',  '可写', 'success', '@backend/runtime'],            ['dir',  '可写', 'success', '@frontend/runtime'],            ['dir',  '可写', 'success', '@api/runtime'],            ['dir',  '可写', 'success', '@root/web/storage'],            ['dir',  '可写', 'success', '@root/web/assets'],            ['dir',  '可写', 'success', '@root/web/admin/assets'],            ['dir',  '可写', 'success', '@root/web/api/assets'],        ];        $result = true;        foreach ($items as &$val) {            $val[3] =	Yii::getAlias($val[3]);            if('dir' == $val[0]){                if(!is_writable($val[3])) {                    if(is_dir($val[3])) {                        $val[1] = '可读';                        $val[2] = 'error';                    } else {                        $val[1] = '不存在';                        $val[2] = 'error';                    }                    $result = false;                }            } else {                if(file_exists($val[3])) {                    if(!is_writable($val[3])) {                        $val[1] = '不可写';                        $val[2] = 'error';                        $result = false;                    }                } else {                    if(!is_writable(dirname($val[3]))) {                        $val[1] = '不存在';                        $val[2] = 'error';                        $result = false;                    }                }            }        }        if (Yii::$app->request->isPost) {            if ($result == true) {                return $this->renderJson(true);            }else {                return $this->renderJson(false, '请确保目录和文件拥有指定权限');            }        }        return $this->render('checkdirfile', [            "items" => $items        ]);    }    public function actionSelectDb()    {        return $this->render('index');    }    public function actionSetDb()    {        $model = new DatabaseForm();        $model->loadDefaultValues();        if ($model->load(Yii::$app->request->post())) {            if ($model->validate() && $model->save()) {                return $this->renderJson(true);            } else {                return $this->renderJson(false, current($model->getFirstErrors()));            }        }        return $this->render('setdb', [            "model" => $model        ]);    }    public function actionSetSite()    {        $model = new SiteForm();        $model->loadDefaultValues();        if ($model->load(Yii::$app->request->post())) {            if ($model->validate() && $model->save()) {                return $this->renderJson(true);            } else {                return $this->renderJson(false, current($model->getFirstErrors()));            }        }        return $this->render('setsite', [            "model" => $model        ]);    }    public function actionSetAdmin()    {        $model = new AdminForm();        $model->loadDefaultValues();        if ($model->load(Yii::$app->request->post())) {            if (!$model->validate() || !$model->save()) {                return $this->renderJson(false, current($model->getFirstErrors()));            }            $error = $this->installDb();            if ($error != null) {                return $this->renderJson(false, $error);            }            //安装核心模块            $this->installConfig();            // 创建用户            $error = $this->createAdminUser();            if ($error != null) {                return $this->renderJson(false, $error);            }            return $this->renderJson(true);        }        return $this->render('setadmin', [            "model" => $model        ]);    }    public function actionSelectModule()    {        $moduleManager = new ModuleManager();        $modules = $moduleManager->findAll();        if (Yii::$app->request->isPost) {            $installModules = Yii::$app->request->post('modules', []);            foreach ($installModules as $installModule) {                $installModuleInfo = $moduleManager->findOne($installModule);                $moduleManager->install($installModuleInfo);            }            // 安装核心模块            $cores = $moduleManager->findCore();            foreach ($cores as $core) {                $moduleManager->install($core);            }            //清缓存            \Yii::$app->getCache()->flush();            //安装完成            Yii::$app->setInstalled();            return $this->renderJson(true);        }        return $this->render('selectmodule', [            "modules" => $modules        ]);    }    /**     * 安装数据库     */    public function installDb()    {        $handle = opendir($this->migrationPath);        while (($file = readdir($handle)) !== false) {            if ($file === '.' || $file === '..') {                continue;            }            $path = $this->migrationPath . DIRECTORY_SEPARATOR . $file;            if (preg_match('/^(m(\d{6}_\d{6})_.*?)\.php$/', $file, $matches) && !isset($applied[$matches[2]]) && is_file($path)) {                $migrations[] = $matches[1];            }        }        closedir($handle);        sort($migrations);        $error = "";        ob_start();        if (Yii::$app->db->schema->getTableSchema($this->migrationTable, true) === null) {            $this->createMigrationHistoryTable();        }        foreach ($migrations as $migration) {            $migrationClass = $this->createMigration($migration);            try {                if ($migrationClass->up() === false) {                    $error = "数据库迁移失败";                }                $this->addMigrationHistory($migration);            } catch (\Exception $e) {                $error = "数据表已经存在,或者其他错误!";            }        }        ob_end_clean();        if (! empty($error)) {            return $error;        }        return null;    }    //写入配置文件    public function installConfig()    {        \Yii::$app->setKeys($this->envPath);        $data = \Yii::$app->getCache()->get(SiteForm::CACHE_KEY);        foreach ($data as $name => $value) {            Yii::$app->setEnv($name, $value);        }        return true;    }    public function createAdminUser()    {        $data = \Yii::$app->getCache()->get(AdminForm::CACHE_KEY);        $user = new User();        $user->setScenario("create");        $user->email = $data["email"];        $user->username = $data["username"];        $user->password = $data["password"];        if($user->create() == false) {            return current($user->getFirstErrors());        }        return null;    }    protected function createMigrationHistoryTable()    {        Yii::$app->db->createCommand()->createTable($this->migrationTable, [            'version' => 'varchar(180) NOT NULL PRIMARY KEY',            'apply_time' => 'integer',        ])->execute();        Yii::$app->db->createCommand()->insert($this->migrationTable, [            'version' => 'm000000_000000_base',            'apply_time' => time(),        ])->execute();    }    protected function createMigration($class)    {        $file = $this->migrationPath . DIRECTORY_SEPARATOR . $class . '.php';        require_once($file);        return new $class();    }    protected function addMigrationHistory($version)    {        $command = Yii::$app->db->createCommand();        $command->insert($this->migrationTable, [            'version' => $version,            'apply_time' => time(),        ])->execute();    }}
 |