model = new MedalModel(); } 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', 'image', 'description', 'sort', 'status'], 'post'); try { validate(MedalValidate::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(MedalValidate::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('medal/index'); } 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) { $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()); } } } /** * 手动授予勋章(给指定用户发放) */ public function grant() { if (! ($this->request->isAjax() && $this->request->isPost())) { $this->result->error('请求方式错误', 405); } $uid = (int) $this->request->param('uid', 0); $medalId = (int) $this->request->param('medal_id', 0); if ($uid <= 0) { $this->result->error('请输入有效的用户ID'); } if ($medalId <= 0) { $this->result->error('请选择勋章'); } // 校验用户存在 $user = Db::name('member')->where('uid', $uid)->find(); if (! $user) { $this->result->error('用户不存在'); } [$ok, $msg] = MedalModel::grant($uid, $medalId); if ($ok) { $this->result->success([], $msg); } $this->result->error($msg); } }