* @return mixed * @throws \think\Exception * @throws \think\exception\DbException */ public function index($group = 'base') { cookie('__forward__', $_SERVER['REQUEST_URI']); // 配置分组信息 $list_group = config('config_group'); $tab_list = []; foreach ($list_group as $key => $value) { $tab_list[$key]['title'] = $value; $tab_list[$key]['url'] = url('index', ['group' => $key]); } // 查询 $map = $this->getMap(); $map[] = ['group', '=', $group]; $map[] = ['status', 'egt', 0]; // 排序 $order = $this->getOrder('sort asc,id asc'); // 数据列表 $data_list = ConfigModel::where($map)->order($order)->paginate(); // 使用ZBuilder快速创建数据表格 return ZBuilder::make('table') ->setPageTitle('配置管理') // 设置页面标题 ->setTabNav($tab_list, $group) // 设置tab分页 ->setSearch(['name' => '名称', 'title' => '标题']) // 设置搜索框 ->addColumns([ // 批量添加数据列 ['name', '名称', 'text.edit'], ['title', '标题', 'text.edit'], ['type', '类型', 'select', config('form_item_type')], ['status', '状态', 'switch'], ['sort', '排序', 'text.edit'], ['right_button', '操作', 'btn'] ]) ->addValidate('Config', 'name,title') // 添加快捷编辑的验证器 ->addOrder('name,title,status') // 添加标题字段排序 ->addFilter('name,title') // 添加标题字段筛选 ->addFilter('type', config('form_item_type')) // 添加标题字段筛选 ->addFilterMap('name,title', ['group' => $group]) // 添加标题字段筛选条件 ->addTopButton('add', ['href' => url('add', ['group' => $group])], true) // 添加单个顶部按钮 ->addTopButtons('enable,disable,delete') // 批量添加顶部按钮 ->addRightButton('edit', [], true) ->addRightButton('delete') // 批量添加右侧按钮 ->setRowList($data_list) // 设置表格数据 ->fetch(); // 渲染模板 } /** * 新增配置项 * @param string $group 分组 * @author 蔡伟明 <314013107@qq.com> * @return mixed * @throws \think\Exception */ public function add($group = '') { // 保存数据 if ($this->request->isPost()) { // 表单数据 $data = $this->request->post(); // 验证 $result = $this->validate($data, 'Config'); if(true !== $result) $this->error($result); // 如果是快速联动 if ($data['type'] == 'linkages') { $data['key'] = $data['key'] == '' ? 'id' : $data['key']; $data['pid'] = $data['pid'] == '' ? 'pid' : $data['pid']; $data['level'] = $data['level'] == '' ? '2' : $data['level']; $data['option'] = $data['option'] == '' ? 'name' : $data['option']; } if ($config = ConfigModel::create($data)) { cache('system_config', null); $forward = $this->request->param('_pop') == 1 ? null : cookie('__forward__'); // 记录行为 $details = '详情:分组('.$data['group'].')、类型('.$data['type'].')、标题('.$data['title'].')、名称('.$data['name'].')'; action_log('config_add', 'admin_config', $config['id'], UID, $details); $this->success('新增成功', $forward); } else { $this->error('新增失败'); } } // 使用ZBuilder快速创建表单 return ZBuilder::make('form') ->setPageTitle('新增') ->addRadio('group', '配置分组', '', config('config_group'), $group) ->addSelect('type', '配置类型', '', config('form_item_type')) ->addText('title', '配置标题', '一般由中文组成,仅用于显示') ->addText('name', '配置名称', '由英文字母和下划线组成,如 web_site_title,调用方法:config(\'web_site_title\')') ->addTextarea('value', '配置值', '该配置的具体内容') ->addTextarea('options', '配置项', '用于单选、多选、下拉、联动等类型') ->addText('ajax_url', '异步请求地址', "如请求的地址是 url('ajax/getCity'),那么只需填写 ajax/getCity,或者直接填写以 http开头的url地址") ->addText('next_items', '下一级联动下拉框的表单名', "与当前有关联的下级联动下拉框名,多个用逗号隔开,如:area,other") ->addText('param', '请求参数名', "联动下拉框请求参数名,默认为配置名称") ->addNumber('level', '级别', '需要显示的级别数量,默认为2', 2, 2, 4) ->addText('table', '表名', '要查询的表,里面必须含有id、name、pid三个字段,其中id和name字段可在下面重新定义') ->addText('pid', '父级id字段名', '即表中的父级ID字段名,如果表中的主键字段名为pid则可不填写') ->addText('key', '键字段名', '即表中的主键字段名,如果表中的主键字段名为id则可不填写') ->addText('option', '值字段名', '下拉菜单显示的字段名,如果表中的该字段名为name则可不填写') ->addText('ak', 'APPKEY', '百度编辑器APPKEY') ->addText('format', '格式') ->addText('tips', '配置说明', '该配置的具体说明') ->addText('sort', '排序', '', 100) ->setTrigger('type', 'linkage', 'ajax_url,next_items,param') ->setTrigger('type', 'linkages', 'table,pid,level,key,option') ->setTrigger('type', 'bmap', 'ak') ->setTrigger('type', 'masked,date,time,datetime', 'format') ->fetch(); } /** * 编辑 * @param int $id * @author 蔡伟明 <314013107@qq.com> * @return mixed * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function edit($id = 0) { if ($id === 0) $this->error('参数错误'); // 保存数据 if ($this->request->isPost()) { // 表单数据 $data = $this->request->post(); // 验证 $result = $this->validate($data, 'Config'); if(true !== $result) $this->error($result); // 如果是快速联动 if ($data['type'] == 'linkages') { $data['key'] = $data['key'] == '' ? 'id' : $data['key']; $data['pid'] = $data['pid'] == '' ? 'pid' : $data['pid']; $data['level'] = $data['level'] == '' ? '2' : $data['level']; $data['option'] = $data['option'] == '' ? 'name' : $data['option']; } // 原配置内容 $config = ConfigModel::where('id', $id)->find(); $details = '原数据:分组('.$config['group'].')、类型('.$config['type'].')、标题('.$config['title'].')、名称('.$config['name'].')'; if ($config = ConfigModel::update($data)) { cache('system_config', null); $forward = $this->request->param('_pop') == 1 ? null : cookie('__forward__'); // 记录行为 action_log('config_edit', 'admin_config', $config['id'], UID, $details); $this->success('编辑成功', $forward, '_parent_reload'); } else { $this->error('编辑失败'); } } // 获取数据 $info = ConfigModel::get($id); // 使用ZBuilder快速创建表单 return ZBuilder::make('form') ->setPageTitle('编辑') ->addHidden('id') ->addRadio('group', '配置分组', '', config('config_group')) ->addSelect('type', '配置类型', '', config('form_item_type')) ->addText('title', '配置标题', '一般由中文组成,仅用于显示') ->addText('name', '配置名称', '由英文字母和下划线组成,如 web_site_title,调用方法:config(\'web_site_title\')') ->addTextarea('value', '配置值', '该配置的具体内容') ->addTextarea('options', '配置项', '用于单选、多选、下拉、联动等类型') ->addText('ajax_url', '异步请求地址', "如请求的地址是 url('ajax/getCity'),那么只需填写 ajax/getCity,或者直接填写以 http开头的url地址") ->addText('next_items', '下一级联动下拉框的表单名', "与当前有关联的下级联动下拉框名,多个用逗号隔开,如:area,other") ->addText('param', '请求参数名', "联动下拉框请求参数名,默认为配置名称") ->addNumber('level', '级别', '需要显示的级别数量,默认为2', 2, 2, 4) ->addText('table', '表名', '要查询的表,里面必须含有id、name、pid三个字段,其中id和name字段可在下面重新定义') ->addText('pid', '父级id字段名', '即表中的父级ID字段名,如果表中的主键字段名为pid则可不填写') ->addText('key', '键字段名', '即表中的主键字段名,如果表中的主键字段名为id则可不填写') ->addText('option', '值字段名', '下拉菜单显示的字段名,如果表中的该字段名为name则可不填写') ->addText('ak', 'APPKEY', '百度编辑器APPKEY') ->addText('format', '格式') ->addText('tips', '配置说明', '该配置的具体说明') ->addText('sort', '排序', '', 100) ->setTrigger('type', 'linkage', 'ajax_url,next_items,param') ->setTrigger('type', 'linkages', 'table,pid,level,key,option') ->setTrigger('type', 'bmap', 'ak') ->setTrigger('type', 'masked,date,time,datetime', 'format') ->setFormData($info) ->fetch(); } /** * 删除配置 * @param array $record 行为日志 * @author 蔡伟明 <314013107@qq.com> * @throws \think\Exception * @throws \think\exception\PDOException */ public function delete($record = []) { return $this->setStatus('delete'); } /** * 启用配置 * @param array $record 行为日志 * @author 蔡伟明 <314013107@qq.com> * @throws \think\Exception * @throws \think\exception\PDOException */ public function enable($record = []) { return $this->setStatus('enable'); } /** * 禁用配置 * @param array $record 行为日志 * @author 蔡伟明 <314013107@qq.com> * @throws \think\Exception * @throws \think\exception\PDOException */ public function disable($record = []) { return $this->setStatus('disable'); } /** * 设置配置状态:删除、禁用、启用 * @param string $type 类型:delete/enable/disable * @param array $record * @author 蔡伟明 <314013107@qq.com> * @throws \think\Exception * @throws \think\exception\PDOException */ public function setStatus($type = '', $record = []) { $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids'); $uid_delete = is_array($ids) ? '' : $ids; $ids = ConfigModel::where('id', 'in', $ids)->column('title'); return parent::setStatus($type, ['config_'.$type, 'admin_config', $uid_delete, UID, implode('、', $ids)]); } /** * 快速编辑 * @param array $record 行为日志 * @author 蔡伟明 <314013107@qq.com> * @return mixed */ public function quickEdit($record = []) { $id = input('post.pk', ''); $field = input('post.name', ''); $value = input('post.value', ''); $config = ConfigModel::where('id', $id)->value($field); $details = '字段(' . $field . '),原值(' . $config . '),新值:(' . $value . ')'; return parent::quickEdit(['config_edit', 'admin_config', $id, UID, $details]); } }