skycaiji/SkycaijiApp/install/controller/Index.php

246 lines
7.1 KiB
PHP

<?php
/*
|--------------------------------------------------------------------------
| SkyCaiji (蓝天采集器)
|--------------------------------------------------------------------------
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved.
|--------------------------------------------------------------------------
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
namespace skycaiji\install\controller;
use skycaiji\common\controller\BaseController;
use skycaiji\admin\model\User;
use think\Db;
use skycaiji\install\event\UpgradeDb;
use think\Config;
class Index extends BaseController{
public function __construct(){
parent::__construct();
if(session_status()!==2){
session_start();
}
if(file_exists(config('app_path').'/install/data/install.lock')){
$this->success('程序已安装','admin/Index/index');
}
}
public function indexAction(){
return $this->fetch();
}
/*环境检测*/
public function step1Action(){
$LocSystem=new \skycaiji\install\event\LocSystem();
$setting=$LocSystem->environment();
$this->assign('serverDataList',$setting['server']);
$this->assign('phpModuleList',$setting['php']);
$this->assign('pathFileList',$setting['path']);
return $this->fetch();
}
/*数据安装表单*/
public function step2Action(){
if(request()->isPost()){
$db_config=array(
'db_host'=>input('db_host'),
'db_port'=>input('db_port'),
'db_name'=>input('db_name'),
'db_user'=>input('db_user'),
'db_prefix'=>trim(input('db_prefix'),'_')
);
foreach ($db_config as $k=>$v){
if(empty($v)){
$this->error(lang('empty_db',array('type'=>lang($k))));
}
}
$db_config['db_type']='mysql';
$db_config['db_pwd']=input('db_pwd');
$db_config['db_prefix'].='_';
$adminUser=array(
'user_name'=>input('user_name'),
'user_pwd'=>input('user_pwd'),
'user_repwd'=>input('user_repwd'),
'user_email'=>input('user_email')
);
if(empty($adminUser['user_name'])){
$this->error('请输入创始人用户名');
}
$check=User::right_username($adminUser['user_name']);
if(!$check['success']){
$this->error('创始人'.$check['msg']);
}
if(empty($adminUser['user_pwd'])){
$this->error('请输入创始人密码');
}
$check=User::right_pwd($adminUser['user_pwd']);
if(!$check['success']){
$this->error('创始人'.$check['msg']);
}
if($adminUser['user_pwd']!=$adminUser['user_repwd']){
$this->error('创始人密码不一致');
}
if(empty($adminUser['user_email'])){
$this->error('请输入创始人邮箱');
}
$check=User::right_email($adminUser['user_email']);
if(!$check['success']){
$this->error('创始人邮箱格式错误');
}
try {
$dbConfig=$this->_get_db_config($db_config);
$dbTables=Db::connect($dbConfig)->getTables();
}catch(\Exception $ex){
if(!empty($dbTables)){
$this->error($ex->getMessage());
}
}
$has_data = false;
/*
if (! empty ( $dbTables )) {
foreach ( $dbTables as $dbTable ) {
if (stripos ( $dbTable, $db_config ['db_prefix'] ) === 0) {
// 存在表
$has_data = true;
break;
}
}
}
*/
session('install_config',array('db'=>$db_config,'admin'=>$adminUser));
$this->success('',null,array('has_data'=>$has_data));
}else{
return $this->fetch();
}
}
/*执行数据安装*/
public function step3Action(){
echo $this->fetch();
$installConfig=session('install_config');
if(empty($installConfig)){
$this->error('请先安装数据','Install/index/step2');
}
$dbConfig=$installConfig['db'];
$installDataPath=config('app_path').'/install/data';
$sqlFile=$installDataPath.'/install_table';
if(!file_exists($sqlFile)){
$this->error('sql安装文件不存在');
}
$installSql=file_get_contents($sqlFile);
$installSql=preg_replace('/\s+`skycaiji_/i', ' `'.$dbConfig['db_prefix'], $installSql);
if(preg_match_all('/[\s\S]+?\;[\r\n]/',$installSql,$sqlList)){
$sqlList=$sqlList[0];
}else{
$this->error('没有sql安装语句');
}
$msgError=false;
try {
$this->_echo_msg('正在安装...');
$dbName=$dbConfig['db_name'];
unset($dbConfig['db_name']);
Config::set('database',$this->_get_db_config($dbConfig));
$dbConn=Db::connect();
$dbConn->execute('create database if not exists '.$dbName.' default character set utf8');
$dbConn->execute('use '.$dbName);
foreach($sqlList as $sql){
$dbConn->execute($sql);
$msg='';
if(preg_match('/^\s*create\s+table\s+`'.$dbConfig['db_prefix'].'(?P<table>[^\s]+?)`/i',$sql,$tableName)){
$msg=$dbConfig['db_prefix'].$tableName['table'].' 表创建成功!';
}
if($msg){
$this->_echo_msg($msg);
}
}
$createConfig=file_get_contents($installDataPath.'/config.php');
foreach ($installConfig['db'] as $k=>$v){
$createConfig=str_replace('{$'.strtoupper($k).'}', $v, $createConfig);
}
$createConfig=preg_replace('/\{\$db_([^\s]+?)\}/i', '', $createConfig);
if(empty($createConfig)){
$msgError='配置文件不能为空';
}else{
if(write_dir_file(config('root_path').'/data/config.php', $createConfig)===false){
$msgError='配置文件创建失败';
}else{
$this->_echo_msg('配置文件创建成功!');
$founderGid=$dbConn->table($dbConfig['db_prefix'].'usergroup')->where('founder',1)->value('id');
$userSalt=\skycaiji\admin\model\User::rand_salt();
$dbConn->table($dbConfig['db_prefix'].'user')->insert(array(
'username'=>$installConfig['admin']['user_name'],
'password'=>\skycaiji\admin\model\User::pwd_encrypt($installConfig['admin']['user_pwd'],$userSalt),
'salt'=>$userSalt,
'groupid'=>$founderGid,
'email'=>$installConfig['admin']['user_email'],
'regtime'=>time()
));
$this->_echo_msg('创始人账号'.$installConfig['admin']['user_name'].'添加成功!');
$upgradeDb=new UpgradeDb();
$upgradeResult=$upgradeDb->upgrade();
if(!$upgradeResult['success']){
$this->_echo_msg('数据库升级失败');
}
$this->_echo_msg('安装完成!');
write_dir_file(config('app_path').'/install/data/install.lock', '1');
$this->_echo_msg('<a href="'.url('Admin/Index/index').'" class="btn btn-lg btn-success">开始使用</a>');
}
}
}catch (\Exception $ex){
$this->error($ex->getMessage(),null,null,10);
}
if($msgError){
$this->error($msgError);
}
}
public function _echo_msg($msg){
echo '<script type="text/javascript">echo_msg("'.addslashes($msg).'");</script>';
ob_flush();
flush();
}
public function _get_db_config($config){
$dbConfig=array(
'type'=>$config['db_type'],
'hostname'=>$config['db_host'],
'hostport'=>$config['db_port'],
'database'=>$config['db_name'],
'password'=>$config['db_pwd'],
'username'=>$config['db_user'],
'prefix'=>$config['db_prefix'],
'params'=>[
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
\PDO::ATTR_EMULATE_PREPARES => true
]
);
return $dbConfig;
}
}