* @Date: 2026-05-09 00:41:41 * @LastEditors: YwxApp * @LastEditTime: 2026-07-23 00:00:00 * @Description: 友情链接管理 * @FilePath: \ywxapp_dev\app\backend\controller\Links.php * @CustomString: Copyright (c) 2026 YwxApp */ declare(strict_types=1); namespace app\backend\controller; use think\Request; use think\facade\Db; use think\db\exception\DbException; use think\exception\ValidateException; use ywxapp\controller\BackendBase; use ywxapp\model\Links as LinksModel; use app\backend\validate\Links as LinksValidate; /** * 友情链接管理 * * @author ywxapp */ class Links extends BackendBase { protected $noNeedLogin = []; protected $noNeedVerify = []; protected function initialize() { $this->model = new LinksModel(); } /** * 列表 */ public function index() { $page = $this->request->param('page/d', 1); $limit = $this->request->param('limit/d', 15); $title = $this->request->param('title', ''); if ($this->request->isAjax()) { $query = $this->model->newQuery(); if ($title !== '') { $query->where('title', 'like', '%' . $title . '%'); } $list = $query->order('sort', 'desc') ->paginate(['page' => $page, 'list_rows' => $limit]); $this->result->setCount($list->total())->success($list->items()); } return $this->fetch(); } /** * 保存 */ public function save() { if (! $this->request->isPost()) { $this->result->error('请求方式错误', 405); } $params = $this->request->only( ['title', 'url', 'logo', 'description', 'sort', 'status'], 'post' ); try { validate(LinksValidate::class)->check($params); $this->model->create($params); $this->result->success('', '添加成功'); } catch (ValidateException $e) { $this->result->error($e->getMessage()); } catch (DbException $e) { $this->result->error('添加失败: ' . $e->getMessage(), 2); } } /** * 编辑(抽屉表单直接读取行数据,此接口可用于回显) */ public function edit($id = null) { $id = $id ?: $this->request->param('id'); $info = $this->model->find($id); if (! $info) { $this->result->error('友链不存在', 404); } $this->result->success(['info' => $info]); } /** * 更新 */ public function update() { if (! ($this->request->isAjax() && $this->request->isPut())) { $this->result->error('请求方式错误', 405); } $params = $this->request->param(); $id = $params['id'] ?? null; $info = $this->model->find($id); if (! $info) { $this->result->error('友链不存在', 404); } // 仅切换状态时不走完整校验(状态开关走此分支) $statusOnly = isset($params['status']) && count(array_diff(array_keys($params), ['id', 'status'])) === 0; if (! $statusOnly) { try { validate(LinksValidate::class)->check($params); } catch (ValidateException $e) { $this->result->error($e->getMessage()); } } $info->save($params); $this->result->success($info, '更新成功'); } /** * 回收站列表 */ public function recyclebin() { $page = $this->request->param('page/d', 1); $limit = $this->request->param('limit/d', 15); if ($this->request->isAjax()) { $list = $this->model->onlyTrashed() ->order('sort', 'desc') ->paginate(['page' => $page, 'list_rows' => $limit]); $this->result->setCount($list->total())->success($list->items()); } return $this->fetch('links/index'); } /** * 删除(软删除;force=1 物理删除) */ public function delete() { if ($this->request->isAjax() && $this->request->isDelete()) { $ids = $this->request->param('ids', ''); $force = $this->request->param('force', false); if (empty($ids)) { $this->result->error('请选择要删除的数据'); } $idsArray = array_filter(explode(',', $ids), 'is_numeric'); if (empty($idsArray)) { $this->result->error('参数错误'); } try { Db::transaction(function () use ($idsArray, $force) { if ($force) { $this->model->onlyTrashed() ->whereIn('id', $idsArray) ->select() ->each(function ($item) { $item->force()->delete(); }); } else { $this->model->destroy($idsArray); } }); $this->result->success(); } catch (\think\exception\HttpResponseException $e) { throw $e; } catch (\Exception $e) { \think\facade\Log::error('批量删除友链失败', [ 'exception' => $e->__toString(), 'ids' => $idsArray, ]); $this->result->error('删除失败: ' . ($e->getMessage() ?: $e->__toString()), 500); } } } /** * 从回收站恢复 */ public function restore($ids = '') { if ($this->request->isAjax() && $this->request->isPost()) { $ids = $this->request->param('ids', ''); if (empty($ids)) { $this->result->error('请选择要恢复的数据'); } $idsArray = array_filter(explode(',', $ids), 'is_numeric'); Db::startTrans(); try { $this->model->withTrashed() ->where('id', 'in', $idsArray) ->select() ->each(function ($item) { $item->restore(); }); Db::commit(); $this->result->success('恢复成功'); } catch (DbException $e) { Db::rollback(); $this->result->error('恢复失败: ' . $e->getMessage()); } } } }