253 lines
7.9 KiB
PHP
253 lines
7.9 KiB
PHP
<?php
|
||
/**
|
||
* 商业使用授权协议
|
||
*
|
||
* Copyright (c) 2025 [云泽网]. 保留所有权利.
|
||
*
|
||
* 本软件仅供评估使用。任何商业用途必须获得书面授权许可。
|
||
* 未经授权商业使用本软件属于侵权行为,将承担法律责任。
|
||
*
|
||
* 授权购买请联系: 357099073@qq.com
|
||
* 官方网站: https://www.yunzer.cn
|
||
*
|
||
* 评估用户须知:
|
||
* 1. 禁止移除版权声明
|
||
* 2. 禁止用于生产环境
|
||
* 3. 禁止转售或分发
|
||
*/
|
||
|
||
/**
|
||
* 后台管理系统-资源管理
|
||
*/
|
||
namespace app\admin\controller;
|
||
use app\admin\controller\BaseController;
|
||
use app\admin\model\Tk\TkKnowledgePoints;
|
||
use app\admin\model\Tk\TkQuestionAttachments;
|
||
use app\admin\model\Tk\TkQuestionOptions;
|
||
use app\admin\model\Tk\TkQuestions;
|
||
use app\admin\model\Tk\TkQuestionStatistics;
|
||
use app\admin\model\Tk\TkQuestionTagRelations;
|
||
use app\admin\model\Tk\TkQuestionTags;
|
||
use app\admin\model\Tk\TkQuestionUsageRecords;
|
||
use app\admin\model\Tk\TkSubjects;
|
||
use think\facade\View;
|
||
use think\facade\Request;
|
||
use think\facade\Db;
|
||
use app\admin\controller\LogController as Log;
|
||
use think\App;
|
||
|
||
class TkController extends BaseController
|
||
{
|
||
//题目分类管理
|
||
public function category()
|
||
{
|
||
try {
|
||
$page = input('post.page/d', 1); // 当前页码
|
||
$limit = input('post.limit/d', 10); // 每页条数
|
||
|
||
// 查询总数
|
||
$total = TkSubjects::where('is_deleted', 0)->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;
|
||
}
|
||
|
||
} |