587 lines
25 KiB
PHP
587 lines
25 KiB
PHP
<?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;
|
||
}
|