where('delete_time', null) ->where('status', 1) ->select() ->toArray(); // 获取顶级分类信息 $category = null; if ($cateid > 0) { $category = ResourcesCategory::where('id', $cateid) ->where('delete_time', null) ->where('status', 1) ->find(); } // 获取所有子分类 $subCategories = []; if ($cateid > 0) { $subCategories = ResourcesCategory::where('cid', $cateid) ->where('delete_time', null) ->where('status', 1) ->select() ->toArray(); } // 获取所有子分类ID $subCategoryIds = array_column($subCategories, 'id'); if ($cateid > 0) { $subCategoryIds[] = $cateid; } // 构建资源查询条件 $where = [ ['delete_time', '=', null], ['status', '=', 1] ]; if (!empty($subCategoryIds)) { $where[] = ['cate', 'in', $subCategoryIds]; } // 查询资源 $programs = Resources::where($where) ->order('id DESC') ->page($page, $limit) ->select() ->toArray(); // 按子分类分组资源 $groupedPrograms = []; foreach ($subCategories as $subCategory) { $groupedPrograms[$subCategory['id']] = [ 'id' => $subCategory['id'], 'name' => $subCategory['name'], 'list' => [] ]; } // 将资源分配到对应的子分类 foreach ($programs as $program) { if (isset($groupedPrograms[$program['cate']])) { $groupedPrograms[$program['cate']]['list'][] = $program; } } // 获取总数 $total = Resources::where($where)->count(); // 准备返回数据 $data = [ 'cate' => [ 'id' => $cateid, 'name' => $category ? $category['name'] : '', 'desc' => $category ? $category['desc'] : '', 'image' => $category ? $category['image'] : '', 'subCategories' => array_values($groupedPrograms), 'total' => $total, 'page' => $page, 'limit' => $limit ] ]; // 根据请求方式返回不同的输出 if (request()->isPost()) { return json([ 'code' => 1, 'msg' => '获取成功', 'data' => $data ]); } else { // 为视图准备数据 $viewData = [ 'categories' => $categories, 'cate' => $data['cate'] ]; return view('index', $viewData); } } // 程序列表页 public function list() { // 获取分类ID $cateId = Request::param('cate/d', 0); // 构建查询条件 $where = [ ['a.delete_time', '=', null], ['a.status', '=', 1] ]; if ($cateId > 0) { $where[] = ['a.cate', '=', $cateId]; } // 获取程序列表 $programs = Resources::alias('a') ->join('resources_category c', 'a.cate = c.id') ->where($where) ->field([ 'a.*', 'IF(a.icon IS NULL OR a.icon = "", c.icon, a.icon) as icon' ]) ->order('a.id DESC') ->paginate([ 'list_rows' => 10, 'query' => Request::instance()->param() ]); // 获取分类信息 $category = null; if ($cateId > 0) { $category = ResourcesCategory::where('id', $cateId) ->where('delete_time', null) ->where('status', 1) ->find(); } // 获取所有分类 $categories = ResourcesCategory::where('delete_time', null) ->where('status', 1) ->select() ->toArray(); // 如果是POST请求,返回JSON数据 if (Request::isPost()) { return json([ 'code' => 1, 'msg' => '获取成功', 'data' => [ 'programs' => $programs->items(), 'total' => $programs->total(), 'current_page' => $programs->currentPage(), 'per_page' => $programs->listRows(), 'category' => $category ] ]); } // GET请求返回渲染的视图 View::assign([ 'programs' => $programs, 'category' => $category, 'categories' => $categories ]); return View::fetch('list'); } // 程序详情页 public function detail() { $id = Request::param('id/d', 0); $program = Resources::where('id', $id)->find(); if (!$program) { return json(['code' => 0, 'msg' => '程序不存在或已被删除']); } // 如果size没有,从附件表中获取 if (empty($program['size']) && !empty($program['fileurl'])) { $attachment = Attachments::where('src', $program['fileurl']) ->find(); if ($attachment && !empty($attachment['size'])) { $size = $attachment['size']; // 转换文件大小为合适的单位 if ($size >= 1073741824) { // 1GB = 1024MB = 1024*1024KB = 1024*1024*1024B $program['size'] = round($size / 1073741824, 2) . 'GB'; } elseif ($size >= 1048576) { // 1MB = 1024KB = 1024*1024B $program['size'] = round($size / 1048576, 2) . 'MB'; } else { $program['size'] = round($size / 1024, 2) . 'KB'; } } } // 如果size存在,确保转换为合适的单位 if (!empty($program['size']) && is_numeric($program['size'])) { $size = $program['size']; if ($size >= 1073741824) { $program['size'] = round($size / 1073741824, 2) . 'GB'; } elseif ($size >= 1048576) { $program['size'] = round($size / 1048576, 2) . 'MB'; } else { $program['size'] = round($size / 1024, 2) . 'KB'; } } // 获取分类名称 $cateName = ResourcesCategory::where('id', $program['cate']) ->value('name'); // 获取作者信息 $authorInfo = Users::where('name', $program['uploader'])->find(); if ($authorInfo) { // 统计作者的文章数 $articleCount = Articles::where('author', $program['uploader'])->count(); // 统计作者的资源数 $resourceCount = Resources::where('uploader', $program['uploader'])->count(); $authorData = [ 'avatar' => $authorInfo['avatar'] ?: '/static/images/avatar.png', 'name' => $authorInfo['name'], 'resource_count' => $resourceCount, 'article_count' => $articleCount ]; } else { $authorData = [ 'avatar' => '/static/images/avatar.png', 'name' => $program['uploader'], 'resource_count' => 0, 'article_count' => 0 ]; } // 获取上一个和下一个程序 $prevProgram = Resources::where('id', '<', $id) ->where('delete_time', null) ->where('status', 1) ->where('cate', $program['cate']) ->field(['id', 'title']) ->order('id DESC') ->find(); $nextProgram = Resources::where('id', '>', $id) ->where('delete_time', null) ->where('status', 1) ->where('cate', $program['cate']) ->field(['id', 'title']) ->order('id ASC') ->find(); // 获取相关程序(同分类的其他程序) $relatedPrograms = Resources::alias('p') ->join('yz_resources_category c', 'p.cate = c.id') ->where('p.cate', $program['cate']) ->where('p.id', '<>', $id) ->where('p.delete_time', null) ->where('p.status', 1) ->field([ 'p.id', 'p.title', 'COALESCE(p.icon, c.icon) as icon' ]) ->order('p.id DESC') ->limit(3) ->select() ->toArray(); // 如果是 AJAX 请求,返回 JSON 数据 if (Request::isAjax()) { return json([ 'code' => 1, 'msg' => '获取成功', 'data' => [ 'authorInfo' => $authorData, 'program' => $program, 'cateName' => $cateName, 'prevProgram' => $prevProgram, 'nextProgram' => $nextProgram, 'relatedPrograms' => $relatedPrograms ] ]); } // 非 AJAX 请求返回视图 View::assign([ 'authorInfo' => $authorData, 'program' => $program, 'cateName' => $cateName, 'prevProgram' => $prevProgram, 'nextProgram' => $nextProgram, 'relatedPrograms' => $relatedPrograms ]); return View::fetch('detail'); } // 程序下载 public function download() { $id = Request::param('id/d', 0); $program = Resources::where('id', $id) ->where('delete_time', null) ->where('status', 1) ->find(); if (!$program) { return json(['code' => 0, 'msg' => '程序不存在或已被删除']); } // 更新下载次数 Resources::where('id', $id)->inc('downloads')->update(); return json([ 'code' => 1, 'msg' => '获取成功', 'data' => [ 'fileurl' => $program['fileurl'] ] ]); } // 获取访问统计 public function viewStats() { $id = Request::param('id/d', 0); // 获取总访问量 $totalViews = Resources::where('id', $id) ->value('views'); return json([ 'code' => 1, 'data' => [ 'total' => $totalViews ] ]); } /** * 更新程序访问次数 */ public function updateViews() { if (!Request::isPost()) { return json(['code' => 0, 'msg' => '非法请求']); } $id = Request::post('id'); if (!$id) { return json(['code' => 0, 'msg' => '参数错误']); } try { // 更新访问次数 $program = Resources::where('id', $id)->find(); if (!$program) { return json(['code' => 0, 'msg' => '程序不存在']); } // 更新访问次数 Resources::where('id', $id)->inc('views')->update(); // 获取更新后的访问次数 $newViews = Resources::where('id', $id)->value('views'); return json(['code' => 1, 'msg' => '更新成功', 'data' => ['views' => $newViews]]); } catch (\Exception $e) { return json(['code' => 0, 'msg' => '更新失败:' . $e->getMessage()]); } } }