123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <?php
- /**
- * Created by PhpStorm.
- * User: NODELOG
- * Date: 16/7/6
- * Time: 下午3:35
- */
- namespace console\controllers;
- use common\modules\user\models\User;
- use yii\console\Controller;
- use Yii;
- use yii\helpers\Console;
- class AppController extends Controller
- {
- public $defaultAction = 'install';
- public $writablePaths = [
- '@root/web/assets',
- '@root/web/admin/assets',
- '@root/web/storage',
- '@root/cache',
- '@api/runtime',
- '@backend/runtime',
- '@frontend/runtime',
- '@wechat/runtime',
- ];
- public $executablePaths = [
- '@root/yii',
- ];
- public $envPath = '@root/.env';
- public $installFile = '@root/web/storage/install.txt';
- /**
- * 设置可写
- */
- public function actionSetWritable()
- {
- $this->setWritable($this->writablePaths);
- }
- /**
- * 设置可执行
- */
- public function actionSetExecutable()
- {
- $this->setExecutable($this->executablePaths);
- }
- /**
- * 设置cookie加密key
- */
- public function actionSetKeys()
- {
- $this->setKeys($this->envPath);
- }
- public function setWritable($paths)
- {
- foreach ($paths as $writable) {
- $writable = Yii::getAlias($writable);
- Console::output("Setting writable: {$writable}");
- @chmod($writable, 0777);
- }
- }
- public function setExecutable($paths)
- {
- foreach ($paths as $executable) {
- $executable = Yii::getAlias($executable);
- Console::output("Setting executable: {$executable}");
- @chmod($executable, 0755);
- }
- }
- public function setKeys($file)
- {
- $file = Yii::getAlias($file);
- Console::output("Generating keys in {$file}");
- $content = file_get_contents($file);
- $content = preg_replace_callback('/<generated_key>/', function () {
- $length = 32;
- $bytes = openssl_random_pseudo_bytes(32, $cryptoStrong);
- return strtr(substr(base64_encode($bytes), 0, $length), '+/', '_-');
- }, $content);
- file_put_contents($file, $content);
- }
- /**
- * 设置数据库
- * @throws \yii\base\InvalidConfigException
- */
- public function actionSetDb()
- {
- do {
- $dbHost = $this->prompt('dbhost(默认为中括号内的值)' . PHP_EOL, ['default' => '127.0.0.1']);
- $dbPort = $this->prompt('dbport(默认为中括号内的值)' . PHP_EOL, ['default' => '3306']);
- $dbDbname = $this->prompt('dbname(不存在则自动创建)' . PHP_EOL, ['default' => 'yii']);
- $dbUsername = $this->prompt('dbusername(默认为中括号内的值)' . PHP_EOL, ['default' => 'root']);
- $dbPassword = $this->prompt('dbpassword' . PHP_EOL);
- $dbDsn = "mysql:host={$dbHost};port={$dbPort}";
- } while(!$this->testConnect($dbDsn, $dbDbname, $dbUsername, $dbPassword));
- $dbDsn = "mysql:host={$dbHost};port={$dbPort};dbname={$dbDbname}";
- $dbTablePrefix = $this->prompt('tableprefix(默认为中括号内的值)' . PHP_EOL, ['default' => 'yii2cmf_']);
- $this->setEnv('DB_USERNAME', $dbUsername);
- $this->setEnv('DB_PASSWORD', $dbPassword);
- $this->setEnv('DB_TABLE_PREFIX', $dbTablePrefix);
- $this->setEnv('DB_DSN', $dbDsn);
- Yii::$app->set('db', Yii::createObject([
- 'class' => 'yii\db\Connection',
- 'dsn' => $dbDsn,
- 'username' => $dbUsername,
- 'password' => $dbPassword,
- 'tablePrefix' => $dbTablePrefix,
- 'charset' => 'utf8'
- ])
- );
- }
- public function testConnect($dsn = '', $dbname, $username = '', $password = '')
- {
- try{
- $pdo = new \PDO($dsn, $username, $password);
- $sql = "CREATE DATABASE IF NOT EXISTS {$dbname} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;";
- $pdo->query($sql);
- } catch(\Exception $e) {
- $this->stderr("\n" . $e->getMessage(), Console::FG_RED);
- $this->stderr("\n ... 连接失败,核对数据库信息.\n\n", Console::FG_RED, Console::BOLD);
- return false;
- }
- return true;
- }
- public function setEnv($name, $value)
- {
- $file = Yii::getAlias($this->envPath);
- $content = preg_replace("/({$name}\s*=)\s*(.*)/", "\${1}$value", file_get_contents($file));// \${1}修复后边跟数字的bug
- file_put_contents($file, $content);
- }
- public function checkInstalled()
- {
- return file_exists(Yii::getAlias($this->installFile));
- }
- public function setInstalled()
- {
- file_put_contents(Yii::getAlias($this->installFile), time());
- }
- // 重置安装
- public function resetInstall()
- {
- $this->run('/migrate/down', ['all', 'interactive' => false]);
- @unlink(Yii::getAlias($this->installFile));
- @unlink(Yii::getAlias($this->envPath));
- }
- // 安装
- public function actionInstall()
- {
- if ($this->checkInstalled()) {
- $this->stdout("\n ... 已经安装过.\n\n", Console::FG_RED);
- die;
- }
- $start = <<<STR
- +==========================================+
- | Welcome to setup yii2cmf |
- | 欢迎使用 yii2cmf 安装程序 |
- +------------------------------------------+
- | Follow the on-screen instructions please |
- | 请按照屏幕上的提示操作以完成安装 |
- +==========================================+
- STR;
- $this->stdout($start, Console::FG_GREEN);
- copy(Yii::getAlias('@root/.env.example'), Yii::getAlias($this->envPath));
- $this->runAction('set-writable', ['interactive' => $this->interactive]);
- $this->runAction('set-executable', ['interactive' => $this->interactive]);
- $this->runAction('set-keys', ['interactive' => $this->interactive]);
- $this->runAction('set-db', ['interactive' => $this->interactive]);
- $appStatus = $this->select('设置当前应用模式', ['dev' => 'dev', 'prod' => 'prod']);
- $this->setEnv('YII_DEBUG', $appStatus == 'prod' ? 'false' : 'true');
- $this->setEnv('YII_ENV', $appStatus);
- // 迁移
- Yii::$app->runAction('migrate/up', ['interactive' => false]);
- //创建默认用户
- $this->runAction('create-admin', ['interactive' => $this->interactive]);
- $this->setEnv('SITE_URL', $this->prompt('siteUrl'));
- // 清缓存
- Yii::$app->runAction('cache/flush-all', ['interactive' => false]);
- $this->setInstalled();
- $end = <<<STR
- +=================================================+
- | Installation completed successfully, Thanks you |
- | 安装成功,感谢选择和使用 yii2cmf |
- +------------------------------------------+
- | 默认后台账号:hehe 密码: 111111
- +=================================================+
- STR;
- $this->stdout($end, Console::FG_GREEN);
- }
- public function actionCreateAdmin()
- {
- $user = new User();
- $user->setScenario("create");
- $user->email = 'hehe@hehe.com';
- $user->username = 'hehe';
- $user->password = '111111';
- $user->create();
- }
- public function actionReset()
- {
- if (!$this->checkInstalled()) {
- $this->stdout("\n ... 还没安装.\n\n", Console::FG_RED);
- die;
- }
- if ($this->confirm('确定要重置安装状态吗?')) {
- $this->resetInstall();
- }
- }
- public function actionUpdate()
- {
- \Yii::$app->runAction('migrate/up', ['interactive' => $this->interactive]);
- }
- }
|