|
|
<?php
|
|
|
/**
|
|
|
* +----------------------------------------------------------------------
|
|
|
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
|
|
* +----------------------------------------------------------------------
|
|
|
* | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
|
|
|
* +----------------------------------------------------------------------
|
|
|
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
|
|
* +----------------------------------------------------------------------
|
|
|
* | Author: CRMEB Team <admin@crmeb.com>
|
|
|
* +----------------------------------------------------------------------
|
|
|
*/
|
|
|
|
|
|
namespace crmeb\services\crud;
|
|
|
|
|
|
use think\App;
|
|
|
use think\helper\Str;
|
|
|
|
|
|
/**
|
|
|
* 创建crud基类
|
|
|
* Class Make
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
* @package crmeb\services\crud
|
|
|
*/
|
|
|
abstract class Make
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
* 名称
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $name = '';
|
|
|
|
|
|
/**
|
|
|
* 文件类型
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $fileMime = 'php';
|
|
|
|
|
|
/**
|
|
|
* 文件全部路径
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $filePathName = null;
|
|
|
|
|
|
/**
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $fileBasePath;
|
|
|
|
|
|
/**
|
|
|
* 文件内容
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $content = '';
|
|
|
|
|
|
/**
|
|
|
* 实际文件存放
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $pathname = '';
|
|
|
|
|
|
/**
|
|
|
* 命名空间路径
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $usePath = '';
|
|
|
|
|
|
/**
|
|
|
* 变量名称
|
|
|
* @var array
|
|
|
*/
|
|
|
protected $var = [];
|
|
|
|
|
|
/**
|
|
|
* 内容
|
|
|
* @var array
|
|
|
*/
|
|
|
protected $value = [];
|
|
|
|
|
|
/**
|
|
|
* 参数
|
|
|
* @var array
|
|
|
*/
|
|
|
protected $options = [];
|
|
|
|
|
|
/**
|
|
|
* 数据库获取器后缀
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $attrPrefix = '_label';
|
|
|
|
|
|
/**
|
|
|
* 后台前端模板根路径
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $adminTemplatePath;
|
|
|
|
|
|
/**
|
|
|
* 默认保存路径
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $basePath;
|
|
|
|
|
|
/**
|
|
|
* 默认文件夹
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $baseDir;
|
|
|
|
|
|
/**
|
|
|
* @var
|
|
|
*/
|
|
|
protected $app;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Make constructor.
|
|
|
* @param App $app
|
|
|
*/
|
|
|
public function __construct(App $app)
|
|
|
{
|
|
|
$this->app = $app;
|
|
|
$this->adminTemplatePath = self::adminTemplatePath();
|
|
|
$this->basePath = $this->app->getRootPath();
|
|
|
$this->baseDir = $this->setBaseDir();
|
|
|
$this->var = $this->authDrawVar();
|
|
|
$this->value = $this->drawValueKeys();
|
|
|
$this->setDefaultValue();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置默认路径
|
|
|
* @param string $basePath
|
|
|
* @return $this
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function setbasePath(string $basePath)
|
|
|
{
|
|
|
if ($basePath) {
|
|
|
$this->basePath = $basePath;
|
|
|
}
|
|
|
return $this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取字段后缀
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/5/22
|
|
|
*/
|
|
|
public function getAttrPrefix()
|
|
|
{
|
|
|
return $this->attrPrefix;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/11
|
|
|
*/
|
|
|
public static function adminTemplatePath()
|
|
|
{
|
|
|
return config('app.admin_template_path');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置默认保存目录
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/4
|
|
|
*/
|
|
|
protected function setBaseDir(): string
|
|
|
{
|
|
|
return 'crud';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取保存文件的目录
|
|
|
* @param string $path
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/4
|
|
|
*/
|
|
|
protected function getBasePath(string $path = '')
|
|
|
{
|
|
|
//替换成本地路径格式
|
|
|
$path = str_replace('/', DS, $path);
|
|
|
$pathAttr = explode(DS, $path);
|
|
|
$basePathAttr = explode(DS, $this->baseDir);
|
|
|
//替换掉和基础目录相同的
|
|
|
if (count($pathAttr) > 1) {
|
|
|
$newsPath = array_merge(array_diff($basePathAttr, $pathAttr))[0] ?? '';
|
|
|
if ($newsPath !== 'crud') {
|
|
|
$path = $newsPath;
|
|
|
} else {
|
|
|
$this->baseDir = '';
|
|
|
}
|
|
|
}
|
|
|
//多个斜杠的替换成一个
|
|
|
$this->fileBasePath = str_replace(DS . DS, DS, $this->basePath . ($this->baseDir ? $this->baseDir . DS : '') . ($path ? $path . DS : ''));
|
|
|
|
|
|
return $this->fileBasePath;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置文件保存就路径名称
|
|
|
* @param string $filePathName
|
|
|
* @return $this
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/7
|
|
|
*/
|
|
|
public function setFilePathName(string $filePathName = '')
|
|
|
{
|
|
|
if ($filePathName) {
|
|
|
$this->filePathName = $filePathName;
|
|
|
}
|
|
|
return $this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 生成tab
|
|
|
* @param int $num
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/29
|
|
|
*/
|
|
|
public function tab(int $num = 1): string
|
|
|
{
|
|
|
return str_pad('', 4 * $num);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 执行创建
|
|
|
* @return Make
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
public function handle(string $name, array $options = [])
|
|
|
{
|
|
|
$path = $options['path'] ?? '';
|
|
|
[$nameData, $content] = $this->getStubContent($name);
|
|
|
|
|
|
$this->value['NAME'] = $nameData;
|
|
|
if (isset($this->value['NAME_CAMEL']) && !$this->value['NAME_CAMEL']) {
|
|
|
$this->value['NAME_CAMEL'] = Str::studly($name);
|
|
|
}
|
|
|
if (isset($this->value['PATH'])) {
|
|
|
$this->value['PATH'] = $this->getfolderPath($path);
|
|
|
}
|
|
|
if (isset($this->value['USE_PHP']) && !empty($options['usePath'])) {
|
|
|
$this->value['USE_PHP'] = "use " . str_replace('/', '\\', $options['usePath']) . ";\n";
|
|
|
}
|
|
|
if (isset($this->value['MODEL_NAME']) && !$this->value['MODEL_NAME'] && !empty($options['modelName'])) {
|
|
|
$this->value['MODEL_NAME'] = $options['modelName'];
|
|
|
}
|
|
|
|
|
|
$contentStr = str_replace($this->var, $this->value, $content);
|
|
|
$filePath = $this->getFilePathName($path, $this->value['NAME_CAMEL']);
|
|
|
|
|
|
$this->usePath = $this->baseDir . '\\' . $this->value['NAME_CAMEL'];
|
|
|
$this->setPathname($filePath);
|
|
|
$this->setContent($contentStr);
|
|
|
|
|
|
return $this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 模板文件配置
|
|
|
* @param string $type
|
|
|
* @return mixed
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
abstract protected function getStub(string $type = '');
|
|
|
|
|
|
/**
|
|
|
* 自动获取模板变量
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/29
|
|
|
*/
|
|
|
protected function authDrawVar(): array
|
|
|
{
|
|
|
$content = file_get_contents($this->getStub());
|
|
|
$pattern = '/\{\%+[a-zA-Z0-9_-]+\%\}/';
|
|
|
preg_match_all($pattern, $content, $var);
|
|
|
$varData = $var[0] ?? [];
|
|
|
$varData = array_unique($varData);
|
|
|
return $varData;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 提取value key
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/29
|
|
|
*/
|
|
|
protected function drawValueKeys(): array
|
|
|
{
|
|
|
$data = [];
|
|
|
foreach ($this->var as $value) {
|
|
|
$data[str_replace(['{%', '%}'], '', $value)] = '';
|
|
|
}
|
|
|
return $data;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置默认值
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function setDefaultValue()
|
|
|
{
|
|
|
if (isset($this->value['YEAR'])) {
|
|
|
$this->value['YEAR'] = date('Y');
|
|
|
}
|
|
|
if (isset($this->value['TIME'])) {
|
|
|
$this->value['TIME'] = date('Y/m/d H:i:s');
|
|
|
}
|
|
|
if (isset($this->value['DATE'])) {
|
|
|
$this->value['DATE'] = date('Y/m/d');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 提取模板文件
|
|
|
* @param string $name
|
|
|
* @return array
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getStubContent(string $name, string $type = '')
|
|
|
{
|
|
|
$stub = file_get_contents($this->getStub($type));
|
|
|
|
|
|
$namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
|
|
|
|
|
|
$class = str_replace($namespace . '\\', '', $name);
|
|
|
|
|
|
return [$class, $stub];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取文件路径
|
|
|
* @param string $path
|
|
|
* @param string $name
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getFilePathName(string $path, string $name): string
|
|
|
{
|
|
|
$path = ltrim(str_replace('\\', '/', $path), '/');
|
|
|
|
|
|
return $this->getBasePath($path) . $name . ucwords($this->name) . '.' . $this->fileMime;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param string $path
|
|
|
* @return mixed|string|null
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getfolderPath(string $path)
|
|
|
{
|
|
|
$path = $path ?: $this->filePathName;
|
|
|
$path = str_replace([$this->basePath, $this->baseDir], '', $path);
|
|
|
$path = ltrim(str_replace('\\', '/', $path), '/');
|
|
|
$pathArr = explode('/', $path);
|
|
|
array_pop($pathArr);
|
|
|
if ($pathArr) {
|
|
|
return '\\' . implode('\\', $pathArr);
|
|
|
} else {
|
|
|
return '';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取保存文件路径
|
|
|
* @param string $name
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getPathName(string $name): string
|
|
|
{
|
|
|
$name = str_replace('app\\', '', $name);
|
|
|
|
|
|
return $this->app->getBasePath() . ltrim(str_replace('\\', '/', $name), '/') . '.php';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取类名
|
|
|
* @param string $name
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getClassName(string $name): string
|
|
|
{
|
|
|
if (strpos($name, '\\') !== false) {
|
|
|
return $name;
|
|
|
}
|
|
|
|
|
|
if (strpos($name, '@')) {
|
|
|
[$app, $name] = explode('@', $name);
|
|
|
} else {
|
|
|
$app = '';
|
|
|
}
|
|
|
|
|
|
if (strpos($name, '/') !== false) {
|
|
|
$name = str_replace('/', '\\', $name);
|
|
|
}
|
|
|
|
|
|
return $this->getNamespace($app) . '\\' . $name;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取命名空间名
|
|
|
* @param string $app
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/3/13
|
|
|
*/
|
|
|
protected function getNamespace(string $app): string
|
|
|
{
|
|
|
return 'app' . ($app ? '\\' . $app : '');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置内容
|
|
|
* @param string $content
|
|
|
* @return array|string|string[]
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/14
|
|
|
*/
|
|
|
protected function setContent(string $content)
|
|
|
{
|
|
|
$this->content = str_replace('', '', $content);
|
|
|
return $this->content;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param string $pathname
|
|
|
* @return $this
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
protected function setPathname(string $pathname)
|
|
|
{
|
|
|
$this->pathname = $this->filePathName ?: $pathname;
|
|
|
return $this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param string $key
|
|
|
* @return mixed|null
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function getValue(string $key)
|
|
|
{
|
|
|
return $this->value[$key] ?? null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取命名空间路径
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function getUsePath()
|
|
|
{
|
|
|
return $this->usePath;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取内容
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function getContent()
|
|
|
{
|
|
|
return $this->content;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @return string
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function getPath()
|
|
|
{
|
|
|
return $this->pathname;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @return array
|
|
|
* @author 等风来
|
|
|
* @email 136327134@qq.com
|
|
|
* @date 2023/4/18
|
|
|
*/
|
|
|
public function toArray()
|
|
|
{
|
|
|
return [
|
|
|
'path' => $this->pathname,
|
|
|
'content' => $this->content,
|
|
|
'value' => $this->value,
|
|
|
'var' => $this->var,
|
|
|
'usePath' => $this->usePath,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
public function __destruct()
|
|
|
{
|
|
|
$this->content = '';
|
|
|
$this->pathname = '';
|
|
|
$this->usePath = '';
|
|
|
}
|
|
|
}
|
|
|
|