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

408 lines
11 KiB
PHP

<?php
/**
* 用户偏好设置接口
* 支持用户选择标签/分类筛选、屏蔽过敏原食材
*/
$startTime = microtime(true);
define('ZBP_HOOKERROR', false);
require '../zb_system/function/c_system_base.php';
$zbp->Load();
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
$act = strtolower(trim($_GET['act'] ?? 'get'));
$result = array();
switch ($act) {
case 'get':
$result = get_user_preference();
break;
case 'set':
$result = set_user_preference();
break;
case 'add_tag':
$result = add_preferred_tag();
break;
case 'remove_tag':
$result = remove_preferred_tag();
break;
case 'add_category':
$result = add_preferred_category();
break;
case 'remove_category':
$result = remove_preferred_category();
break;
case 'add_allergen':
$result = add_blocked_allergen();
break;
case 'remove_allergen':
$result = remove_blocked_allergen();
break;
case 'clear':
$result = clear_user_preference();
break;
case 'allergens':
$result = get_allergen_types();
break;
default:
$result = get_user_preference();
break;
}
$result['_query_time'] = round((microtime(true) - $startTime) * 1000, 2) . 'ms';
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
/**
* 获取用户ID
*/
function get_user_id() {
$userId = isset($_GET['user_id']) ? trim($_GET['user_id']) : '';
if (empty($userId)) {
$userId = isset($_COOKIE['user_pref_id']) ? $_COOKIE['user_pref_id'] : '';
}
if (empty($userId)) {
$userId = 'user_' . md5(uniqid(mt_rand(), true));
setcookie('user_pref_id', $userId, time() + 86400 * 365, '/');
}
return $userId;
}
/**
* 获取偏好缓存文件
*/
function get_preference_file($userId) {
$cacheDir = dirname(__FILE__) . '/cache/preference/';
if (!is_dir($cacheDir)) {
@mkdir($cacheDir, 0755, true);
}
return $cacheDir . 'pref_' . md5($userId) . '.json';
}
/**
* 加载用户偏好
*/
function load_user_preference($userId) {
$file = get_preference_file($userId);
if (file_exists($file)) {
$content = file_get_contents($file);
$data = json_decode($content, true);
return is_array($data) ? $data : get_default_preference();
}
return get_default_preference();
}
/**
* 保存用户偏好
*/
function save_user_preference($userId, $data) {
$file = get_preference_file($userId);
$data['updated_at'] = time();
file_put_contents($file, json_encode($data, JSON_UNESCAPED_UNICODE));
}
/**
* 获取默认偏好设置
*/
function get_default_preference() {
return array(
'preferred_tags' => array(),
'preferred_categories' => array(),
'blocked_allergens' => array(),
'created_at' => time()
);
}
/**
* 获取用户偏好
*/
function get_user_preference() {
$userId = get_user_id();
$data = load_user_preference($userId);
return array(
'code' => 200,
'message' => 'success',
'data' => array(
'user_id' => $userId,
'preferred_tags' => $data['preferred_tags'],
'preferred_categories' => $data['preferred_categories'],
'blocked_allergens' => $data['blocked_allergens'],
'filter_mode' => count($data['preferred_tags']) > 0 || count($data['preferred_categories']) > 0 ? 'include' : 'all',
'allergen_filter' => count($data['blocked_allergens']) > 0 ? 'enabled' : 'disabled'
)
);
}
/**
* 设置用户偏好
*/
function set_user_preference() {
$userId = get_user_id();
$data = load_user_preference($userId);
if (isset($_GET['preferred_tags'])) {
$tags = $_GET['preferred_tags'];
if (is_string($tags)) {
$tags = array_map('intval', explode(',', $tags));
}
$data['preferred_tags'] = array_filter(array_unique($tags));
}
if (isset($_GET['preferred_categories'])) {
$categories = $_GET['preferred_categories'];
if (is_string($categories)) {
$categories = array_map('intval', explode(',', $categories));
}
$data['preferred_categories'] = array_filter(array_unique($categories));
}
if (isset($_GET['blocked_allergens'])) {
$allergens = $_GET['blocked_allergens'];
if (is_string($allergens)) {
$allergens = explode(',', $allergens);
}
$data['blocked_allergens'] = array_filter(array_unique($allergens));
}
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '偏好设置已保存',
'data' => array(
'user_id' => $userId,
'preferred_tags' => $data['preferred_tags'],
'preferred_categories' => $data['preferred_categories'],
'blocked_allergens' => $data['blocked_allergens']
)
);
}
/**
* 添加偏好标签
*/
function add_preferred_tag() {
$userId = get_user_id();
$tagId = (int) ($_GET['tag_id'] ?? 0);
if ($tagId <= 0) {
return array(
'code' => 400,
'message' => '标签ID无效'
);
}
$data = load_user_preference($userId);
if (!in_array($tagId, $data['preferred_tags'])) {
$data['preferred_tags'][] = $tagId;
}
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '标签已添加',
'data' => array(
'tag_id' => $tagId,
'preferred_tags' => $data['preferred_tags']
)
);
}
/**
* 移除偏好标签
*/
function remove_preferred_tag() {
$userId = get_user_id();
$tagId = (int) ($_GET['tag_id'] ?? 0);
$data = load_user_preference($userId);
$data['preferred_tags'] = array_values(array_diff($data['preferred_tags'], array($tagId)));
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '标签已移除',
'data' => array(
'tag_id' => $tagId,
'preferred_tags' => $data['preferred_tags']
)
);
}
/**
* 添加偏好分类
*/
function add_preferred_category() {
$userId = get_user_id();
$categoryId = (int) ($_GET['category_id'] ?? 0);
if ($categoryId <= 0) {
return array(
'code' => 400,
'message' => '分类ID无效'
);
}
$data = load_user_preference($userId);
if (!in_array($categoryId, $data['preferred_categories'])) {
$data['preferred_categories'][] = $categoryId;
}
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '分类已添加',
'data' => array(
'category_id' => $categoryId,
'preferred_categories' => $data['preferred_categories']
)
);
}
/**
* 移除偏好分类
*/
function remove_preferred_category() {
$userId = get_user_id();
$categoryId = (int) ($_GET['category_id'] ?? 0);
$data = load_user_preference($userId);
$data['preferred_categories'] = array_values(array_diff($data['preferred_categories'], array($categoryId)));
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '分类已移除',
'data' => array(
'category_id' => $categoryId,
'preferred_categories' => $data['preferred_categories']
)
);
}
/**
* 添加屏蔽过敏原
*/
function add_blocked_allergen() {
$userId = get_user_id();
$allergenType = trim($_GET['allergen_type'] ?? '');
if (empty($allergenType)) {
return array(
'code' => 400,
'message' => '过敏原类型无效'
);
}
$validAllergens = get_valid_allergen_types();
if (!in_array($allergenType, $validAllergens)) {
return array(
'code' => 400,
'message' => '无效的过敏原类型'
);
}
$data = load_user_preference($userId);
if (!in_array($allergenType, $data['blocked_allergens'])) {
$data['blocked_allergens'][] = $allergenType;
}
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '过敏原已屏蔽',
'data' => array(
'allergen_type' => $allergenType,
'blocked_allergens' => $data['blocked_allergens']
)
);
}
/**
* 移除屏蔽过敏原
*/
function remove_blocked_allergen() {
$userId = get_user_id();
$allergenType = trim($_GET['allergen_type'] ?? '');
$data = load_user_preference($userId);
$data['blocked_allergens'] = array_values(array_diff($data['blocked_allergens'], array($allergenType)));
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '过敏原屏蔽已移除',
'data' => array(
'allergen_type' => $allergenType,
'blocked_allergens' => $data['blocked_allergens']
)
);
}
/**
* 清除用户偏好
*/
function clear_user_preference() {
$userId = get_user_id();
$data = get_default_preference();
save_user_preference($userId, $data);
return array(
'code' => 200,
'message' => '偏好设置已清除',
'data' => $data
);
}
/**
* 获取过敏原类型列表
*/
function get_allergen_types() {
$allergens = array(
array('type' => 'nuts', 'name' => '坚果类', 'description' => '核桃、杏仁、腰果、榛子、松子、开心果、栗子、花生'),
array('type' => 'seafood', 'name' => '海鲜类', 'description' => '鱼、虾、蟹、贝类、海参等'),
array('type' => 'dairy', 'name' => '乳制品', 'description' => '牛奶、奶粉、奶酪、奶油、酸奶、黄油等'),
array('type' => 'eggs', 'name' => '蛋类', 'description' => '鸡蛋、鸭蛋、鹅蛋、鸽蛋、鹌鹑蛋'),
array('type' => 'grains', 'name' => '谷物类', 'description' => '小麦、面粉、面包、面条等'),
array('type' => 'beans', 'name' => '豆类', 'description' => '黄豆、绿豆、红豆、蚕豆、豌豆等'),
array('type' => 'meat', 'name' => '肉类', 'description' => '猪、牛、羊、鸡、鸭、鹅等'),
array('type' => 'fruits', 'name' => '水果类', 'description' => '桃、芒果、菠萝、草莓、猕猴桃等'),
array('type' => 'vegetables', 'name' => '蔬菜类', 'description' => '芹菜、茄子、韭菜、香菜、姜、蒜等'),
array('type' => 'mushrooms', 'name' => '菌类', 'description' => '香菇、金针菇、木耳、银耳等'),
array('type' => 'seasonings', 'name' => '调味品类', 'description' => '胡椒、花椒、芥末、味精、料酒等'),
array('type' => 'other', 'name' => '其他', 'description' => '蜂蜜、巧克力、可可、芝麻等')
);
return array(
'code' => 200,
'message' => 'success',
'data' => $allergens
);
}
/**
* 获取有效的过敏原类型
*/
function get_valid_allergen_types() {
return array('nuts', 'seafood', 'dairy', 'eggs', 'grains', 'beans', 'meat', 'fruits', 'vegetables', 'mushrooms', 'seasonings', 'other');
}