| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 | <?phpnamespace 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);                    if (Db::getPdo()->inTransaction() == true) {                        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);                    if (Db::getPdo()->inTransaction() == true) {                        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);            if (Db::getPdo()->inTransaction() == true) {                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;    }}
 |