提交 ad467460 编写于 作者: D devil_gong

安装程序优化,支持mysql5.0版本

上级 7d42d679
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2018 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\common;
use Exception;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ValidateException;
/**
* 异常处理
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class Http extends Handle
{
/**
* 异常处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-01-14
* @desc description
* @param Exception $e [错误对象]
*/
public function render(Exception $e)
{
// ajax请求处理
if(IS_AJAX)
{
// 参数验证错误
if($e instanceof ValidateException)
{
$msg = $e->getError();
$code = -422;
}
// 请求异常
if($e instanceof HttpException && request()->isAjax())
{
$msg = $e->getMessage();
$code = $e->getStatusCode();
}
if(!isset($code))
{
$code = -500;
}
if(empty($msg))
{
if(method_exists($e, 'getMessage'))
{
$msg = $e->getMessage();
} else {
$msg = '服务器错误';
}
}
exit(json_encode(DataReturn($msg, $code)));
// web错误交给系统处理
} else {
return parent::render($e);
}
}
}
?>
\ No newline at end of file
......@@ -22,6 +22,9 @@ use think\Db;
*/
class Index extends Common
{
// 编码类型
private $charset_type_list;
/**
* 构造方法
* @author Devil
......@@ -33,6 +36,20 @@ class Index extends Common
public function __construct()
{
parent::__construct();
// 编码类型
$this->charset_type_list = [
'utf8mb4' => [
'charset' => 'utf8mb4',
'collate' => 'utf8mb4_general_ci',
'version' => 5.6,
],
'utf8' => [
'charset' => 'utf8',
'collate' => 'utf8_general_ci',
'version' => 5.0,
],
];
}
/**
......@@ -94,6 +111,8 @@ class Index extends Common
{
$this->IsInstall();
new \base\Behavior(['msg'=>'数据信息填写']);
$this->assign('charset_type_list' , $this->charset_type_list);
return $this->fetch();
}
......@@ -160,7 +179,7 @@ class Index extends Common
}
// mysql版本
$ret = $this->IsVersion($db);
$ret = $this->IsVersion($db, $params['DB_CHARSET']);
if($ret['code'] != 0)
{
return $ret;
......@@ -169,7 +188,7 @@ class Index extends Common
// 检查数据表是否存在
if(!$this->IsDbExist($db, $params['DB_NAME']))
{
if($this->DbNameCreate($db, $params['DB_NAME']))
if($this->DbNameCreate($db, $params['DB_NAME'], $params['DB_CHARSET']))
{
$db = $this->DbObj($params, $params['DB_NAME']);
} else {
......@@ -241,7 +260,7 @@ return [
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8mb4',
'charset' => '{$this->charset_type_list[$params['DB_CHARSET']]['charset']}',
// 数据库表前缀
'prefix' => '{$params['DB_PREFIX']}',
// 数据库调试模式
......@@ -310,6 +329,14 @@ php;
//替换表前缀
$sql = str_replace("`s_", " `{$params['DB_PREFIX']}", $sql);
// 编码替换,utf8mb4则做替换操作
$charset = $this->charset_type_list[$params['DB_CHARSET']];
if($charset['charset'] != 'utf8mb4')
{
$sql = str_replace('CHARSET=utf8mb4', "CHARSET={$charset['charset']}", $sql);
$sql = str_replace('utf8mb4_general_ci', "{$charset['collate']}", $sql);
}
// 转为数组
$sql_all = preg_split("/;[\r\n]+/", $sql);
......@@ -348,9 +375,10 @@ php;
* @version 1.0.0
* @date 2018-12-28
* @desc description
* @param [object] $db [db对象]
* @param [object] $db [db对象]
* @param [string] $db_charset [数据库编码]
*/
private function IsVersion($db)
private function IsVersion($db, $db_charset)
{
$data = $db->query("select version() AS version");
if(empty($data[0]['version']))
......@@ -358,10 +386,12 @@ php;
new \base\Behavior(['msg'=>'查询数据库版本失败']);
return DataReturn('查询数据库版本失败', -1);
} else {
if($data[0]['version'] < 5.6)
$mysql_version = str_replace('-log', '', $data[0]['version']);
if($mysql_version < $this->charset_type_list[$db_charset]['version'])
{
new \base\Behavior(['msg'=>'数据库版本过低', 'mysql_version'=>$data[0]['version']]);
return DataReturn('数据库版本过低', -1);
$msg = '数据库版本过低、需要>='.$this->charset_type_list[$db_charset]['version'].'、当前'.$mysql_version;
new \base\Behavior(['msg'=>$msg, 'mysql_version'=>$mysql_version]);
return DataReturn($msg, -1);
}
}
return DataReturn('success', 0);
......@@ -374,12 +404,13 @@ php;
* @version 1.0.0
* @date 2018-12-28
* @desc description
* @param [object] $db [db对象]
* @param [string] $db_name [数据库名称]
* @param [object] $db [db对象]
* @param [string] $db_name [数据库名称]
* @param [string] $db_charset [数据库编码]
*/
private function DbNameCreate($db, $db_name)
private function DbNameCreate($db, $db_name, $db_charset)
{
$sql = "CREATE DATABASE {$db_name} DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci";
$sql = "CREATE DATABASE {$db_name} DEFAULT CHARSET {$this->charset_type_list[$db_charset]['charset']} COLLATE {$this->charset_type_list[$db_charset]['collate']}";
if($db->execute($sql) !== false)
{
return $this->IsDbExist($db, $db_name);
......@@ -460,6 +491,12 @@ php;
'key_name' => 'DB_TYPE',
'error_msg' => '请选择数据库类型',
],
[
'checked_type' => 'in',
'key_name' => 'DB_CHARSET',
'checked_data' => array_column($this->charset_type_list, 'charset'),
'error_msg' => '请选择数据编码',
],
[
'checked_type' => 'empty',
'key_name' => 'DB_HOST',
......
......@@ -8,8 +8,12 @@
<h2>数据库信息</h2>
<div class="am-alert am-alert-warning am-radius" data-am-alert>
<button type="button" class="am-close">&times;</button>
<p class="fs-12">MySQL需 5.6 及以上版本</p>
<p class="fs-12">编码格式为 utf8mb4 / utf8mb4_general_ci</p>
<p class="fs-12">温馨提示、建议采用utf8mb4</p>
{{if !empty($charset_type_list)}}
{{foreach $charset_type_list as $v}}
<p class="fs-12">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{$v.charset}}编码、MySQL版本需 {{$v.version}} 及以上版本 ({{$v.collate}})</p>
{{/foreach}}
{{/if}}
</div>
<form class="am-form am-form-horizontal form-validation" method="post" action="{{:MyUrl('install/index/add')}}" request-type="ajax-url" request-value="{{:MyUrl('install/index/successful')}}" timeout="60000">
<div class="am-form-group">
......@@ -19,6 +23,19 @@
</div>
</div>
<div class="am-form-group am-form-select">
<label class="am-u-sm-2 am-form-label">数据库编码</label>
<div class="am-u-sm-10">
<select class="am-input-sm am-radius chosen-select" name="DB_CHARSET" data-validation-message="请选择数据编码" required>
{{if !empty($charset_type_list)}}
{{foreach $charset_type_list as $v}}
<option value="{{$v.charset}}">{{$v.charset}} - {{$v.collate}} (mysql版本>={{$v.version}})</option>
{{/foreach}}
{{/if}}
</select>
</div>
</div>
<div class="am-form-group">
<label class="am-u-sm-2 am-form-label">数据库服务器</label>
<div class="am-u-sm-10">
......
......@@ -9,4 +9,9 @@
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/lib/jquery/jquery-2.1.0.js"></script>
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/lib/assets/js/amazeui.min.js"></script>
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/js/common.js"></script>
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/install/js/index.js"></script>
\ No newline at end of file
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/install/js/index.js"></script>
<!-- amazeui插件 -->
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/lib/amazeui-switch/amazeui.switch.min.js"></script>
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/lib/amazeui-chosen/amazeui.chosen.min.js"></script>
<script type='text/javascript' src="{{$Think.__MY_ROOT_PUBLIC__}}static/common/lib/amazeui-dialog/amazeui.dialog.min.js"></script>
\ No newline at end of file
......@@ -141,6 +141,6 @@ return [
// 显示错误信息
'show_error_msg' => false,
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => '',
'exception_handle' => '\\app\\common\\Http',
];
?>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册