You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
422 lines
12 KiB
422 lines
12 KiB
<?php |
|
/** |
|
* |
|
* Baseics.php |
|
* User: ChenLong |
|
* DateTime: 2020/3/9 12:37 |
|
*/ |
|
|
|
|
|
namespace sdModule\makeAdminBasics; |
|
|
|
|
|
use app\common\ResponseJson; |
|
use sdModule\makeAdminBasics\htmlUnit\FormCheckbox; |
|
use sdModule\makeAdminBasics\htmlUnit\FormDate; |
|
use sdModule\makeAdminBasics\htmlUnit\FormEditor; |
|
use sdModule\makeAdminBasics\htmlUnit\FormImage; |
|
use sdModule\makeAdminBasics\htmlUnit\FormMonth; |
|
use sdModule\makeAdminBasics\htmlUnit\FormRadio; |
|
use sdModule\makeAdminBasics\htmlUnit\FormRange; |
|
use sdModule\makeAdminBasics\htmlUnit\FormSelect; |
|
use sdModule\makeAdminBasics\htmlUnit\FormText; |
|
use sdModule\makeAdminBasics\htmlUnit\FormTextarea; |
|
use sdModule\makeAdminBasics\htmlUnit\FormTime; |
|
use sdModule\makeAdminBasics\htmlUnit\Js; |
|
use sdModule\makeAdminBasics\htmlUnit\JsFacade; |
|
|
|
class Basics |
|
{ |
|
/** |
|
* 缩进之前换行 |
|
*/ |
|
const BEFORE = 1; |
|
/** |
|
* 缩进之后换行 |
|
*/ |
|
const AFTER = 2; |
|
|
|
/** |
|
* 缩进 |
|
*/ |
|
const INDENT = ' '; |
|
|
|
/** |
|
* @return string|\think\response\Json |
|
* @throws \ReflectionException |
|
*/ |
|
public static function auxCall() |
|
{ |
|
$make = new self(); |
|
|
|
if (isset($_GET['table_name'])) { |
|
$tableFieldInfo = $make->getFieldInfo($_GET['table_name']); |
|
return ResponseJson::mixin($tableFieldInfo ?: '请确认表名,没有查到该表信息'); |
|
}elseif (isset($_GET['table'])) { |
|
return ResponseJson::success(); |
|
} |
|
|
|
if (!empty($_POST)) { |
|
return ResponseJson::mixin((new Make($_POST))->make()); |
|
} |
|
|
|
return $make->loadFromForm(); |
|
} |
|
|
|
|
|
/** |
|
* 加载辅助页面 |
|
* @return string |
|
*/ |
|
public function loadFromForm() |
|
{ |
|
$layuiDir = ConfigHelper::get('layui_dir'); |
|
$tableUrl = ConfigHelper::get('get_table_info_url'); |
|
$submitUrl = ConfigHelper::get('submit_url'); |
|
$makeItem = ConfigHelper::get('make_class'); |
|
|
|
$formModule = []; |
|
foreach ( ConfigHelper::get('form_module') as $key => $value){ |
|
$formModule[] = [ |
|
'value' => $key, |
|
'text' => $value[1] |
|
]; |
|
} |
|
|
|
include __DIR__ . '/src/formHtml.php'; |
|
return ''; |
|
} |
|
|
|
/** |
|
* 获取字段详情信息 |
|
* @param string $table 表名 |
|
* @param bool $isPrefix 是否包含表前缀 |
|
* @return mixed |
|
*/ |
|
public function getFieldInfo(string $table, bool $isPrefix = false) |
|
{ |
|
$table_info = $this->getTableInfo($table, $isPrefix); |
|
$d = array_map(function ($value) { |
|
$value = $this->formDefault($value); |
|
$value = $this->joinTable($value); |
|
$value = $this->labelHandle($value); |
|
$value = $this->showTypeHandle($value); |
|
return $value; |
|
}, $table_info); |
|
return $d; |
|
} |
|
|
|
/** |
|
* 获取表信息 |
|
* @param string $table |
|
* @param bool $isPrefix |
|
* @return mixed |
|
*/ |
|
public function getTableInfo(string $table, bool $isPrefix = false) |
|
{ |
|
$isPrefix or $table = ConfigHelper::get('database_prefix') . $table; |
|
$sql = "select |
|
`COLUMN_NAME` column_name, |
|
DATA_TYPE column_type, |
|
COLUMN_COMMENT column_comment,CHARACTER_MAXIMUM_LENGTH,column_default column_default |
|
from |
|
information_schema.columns |
|
where |
|
table_schema = :table_schema |
|
AND |
|
`table_name` = :table_names"; |
|
|
|
return $this->sqlExecute($sql, [ |
|
'table_names' => $table, |
|
'table_schema' => ConfigHelper::get('database_name') |
|
]); |
|
} |
|
|
|
/** |
|
* 执行 sql |
|
* @param string $sql |
|
* @param array $param |
|
* @return mixed |
|
*/ |
|
private function sqlExecute(string $sql, array $param) |
|
{ |
|
return ConfigHelper::get('database_connect')::query($sql, $param); |
|
} |
|
|
|
/** |
|
* 处理表格展示的类型 |
|
* @param $value |
|
* @return mixed |
|
*/ |
|
protected function showTypeHandle($value) |
|
{ |
|
if (in_array($value['form_type'], ['images', 'editor', 'textarea', 'password'])) { |
|
$value['show_type'] = ''; |
|
}elseif($value['form_type'] == 'image'){ |
|
$value['show_type'] = 'image'; |
|
}else{ |
|
$value['show_type'] = 'text'; |
|
} |
|
return $value; |
|
} |
|
|
|
/** |
|
* label 和选择值处理 |
|
* @param $value |
|
* @return mixed |
|
*/ |
|
protected function labelHandle($value) |
|
{ |
|
$comment = strtr($value['column_comment'], [':' => ':', ',' => ',']); |
|
$join = []; |
|
if (strpos($comment, ':') !== false) { |
|
$value['column_comment'] = substr($comment, 0, strpos($comment, ':')); |
|
$v = substr($comment, strpos($comment, ':') + 1); |
|
$arr = explode(',', $v); |
|
|
|
foreach ($arr as $item) { |
|
if (strpos($item, '=') !== false) { |
|
$join[] = $item; |
|
} else { |
|
$join[] = substr($item, 0, 1) . '=' .substr($item, 1); |
|
} |
|
} |
|
} |
|
|
|
$join and $value['join'] = $join; |
|
|
|
return $value; |
|
} |
|
|
|
|
|
|
|
/** |
|
* 默认表单类型 |
|
* @param $value |
|
* @return mixed |
|
*/ |
|
public function formDefault($value) |
|
{ |
|
$default = [ |
|
'char' => 'text', |
|
'varchar' => 'text', |
|
'datetime' => 'datetime', |
|
'date' => 'date', |
|
'text' => 'editor', |
|
'int' => 'text', |
|
'tinyint' => 'select', |
|
'string' => 'text' |
|
]; |
|
|
|
$except = ['id', 'delete_time', 'create_time', 'update_time']; |
|
|
|
if (in_array($value['column_name'] ,$except)){ |
|
$value['form_type'] = ''; |
|
return $value; |
|
} |
|
|
|
switch (true) { |
|
case strpos($value['column_name'], 'images') !== false: |
|
$value['form_type'] = 'images'; |
|
break; |
|
|
|
case strpos($value['column_name'], 'password') !== false: |
|
$value['form_type'] = 'password'; |
|
break; |
|
|
|
case strpos($value['column_name'], 'image') !== false |
|
|| strpos($value['column_name'], 'img') !== false |
|
|| strpos($value['column_name'], 'avatar') !== false |
|
|| strpos($value['column_name'], 'cover') !== false : |
|
$value['form_type'] = 'image'; |
|
break; |
|
|
|
case ($value['column_type'] == 'char' || $value['column_type'] == 'varchar') |
|
&& $value['CHARACTER_MAXIMUM_LENGTH'] > 255: |
|
$value['form_type'] = 'textarea'; |
|
break; |
|
|
|
case $value['column_type'] == 'tinyint' |
|
&& count(explode(',', strtr($value['column_comment'], [',' => ',']))) <= 3: |
|
$value['form_type'] = 'radio'; |
|
break; |
|
|
|
case isset($default[$value['column_type']]): |
|
$value['form_type'] = $default[$value['column_type']]; |
|
break; |
|
|
|
default: |
|
$value['form_type'] = ''; |
|
} |
|
|
|
return $value; |
|
} |
|
|
|
/** |
|
* 关联表处理 |
|
* @param $value |
|
* @return mixed |
|
*/ |
|
protected function joinTable($value) |
|
{ |
|
if (substr($value['column_name'], -3) !== '_id' && $value['column_name'] !== 'pid') return $value; |
|
|
|
$table = $value['column_name'] === 'pid' ? '' : substr($value['column_name'], 0, -3); |
|
|
|
$primary = $this->primary($table ?: $_GET['table_name']); |
|
$labelData = $this->getTableInfo($table ?: $_GET['table_name']); |
|
|
|
if (!$labelData) return $value; |
|
|
|
foreach ($labelData as $item) { |
|
if (in_array($item['column_type'], ['char', 'varchar'])) { |
|
$showField = $item['column_name']; |
|
break; |
|
} |
|
} |
|
|
|
|
|
$value['form_type'] = 'select'; |
|
$value['join'] = empty($showField) ? '' : "{$table}:{$primary}={$showField}"; |
|
|
|
return $value; |
|
} |
|
|
|
/** |
|
* 获取主键 |
|
* @param $table |
|
* @return mixed|string |
|
*/ |
|
private function primary($table) |
|
{ |
|
$sql = "SELECT |
|
k.column_name |
|
FROM |
|
information_schema.table_constraints t |
|
JOIN information_schema.key_column_usage k USING ( |
|
`constraint_name`, |
|
table_schema, |
|
`table_name` |
|
) |
|
WHERE |
|
t.constraint_type = 'PRIMARY KEY' |
|
AND t.table_schema = :schemas |
|
AND t.table_name = :tables; |
|
"; |
|
|
|
$result = $this->sqlExecute($sql, [ |
|
'schemas' => ConfigHelper::get('database_name'), |
|
'tables' => ConfigHelper::get('database_prefix') . $table |
|
]); |
|
|
|
if ($result && count($result) == 1) { |
|
return $result[0]['column_name']; |
|
} |
|
return ''; |
|
} |
|
|
|
/** |
|
* 获取表注释 |
|
* @param string $table |
|
* @param bool $isPrefix |
|
* @return mixed |
|
*/ |
|
public function getTableComment($table = '', $isPrefix = false) |
|
{ |
|
$sql = "SELECT TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = :table_names AND TABLE_SCHEMA = :schemas LIMIT 1"; |
|
|
|
$isPrefix or $table = ConfigHelper::get('database_prefix') . $table; |
|
|
|
$result = $this->sqlExecute($sql, [ |
|
'table_names' => $table, |
|
'schemas' => ConfigHelper::get('database_name') |
|
]); |
|
|
|
if ($result && !empty($result[0]) && is_array($result[0])) { |
|
return $result[0]['TABLE_COMMENT']; |
|
} |
|
return null; |
|
} |
|
|
|
|
|
/** |
|
* @param $var |
|
* @param bool $return |
|
* @return mixed|string|string[]|null|void |
|
*/ |
|
public static function varExport($var, $return = false) |
|
{ |
|
$export = var_export($var, true); |
|
$export = preg_replace("/^([ ]*)(.*)/m", '$1$1$2', $export); |
|
$array = preg_split("/\r\n|\n|\r/", $export); |
|
$array = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [null, ']$1', ' => ['], $array); |
|
$export = join(PHP_EOL, array_filter(["["] + $array)); |
|
if ((bool)$return) return $export; else echo $export; |
|
} |
|
|
|
/** |
|
* 缩进换行 |
|
* @param int $number 缩进次数 |
|
* @param null $lineFeed 换行位置,默认不换行,1 缩进之前换行,2 缩进之后换行 |
|
* @return string |
|
*/ |
|
public static function indentAndLineFeed($number, $lineFeed = null) |
|
{ |
|
$str = str_repeat(self::INDENT, $number); |
|
|
|
if ($lineFeed) |
|
return $lineFeed == self::BEFORE ? PHP_EOL . $str : $str . PHP_EOL; |
|
else |
|
return $str; |
|
} |
|
|
|
|
|
/** |
|
* 转数组合法代码 |
|
* @param array $array |
|
* @param int $indent |
|
* @param bool $notKey |
|
* @return string|void |
|
*/ |
|
public static function toLegalArrayCode(array $array, int $indent = 2, $notKey = false) |
|
{ |
|
if ($indent === 0 && !$notKey) { |
|
return self::toLegalArrayCodeNotLineFeed($array); |
|
} |
|
|
|
if ($notKey) { |
|
return self::toLegalArrayCodeLineFeedNotKey($array, $indent); |
|
} |
|
|
|
$code = '['; |
|
foreach ($array as $key => $value) { |
|
$value = preg_match('/^\|.+|\n+\|$/', $value) ? strtr($value, ['|' => '']) : "'{$value}'"; |
|
$code .= self::indentAndLineFeed($indent, self::BEFORE) . |
|
"'{$key}' => {$value},"; |
|
} |
|
|
|
return $code . self::indentAndLineFeed($indent - 1, self::BEFORE) . ']'; |
|
} |
|
|
|
/** |
|
* 数组合法的字符串代码 @不换行 |
|
* @param array $array |
|
* @return string |
|
*/ |
|
private static function toLegalArrayCodeNotLineFeed(array $array) |
|
{ |
|
return '[\'' . implode("','", $array) . '\']'; |
|
} |
|
|
|
/** |
|
* @param array $array |
|
* @param int $indent |
|
* @return string |
|
*/ |
|
private static function toLegalArrayCodeLineFeedNotKey(array $array, int $indent) |
|
{ |
|
$code = '[%s\'' . implode("'," . self::indentAndLineFeed($indent, self::BEFORE) . "'", $array) . '\'%1$s]'; |
|
return sprintf($code, self::indentAndLineFeed($indent - 1, self::BEFORE)); |
|
} |
|
} |
|
|
|
|