diff --git a/README.md b/README.md index dee8da3..3663e55 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,14 @@ location / { ## 五、技术支持 - QQ:357099073 + +## 六、数据表结构 +1. 题目表(questions) +2. 选择题选项表(question_options) +3. 科目表(subjects) +4. 知识点表(knowledge_points) +5. 题目标签表(question_tags) +6. 题目标签关联表(question_tag_relations) +7. 题目附件表(question_attachments) +8. 题目使用记录表(question_usage_records) +9. 题目统计表(question_statistics) \ No newline at end of file diff --git a/app/admin/controller/TkController.php b/app/admin/controller/TkController.php new file mode 100644 index 0000000..3b6b056 --- /dev/null +++ b/app/admin/controller/TkController.php @@ -0,0 +1,253 @@ +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; + } + +} \ No newline at end of file diff --git a/app/admin/model/Tk/TkKnowledgePoints.php b/app/admin/model/Tk/TkKnowledgePoints.php new file mode 100644 index 0000000..cb0dbc7 --- /dev/null +++ b/app/admin/model/Tk/TkKnowledgePoints.php @@ -0,0 +1,30 @@ + +