251 lines
7.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use think\facade\Console;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Crud extends BaseController
{
public function index()
{
$prefix = config('database.connections.mysql.prefix');
//查询所有表信息
$table_info = Db::query('SHOW TABLE STATUS');
foreach ($table_info as $k=>&$val) {
$val['a'] = strpos($val['Comment'],'::crud');
if(strpos($val['Comment'],'::crud') == false){
unset($table_info[$k]);
continue;
}
$val['title'] = str_replace($prefix,'',$val['Name']);
$val['crud'] = $this->check($val['title']);
$val['Comment'] = str_replace('::crud','',$val['Comment']);
}
View::assign('prefix',$prefix);
View::assign('table_info',$table_info);
return view();
}
public function check($table,$type='c',$path='admin')
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
if($type == 'c'){
$table = ucfirst(camelize($table));
$filePath = 'app'. DS . $path . DS . 'controller' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'controller' . DS . $table . '.php';
}
if($type == 'm'){
$table = ucfirst(camelize($table));
$filePath = 'app'. DS . $path . DS . 'model' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'model' . DS . $table . '.php';
}
if($type == 'v'){
$table = ucfirst(camelize($table)) . 'Validate';
$filePath = 'app'. DS . $path . DS . 'validate' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'validate' . DS . $table . '.php';
}
if($type == 'l'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'datalist.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'datalist.html';
}
if($type == 'a'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'add.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'add.html';
}
if($type == 'e'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'edit.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'edit.html';
}
if($type == 'r'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'read.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'read.html';
}
if (file_exists($realPath)) {
return $filePath;
}
else{
return 0;
}
}
//crud
public function table()
{
$param = get_params();
$prefix = config('database.connections.mysql.prefix');
//查询指定表信息
$table_info = Db::query('SHOW TABLE STATUS LIKE ' . "'" . $param['name'] . "'");
$detail = $table_info[0];
$detail['title'] = str_replace($prefix,'',$detail['Name']);
$detail['Comment'] = str_replace('::crud','',$detail['Comment']);
$table_columns = Db::query("SHOW FULL COLUMNS FROM " . $param['name']);
//var_dump($table_info);exit;
//var_dump($table_columns);exit;
$detail['c'] = $this->check($detail['title'], $type='c');
$detail['m'] = $this->check($detail['title'], $type='m');
$detail['v'] = $this->check($detail['title'], $type='v');
$detail['l'] = $this->check($detail['title'], $type='l');
$detail['a'] = $this->check($detail['title'], $type='a');
$detail['e'] = $this->check($detail['title'], $type='e');
$detail['r'] = $this->check($detail['title'], $type='r');
View::assign('detail', $detail);
View::assign('columns', $table_columns);
return view();
}
//一键crud
public function crud()
{
$uid = get_login_admin('id');
if($uid!=1){
return to_assign(1,'只有系统超级管理员才有权限使用一键crud功能');
}
$param = get_params();
set_cache('crud_v_'.$param['field'], $param['crud_v']);
set_cache('crud_a_'.$param['field'], $param['crud_a']);
set_cache('crud_e_'.$param['field'], $param['crud_e']);
set_cache('crud_r_'.$param['field'], $param['crud_r']);
set_cache('crud_l_'.$param['field'], $param['crud_l']);
$t = '-t'.$param['field'];
$c = '-c'.$param['field'];
$m = '-m'.$param['name'];
try {
$output = Console::call('crud', [$t,$c,$m]);
//return $output->fetch();
} catch(\Exception $e) {
clear_cache('crud_v_'.$param['field']);
clear_cache('crud_a_'.$param['field']);
clear_cache('crud_e_'.$param['field']);
clear_cache('crud_r_'.$param['field']);
clear_cache('crud_l_'.$param['field']);
return to_assign(1, $e->getMessage());
}
}
//一键生成菜单
public function menu($field='',$name='')
{
$uid = get_login_admin('id');
if($uid!=1){
return to_assign(1,'只有系统超级管理员才有权限使用一键生成菜单功能!');
}
if(empty($field) || empty($name)){
return to_assign(1,'参数错误!');
}
$rule = [
[
'title' => $name.'管理',
'name' => $name,
'src' => '',
'module' => '',
'crud' => $field,
'menu' => '1',
'icon' => 'bi-folder',
'son' => [
[
'title' => $name.'列表',
'name' => $name.'列表',
'src' => 'admin/'.$field.'/datalist',
'module' => '',
'crud' => $field,
'menu' => '1',
'icon' => '',
'son' => [
[
'title' => '新建',
'name' => $name,
'src' => 'admin/'.$field.'/add',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '编辑',
'name' => $name,
'src' => 'admin/'.$field.'/edit',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '查看',
'name' => $name,
'src' => 'admin/'.$field.'/read',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '删除',
'name' => $name,
'src' => 'admin/'.$field.'/del',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
]
]
]
]
]
];
//如果安装过该模块,删除原来的菜单信息
Db::name('AdminRule')->where('crud',$field)->delete();
$sort = Db::name('AdminRule')->where('pid',0)->max('sort');
$this->add_rule($rule,0,$sort+1);
//更新超级管理员的权限节点
$rules = Db::name('AdminRule')->column('id');
$admin_rules = implode(',',$rules);
$res = Db::name('AdminGroup')->strict(false)->where('id',1)->update(['rules'=>$admin_rules,'update_time'=>time()]);
if($res!==false){
// 删除后台节点缓存
clear_cache('adminRules');
return to_assign();
}
else{
return to_assign(1,'操作失败');
}
}
//递归插入菜单数据
protected function add_rule($data, $pid=0,$sort=0)
{
foreach($data as $k => $v)
{
$rule=[
'title' => $v['title'],
'name' => $v['name'],
'src' => $v['src'],
'module' => $v['module'],
'menu' => $v['menu'],
'icon' => $v['icon'],
'crud' => $v['crud'],
'pid' => $pid,
'sort' => $sort,
'create_time' => time()
];
$new_id = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($rule);
if(!empty($v['son'] && $new_id)){
$this->add_rule($v['son'],$new_id);
}
}
}
}