Files
kitchen/docs/api/stats_full.php
Developer 8d27c67d3a api实现
2026-04-09 08:54:36 +08:00

587 lines
25 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 📊 全面统计接口
*
* 访问地址: /api/stats_full.php
*
* 参数说明:
* - layer: basic(基础) / detail(详情) / full(完整) / hot(热门)
* - module: recipe / ingredient / category / tag / user / nutrition / hot
*
* 示例:
* - ?layer=basic 基础统计App首页
* - ?layer=detail 详细统计(后台分析)
* - ?layer=full 完整统计
* - ?layer=hot 热门统计(推荐使用)
* - ?module=recipe 仅菜谱统计
* - ?module=hot 热门统计
*/
$startTime = microtime(true);
require '../zb_system/function/c_system_base.php';
$zbp->Load();
require_once 'cache.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$layer = strtolower(trim($_GET['layer'] ?? 'basic'));
$module = strtolower(trim($_GET['module'] ?? ''));
if (!in_array($layer, ['basic', 'detail', 'full', 'hot'])) {
$layer = 'basic';
}
$cacheKey = 'stats_full_' . $layer . '_' . $module;
$cachedResult = ApiCache::get('stats_full', array('layer' => $layer, 'module' => $module));
if ($cachedResult !== null) {
$cachedResult['_cached'] = true;
$cachedResult['_query_time'] = round((microtime(true) - $startTime) * 1000, 2) . 'ms';
echo json_encode($cachedResult, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
$result = array(
'code' => 200,
'message' => '📊 统计数据',
'data' => array()
);
if (!empty($module)) {
switch ($module) {
case 'recipe':
$result['data']['recipe'] = getRecipeStats($layer);
break;
case 'ingredient':
$result['data']['ingredient'] = getIngredientStats($layer);
break;
case 'category':
$result['data']['category'] = getCategoryStats($layer);
break;
case 'tag':
$result['data']['tag'] = getTagStats($layer);
break;
case 'user':
$result['data']['user'] = getUserStats($layer);
break;
case 'nutrition':
$result['data']['nutrition'] = getNutritionStats($layer);
break;
case 'hot':
$result['data']['hot'] = getHotStats();
break;
default:
$result['code'] = 400;
$result['message'] = '❌ 无效的模块参数';
break;
}
} else {
if ($layer === 'hot') {
$result['data']['hot'] = getHotStats();
} else {
$result['data']['basic'] = getBasicStats();
if ($layer === 'detail' || $layer === 'full') {
$result['data']['recipe'] = getRecipeStats($layer);
$result['data']['ingredient'] = getIngredientStats($layer);
$result['data']['category'] = getCategoryStats($layer);
$result['data']['tag'] = getTagStats($layer);
$result['data']['user'] = getUserStats($layer);
}
if ($layer === 'full') {
$result['data']['nutrition'] = getNutritionStats($layer);
$result['data']['time_analysis'] = getTimeAnalysis();
}
}
}
ApiCache::set('stats_full', array('layer' => $layer, 'module' => $module), $result);
$result['_cached'] = false;
$result['_query_time'] = round((microtime(true) - $startTime) * 1000, 2) . 'ms';
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
// ==================== 统计函数 ====================
function getBasicStats() {
global $zbp;
$tablePost = $zbp->db->dbpre . 'post';
$tableIngredient = $zbp->db->dbpre . 'ingredient_detail';
$tablePostStat = $zbp->db->dbpre . 'post_stat';
$tableIngredientStat = $zbp->db->dbpre . 'ingredient_stat';
$recipeTotal = $zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0")[0]['c'] ?? 0;
$recipeViews = $zbp->db->Query("SELECT SUM(log_ViewNums) as v FROM $tablePost WHERE log_Type = 0")[0]['v'] ?? 0;
$recipeLikes = $zbp->db->Query("SELECT SUM(like_nums) as l FROM $tablePostStat")[0]['l'] ?? 0;
$recipeRecommends = $zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tablePostStat")[0]['r'] ?? 0;
$ingredientTotal = $zbp->db->Query("SELECT COUNT(*) as c FROM $tableIngredient")[0]['c'] ?? 0;
$ingredientViews = $zbp->db->Query("SELECT SUM(view_count) as v FROM $tableIngredient")[0]['v'] ?? 0;
$ingredientLikes = $zbp->db->Query("SELECT SUM(like_nums) as l FROM $tableIngredientStat")[0]['l'] ?? 0;
$ingredientRecommends = $zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tableIngredientStat")[0]['r'] ?? 0;
return array(
'recipe' => array(
'total' => (int) $recipeTotal,
'views' => (int) $recipeViews,
'likes' => (int) $recipeLikes,
'recommends' => (int) $recipeRecommends
),
'ingredient' => array(
'total' => (int) $ingredientTotal,
'views' => (int) $ingredientViews,
'likes' => (int) $ingredientLikes,
'recommends' => (int) $ingredientRecommends
),
'category' => array(
'total' => count($zbp->categories)
),
'tag' => array(
'total' => $zbp->db->Query("SELECT COUNT(*) as c FROM " . $zbp->db->dbpre . "tag")[0]['c'] ?? 0
),
'user' => array(
'total' => $zbp->db->Query("SELECT COUNT(*) as c FROM " . $zbp->db->dbpre . "member")[0]['c'] ?? 0
)
);
}
function getRecipeStats($layer) {
global $zbp;
$tablePost = $zbp->db->dbpre . 'post';
$tablePostStat = $zbp->db->dbpre . 'post_stat';
$tableRecipe = $zbp->db->dbpre . 'recipe';
$stats = array(
'total' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(log_ViewNums) as v FROM $tablePost WHERE log_Type = 0")[0]['v'] ?? 0),
'likes' => (int) ($zbp->db->Query("SELECT SUM(like_nums) as l FROM $tablePostStat")[0]['l'] ?? 0),
'recommends' => (int) ($zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tablePostStat")[0]['r'] ?? 0),
'avg_recommend_score' => (float) ($zbp->db->Query("SELECT AVG(recommend_score) as a FROM $tablePostStat WHERE recommend_nums > 0")[0]['a'] ?? 0)
);
if ($layer === 'detail' || $layer === 'full') {
$processStats = $zbp->db->Query("SELECT process, COUNT(*) as c FROM $tableRecipe WHERE process IS NOT NULL AND process != '' GROUP BY process ORDER BY c DESC LIMIT 20");
$stats['process'] = array();
foreach ($processStats as $row) {
$stats['process'][$row['process']] = (int) $row['c'];
}
$tasteStats = $zbp->db->Query("SELECT taste, COUNT(*) as c FROM $tableRecipe WHERE taste IS NOT NULL AND taste != '' GROUP BY taste ORDER BY c DESC LIMIT 20");
$stats['taste'] = array();
foreach ($tasteStats as $row) {
$stats['taste'][$row['taste']] = (int) $row['c'];
}
$topViews = $zbp->db->Query("SELECT log_ID, log_Title, log_ViewNums FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 ORDER BY log_ViewNums DESC LIMIT 10");
$stats['top_views'] = array();
foreach ($topViews as $row) {
$stats['top_views'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'views' => (int) $row['log_ViewNums']
);
}
$topLikes = $zbp->db->Query("SELECT p.log_ID, p.log_Title, s.like_nums FROM $tablePost p JOIN $tablePostStat s ON p.log_ID = s.log_id WHERE p.log_Type = 0 AND p.log_Status = 0 ORDER BY s.like_nums DESC LIMIT 10");
$stats['top_likes'] = array();
foreach ($topLikes as $row) {
$stats['top_likes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'likes' => (int) $row['like_nums']
);
}
$categoryDist = $zbp->db->Query("SELECT log_CateID, COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 GROUP BY log_CateID ORDER BY c DESC LIMIT 10");
$stats['category_distribution'] = array();
foreach ($categoryDist as $row) {
$cate = $zbp->GetCategoryByID($row['log_CateID']);
$stats['category_distribution'][] = array(
'id' => (int) $row['log_CateID'],
'name' => $cate ? $cate->Name : '未知',
'count' => (int) $row['c']
);
}
}
return $stats;
}
function getIngredientStats($layer) {
global $zbp;
$tableIngredient = $zbp->db->dbpre . 'ingredient_detail';
$tableIngredientStat = $zbp->db->dbpre . 'ingredient_stat';
$tableRecipeIngredient = $zbp->db->dbpre . 'recipe_ingredient';
$stats = array(
'total' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableIngredient")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(view_count) as v FROM $tableIngredient")[0]['v'] ?? 0),
'likes' => (int) ($zbp->db->Query("SELECT SUM(like_nums) as l FROM $tableIngredientStat")[0]['l'] ?? 0),
'recommends' => (int) ($zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tableIngredientStat")[0]['r'] ?? 0)
);
$typeDist = $zbp->db->Query("SELECT type, COUNT(*) as c FROM $tableRecipeIngredient GROUP BY type");
$stats['type_distribution'] = array();
foreach ($typeDist as $row) {
$stats['type_distribution'][$row['type']] = (int) $row['c'];
}
if ($layer === 'detail' || $layer === 'full') {
$topUsed = $zbp->db->Query("SELECT name, COUNT(*) as c FROM $tableRecipeIngredient GROUP BY name ORDER BY c DESC LIMIT 20");
$stats['top_used'] = array();
foreach ($topUsed as $row) {
$stats['top_used'][] = array(
'name' => $row['name'],
'count' => (int) $row['c']
);
}
$topViews = $zbp->db->Query("SELECT ingredient_id, name, view_count FROM $tableIngredient ORDER BY view_count DESC LIMIT 10");
$stats['top_views'] = array();
foreach ($topViews as $row) {
$stats['top_views'][] = array(
'id' => (int) $row['ingredient_id'],
'name' => $row['name'],
'views' => (int) $row['view_count']
);
}
$topLikes = $zbp->db->Query("SELECT i.ingredient_id, i.name, s.like_nums FROM $tableIngredient i JOIN $tableIngredientStat s ON i.ingredient_id = s.ingredient_id ORDER BY s.like_nums DESC LIMIT 10");
$stats['top_likes'] = array();
foreach ($topLikes as $row) {
$stats['top_likes'][] = array(
'id' => (int) $row['ingredient_id'],
'name' => $row['name'],
'likes' => (int) $row['like_nums']
);
}
$cateDist = $zbp->db->Query("SELECT cate_ID, COUNT(*) as c FROM $tableIngredient WHERE cate_ID > 0 GROUP BY cate_ID ORDER BY c DESC LIMIT 10");
$stats['category_distribution'] = array();
foreach ($cateDist as $row) {
$cate = $zbp->GetCategoryByID($row['cate_ID']);
$stats['category_distribution'][] = array(
'id' => (int) $row['cate_ID'],
'name' => $cate ? $cate->Name : '未知',
'count' => (int) $row['c']
);
}
}
return $stats;
}
function getCategoryStats($layer) {
global $zbp;
$tableCategory = $zbp->db->dbpre . 'category';
$tablePost = $zbp->db->dbpre . 'post';
$stats = array(
'total' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableCategory")[0]['c'] ?? 0),
'root_count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableCategory WHERE cate_ParentID = 0")[0]['c'] ?? 0)
);
if ($layer === 'detail' || $layer === 'full') {
$rootCategories = $zbp->db->Query("SELECT cate_ID, cate_Name, cate_Count FROM $tableCategory WHERE cate_ParentID = 0 ORDER BY cate_ID ASC");
$stats['tree'] = array();
foreach ($rootCategories as $root) {
$children = $zbp->db->Query("SELECT cate_ID, cate_Name, cate_Count FROM $tableCategory WHERE cate_ParentID = " . (int) $root['cate_ID'] . " ORDER BY cate_Order ASC");
$childrenList = array();
foreach ($children as $child) {
$childrenList[] = array(
'id' => (int) $child['cate_ID'],
'name' => $child['cate_Name'],
'count' => (int) $child['cate_Count']
);
}
$stats['tree'][] = array(
'id' => (int) $root['cate_ID'],
'name' => $root['cate_Name'],
'count' => (int) $root['cate_Count'],
'children' => $childrenList,
'children_count' => count($childrenList)
);
}
$topCategories = $zbp->db->Query("SELECT log_CateID, COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 GROUP BY log_CateID ORDER BY c DESC LIMIT 10");
$stats['top_categories'] = array();
foreach ($topCategories as $row) {
$cate = $zbp->GetCategoryByID($row['log_CateID']);
$stats['top_categories'][] = array(
'id' => (int) $row['log_CateID'],
'name' => $cate ? $cate->Name : '未知',
'count' => (int) $row['c']
);
}
}
return $stats;
}
function getTagStats($layer) {
global $zbp;
$tableTag = $zbp->db->dbpre . 'tag';
$stats = array(
'total' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableTag")[0]['c'] ?? 0),
'used_count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableTag WHERE tag_Count > 0")[0]['c'] ?? 0)
);
$hotTags = $zbp->db->Query("SELECT tag_ID, tag_Name, tag_Count FROM $tableTag WHERE tag_Count > 0 ORDER BY tag_Count DESC LIMIT 20");
$stats['hot_tags'] = array();
foreach ($hotTags as $row) {
$stats['hot_tags'][] = array(
'id' => (int) $row['tag_ID'],
'name' => $row['tag_Name'],
'count' => (int) $row['tag_Count']
);
}
return $stats;
}
function getUserStats($layer) {
global $zbp;
$tableMember = $zbp->db->dbpre . 'member';
$tablePost = $zbp->db->dbpre . 'post';
$stats = array(
'total' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableMember")[0]['c'] ?? 0)
);
if ($layer === 'detail' || $layer === 'full') {
$topAuthors = $zbp->db->Query("SELECT log_AuthorID, COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 GROUP BY log_AuthorID ORDER BY c DESC LIMIT 10");
$stats['top_authors'] = array();
foreach ($topAuthors as $row) {
$member = $zbp->GetMemberByID($row['log_AuthorID']);
$stats['top_authors'][] = array(
'id' => (int) $row['log_AuthorID'],
'name' => $member ? $member->Name : '未知',
'count' => (int) $row['c']
);
}
$members = $zbp->db->Query("SELECT mem_ID, mem_Name, mem_Articles, mem_Comments FROM $tableMember LIMIT 20");
$stats['members'] = array();
foreach ($members as $row) {
$stats['members'][] = array(
'id' => (int) $row['mem_ID'],
'name' => $row['mem_Name'],
'articles' => (int) $row['mem_Articles'],
'comments' => (int) $row['mem_Comments']
);
}
}
return $stats;
}
function getNutritionStats($layer) {
global $zbp;
$tableNutrition = $zbp->db->dbpre . 'recipe_nutrition';
$stats = array(
'total_records' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableNutrition")[0]['c'] ?? 0),
'unique_nutrients' => (int) ($zbp->db->Query("SELECT COUNT(DISTINCT name) as c FROM $tableNutrition")[0]['c'] ?? 0)
);
$nutrientTypes = $zbp->db->Query("SELECT name, COUNT(*) as c, AVG(value) as avg_val, unit FROM $tableNutrition GROUP BY name, unit ORDER BY c DESC LIMIT 30");
$stats['nutrient_types'] = array();
foreach ($nutrientTypes as $row) {
$stats['nutrient_types'][] = array(
'name' => $row['name'],
'count' => (int) $row['c'],
'avg_value' => round((float) $row['avg_val'], 2),
'unit' => $row['unit']
);
}
return $stats;
}
function getTimeAnalysis() {
global $zbp;
$tablePost = $zbp->db->dbpre . 'post';
$tableIngredient = $zbp->db->dbpre . 'ingredient_detail';
$stats = array();
$byMonth = $zbp->db->Query("SELECT FROM_UNIXTIME(log_PostTime, '%Y-%m') as month, COUNT(*) as c FROM $tablePost WHERE log_Type = 0 GROUP BY month ORDER BY month DESC LIMIT 12");
$stats['recipe_by_month'] = array();
foreach ($byMonth as $row) {
$stats['recipe_by_month'][] = array(
'month' => $row['month'],
'count' => (int) $row['c']
);
}
$ingredientByMonth = $zbp->db->Query("SELECT FROM_UNIXTIME(create_time, '%Y-%m') as month, COUNT(*) as c FROM $tableIngredient GROUP BY month ORDER BY month DESC LIMIT 12");
$stats['ingredient_by_month'] = array();
foreach ($ingredientByMonth as $row) {
$stats['ingredient_by_month'][] = array(
'month' => $row['month'],
'count' => (int) $row['c']
);
}
return $stats;
}
function getHotStats() {
global $zbp;
$tablePost = $zbp->db->dbpre . 'post';
$tablePostStat = $zbp->db->dbpre . 'post_stat';
$tableIngredient = $zbp->db->dbpre . 'ingredient_detail';
$tableIngredientStat = $zbp->db->dbpre . 'ingredient_stat';
$todayStart = strtotime('today');
$monthStart = strtotime('first day of this month 00:00:00');
$stats = array(
'period' => array(
'today' => date('Y-m-d'),
'month' => date('Y-m'),
'update_time' => date('Y-m-d H:i:s')
)
);
$stats['recipe'] = array(
'total' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(log_ViewNums) as v FROM $tablePost WHERE log_Type = 0")[0]['v'] ?? 0),
'likes' => (int) ($zbp->db->Query("SELECT SUM(like_nums) as l FROM $tablePostStat")[0]['l'] ?? 0),
'recommends' => (int) ($zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tablePostStat")[0]['r'] ?? 0)
),
'today' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 AND log_PostTime >= $todayStart")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(log_ViewNums) as v FROM $tablePost WHERE log_Type = 0 AND log_PostTime >= $todayStart")[0]['v'] ?? 0)
),
'month' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 AND log_PostTime >= $monthStart")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(log_ViewNums) as v FROM $tablePost WHERE log_Type = 0 AND log_PostTime >= $monthStart")[0]['v'] ?? 0)
)
);
$stats['ingredient'] = array(
'total' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableIngredient")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(view_count) as v FROM $tableIngredient")[0]['v'] ?? 0),
'likes' => (int) ($zbp->db->Query("SELECT SUM(like_nums) as l FROM $tableIngredientStat")[0]['l'] ?? 0),
'recommends' => (int) ($zbp->db->Query("SELECT SUM(recommend_nums) as r FROM $tableIngredientStat")[0]['r'] ?? 0)
),
'today' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableIngredient WHERE create_time >= $todayStart")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(view_count) as v FROM $tableIngredient WHERE create_time >= $todayStart")[0]['v'] ?? 0)
),
'month' => array(
'count' => (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tableIngredient WHERE create_time >= $monthStart")[0]['c'] ?? 0),
'views' => (int) ($zbp->db->Query("SELECT SUM(view_count) as v FROM $tableIngredient WHERE create_time >= $monthStart")[0]['v'] ?? 0)
)
);
$hotRecipes = $zbp->db->Query("SELECT p.log_ID, p.log_Title, p.log_ViewNums, ps.like_nums, ps.recommend_nums FROM $tablePost p LEFT JOIN $tablePostStat ps ON p.log_ID = ps.log_id WHERE p.log_Type = 0 AND p.log_Status = 0 ORDER BY p.log_ViewNums DESC LIMIT 20");
$stats['hot_recipes'] = array();
foreach ($hotRecipes as $row) {
$stats['hot_recipes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'views' => (int) $row['log_ViewNums'],
'likes' => (int) ($row['like_nums'] ?? 0),
'recommends' => (int) ($row['recommend_nums'] ?? 0),
'url' => '?act=detail&id=' . $row['log_ID']
);
}
$hotIngredients = $zbp->db->Query("SELECT i.ingredient_id, i.name, i.view_count, s.like_nums, s.recommend_nums FROM $tableIngredient i LEFT JOIN $tableIngredientStat s ON i.ingredient_id = s.ingredient_id ORDER BY i.view_count DESC LIMIT 10");
$stats['hot_ingredients'] = array();
foreach ($hotIngredients as $row) {
$stats['hot_ingredients'][] = array(
'id' => (int) $row['ingredient_id'],
'name' => $row['name'],
'views' => (int) $row['view_count'],
'likes' => (int) ($row['like_nums'] ?? 0),
'recommends' => (int) ($row['recommend_nums'] ?? 0),
'url' => '?act=ingredient_detail&id=' . $row['ingredient_id']
);
}
$topLikedRecipes = $zbp->db->Query("SELECT p.log_ID, p.log_Title, ps.like_nums FROM $tablePost p JOIN $tablePostStat ps ON p.log_ID = ps.log_id WHERE p.log_Type = 0 AND p.log_Status = 0 ORDER BY ps.like_nums DESC LIMIT 20");
$stats['top_liked_recipes'] = array();
foreach ($topLikedRecipes as $row) {
$stats['top_liked_recipes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'likes' => (int) $row['like_nums'],
'url' => '?act=detail&id=' . $row['log_ID']
);
}
$topRecommendedRecipes = $zbp->db->Query("SELECT p.log_ID, p.log_Title, ps.recommend_nums, ps.recommend_score FROM $tablePost p JOIN $tablePostStat ps ON p.log_ID = ps.log_id WHERE p.log_Type = 0 AND p.log_Status = 0 ORDER BY ps.recommend_nums DESC, ps.recommend_score DESC LIMIT 20");
$stats['top_recommended_recipes'] = array();
foreach ($topRecommendedRecipes as $row) {
$stats['top_recommended_recipes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'recommends' => (int) $row['recommend_nums'],
'score' => (float) $row['recommend_score'],
'url' => '?act=detail&id=' . $row['log_ID']
);
}
$totalRecipes = (int) ($zbp->db->Query("SELECT COUNT(*) as c FROM $tablePost WHERE log_Type = 0 AND log_Status = 0")[0]['c'] ?? 0);
$randomOffset = $totalRecipes > 10 ? mt_rand(0, $totalRecipes - 10) : 0;
$randomRecipes = $zbp->db->Query("SELECT log_ID, log_Title, log_ViewNums FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 ORDER BY log_ID LIMIT $randomOffset, 10");
$stats['random_recipes'] = array();
foreach ($randomRecipes as $row) {
$stats['random_recipes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'views' => (int) $row['log_ViewNums'],
'url' => '?act=detail&id=' . $row['log_ID']
);
}
$latestRecipes = $zbp->db->Query("SELECT log_ID, log_Title, log_PostTime, log_ViewNums FROM $tablePost WHERE log_Type = 0 AND log_Status = 0 ORDER BY log_PostTime DESC LIMIT 20");
$stats['latest_recipes'] = array();
foreach ($latestRecipes as $row) {
$stats['latest_recipes'][] = array(
'id' => (int) $row['log_ID'],
'title' => $row['log_Title'],
'post_time' => date('Y-m-d H:i:s', $row['log_PostTime']),
'views' => (int) $row['log_ViewNums'],
'url' => '?act=detail&id=' . $row['log_ID']
);
}
$latestIngredients = $zbp->db->Query("SELECT ingredient_id, name, create_time, view_count FROM $tableIngredient ORDER BY create_time DESC LIMIT 10");
$stats['latest_ingredients'] = array();
foreach ($latestIngredients as $row) {
$stats['latest_ingredients'][] = array(
'id' => (int) $row['ingredient_id'],
'name' => $row['name'],
'create_time' => date('Y-m-d H:i:s', $row['create_time']),
'views' => (int) $row['view_count'],
'url' => '?act=ingredient_detail&id=' . $row['ingredient_id']
);
}
return $stats;
}