count(); // 查询当前页数据(分页) $list = TkSubjects::where('is_deleted', 0) ->order('sort ASC, level ASC, id ASC') ->field('id, name, code, parent_id, level, sort') ->page($page, $limit) ->select() ->toArray(); if (Request::isPost()) { // POST请求返回JSON - 分页数据 return json([ 'code' => 0, 'msg' => 'success', 'data' => $list, 'count' => $total ]); } else { // GET请求渲染视图,传递最大层级 // 这里需要获取全部数据以便计算最大层级 $allList = TkSubjects::where('is_deleted', 0) ->field('level') ->select() ->toArray(); $maxLevel = 0; if (!empty($allList)) { $maxLevel = max(array_column($allList, 'level')); } View::assign([ 'maxLevel' => $maxLevel // 传递最大层级给视图 ]); return View::fetch(); } } catch (\Exception $e) { return json([ 'code' => 1, 'msg' => '获取分类数据失败', 'data' => [], 'count' => 0, 'error' => $e->getMessage() ]); } } //递归构建树形结构 private function buildTree($item, $list) { $item['children'] = []; foreach ($list as $child) { if ($child['parent_id'] == $item['id']) { // 添加层级关系标识 $child['isLeaf'] = ($child['level'] == max(array_column($list, 'level'))); $item['children'][] = $this->buildTree($child, $list); } } return $item; } //题目分类增加 public function categoryadd() { if (Request::isPost()) { $name = trim(input('post.name', '')); $level = trim(input('post.level', '')); if (empty($name)) { return json(['code' => 1, 'msg' => '分类名称不能为空']); } // 检查是否已存在同名分类 $exists = TkSubjects::where('name', $name) ->where('is_deleted', null) ->find(); if ($exists) { return json(['code' => 1, 'msg' => '该分类名称已存在']); } $data = [ 'name' => $name, 'level' => $level, 'status' => 1, 'create_time' => time() ]; $res = TkSubjects::create($data); if ($res) { return json(['code' => 0, 'msg' => '新增成功']); } else { return json(['code' => 1, 'msg' => '新增失败']); } } else { // GET请求渲染新增分类页面(如有需要) return View::fetch(); } } //题目管理列表 public function topiclist() { if (Request::isPost()) { $params = [ 'category' => input('post.category'), 'name' => input('post.name'), 'uploader' => input('post.uploader') ]; $page = (int) input('post.page', 1); $limit = (int) input('post.limit', 10); $query = TkQuestions::where('delete_time', null) ->where('status', 1); // 分类筛选 if (!empty($params['category'])) { $cateInfo = TkSubjects::where('name', $params['category']) ->where('delete_time', null) ->where('status', 1) ->field('id') ->find(); if ($cateInfo) { $query = $query->where('cate', (int) $cateInfo['id']); } } // 名称搜索 if (!empty($params['name'])) { $query = $query->where('name', 'like', '%' . $params['name'] . '%'); } // 上传者搜索 if (!empty($params['uploader'])) { $query = $query->where('uploader', 'like', '%' . $params['uploader'] . '%'); } $count = $query->count(); $lists = $query->order('id DESC') ->page($page, $limit) ->select() ->each(function ($item) { // 获取分类信息 $cateInfo = TkSubjects::where('id', (int) $item['cate']) ->field('name, icon') ->find(); if ($cateInfo) { $item['cate'] = $cateInfo['name']; if (empty($item['icon']) && !empty($cateInfo['icon'])) { $item['icon'] = $cateInfo['icon']; } } $item['create_time'] = date('Y-m-d H:i:s', (int) $item['create_time']); return $item; }); return json([ 'code' => 0, 'msg' => '获取成功', 'count' => $count, 'data' => $lists ]); } else { $allCategories = TkSubjects::where('delete_time', null) ->where('status', 1) ->field('id, name, cid, icon') ->order('sort asc, id asc') ->select() ->toArray(); $categories = $this->buildParentChild($allCategories); View::assign([ 'categories' => $categories ]); return View::fetch(); } } // 构建父子结构 private function buildParentChild($lists) { $tree = []; foreach ($lists as $item) { if ($item['cid'] == 0) { // 顶级分类 $tree[] = $item; } else { // 子分类 foreach ($tree as &$parent) { if ($parent['id'] == $item['cid']) { if (!isset($parent['children'])) { $parent['children'] = []; } $parent['children'][] = $item; break; } } } } return $tree; } }