From 76ef8887e8448924e1c9a55933402951d4789aa3 Mon Sep 17 00:00:00 2001 From: tensent Date: Tue, 14 Apr 2020 14:45:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E8=A3=85=E7=A8=8B=E5=BA=8F=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .example.env | 2 +- public/index.php | 8 +- public/install.php | 703 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 711 insertions(+), 2 deletions(-) create mode 100644 public/install.php diff --git a/.example.env b/.example.env index b5827018..80d67f4e 100755 --- a/.example.env +++ b/.example.env @@ -1 +1 @@ -APP_DEBUG = true rootuid = 1 [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = test USERNAME = username PASSWORD = password HOSTPORT = 3306 CHARSET = utf8 PREFIX = sent_ DEBUG = true [LANG] default_lang = zh-cn [JWT] SECRET=4b3577984b4e6706837e0004362113ca \ No newline at end of file +APP_DEBUG = true rootuid = 1 [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = {type} HOSTNAME = {hostname} DATABASE = {database} USERNAME = {username} PASSWORD = {password} HOSTPORT = {hostport} CHARSET = utf8 PREFIX = {prefix} DEBUG = true [LANG] default_lang = zh-cn [JWT] SECRET={secret} \ No newline at end of file diff --git a/public/index.php b/public/index.php index e3c0fe90..badb14ec 100755 --- a/public/index.php +++ b/public/index.php @@ -14,8 +14,14 @@ namespace think; require __DIR__ . '/../vendor/autoload.php'; +$app = new App(); + +if (!is_file($app->getRootPath() . '.env') || !is_file($app->getRootPath() . 'install.lock')) { + header('Location: install.php');exit(); +} + // 执行HTTP应用并响应 -$http = (new App())->http; +$http = $app->http; $response = $http->run(); diff --git a/public/install.php b/public/install.php new file mode 100644 index 00000000..fd031556 --- /dev/null +++ b/public/install.php @@ -0,0 +1,703 @@ + +// +---------------------------------------------------------------------- +namespace think; + +use think\facade\Db; + +session_start(); +require __DIR__ . '/../vendor/autoload.php'; + +$app = new App(); + +if (is_file($app->getRootPath() . '.env') && is_file($app->getRootPath() . 'install.lock')) { + header('Location: index.php');exit(); +} + +define('ROOT_PATH', $app->getRootPath()); +$status = [ + 'index' => 'info', + 'check' => 'info', + 'config' => 'info', + 'sql' => 'info', + 'complete' => 'info', +]; + +$action = $app->request->param('action', 'index'); + +$title = ""; +if ($action == 'index') { + $title = "系统安装"; +}elseif ($action == 'check') { + session('step_check', false); + //环境检测 + $env = check_env(); + $dirfile = check_dirfile(); + //函数检测 + $func = check_func(); + + if (!session('error')) { + session('step_check', true); + } + + $title = "环境检查"; +}elseif ($action == 'config') { + if ($app->request->isAjax()) { + $data = $app->request->param(); + $info = file_get_contents(ROOT_PATH . '.example.env'); + $dbc = true; + foreach ($data['database'] as $key => $value) { + if ($value == '') { + $dbc = false; + } + $info = str_replace("{".$key."}", $value, $info); + } + foreach ($data['admin'] as $key => $value) { + if ($value == '') { + $dbc = false; + } + } + if (!$dbc) { + echo json_encode(['code'=>0,'msg'=>'请填写完系统配置信息!']);exit(); + } + $info = str_replace("{secret}", \xin\helper\Str::random(32), $info); + file_put_contents(ROOT_PATH . '.env', $info); + session('database_info', $data['database']); + session('admin_info', $data['admin']); + + try { + $dsn = "mysql:host=".$data['database']['hostname'].";dbname=".$data['database']['database']; + $con = new \PDO($dsn, $data['database']['username'], $data['database']['password']); + + session('step_config', true); + $data = ['code' => 1]; + echo json_encode($data);exit(); + } catch (\PDOException $e) { + session('step_config', false); + $data = ['code' => 0, 'msg' => $e->getMessage()]; + echo json_encode($data);exit(); + } + }else{ + if (!session('step_check')) { + echo "";exit(); + } + + $title = "系统配置"; + } +}elseif ($action == 'database') { + if (!session('database_info') || !session('admin_info') || !session('step_config')) { + echo "";exit(); + } + $title = "数据库安装"; +}elseif ($action == 'complete') { + if (!session('step_database')) { + echo "";exit(); + } + file_put_contents(ROOT_PATH . "install.lock", "ok"); + $title = "安装完成"; +} + +?> + + + + +SentCMS系统安装 + + + + + + + + + + + + +
+
+ +
+
+
+ +
+

 

+ +
+ + +
+
+
+ +
+
+
+
+

+
+
+ +
+
+

SentCMS网站管理系统 安装协议

+ +
版权所有 (c) 2014-2015,南昌腾速科技有限公司保留所有权利。
+
+
+

+ SentCMS网站管理系统基于 + ThinkPHP框架 + 的开发产品。感谢顶想公司为SentCMS网站管理系统提供内核支持。 +

+

+ 感谢您选择SentCMS网站管理系统,希望我们的努力可以为您创造价值。公司网址为 + https://www.tensent.cn + ,产品官方网站网址为 + http://www.sentcms.com + 。 +

+

+ 用户须知:本协议是您于南昌腾速科技有限公司关于SentCMS网站管理系统产品使用的法律协议。无论您是个人或组织、盈利与否、用途如何(包括以学习和研究为目的),均需仔细阅读本协议,包括免除或者限制南昌腾速科技有限公司责任的免责条款及对您的权利限制。请您审阅并接受或不接受本服务条款。如您不同意本服务条款及或南昌腾速科技有限公司随时对其的修改,您应不使用或主动取消SentCMS网站管理系统产品。否则,您的任何对SentCMS网站管理系统的相关服务的注册、登陆、下载、查看等使用行为将被视为您对本服务条款全部的完全接受,包括接受南昌腾速科技有限公司对服务条款随时所做的任何修改。 +

+

+ 本服务条款一旦发生变更,南昌腾速科技有限公司将在产品官网上公布修改内容。修改后的服务条款一旦在网站公布即有效代替原来的服务条款。您可随时登陆官网查阅最新版服务条款。如果您选择接受本条款,即表示您同意接受协议各项条件的约束。如果您不同意本服务条款,则不能获得使用本服务的权利。您若有违反本条款规定,南昌腾速科技有限公司有权随时中止或终止您对SentCMS网站管理系统产品的使用资格并保留追究相关法律责任的权利。 +

+

+ 在理解、同意、并遵守本协议的全部条款后,方可开始使用SentCMS网站管理系统产品。您也可能与南昌腾速科技有限公司直接签订另一书面协议,以补充或者取代本协议的全部或者任何部分。 +

+

+ 南昌腾速科技有限公司拥有SentCMS网站管理系统的知识产权,包括商标和著作权。本软件只供许可协议,并非出售。想天只允许您在遵守本协议各项条款的情况下复制、下载、安装、使用或者以其他方式受益于本软件的功能或者知识产权。 +

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +

运行环境检查

项目所需配置当前配置
 
+ + + + + + + + + + + + + + + + + + +

目录、文件权限检查

目录/文件所需状态当前状态
 可写 
+ + + + + + + + + + + + + + + + +

函数依赖性检查

函数名称检查结果
() 
+ +
+ +
+ + + +
+ 数据库配置 +
+
+ +
+ +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ 管理员配合 +
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+ +
+ + (数据库名称不能为空) +
+
+
+
+ + +
+
+
+ + +

安装数据库

+
+
+
+ +
+ location.href = "install.php?action=complete";'; + } + ?> + +

完成

+ + + + +
+
+ +
+
+
+ +
+
+
+ + + array('操作系统', '不限制', '类Unix', PHP_OS, 'success'), + 'php' => array('PHP版本', '7.1.0', '7.1+', PHP_VERSION, 'success'), + 'upload' => array('附件上传', '不限制', '2M+', '未知', 'success'), + 'gd' => array('GD库', '2.0', '2.0+', '未知', 'success'), + 'disk' => array('磁盘空间', '20M', '不限制', '未知', 'success'), + ); + + //PHP环境检测 + if($items['php'][3] < $items['php'][1]){ + $items['php'][4] = 'error'; + session('error', true); + } + + //附件上传检测 + if(@ini_get('file_uploads')) + $items['upload'][3] = ini_get('upload_max_filesize'); + + //GD库检测 + $tmp = function_exists('gd_info') ? gd_info() : array(); + if(empty($tmp['GD Version'])){ + $items['gd'][3] = '未安装'; + $items['gd'][4] = 'error'; + session('error', true); + } else { + $items['gd'][3] = $tmp['GD Version']; + } + unset($tmp); + + //磁盘空间检测 + if(function_exists('disk_free_space')) { + $items['disk'][3] = floor(disk_free_space(ROOT_PATH) / (1024*1024)).'M'; + } + + return $items; +} + +/** + * 目录,文件读写检测 + * @return array 检测数据 + */ +function check_dirfile(){ + $items = array( + array('dir', '可写', 'success', 'uploads/file/'), + array('dir', '可写', 'success', 'uploads/image/'), + array('dir', '可写', 'success', 'uploads/media/'), + ); + + foreach ($items as &$val) { + $item = ROOT_PATH . 'public' . DIRECTORY_SEPARATOR . $val[3]; + if('dir' == $val[0]){ + if(!is_writable($item)) { + if(is_dir($item)) { + $val[1] = '可读'; + $val[2] = 'error'; + session('error', true); + } else { + $val[1] = '不存在'; + $val[2] = 'error'; + session('error', true); + } + } + } else { + if(file_exists($item)) { + if(!is_writable($item)) { + $val[1] = '不可写'; + $val[2] = 'error'; + session('error', true); + } + } else { + if(!is_writable(dirname($item))) { + $val[1] = '不存在'; + $val[2] = 'error'; + session('error', true); + } + } + } + } + + return $items; +} + +/** + * 函数检测 + * @return array 检测数据 + */ +function check_func(){ + $items = array( + array('pdo','支持','success','类'), + array('pdo_mysql','支持','success','模块'), + array('file_get_contents', '支持', 'success','函数'), + array('mb_strlen', '支持', 'success','函数'), + ); + + foreach ($items as &$val) { + if(('类'==$val[3] && !class_exists($val[0])) + || ('模块'==$val[3] && !extension_loaded($val[0])) + || ('函数'==$val[3] && !function_exists($val[0])) + ){ + $val[1] = '不支持'; + $val[2] = 'error'; + session('error', true); + } + } + + return $items; +} + +/** + * 创建数据表 + * @param resource $db 数据库连接资源 + */ +function create_tables($db, $prefix = ''){ + //读取SQL文件 + $sql = file_get_contents(ROOT_PATH . 'runtime' . DIRECTORY_SEPARATOR . 'sql' . DIRECTORY_SEPARATOR . 'install.sql'); + $sql = str_replace("\r", "\n", $sql); + $sql = explode(";\n", $sql); + + //替换表前缀 + $orginal = 'sent_'; + $sql = str_replace(" `{$orginal}", " `{$prefix}", $sql); + + //开始安装 + show_msg('开始安装数据库...'); + foreach ($sql as $value) { + $value = trim($value); + if(empty($value)) continue; + if(substr($value, 0, 12) == 'CREATE TABLE') { + $name = preg_replace("/^CREATE TABLE `(\w+)` .*/s", "\\1", $value); + $msg = "创建数据表{$name}"; + if(false !== $db->query($value)){ + show_msg($msg . '...成功'); + } else { + show_msg($msg . '...失败!', 'error'); + session('error', true); + } + } else { + $db->query($value); + } + + } +} + +function register_administrator($db, $prefix, $admin){ + show_msg('开始注册创始人帐号...'); + + $salt = \xin\helper\Str::random(4); + $password = md5($admin['password'].$salt); + + $sql = "INSERT INTO `[PREFIX]member` (`uid`,`username`,`password`,`nickname`,`email`, `sex`,`birthday`,`qq`,`score`,`salt`,`login`,`reg_ip`,`reg_time`,`last_login_ip`,`last_login_time`,`status`) VALUES ". + "('1', '[NAME]', '[PASS]', '[NAME]', '[EMAIL]', '0', '0000-00-00', '', '0','[SALT]', '1', '0', '[TIME]', '[IP]', '[TIME]', '1');"; + $sql = str_replace( + array('[PREFIX]', '[NAME]','[PASS]','[EMAIL]','[SALT]', '[TIME]', '[IP]'), + array($prefix, $admin['username'],$password, $admin['email'],$salt, time(), \xin\helper\Server::getRemoteIp()), + $sql); + $db->query($sql); + show_msg('创始人帐号注册完成!'); +} + +/** + * 更新数据表 + * @param resource $db 数据库连接资源 + * @author lyq <605415184@qq.com> + */ +function update_tables($db, $prefix = ''){ + //读取SQL文件 + $sql = file_get_contents(ROOT_PATH . 'data/update.sql'); + $sql = str_replace("\r", "\n", $sql); + $sql = explode(";\n", $sql); + + //替换表前缀 + $sql = str_replace(" `sent_", " `{$prefix}", $sql); + + //开始安装 + show_msg('开始升级数据库...'); + foreach ($sql as $value) { + $value = trim($value); + if(empty($value)) continue; + if(substr($value, 0, 12) == 'CREATE TABLE') { + $name = preg_replace("/^CREATE TABLE `(\w+)` .*/s", "\\1", $value); + $msg = "创建数据表{$name}"; + if(false !== $db->execute($value)){ + show_msg($msg . '...成功'); + } else { + show_msg($msg . '...失败!', 'error'); + session('error', true); + } + } else { + if(substr($value, 0, 8) == 'UPDATE `') { + $name = preg_replace("/^UPDATE `(\w+)` .*/s", "\\1", $value); + $msg = "更新数据表{$name}"; + } else if(substr($value, 0, 11) == 'ALTER TABLE'){ + $name = preg_replace("/^ALTER TABLE `(\w+)` .*/s", "\\1", $value); + $msg = "修改数据表{$name}"; + } else if(substr($value, 0, 11) == 'INSERT INTO'){ + $name = preg_replace("/^INSERT INTO `(\w+)` .*/s", "\\1", $value); + $msg = "写入数据表{$name}"; + } + if(($db->execute($value)) !== false){ + show_msg($msg . '...成功'); + } else{ + show_msg($msg . '...失败!', 'error'); + session('error', true); + } + } + } +} + +/** + * 及时显示提示信息 + * @param string $msg 提示信息 + */ +function show_msg($msg, $class = 'primary'){ + echo ""; + flush(); + ob_flush(); +} + +/** + * 生成系统AUTH_KEY + * @author 麦当苗儿 + */ +function build_auth_key(){ + $chars = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $chars .= '`~!@#$%^&*()_+-=[]{};:"|,.<>/?'; + $chars = str_shuffle($chars); + return substr($chars, 0, 40); +} + +function session($name, $value = false){ + if ($name == '') { + return false; + } + if ($value) { + $_SESSION[$name] = $value; + }else{ + return isset($_SESSION[$name]) ? $_SESSION[$name] : false; + } +} +?> \ No newline at end of file