408 lines
11 KiB
PHP
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');
|
|
}
|