360 lines
10 KiB
PHP
360 lines
10 KiB
PHP
<?php
|
|
|
|
namespace app\admin\controller\famysql;
|
|
|
|
use app\common\controller\Backend;
|
|
use think\Db;
|
|
|
|
/**
|
|
* 索引管理
|
|
*/
|
|
class Index extends Backend
|
|
{
|
|
protected $noNeedRight = ['selectpage'];
|
|
|
|
/**
|
|
* 读取索引类型规则
|
|
* @return array
|
|
*/
|
|
protected $typeList = ['INDEX' => 'INDEX(普通)', 'UNIQUE' => 'UNIQUE(唯一)', 'FULLTEXT' => 'FULLTEXT(全文)'];
|
|
|
|
public function _initialize()
|
|
{
|
|
parent::_initialize();
|
|
if (!config("app_debug")) {
|
|
$this->error("数据库管理插件只允许在开发环境下使用");
|
|
}
|
|
if (!$this->auth->isSuperAdmin()) {
|
|
$this->error(__('Access is allowed only to the super management group'));
|
|
}
|
|
$this->view->assign("indexList", $this->typeList);
|
|
}
|
|
|
|
/**
|
|
* 索引首页
|
|
*/
|
|
public function indexs()
|
|
{
|
|
$name = $this->request->get('name');
|
|
$is_admin = (int) $this->request->get('is_admin');
|
|
$offset = $this->request->get("offset");
|
|
$limit = $this->request->get("limit");
|
|
if ($name == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'name'));
|
|
}
|
|
|
|
if ($this->request->isAjax()) {
|
|
$indexs = Db::query("SHOW INDEX FROM {$name}");
|
|
|
|
$lists = [];
|
|
$Key_names = [];
|
|
foreach ($indexs as $index) {
|
|
array_push($Key_names, $index['Key_name']);
|
|
$Key_names = array_unique($Key_names);
|
|
}
|
|
|
|
foreach ($Key_names as $key => $Key_name) {
|
|
$lists[$key] = $this->get_indexs($name, $Key_name, $is_admin);
|
|
}
|
|
|
|
$result = array("total" => count($lists), "rows" => array_slice($lists, $offset, $limit));
|
|
return json($result);
|
|
}
|
|
$this->view->assign("name", $name);
|
|
$this->view->assign("is_admin", $is_admin);
|
|
return $this->view->fetch();
|
|
}
|
|
|
|
/**
|
|
* 添加
|
|
*/
|
|
public function index_add()
|
|
{
|
|
$table = $this->request->get('table');
|
|
if ($table == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'table'));
|
|
}
|
|
|
|
if ($this->request->isPost()) {
|
|
$params = $this->request->post("row/a");
|
|
if ($params) {
|
|
$result = false;
|
|
$sql = "CREATE";
|
|
Db::startTrans();
|
|
try {
|
|
if ($params['non_unique'] !== 'INDEX') {
|
|
$sql .= " {$params['non_unique']}";
|
|
}
|
|
$sql .= " INDEX `{$params['name']}` ON `{$table}`";
|
|
$column_names = explode(',', $params['column_name']);
|
|
$sql .= " (";
|
|
foreach ($column_names as $column_name) {
|
|
$sql .= "`{$column_name}`,";
|
|
}
|
|
$sql = rtrim($sql, ',');
|
|
$sql .= ")";
|
|
$result = Db::execute($sql);
|
|
Db::commit();
|
|
|
|
} catch (\think\exception\PDOException $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
} catch (\think\Exception $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
}
|
|
if ($result !== false) {
|
|
$this->success();
|
|
} else {
|
|
$this->error(__('No rows were inserted'));
|
|
}
|
|
}
|
|
$this->error(__('Parameter %s can not be empty', ''));
|
|
}
|
|
|
|
$this->view->assign("table", $table);
|
|
return $this->view->fetch();
|
|
}
|
|
|
|
/**
|
|
* 编辑
|
|
*/
|
|
public function index_edit()
|
|
{
|
|
$table = $this->request->get('table');
|
|
if ($table == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'table'));
|
|
}
|
|
$name = $this->request->get('name');
|
|
if ($name == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'name'));
|
|
}
|
|
$row = $this->get_indexs($table, $name, 0);
|
|
|
|
if ($this->request->isPost()) {
|
|
$params = $this->request->post("row/a");
|
|
if ($params) {
|
|
$result = false;
|
|
$sql = "ALTER TABLE `{$table}` DROP INDEX `{$row['name']}`, ADD";
|
|
Db::startTrans();
|
|
try {
|
|
if ($params['non_unique'] !== 'INDEX') {
|
|
$sql .= " {$params['non_unique']}";
|
|
}
|
|
$sql .= " INDEX `{$params['name']}`";
|
|
$column_names = explode(',', $params['column_name']);
|
|
$sql .= "(";
|
|
foreach ($column_names as $column_name) {
|
|
$sql .= "`{$column_name}`,";
|
|
}
|
|
$sql = rtrim($sql, ',');
|
|
$sql .= ")";
|
|
$result = Db::execute($sql);
|
|
Db::commit();
|
|
} catch (\think\exception\PDOException $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
} catch (\think\Exception $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
}
|
|
if ($result !== false) {
|
|
$this->success();
|
|
} else {
|
|
$this->error(__('No rows were inserted'));
|
|
}
|
|
}
|
|
$this->error(__('Parameter %s can not be empty', ''));
|
|
}
|
|
|
|
$this->view->assign("row", $row);
|
|
$this->view->assign("table", $table);
|
|
return $this->view->fetch();
|
|
}
|
|
|
|
/**
|
|
* 删除
|
|
*/
|
|
public function index_del()
|
|
{
|
|
$table = $this->request->param("table");
|
|
if ($table == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'table'));
|
|
}
|
|
$name = $this->request->param("name");
|
|
if ($name == NULL) {
|
|
$this->error(__('Parameter %s can not be empty', 'name'));
|
|
}
|
|
|
|
$result = false;
|
|
try {
|
|
$sql = "ALTER TABLE `{$table}` DROP INDEX `{$name}`;";
|
|
$result = Db::execute($sql);
|
|
Db::commit();
|
|
} catch (\think\exception\PDOException $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
} catch (\think\Exception $e) {
|
|
Db::rollback();
|
|
$this->error($e->getMessage());
|
|
}
|
|
if ($result !== false) {
|
|
$this->success();
|
|
} else {
|
|
$this->error(__('No rows were deleted'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 查看
|
|
* @internal
|
|
*/
|
|
public function index()
|
|
{
|
|
$this->error('禁止访问');
|
|
}
|
|
|
|
/**
|
|
* 添加
|
|
* @internal
|
|
*/
|
|
public function add()
|
|
{
|
|
$this->error('禁止访问');
|
|
}
|
|
|
|
/**
|
|
* 编辑
|
|
* @param string $ids
|
|
* @internal
|
|
*/
|
|
public function edit($ids = null)
|
|
{
|
|
$this->error('禁止访问');
|
|
}
|
|
|
|
/**
|
|
* 删除
|
|
* @param string $ids
|
|
* @internal
|
|
*/
|
|
public function del($ids = null)
|
|
{
|
|
$this->error('禁止访问');
|
|
}
|
|
|
|
/**
|
|
* 批量更新
|
|
* @internal
|
|
* @param string $ids
|
|
* @return void
|
|
*/
|
|
public function multi($ids = null)
|
|
{
|
|
$this->error('禁止访问');
|
|
}
|
|
|
|
/**
|
|
* 字段列表
|
|
* @internal
|
|
*/
|
|
public function selectpage($type = '')
|
|
{
|
|
//当前页
|
|
$page = $this->request->request("pageNumber");
|
|
//分页大小
|
|
$pagesize = $this->request->request("pageSize");
|
|
|
|
$q_word = (array) $this->request->request("q_word/a");
|
|
|
|
$word = $q_word ? $q_word[0] : '';
|
|
|
|
$custom = (array) $this->request->request("custom/a");
|
|
$keyValue = $this->request->request('keyValue');
|
|
if (!$keyValue) {
|
|
if ($custom && is_array($custom)) {
|
|
$table = $custom['table'];
|
|
}
|
|
|
|
$fields = Db::getFields($table);
|
|
$lists = [];
|
|
foreach ($fields as $field => $fieldInfo) {
|
|
if (!in_array($field, ['id'])) {
|
|
$lists[] = $field;
|
|
}
|
|
}
|
|
|
|
foreach ($lists as $k => $v) {
|
|
$lists[$k] = ["column_name" => $v];
|
|
}
|
|
|
|
if (!empty($word)) {
|
|
$res_arr = [];
|
|
foreach ($lists as $list) {
|
|
$res_arr[] = $list['column_name'];
|
|
}
|
|
$res_arr = array_filter($res_arr, function ($v) use ($word) {
|
|
return stripos($v, $word) !== false;
|
|
});
|
|
$res_arrs = array_values($res_arr);
|
|
|
|
$lists_arr = [];
|
|
foreach ($res_arrs as $res) {
|
|
$lists_arr[] = [
|
|
'column_name' => $res,
|
|
];
|
|
}
|
|
$lists = $lists_arr;
|
|
}
|
|
|
|
} else {
|
|
$values = explode(',', $keyValue);
|
|
foreach ($values as $key => $value) {
|
|
$lists[$key] = ['column_name' => $value];
|
|
}
|
|
|
|
}
|
|
|
|
$result = array("total" => count($lists), "list" => array_slice($lists, ($page - 1) * $pagesize, $pagesize));
|
|
|
|
return json($result);
|
|
|
|
}
|
|
|
|
private function get_indexs($tableName, $keyName, $is_admin)
|
|
{
|
|
$indexs = Db::query("SHOW INDEX FROM {$tableName} WHERE Key_name = '{$keyName}'");
|
|
|
|
$lists = [];
|
|
foreach ($indexs as $key => $index) {
|
|
if ($index['Key_name'] == 'PRIMARY') {
|
|
$unique = 'PRIMARY';
|
|
} elseif (!$index['Non_unique']) {
|
|
$unique = 'UNIQUE';
|
|
} elseif ($index['Index_type'] == 'FULLTEXT') {
|
|
$unique = 'FULLTEXT';
|
|
} else {
|
|
$unique = 'INDEX';
|
|
}
|
|
$lists[$key]['name'] = $index['Key_name'];
|
|
$lists[$key]['column_name'] = $index['Column_name'];
|
|
$lists[$key]['non_unique'] = $unique;
|
|
}
|
|
|
|
$result['column_name'] = '';
|
|
|
|
foreach ($lists as $i => $list) {
|
|
$result['name'] = $index['Key_name'];
|
|
if (($i + 1) == count($lists)) {
|
|
$result['column_name'] .= $list['column_name'];
|
|
} else {
|
|
$result['column_name'] .= $list['column_name'] . ',';
|
|
}
|
|
$result['non_unique'] = $unique;
|
|
$result['is_admin'] = $is_admin;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|