251121提交测试

This commit is contained in:
tsf 2025-11-21 19:15:51 +08:00
commit f0bafebafb
15 changed files with 1558 additions and 243 deletions

View File

@ -38,9 +38,9 @@ class Base extends Controller{
// 减 bcsub(,,20) // 减 bcsub(,,20)
// 乘 bcmul(,,20) // 乘 bcmul(,,20)
// 除 bcdiv(,,20) // 除 bcdiv(,,20)
################################################################接口################################################################ ################################################################接口监控################################################################
################################################################接口################################################################ ################################################################接口监控################################################################
################################################################接口################################################################ ################################################################接口监控################################################################
// 接口记录 // 接口记录
public function record_api_log($params, $error = null, $response = null){ public function record_api_log($params, $error = null, $response = null){
// dump($params); // dump($params);
@ -62,6 +62,62 @@ class Base extends Controller{
} }
/* 接口说明(发邮件)
* $address收件人的邮箱地址 数组 格式: ['460834639@qq.com','460834639@qq.com'.......]
* $content邮件的主题数据信息 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123']
* $annex附件路径信息 字符串
*/
public function send_email_api_error($address,$content,$annex=''){
// $ad = '460834639@qq.com';
$ad1 = '295155911@qq.com';
$mail = new PHPMailer(); //实例化
$mail->IsSMTP(); // 启用SMTP
$mail->Host = "smtp.126.com"; //SMTP服务器 163邮箱例子
$mail->Port = 465; //邮件发送端口
$mail->SMTPAuth = true; //启用SMTP认证
$mail->SMTPSecure = 'ssl';
$mail->CharSet = "UTF-8"; //字符集
$mail->Encoding = "base64"; //编码方式
$mail->Username = "tsf3920322@126.com"; //你的邮箱
$mail->Password = "HLWXNRPUCTHJFIIX"; //你的密码(邮箱后台的授权密码)
$mail->From = "tsf3920322@126.com"; //发件人地址(也就是你的邮箱)
// $mail->Subject = "微盟测试邮件"; //邮件标题
$mail->Subject = $content['title']; //邮件标题
// $mail->FromName = "微盟体测中心"; //发件人姓名
$mail->FromName = $content['from_user_name']; //发件人姓名
for ($i=0; $i < count($address); $i++) {
$mail->AddAddress($address[$i], ""); //添加收件人(地址,昵称)
}
if($annex != ''){
// $url = ROOT_PATH. 'public' . DS . 'tsf' . DS .'demoooo.jpg';
$mail->AddAttachment($annex,''); // 添加附件,并指定名称
}
$mail->IsHTML(true); //支持html格式内容
$neirong = $content['content'];
$mail->Body = $neirong; //邮件主体内容
//发送
if (!$mail->Send()) {
return ['code' => 10003,'msg'=>$mail->ErrorInfo];
// return $mail->ErrorInfo;
} else {
return ['code' => 0];
// return 'success';
}
}
################################################################通用工具################################################################
################################################################通用工具################################################################
################################################################通用工具################################################################
// 判断token是否过期 // 判断token是否过期
public function token_time_validate($token){ public function token_time_validate($token){
// 591b70e0d80b5fa6d77e6e1384453ab9 // 591b70e0d80b5fa6d77e6e1384453ab9
@ -116,60 +172,7 @@ class Base extends Controller{
} }
} }
/* 接口说明(发邮件) // 验证数据类型
* $address收件人的邮箱地址 数组 格式: ['460834639@qq.com','460834639@qq.com'.......]
* $content邮件的主题数据信息 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123']
* $annex附件路径信息 字符串
*/
public function send_email_api_error($address,$content,$annex=''){
// $ad = '460834639@qq.com';
$ad1 = '295155911@qq.com';
$mail = new PHPMailer(); //实例化
$mail->IsSMTP(); // 启用SMTP
$mail->Host = "smtp.126.com"; //SMTP服务器 163邮箱例子
$mail->Port = 465; //邮件发送端口
$mail->SMTPAuth = true; //启用SMTP认证
$mail->SMTPSecure = 'ssl';
$mail->CharSet = "UTF-8"; //字符集
$mail->Encoding = "base64"; //编码方式
$mail->Username = "tsf3920322@126.com"; //你的邮箱
$mail->Password = "HLWXNRPUCTHJFIIX"; //你的密码(邮箱后台的授权密码)
$mail->From = "tsf3920322@126.com"; //发件人地址(也就是你的邮箱)
// $mail->Subject = "微盟测试邮件"; //邮件标题
$mail->Subject = $content['title']; //邮件标题
// $mail->FromName = "微盟体测中心"; //发件人姓名
$mail->FromName = $content['from_user_name']; //发件人姓名
for ($i=0; $i < count($address); $i++) {
$mail->AddAddress($address[$i], ""); //添加收件人(地址,昵称)
}
if($annex != ''){
// $url = ROOT_PATH. 'public' . DS . 'tsf' . DS .'demoooo.jpg';
$mail->AddAttachment($annex,''); // 添加附件,并指定名称
}
$mail->IsHTML(true); //支持html格式内容
$neirong = $content['content'];
$mail->Body = $neirong; //邮件主体内容
//发送
if (!$mail->Send()) {
return ['code' => 10003,'msg'=>$mail->ErrorInfo];
// return $mail->ErrorInfo;
} else {
return ['code' => 0];
// return 'success';
}
}
// 验证
public function verify_data_is_ok($data = 2,$type){ public function verify_data_is_ok($data = 2,$type){
if($type == 'str'){ if($type == 'str'){
if (is_string($data)) { if (is_string($data)) {
@ -225,6 +228,54 @@ class Base extends Controller{
return false; return false;
} }
} }
// 计算常规卡路里
public function count_user_nutrition_all($data){
// 计算基础代谢率BMR
if($data['gender'] == 1){
// 男性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) + 5
$bmr = bcmul(10,$data['weight'],20);
$bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20);
$bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20);
$bmr = bcadd($bmr,5,2);
}else if($data['gender'] == 2){
// 女性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) - 161
$bmr = bcmul(10,$data['weight'],20);
$bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20);
$bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20);
$bmr = bcsub($bmr,161,2);
}else{
return $this->msg(10003,'性别未知');
}
// 每日总能量消耗TDEE
// 久坐很少或没有运动BMR × 1.2
// 轻度活动每周1-3天轻度运动BMR × 1.375
// 中度活动每周3-5天中度运动BMR × 1.55
// 高度活动每周6-7天高强度运动BMR × 1.725
// 极高活动体力劳动或每天高强度训练BMR × 1.9
$tdee = bcmul($bmr,1.55,2);
// 碳水化合物通常占总热量的45-65%
// 蛋白质通常占总热量的10-35%
// 脂肪通常占总热量的20-35%
// 孩子&成年人碳水化合物50%蛋白质20%脂肪30%。
// 老人碳水化合物50%蛋白质25%脂肪25%。
// 建议每日摄入量计算:
// 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4
// 2.蛋白质(克):(TDEE × 蛋白质比例) / 4
// 3.脂肪(克): (TDEE × 脂肪比例) / 9
$carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2);
if($data['age_num'] < 65){
$protein = bcdiv(bcmul($tdee,0.2,20),4,2);
$fat = bcdiv(bcmul($tdee,0.3,20),9,2);
}else{
$protein = bcdiv(bcmul($tdee,0.25,20),4,2);
$fat =bcdiv(bcmul($tdee,0.25,20),9,2);
}
return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr];
}
####################################################图片选择上传start##############################################################
####################################################图片选择上传start##############################################################
####################################################图片选择上传start############################################################## ####################################################图片选择上传start##############################################################
public function pic_chose_list($page = 1) { public function pic_chose_list($page = 1) {
$data = input(); $data = input();
@ -344,7 +395,13 @@ class Base extends Controller{
} }
} }
####################################################图片选择上传end############################################################## ####################################################图片选择上传end##############################################################
####################################################图片选择上传end##############################################################
####################################################图片选择上传end##############################################################
########################################################其他工具########################################################
########################################################其他工具########################################################
########################################################其他工具########################################################
public function msg($data,$str='',$result = []){ public function msg($data,$str='',$result = []){
if(is_array($data)){ if(is_array($data)){
if($str != ''){ if($str != ''){
@ -376,4 +433,6 @@ class Base extends Controller{
} }
} }

View File

@ -75,7 +75,7 @@ class Countfood extends Base{
} }
} }
// 获取记食器板块内容 // 获取记食器板块内容
public function get_countfoot_content($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','aud_id'=>1,'time'=>'2025-09-17']){ public function get_countfoot_content(){
// 尝试捕获异常 // 尝试捕获异常
// try { // try {
if(count(input('post.')) > 0){ if(count(input('post.')) > 0){
@ -393,14 +393,16 @@ class Countfood extends Base{
$user_data = $cfc->table($this->kitchenscale_db_msg['user']) $user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["id"=>$data['aud_id']]) ->where(["id"=>$data['aud_id']])
->field('weight,height,gender,age,is_use_set_kcal,set_kcal') ->field('weight,height,gender,age,birthday,is_use_set_kcal,set_kcal')
->find(); ->find();
if(!$user_data){ if(!$user_data){
return $this->msg(10003); return $this->msg(10003);
} }
if($user_data['birthday']){
$user_data['age_num'] = $this->calculate_age($user_data['birthday']);
}else{
$user_data['age_num'] = $user_data['age']; $user_data['age_num'] = $user_data['age'];
}
$nutrition_data = $this->count_user_nutrition_all($user_data); $nutrition_data = $this->count_user_nutrition_all($user_data);
if($user_data['is_use_set_kcal'] == 1){ if($user_data['is_use_set_kcal'] == 1){
// 加 bcadd(,,20) // 加 bcadd(,,20)
@ -633,13 +635,13 @@ class Countfood extends Base{
$bz['text'] = '超标'; $bz['text'] = '超标';
$bz['color'] = '#FF0000'; $bz['color'] = '#FF0000';
} }
array_push($return_data,['time'=>$key,'val'=>$value,'unit'=>'kcal','describe'=>$bz['text'],'color'=>$bz['color']]); array_push($return_data,['time'=>$key,'title'=>'摄入卡路里','val'=>$value,'unit'=>'kcal','describe'=>$bz['text'],'color'=>$bz['color']]);
} }
// dump($return_data); // dump($return_data);
return $this->msg([ return $this->msg([
// 'page_now'=>$data['page'], 'page_now'=>$data['page'],
// 'page_total'=>$page_total, 'page_total'=>$page_total,
'content_list'=>$return_data 'content_list'=>$return_data
]); ]);
} }
@ -809,51 +811,51 @@ class Countfood extends Base{
#######################################################################工具####################################################################### #######################################################################工具#######################################################################
#######################################################################工具####################################################################### #######################################################################工具#######################################################################
public function count_user_nutrition_all($data){ // public function count_user_nutrition_all($data){
// 计算基础代谢率BMR // // 计算基础代谢率BMR
if($data['gender'] == 1){ // if($data['gender'] == 1){
// 男性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) + 5 // // 男性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) + 5
$bmr = bcmul(10,$data['weight'],20); // $bmr = bcmul(10,$data['weight'],20);
$bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); // $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20);
$bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); // $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20);
$bmr = bcadd($bmr,5,2); // $bmr = bcadd($bmr,5,2);
}else if($data['gender'] == 2){ // }else if($data['gender'] == 2){
// 女性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) - 161 // // 女性BMR = 10 × 体重kg + 6.25 × 身高cm - 5 × 年龄(岁) - 161
$bmr = bcmul(10,$data['weight'],20); // $bmr = bcmul(10,$data['weight'],20);
$bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); // $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20);
$bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); // $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20);
$bmr = bcsub($bmr,161,2); // $bmr = bcsub($bmr,161,2);
}else{ // }else{
return $this->msg(10003,'性别未知'); // return $this->msg(10003,'性别未知');
} // }
// 每日总能量消耗TDEE // // 每日总能量消耗TDEE
// 久坐很少或没有运动BMR × 1.2 // // 久坐很少或没有运动BMR × 1.2
// 轻度活动每周1-3天轻度运动BMR × 1.375 // // 轻度活动每周1-3天轻度运动BMR × 1.375
// 中度活动每周3-5天中度运动BMR × 1.55 // // 中度活动每周3-5天中度运动BMR × 1.55
// 高度活动每周6-7天高强度运动BMR × 1.725 // // 高度活动每周6-7天高强度运动BMR × 1.725
// 极高活动体力劳动或每天高强度训练BMR × 1.9 // // 极高活动体力劳动或每天高强度训练BMR × 1.9
$tdee = bcmul($bmr,1.55,2); // $tdee = bcmul($bmr,1.55,2);
// 碳水化合物通常占总热量的45-65% // // 碳水化合物通常占总热量的45-65%
// 蛋白质通常占总热量的10-35% // // 蛋白质通常占总热量的10-35%
// 脂肪通常占总热量的20-35% // // 脂肪通常占总热量的20-35%
// 孩子&成年人碳水化合物50%蛋白质20%脂肪30%。 // // 孩子&成年人碳水化合物50%蛋白质20%脂肪30%。
// 老人碳水化合物50%蛋白质25%脂肪25%。 // // 老人碳水化合物50%蛋白质25%脂肪25%。
// 建议每日摄入量计算: // // 建议每日摄入量计算:
// 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4 // // 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4
// 2.蛋白质(克):(TDEE × 蛋白质比例) / 4 // // 2.蛋白质(克):(TDEE × 蛋白质比例) / 4
// 3.脂肪(克): (TDEE × 脂肪比例) / 9 // // 3.脂肪(克): (TDEE × 脂肪比例) / 9
$carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2); // $carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2);
if($data['age_num'] < 65){ // if($data['age_num'] < 65){
$protein = bcdiv(bcmul($tdee,0.2,20),4,2); // $protein = bcdiv(bcmul($tdee,0.2,20),4,2);
$fat = bcdiv(bcmul($tdee,0.3,20),9,2); // $fat = bcdiv(bcmul($tdee,0.3,20),9,2);
}else{ // }else{
$protein = bcdiv(bcmul($tdee,0.25,20),4,2); // $protein = bcdiv(bcmul($tdee,0.25,20),4,2);
$fat =bcdiv(bcmul($tdee,0.25,20),9,2); // $fat =bcdiv(bcmul($tdee,0.25,20),9,2);
} // }
return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr]; // return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr];
} // }
public function calculateDateRange($n) { public function calculateDateRange($n) {
// 获取当前日期和时间 // 获取当前日期和时间
$today = new \DateTime(); $today = new \DateTime();

View File

@ -0,0 +1,728 @@
<?php
namespace app\KitchenScale\controller\app;
use think\Db;
use think\Controller;
class Guessyoulike extends Controller {
protected $kitchenscale_db_msg = [
'cookbook' => 'app_user_cookbook',
'cookbook_label' => 'app_user_cookbook_label',
'foodlist2' => 'app_z_national_standard_food_type_2',
'foodlist3' => 'app_z_national_standard_food_type_3',
'kcal_log' => 'app_user_kcal_log',
'search_log' => 'app_user_search_log',
'search_history' => 'app_user_search_history',
'tag_preference' => 'app_user_tag_preference',
'recommend_cache' => 'app_recommend_cache'
];
protected $config = [
'tag_limit' => 5,
'item_limit' => 8,
'cache_time' => 3600
];
/**
* 猜你喜欢主接口
*/
public function getGuessYouLike($user_id, $input_tags = 'cookbook', $limit = null) {
try {
if (empty($user_id)) {
return ['code' => 0, 'msg' => '用户ID不能为空', 'data' => []];
}
if (!in_array($input_tags, ['cookbook', 'food'])) {
return ['code' => 0, 'msg' => '类型参数错误只能是cookbook或food', 'data' => []];
}
$tag_limit = $limit ?: $this->config['tag_limit'];
$item_limit = $this->config['item_limit'];
$cache_key = $this->generateCacheKey($user_id, $input_tags, $tag_limit);
$cached_result = $this->getCachedRecommendation($cache_key);
if ($cached_result) {
return $cached_result;
}
$is_new_user = $this->isNewUser($user_id);
if ($is_new_user) {
$result = $this->getHotRecommendationsForNewUser($input_tags, $item_limit);
} else {
if ($input_tags === 'cookbook') {
$result = $this->getCookbookRecommendations($user_id, $tag_limit, $item_limit);
} else {
$result = $this->getFoodRecommendations($user_id, $tag_limit, $item_limit);
}
}
$this->cacheRecommendation($cache_key, $result, $user_id, $input_tags);
return ['code' => 1, 'msg' => '获取成功', 'data' => $result];
} catch (\Exception $e) {
return ['code' => 0, 'msg' => '推荐系统异常: ' . $e->getMessage(), 'data' => []];
}
}
/**
* 判断是否是新用户
*/
private function isNewUser($user_id) {
$cfc = Db::connect('cfc_db');
$has_search_history = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where('user_id', $user_id)
->where('is_del', 0)
->count();
$has_diet_history = $cfc->table($this->kitchenscale_db_msg['kcal_log'])
->where('aud_id', $user_id)
->where('is_del', 0)
->count();
return ($has_search_history + $has_diet_history) == 0;
}
/**
* 为新用户获取热门推荐(只有一个"热门搜索"标签)
*/
private function getHotRecommendationsForNewUser($input_tags, $item_limit) {
$result = [];
if ($input_tags === 'cookbook') {
$hot_recipes = $this->getHotRecipes($item_limit);
$result['热门搜索'] = $hot_recipes;
} else {
$hot_foods = $this->getHotFoods($item_limit);
$result['热门搜索'] = $hot_foods;
}
return $result;
}
/**
* 获取热门菜谱(基于所有用户的搜索记录和饮食记录)
*/
private function getHotRecipes($limit) {
$cfc = Db::connect('cfc_db');
// 方法1从搜索记录中获取热门菜谱关键词
$hot_search_keywords = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where('is_del', 0)
->group('keyword')
->order('SUM(search_count) DESC')
->limit($limit * 2)
->field('keyword, SUM(search_count) as total_searches')
->select();
$recipes = [];
foreach ($hot_search_keywords as $search_item) {
$keyword = $search_item['keyword'];
// 查找匹配的菜谱
$recipe = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->where("(title LIKE '%".$keyword."%' OR describe_data LIKE '%".$keyword."%') and is_del = 0")
->field('id, title as name, "cookbook" as type')
->order('create_time DESC')
->find();
if ($recipe && !in_array($recipe['id'], array_column($recipes, 'id'))) {
$recipes[] = $recipe;
if (count($recipes) >= $limit) break;
}
}
// 方法2从饮食记录中分析热门菜谱通过食材关联
if (count($recipes) < $limit) {
$remaining = $limit - count($recipes);
// 获取热门食材
$hot_foods = $cfc->table($this->kitchenscale_db_msg['kcal_log'] . ' kcal')
->join($this->kitchenscale_db_msg['foodlist3'] . ' f3', 'kcal.food_id = f3.id')
->where('kcal.is_del', 0)
->group('f3.id, f3.name')
->order('COUNT(*) DESC')
->limit(10)
->field('f3.id, f3.name')
->select();
foreach ($hot_foods as $food) {
// 查找包含这些食材的菜谱
$related_recipes = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->where("(title LIKE '%".$food['name']."%' OR describe_data LIKE '%".$food['name']."%') and is_del = 0")
->whereNotIn('id', array_column($recipes, 'id'))
->field('id, title as name, "cookbook" as type')
->order('create_time DESC')
->limit($remaining)
->select();
if ($related_recipes) {
$recipes = array_merge($recipes, $related_recipes);
if (count($recipes) >= $limit) break;
}
}
}
// 方法3如果还不够从菜谱表中按创建时间获取最新的
if (count($recipes) < $limit) {
$remaining = $limit - count($recipes);
$more_recipes = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->where('is_del', 0)
->whereNotIn('id', array_column($recipes, 'id'))
->field('id, title as name, "cookbook" as type')
->order('create_time DESC')
->limit($remaining)
->select();
$recipes = array_merge($recipes, $more_recipes ?: []);
}
return array_slice($recipes, 0, $limit);
}
/**
* 获取热门食材(基于所有用户的饮食记录和搜索记录)
*/
private function getHotFoods($limit) {
$cfc = Db::connect('cfc_db');
$foods = [];
// 方法1从饮食记录中获取热门食材
$hot_from_diet = $cfc->table($this->kitchenscale_db_msg['kcal_log'] . ' kcal')
->join($this->kitchenscale_db_msg['foodlist3'] . ' f3', 'kcal.food_id = f3.id')
->where('kcal.is_del', 0)
->where('f3.is_del', 0)
->group('f3.id, f3.name')
->order('COUNT(*) DESC')
->limit($limit)
->field('f3.id, f3.name, "food" as type, COUNT(*) as eat_count')
->select();
if ($hot_from_diet) {
$foods = array_merge($foods, $hot_from_diet);
}
// 方法2从搜索记录中获取食材相关关键词
if (count($foods) < $limit) {
$remaining = $limit - count($foods);
$food_keywords = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where('is_del', 0)
->group('keyword')
->order('SUM(search_count) DESC')
->limit($remaining * 2)
->field('keyword, SUM(search_count) as total_searches')
->select();
foreach ($food_keywords as $keyword_item) {
$keyword = $keyword_item['keyword'];
// 查找匹配的食材
$food = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
->where('name', 'like', '%' . $keyword . '%')
->where('is_del', 0)
->whereNotIn('id', array_column($foods, 'id'))
->field('id, name, "food" as type')
->find();
if ($food) {
$foods[] = $food;
if (count($foods) >= $limit) break;
}
}
}
// 方法3如果还不够从食材表中获取常用食材
if (count($foods) < $limit) {
$remaining = $limit - count($foods);
$more_foods = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
->where('is_del', 0)
->whereNotIn('id', array_column($foods, 'id'))
->field('id, name, "food" as type')
->order('id DESC')
->limit($remaining)
->select();
$foods = array_merge($foods, $more_foods ?: []);
}
return array_slice($foods, 0, $limit);
}
/**
* 获取食谱推荐(老用户)
*/
private function getCookbookRecommendations($user_id, $tag_limit, $item_limit) {
$result = [];
$preferred_tags = $this->getUserCookbookTags($user_id, $tag_limit);
if (empty($preferred_tags)) {
$preferred_tags = $this->getHotCookbookTags($tag_limit);
}
foreach ($preferred_tags as $tag_info) {
$tag_name = $tag_info['tag_name'];
$recipes = $this->getRecipesByTag($tag_name, $item_limit);
if (!empty($recipes)) {
$result[$tag_name] = $recipes;
}
}
return $result;
}
/**
* 获取用户食谱标签(基于用户搜索记录和饮食记录)
*/
private function getUserCookbookTags($user_id, $limit) {
$cfc = Db::connect('cfc_db');
$tags = [];
// 从用户搜索记录中获取标签
$user_search_tags = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where('user_id', $user_id)
->where('is_del', 0)
->order('search_count DESC, last_searched_at DESC')
->limit($limit * 2)
->field('keyword, search_count')
->select();
foreach ($user_search_tags as $search_item) {
$keyword = $search_item['keyword'];
// 验证关键词是否对应有效的菜谱标签
$valid_tag = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
->where('label_name', 'like', '%' . $keyword . '%')
->where('is_del', 0)
->find();
if ($valid_tag) {
$tags[] = [
'tag_name' => $valid_tag['label_name'],
'tag_id' => $valid_tag['id'],
'source' => 'search',
'weight' => $search_item['search_count']
];
}
if (count($tags) >= $limit) break;
}
// 从用户饮食记录中分析标签(通过食材关联菜谱标签)
if (count($tags) < $limit) {
$user_diet_foods = $cfc->table($this->kitchenscale_db_msg['kcal_log'] . ' kcal')
->join($this->kitchenscale_db_msg['foodlist3'] . ' f3', 'kcal.food_id = f3.id')
->where('kcal.aud_id', $user_id)
->where('kcal.is_del', 0)
->group('f3.id, f3.name')
->order('COUNT(*) DESC')
->limit(5)
->field('f3.id, f3.name, COUNT(*) as eat_count')
->select();
foreach ($user_diet_foods as $food) {
// 查找包含这些食材的菜谱标签
$related_tags = $cfc->table($this->kitchenscale_db_msg['cookbook'] . ' c')
->join($this->kitchenscale_db_msg['cookbook_label'] . ' cl', 'FIND_IN_SET(cl.id, c.cook_label)')
->where('c.food_ids', 'like', '%"' . $food['id'] . '"%')
->where('c.is_del', 0)
->where('cl.is_del', 0)
->group('cl.id, cl.label_name')
->order('COUNT(*) DESC')
->limit(2)
->field('cl.id, cl.label_name, COUNT(*) as recipe_count')
->select();
foreach ($related_tags as $tag) {
if (!in_array($tag['label_name'], array_column($tags, 'tag_name'))) {
$tags[] = [
'tag_name' => $tag['label_name'],
'tag_id' => $tag['id'],
'source' => 'diet',
'weight' => $food['eat_count']
];
}
if (count($tags) >= $limit) break;
}
if (count($tags) >= $limit) break;
}
}
// 按权重排序
usort($tags, function($a, $b) {
return $b['weight'] <=> $a['weight'];
});
return array_slice($tags, 0, $limit);
}
/**
* 获取热门食谱标签(基于所有用户数据)
*/
private function getHotCookbookTags($limit) {
$cfc = Db::connect('cfc_db');
// 从搜索记录中分析热门标签
$hot_search_tags = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where('is_del', 0)
->group('keyword')
->order('SUM(search_count) DESC')
->limit($limit * 2)
->field('keyword, SUM(search_count) as total_searches')
->select();
$tags = [];
foreach ($hot_search_tags as $search_item) {
$keyword = $search_item['keyword'];
$valid_tag = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
->where('label_name', 'like', '%' . $keyword . '%')
->where('is_del', 0)
->find();
if ($valid_tag && !in_array($valid_tag['label_name'], array_column($tags, 'tag_name'))) {
$tags[] = [
'tag_name' => $valid_tag['label_name'],
'tag_id' => $valid_tag['id'],
'search_count' => $search_item['total_searches']
];
}
if (count($tags) >= $limit) break;
}
// 如果不够,从标签表中获取
if (count($tags) < $limit) {
$remaining = $limit - count($tags);
$more_tags = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
->where('is_del', 0)
->whereNotIn('id', array_column($tags, 'tag_id'))
->field('id, label_name as tag_name')
->order('id DESC')
->limit($remaining)
->select();
$tags = array_merge($tags, $more_tags ?: []);
}
return array_slice($tags, 0, $limit);
}
/**
* 根据标签获取食谱
*/
private function getRecipesByTag($tag_name, $limit) {
$cfc = Db::connect('cfc_db');
$recipes = $cfc->table($this->kitchenscale_db_msg['cookbook'] . ' c')
->join($this->kitchenscale_db_msg['cookbook_label'] . ' cl', 'FIND_IN_SET(cl.id, c.cook_label)')
->where('cl.label_name', 'like', '%' . $tag_name . '%')
->where('c.is_del', 0)
->where('cl.is_del', 0)
->field('c.id, c.title as name, "cookbook" as type')
->order('c.create_time DESC')
->limit($limit)
->select();
return $recipes ?: [];
}
/**
* 获取食材推荐(老用户)
*/
private function getFoodRecommendations($user_id, $tag_limit, $item_limit) {
$result = [];
$preferred_categories = $this->getUserFoodCategories($user_id, $tag_limit);
if (empty($preferred_categories)) {
$preferred_categories = $this->getHotFoodCategories($tag_limit);
}
foreach ($preferred_categories as $category_info) {
$category_name = $category_info['category_name'];
$foods = $this->getFoodsByCategory($category_info['category_id'], $item_limit);
if (!empty($foods)) {
$result[$category_name] = $foods;
}
}
return $result;
}
/**
* 获取用户食材分类(基于用户饮食记录)
*/
private function getUserFoodCategories($user_id, $limit) {
$cfc = Db::connect('cfc_db');
$categories = [];
$diet_categories = $cfc->table($this->kitchenscale_db_msg['kcal_log'] . ' kcal')
->join($this->kitchenscale_db_msg['foodlist3'] . ' f3', 'kcal.food_id = f3.id')
->join($this->kitchenscale_db_msg['foodlist2'] . ' f2', 'f3.two_id = f2.id')
->where('kcal.aud_id', $user_id)
->where('kcal.is_del', 0)
->group('f2.id, f2.name')
->order('COUNT(*) DESC')
->limit($limit)
->field('f2.id as category_id, f2.name as category_name, COUNT(*) as eat_count')
->select();
foreach ($diet_categories as $category) {
$categories[] = [
'category_id' => $category['category_id'],
'category_name' => $category['category_name'],
'eat_count' => $category['eat_count']
];
}
return array_slice($categories, 0, $limit);
}
/**
* 获取热门食材分类(基于所有用户数据)
*/
private function getHotFoodCategories($limit) {
$cfc = Db::connect('cfc_db');
// 从饮食记录中分析热门分类
$hot_categories = $cfc->table($this->kitchenscale_db_msg['kcal_log'] . ' kcal')
->join($this->kitchenscale_db_msg['foodlist3'] . ' f3', 'kcal.food_id = f3.id')
->join($this->kitchenscale_db_msg['foodlist2'] . ' f2', 'f3.two_id = f2.id')
->where('kcal.is_del', 0)
->group('f2.id, f2.name')
->order('COUNT(*) DESC')
->limit($limit)
->field('f2.id as category_id, f2.name as category_name, COUNT(*) as total_eat_count')
->select();
if ($hot_categories && count($hot_categories) >= $limit) {
return $hot_categories;
}
// 如果不够,从分类表中获取
$categories = $hot_categories ?: [];
if (count($categories) < $limit) {
$remaining = $limit - count($categories);
$more_categories = $cfc->table($this->kitchenscale_db_msg['foodlist2'])
->where('is_del', 0)
->whereNotIn('id', array_column($categories, 'category_id'))
->field('id as category_id, name as category_name')
->order('id DESC')
->limit($remaining)
->select();
$categories = array_merge($categories, $more_categories ?: []);
}
return array_slice($categories, 0, $limit);
}
/**
* 根据分类获取食材
*/
private function getFoodsByCategory($category_id, $limit) {
$cfc = Db::connect('cfc_db');
$foods = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
->where('two_id', $category_id)
->where('is_del', 0)
->field('id, name, "food" as type')
->order('id DESC')
->limit($limit)
->select();
return $foods ?: [];
}
/**
* 生成缓存key
*/
private function generateCacheKey($user_id, $input_tags, $tag_limit) {
return $user_id . ':' . $input_tags . ':' . $tag_limit;
}
/**
* 获取缓存推荐
*/
private function getCachedRecommendation($cache_key) {
$cfc = Db::connect('cfc_db');
$cache = $cfc->table($this->kitchenscale_db_msg['recommend_cache'])
->where('cache_key', $cache_key)
->where('is_del', 0)
->where('last_hit', '>=', date('Y-m-d H:i:s', time() - $this->config['cache_time']))
->find();
if ($cache) {
$cfc->table($this->kitchenscale_db_msg['recommend_cache'])
->where('id', $cache['id'])
->update([
'hit_count' => $cache['hit_count'] + 1,
'last_hit' => date('Y-m-d H:i:s')
]);
return json_decode($cache['recommend_data'], true);
}
return null;
}
/**
* 缓存推荐结果
*/
private function cacheRecommendation($cache_key, $data, $user_id, $input_tags) {
$cfc = Db::connect('cfc_db');
$cache_data = [
'cache_key' => $cache_key,
'user_id' => $user_id,
'keyword' => $input_tags,
'recommend_data' => json_encode($data, JSON_UNESCAPED_UNICODE),
'hit_count' => 1,
'last_hit' => date('Y-m-d H:i:s'),
'create_time' => date('Y-m-d H:i:s')
];
$cfc->table($this->kitchenscale_db_msg['recommend_cache'])
->insert($cache_data);
}
/**
* 记录用户标签点击(用于更新偏好权重)
*/
public function recordTagClick($user_id, $tag_name, $tag_type) {
try {
$cfc = Db::connect('cfc_db');
$preference = $cfc->table($this->kitchenscale_db_msg['tag_preference'])
->where('user_id', $user_id)
->where('tag_name', $tag_name)
->where('tag_type', $tag_type)
->where('is_del', 0)
->find();
if ($preference) {
$new_weight = min($preference['preference_weight'] + 1, 10);
$cfc->table($this->kitchenscale_db_msg['tag_preference'])
->where('id', $preference['id'])
->update([
'preference_weight' => $new_weight,
'last_updated' => date('Y-m-d H:i:s')
]);
} else {
$cfc->table($this->kitchenscale_db_msg['tag_preference'])
->insert([
'user_id' => $user_id,
'tag_type' => $tag_type,
'tag_name' => $tag_name,
'tag_id' => 0,
'preference_weight' => 1,
'create_time' => date('Y-m-d H:i:s'),
'last_updated' => date('Y-m-d H:i:s')
]);
}
return true;
} catch (\Exception $e) {
return false;
}
}
/**
* 清除用户推荐缓存
*/
public function clearUserCache($user_id) {
try {
$cfc = Db::connect('cfc_db');
$cfc->table($this->kitchenscale_db_msg['recommend_cache'])
->where('user_id', $user_id)
->update(['is_del' => 1]);
return true;
} catch (\Exception $e) {
return false;
}
}
/**
* 获取推荐统计信息
*/
public function getRecommendStats($user_id) {
$cfc = Db::connect('cfc_db');
$cache_stats = $cfc->table($this->kitchenscale_db_msg['recommend_cache'])
->where('user_id', $user_id)
->where('is_del', 0)
->field('COUNT(*) as cache_count, SUM(hit_count) as total_hits')
->find();
$preference_stats = $cfc->table($this->kitchenscale_db_msg['tag_preference'])
->where('user_id', $user_id)
->where('is_del', 0)
->field('COUNT(*) as tag_count, AVG(preference_weight) as avg_weight')
->find();
return [
'cache_count' => $cache_stats['cache_count'] ?? 0,
'total_hits' => $cache_stats['total_hits'] ?? 0,
'tag_count' => $preference_stats['tag_count'] ?? 0,
'avg_weight' => round($preference_stats['avg_weight'] ?? 0, 2)
];
}
/**
* 测试方法
*/
public function test() {
$user_id = 1;
// 测试新用户食谱推荐
$result1 = $this->getGuessYouLike($user_id, 'cookbook');
// 测试新用户食材推荐
$result2 = $this->getGuessYouLike($user_id, 'food');
// 自定义数量
$result3 = $this->getGuessYouLike($user_id, 'cookbook', 3);
// 记录标签点击
$this->recordTagClick($user_id, '家常菜', 'cookbook_label');
// 获取统计信息
$stats = $this->getRecommendStats($user_id);
return [
'cookbook_result' => $result1,
'food_result' => $result2,
'custom_limit' => $result3,
'stats' => $stats
];
}
/**
* 成功返回方法
*/
private function success($msg, $data = []) {
return ['code' => 1, 'msg' => $msg, 'data' => $data];
}
/**
* 错误返回方法
*/
private function error($msg) {
return ['code' => 0, 'msg' => $msg, 'data' => []];
}
}

View File

@ -25,7 +25,15 @@ class Index extends Base{
'collect_list'=>'app_user_collect_list',//点赞表 'collect_list'=>'app_user_collect_list',//点赞表
'banner'=>'app_banner_data',//banner 'banner'=>'app_banner_data',//banner
'version'=>'app_version_log',//版本表 'version'=>'app_version_log',//版本表
'user'=>'app_user_data',//banner 'user'=>'app_user_data',//用户表
'kcal_log'=>'app_user_kcal_log',//饮食记录表
'search_log'=>'app_user_search_log',//搜索历史表
];
protected $reedaw_db_name = [
'banner'=>'admin_notice_banner',//菜谱表
]; ];
@ -157,33 +165,31 @@ class Index extends Base{
} }
// 获取默认配置信息(包含:食材的分类列表,用户角色信息)(OK) // 获取默认配置信息(包含:食材的分类列表,用户角色信息)(OK)
public function get_default_config($data = ['token'=>'']){ public function get_default_config(){
try { // try {
if(count(input('post.')) > 0){
$data = input('post.'); $data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001);
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005);
} }
// if(!array_key_exists('token', $data)){
// return $this->msg(10001);
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005);
// }
$return_data = $this->get_default_config_action($data); $return_data = $this->get_default_config_action($data);
return $return_data; return $return_data;
} catch (\Exception $e) { // } catch (\Exception $e) {
// 捕获异常 // // 捕获异常
$logContent["flie"] = $e->getFile(); // $logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine(); // $logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n"; // $logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n"; // $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n"; // $logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n"; // $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n"; // $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n"; // $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n"; // $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null); // $this->record_api_log($data, $logContent, null);
return $this->msg(99999); // return $this->msg(99999);
} // }
} }
// 首页搜索接口(OK) // 首页搜索接口(OK)
@ -227,55 +233,123 @@ class Index extends Base{
#######################################################################action####################################################################### #######################################################################action#######################################################################
#######################################################################action####################################################################### #######################################################################action#######################################################################
// 老版
// public function get_default_config_action($data){
// $return_data = [
// 'cook_label'=>[],
// // 'account'=>[],
// 'food_list'=>[],
// 'banner'=>[],
// 'jingang_region'=>[
// ['name'=>'菜谱分类','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra1.png'],
// ['name'=>'我的收藏','jump_url'=>'/pageTwo/me/mymenu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra2.png'],
// ['name'=>'热量计算','jump_url'=>'/pages/count/count','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra3.png'],
// ['name'=>'健康食谱','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra4.png'],
// ],
// ];
// $cfc = Db::connect('cfc_db');
// // // 获取食材分类列表start
// // $foodlist1 = $cfc->table($this->kitchenscale_db_msg['foodlist1'])->where("is_del = 0")->order('sort_num desc')->field('id,name')->select();
// $foodlist1 = $cfc->query("SELECT id,name FROM ".$this->kitchenscale_db_msg['foodlist1']." WHERE is_del = 0 ORDER BY sort_num");
// // dump($foodlist1);
// // die;
// $foodlist2 = $cfc->table($this->kitchenscale_db_msg['foodlist2'])->where("is_del = 0")->field('id,name,one_id')->select();
// // dump($foodlist3);
// foreach ($foodlist1 as $key => $value) {
// unset($foodlist1[$key]['ROW_NUMBER']);
// $foodlist1[$key]['list'] = [];
// foreach ($foodlist2 as $k => $v) {
// if($v['one_id'] == $value['id']){
// unset($foodlist2[$k]['ROW_NUMBER']);
// array_push($foodlist1[$key]['list'],$foodlist2[$k]);
// // unset($foodlist2[$k]);
// }
// }
// }
// $return_data['food_list'] = $foodlist1;
// // // 获取食材分类列表end
// // 获取菜谱分类标签start
// $cook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
// ->where("is_del = 0")
// ->field('id,name')
// ->select();
// foreach ($cook_label as $key => $value) {
// unset($cook_label[$key]['ROW_NUMBER']);
// }
// $return_data['cook_label'] = $cook_label;
// // 获取菜谱分类标签end
// // 获取首页信息start
// // 获取banner
// $banner_list = $cfc->query("select b.id,b.title,b.cover,b.create_user_head_pic,b.create_user_nickname,c.pic_url
// from ".$this->kitchenscale_db_msg['banner']." as a
// LEFT JOIN ".$this->kitchenscale_db_msg['cookbook']." as b on a.cookbook_id = b.id
// LEFT JOIN ".$this->kitchenscale_db_msg['uploadimg']." as c on b.cover = c.id
// where a.is_del=0 AND b.is_del=0
// ORDER BY a.sort_num desc,a.id desc
// ");
// // dump($banner_list);
// // die;
// if($data['token'] != ''){
// // 获取账号下信息以及用户信息
// $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic,tel,email')->find();
// if(!$user_data){
// return $this->msg(20001,'账号信息错误');
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005);
// }
// // 获取账号下信息以及用户信息
// $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
// if(!$user_data){
// return $this->msg(20001,'账号信息错误');
// }
// $collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'is_del'=>0])->column('cookbook_id');
// foreach ($banner_list as $key => $value) {
// if(array_key_exists($value['id'],$collect_list)){
// $banner_list[$key]['is_me_like_it'] = 'yes';
// }else{
// $banner_list[$key]['is_me_like_it'] = 'no';
// }
// unset($banner_list[$key]['ROW_NUMBER']);
// }
// }else{
// foreach ($banner_list as $key => $value) {
// $banner_list[$key]['is_me_like_it'] = 'no';
// unset($banner_list[$key]['ROW_NUMBER']);
// }
// }
// $return_data['banner'] = $banner_list;
// // return $this->msg($return_data);
// // 获取首页信息end
// return $this->msg($return_data);
// }
// 新版
public function get_default_config_action($data){ public function get_default_config_action($data){
$return_data = [ $return_data = [
'cook_label'=>[], 'user_data'=>[],
// 'account'=>[], 'kcal_data'=>[
'food_list'=>[], 'title'=>'今日已摄入热量(千卡)',
'banner'=>[], 'kcal'=>['value'=>0,'unit'=>'kcal','standard'=>'不达标','color'=>'#F0AD4E'],
'jingang_region'=>[ 'other_elements'=>[
['name'=>'菜谱分类','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra1.png'], 'carbohydrate'=>['value'=>0,'unit'=>'g'],
['name'=>'我的收藏','jump_url'=>'/pageTwo/me/mymenu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra2.png'], 'protein'=>['value'=>0,'unit'=>'g'],
['name'=>'热量计算','jump_url'=>'/pages/count/count','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra3.png'], 'fat'=>['value'=>0,'unit'=>'g'],
['name'=>'健康食谱','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra4.png'],
], ],
'list'=>[
['title'=>'早餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'],
['title'=>'午餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'],
['title'=>'晚餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'],
['title'=>'加餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'],
],
],
'banner_data'=>[],
'search_history'=>[],
'search_guess'=>[],
]; ];
$cfc = Db::connect('cfc_db'); $cfc = Db::connect('cfc_db');
// // 获取食材分类列表start
// $foodlist1 = $cfc->table($this->kitchenscale_db_msg['foodlist1'])->where("is_del = 0")->order('sort_num desc')->field('id,name')->select();
$foodlist1 = $cfc->query("SELECT id,name FROM ".$this->kitchenscale_db_msg['foodlist1']." WHERE is_del = 0 ORDER BY sort_num");
// dump($foodlist1);
// die;
$foodlist2 = $cfc->table($this->kitchenscale_db_msg['foodlist2'])->where("is_del = 0")->field('id,name,one_id')->select();
// dump($foodlist3);
foreach ($foodlist1 as $key => $value) {
unset($foodlist1[$key]['ROW_NUMBER']);
$foodlist1[$key]['list'] = [];
foreach ($foodlist2 as $k => $v) {
if($v['one_id'] == $value['id']){
unset($foodlist2[$k]['ROW_NUMBER']);
array_push($foodlist1[$key]['list'],$foodlist2[$k]);
// unset($foodlist2[$k]);
}
}
}
$return_data['food_list'] = $foodlist1;
// // 获取食材分类列表end
// 获取菜谱分类标签start
$cook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
->where("is_del = 0")
->field('id,name')
->select();
foreach ($cook_label as $key => $value) {
unset($cook_label[$key]['ROW_NUMBER']);
}
$return_data['cook_label'] = $cook_label;
// 获取菜谱分类标签end
// 获取首页信息start
// 获取banner // 获取banner
$banner_list = $cfc->query("select b.id,b.title,b.cover,b.create_user_head_pic,b.create_user_nickname,c.pic_url $banner_list = $cfc->query("select b.id,b.title,b.cover,b.create_user_head_pic,b.create_user_nickname,c.pic_url
from ".$this->kitchenscale_db_msg['banner']." as a from ".$this->kitchenscale_db_msg['banner']." as a
@ -284,43 +358,106 @@ class Index extends Base{
where a.is_del=0 AND b.is_del=0 where a.is_del=0 AND b.is_del=0
ORDER BY a.sort_num desc,a.id desc ORDER BY a.sort_num desc,a.id desc
"); ");
// dump($banner_list); // 如果有账号信息
// die;
if($data['token'] != ''){ if($data['token'] != ''){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic,tel,email')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
if(!$this->verify_data_is_ok($data['token'],'str')){ if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005); return $this->msg(10005);
} }
// 获取账号下信息以及用户信息 // 获取账号下信息以及用户信息 start
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find(); $user = $cfc->table($this->kitchenscale_db_msg['user'])->where(["token"=>$data['token']])->find();
if(!$user_data){ if(!$user){
return $this->msg(20001,'账号信息错误'); return $this->msg(20001,'账号信息错误');
} }
$collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'is_del'=>0])->column('cookbook_id'); $return_data['user_data'] = $user;
foreach ($banner_list as $key => $value) { if($return_data['user_data']['birthday']){
if(array_key_exists($value['id'],$collect_list)){ $return_data['user_data']['age'] = $this->calculate_age($return_data['user_data']['birthday']);
$banner_list[$key]['is_me_like_it'] = 'yes'; }
unset($return_data['user_data']['id']);
unset($return_data['user_data']['token']);
unset($return_data['user_data']['update_time']);
unset($return_data['user_data']['ROW_NUMBER']);
// 获取账号下信息以及用户信息 end
// 处理计食器信息 start
$kcal = $cfc->table($this->kitchenscale_db_msg['kcal_log'])->where(["aud_id"=>$user['id'],'is_del'=>0])->whereTime('create_time', 'today')->order('id desc')->select();
if(count($kcal)>0){
$return_data['kcal_data']['title'] = '今日已摄入热量(千卡)'.$kcal[0]['create_time'];
foreach ($kcal as $key => $value) {
$return_data['kcal_data']['kcal']['value'] = bcadd($return_data['kcal_data']['kcal']['value'],$value['kcal_val'],2);
$return_data['kcal_data']['other_elements']['carbohydrate']['value'] = bcadd($return_data['kcal_data']['other_elements']['carbohydrate']['value'],$value['carbohydrate_val'],2);
$return_data['kcal_data']['other_elements']['protein']['value'] = bcadd($return_data['kcal_data']['other_elements']['protein']['value'],$value['protein_val'],2);
$return_data['kcal_data']['other_elements']['fat']['value'] = bcadd($return_data['kcal_data']['other_elements']['fat']['value'],$value['fat_val'],2);
if($value['meals_type'] == '早餐'){
$return_data['kcal_data']['list'][0]['value'] = bcadd($return_data['kcal_data']['list'][0]['value'],$value['kcal_val'],2);
}else if($value['meals_type'] == '午餐'){
$return_data['kcal_data']['list'][1]['value'] = bcadd($return_data['kcal_data']['list'][1]['value'],$value['kcal_val'],2);
}else if($value['meals_type'] == '晚餐'){
$return_data['kcal_data']['list'][2]['value'] = bcadd($return_data['kcal_data']['list'][2]['value'],$value['kcal_val'],2);
}else{ }else{
$banner_list[$key]['is_me_like_it'] = 'no'; $return_data['kcal_data']['list'][3]['value'] = bcadd($return_data['kcal_data']['list'][3]['value'],$value['kcal_val'],2);
} }
unset($banner_list[$key]['ROW_NUMBER']); }
} foreach ($return_data['kcal_data']['list'] as $key => $value) {
}else{ if($value['value'] <= 0){
foreach ($banner_list as $key => $value) { $return_data['kcal_data']['list'][$key]['value'] = '-';
$banner_list[$key]['is_me_like_it'] = 'no';
unset($banner_list[$key]['ROW_NUMBER']);
} }
} }
$return_data['banner'] = $banner_list;
// return $this->msg($return_data);
// 获取首页信息end
return $this->msg($return_data);
} }
if($user['is_use_set_kcal'] == 1){
$nutrition_data['kcal'] = $user['set_kcal'];
}else{
$user['age_num'] = $return_data['user_data']['age'];
$nutrition_data = $this->count_user_nutrition_all($user);
}
if(bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) < 0.9){
$return_data['kcal_data']['kcal']['standard'] = '不达标';
$return_data['kcal_data']['kcal']['color'] = '#F0AD4E';
}else if(bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) >= 0.9 && bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) < 1.1){
$return_data['kcal_data']['kcal']['standard'] = '达标';
$return_data['kcal_data']['kcal']['color'] = '#4CD964';
}else{
$return_data['kcal_data']['kcal']['standard'] = '超标';
$return_data['kcal_data']['kcal']['color'] = '#FF0000';
}
// 处理计食器信息 end
// 处理搜索历史 start
$search_log = $cfc->table($this->kitchenscale_db_msg['search_log'])->where(["aud_id"=>$user['id'],'is_del'=>0])->order('id desc')->limit(30)->select();
$return_data['search_history'] = $search_log;
// 处理搜索历史 end
}else{
// foreach ($banner_list as $key => $value) {
// $banner_list[$key]['is_me_like_it'] = 'no';
// unset($banner_list[$key]['ROW_NUMBER']);
// }
}
// 处理banner信息 start
// $collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'is_del'=>0])->column('cookbook_id');
// foreach ($banner_list as $key => $value) {
// if(array_key_exists($value['id'],$collect_list)){
// $banner_list[$key]['is_me_like_it'] = 'yes';
// }else{
// $banner_list[$key]['is_me_like_it'] = 'no';
// }
// unset($banner_list[$key]['ROW_NUMBER']);
// }
$banner_list = Db::table($this->reedaw_db_name['banner'])->where(['scene_data' => '3','is_del'=>0])->cache(3600)->order('sort_num desc')->field('id,type,pic,jump_url,parameter_data,sort_num')->select();
for ($i=0; $i < count($banner_list); $i++) {
if($banner_list[$i]['type'] != 1){
$banner_list[$i]['parameter_data'] = '';
}
unset($banner_list[$i]['sort_num']);
unset($banner_list[$i]['ROW_NUMBER']);
}
// 处理banner信息 end
$return_data['banner_data'] = $banner_list;
return $this->msg($return_data);
}
public function search_column_action($data){ public function search_column_action($data){

View File

@ -65,7 +65,7 @@ class Usercenter extends Base{
} }
} }
// 修改用户 // 修改用户
public function update_user_msg($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a','nickname'=>'测试人员001','gender'=>'1','age'=>'18','height'=>'165.34','weight'=>'55.55']){ public function update_user_msg(){
try { try {
if(count(input('post.')) > 0){ if(count(input('post.')) > 0){
$data = input('post.'); $data = input('post.');
@ -79,8 +79,8 @@ class Usercenter extends Base{
if(!array_key_exists('gender', $data)){ if(!array_key_exists('gender', $data)){
return $this->msg(10001,'gender is miss'); return $this->msg(10001,'gender is miss');
} }
if(!array_key_exists('age', $data)){ if(!array_key_exists('birthday', $data)){
return $this->msg(10001,'age is miss'); return $this->msg(10001,'birthday is miss');
} }
if(!array_key_exists('height', $data)){ if(!array_key_exists('height', $data)){
return $this->msg(10001,'height is miss'); return $this->msg(10001,'height is miss');
@ -97,8 +97,8 @@ class Usercenter extends Base{
if(!$this->verify_data_is_ok($data['gender'],'intnum')){ if(!$this->verify_data_is_ok($data['gender'],'intnum')){
return $this->msg(10005,'gender type is error'); return $this->msg(10005,'gender type is error');
} }
if(!$this->verify_data_is_ok($data['age'],'intnum')){ if(!$this->verify_data_is_ok($data['birthday'],'datetime')){
return $this->msg(10005,'age type is error'); return $this->msg(10005,'birthday type is error');
} }
if(!$this->verify_data_is_ok($data['height'],'num')){ if(!$this->verify_data_is_ok($data['height'],'num')){
return $this->msg(10005,'height type is error'); return $this->msg(10005,'height type is error');
@ -305,7 +305,7 @@ class Usercenter extends Base{
$user_msg['nickname'] = $data['nickname']; $user_msg['nickname'] = $data['nickname'];
$user_msg['head_pic'] = $data['gender'] == 1?'https://tc.pcxbc.com/tsf/1.png':'https://tc.pcxbc.com/tsf/2.png'; $user_msg['head_pic'] = $data['gender'] == 1?'https://tc.pcxbc.com/tsf/1.png':'https://tc.pcxbc.com/tsf/2.png';
$user_msg['gender'] = $data['gender']; $user_msg['gender'] = $data['gender'];
$user_msg['age'] = $data['age']; $user_msg['birthday'] = $data['birthday'];
$user_msg['height'] = $data['height']; $user_msg['height'] = $data['height'];
$user_msg['weight'] = $data['weight']; $user_msg['weight'] = $data['weight'];

View File

@ -46,6 +46,7 @@ class Printaction extends Base
a.mac_code, a.mac_code,
a.sn_code, a.sn_code,
b.box_code, b.box_code,
b.is_del,
FORMAT(b.box_num, '000') AS box_num FORMAT(b.box_num, '000') AS box_num
FROM FROM
sn_code_all AS a sn_code_all AS a
@ -62,10 +63,10 @@ class Printaction extends Base
return $result; return $result;
}else{ }else{
$result2 = [ $result2 = [
['Mac码','Sn码','箱号'] ['Mac码','Sn码','箱号','是否注销']
]; ];
for ($i=0; $i < count($result); $i++) { for ($i=0; $i < count($result); $i++) {
$result2[] = [$result[$i]['mac_code'],$result[$i]['sn_code'],$result[$i]['box_code'].'-'.$result[$i]['box_num']]; $result2[] = [$result[$i]['mac_code'],$result[$i]['sn_code'],$result[$i]['box_code'].'-'.$result[$i]['box_num'],$result[$i]['is_del']==0?'否':'是'];
} }
$excel = new \app\download\controller\Excel(); $excel = new \app\download\controller\Excel();
$excel->export($result2, $pc['box_code']); $excel->export($result2, $pc['box_code']);

View File

@ -96,7 +96,7 @@ class Savemsg extends Base{
public function save_box_msg($data = ['sn_code_all'=>'564654564654654,564654564654654','box_serial_number'=>'996589585']){ public function save_box_msg($data = ['sn_code_all'=>'564654564654654,564654564654654','box_serial_number'=>'996589585']){
// try { try {
// 你的业务逻辑 // 你的业务逻辑
if(count(input('post.')) > 0){ if(count(input('post.')) > 0){
$data = input('post.'); $data = input('post.');
@ -115,22 +115,22 @@ class Savemsg extends Base{
} }
$result = $this->save_box_msg_action($data); $result = $this->save_box_msg_action($data);
return $result; return $result;
// } catch (\Exception $e) { } catch (\Exception $e) {
// // 捕获异常 // 捕获异常
// $logContent["flie"] = $e->getFile(); $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine(); $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n"; $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n"; $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n"; $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n"; $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "函数名: " . __FUNCTION__ . "\n"; $logContent['all_content'] .= "函数名: " . __FUNCTION__ . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n"; $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n"; $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// // dump($data); // dump($data);
// // die; // die;
// $this->record_api_log($data, $logContent, null); $this->record_api_log($data, $logContent, null);
// return $this->msg(99999); return $this->msg(99999);
// } }
} }
@ -175,6 +175,11 @@ class Savemsg extends Base{
} }
public function logout_outbox_code(){
return $this->fetch();
}
########################################################################action######################################################################## ########################################################################action########################################################################
@ -212,9 +217,20 @@ class Savemsg extends Base{
public function save_sn_msg_action($data){ public function save_sn_msg_action($data){
$data = $this->chuli_str_kongbai($data); $data = $this->chuli_str_kongbai($data);
$zengjie = Db::connect('zengjie_db'); $zengjie = Db::connect('zengjie_db');
$sn_code = $zengjie->table('sn_code_all')->where(['sn_code'=>$data['sn_code']])->count(); $sn_code = $zengjie->table('sn_code_all')->where(['sn_code'=>$data['sn_code']])->find();
if($sn_code > 0){
if($sn_code){
$box_state = $zengjie->table('box_code_all')->where(['id'=>$sn_code['batch_id']])->field('id,is_del')->find();
if($box_state['is_del'] == 0){
return $this->msg(10002,'该码已录入'); return $this->msg(10002,'该码已录入');
}else{
$sn_del_state = $zengjie->table('sn_code_all')->where(['id'=>$sn_code['id']])->delete();
if ($sn_del_state) {
// return $this->msg(10000, '删除成功'); // 假设10000是成功代码
} else {
return $this->msg(10002, '数据错误请重新尝试');
}
}
} }
$result = $zengjie->table('sn_code_all')->insert([ $result = $zengjie->table('sn_code_all')->insert([
@ -354,6 +370,24 @@ class Savemsg extends Base{
return $data; return $data;
} }
public function logout_outbox_code_action(){
$data = input();
// 处理前导零
$boxNumber = ltrim($data['boxNumber'], '0');
$boxNumber = $boxNumber === '' ? '0' : $boxNumber;
$zengjie = Db::connect('zengjie_db');
$box_result = $zengjie->table('box_code_all')->where(['box_code'=>$data['boxCode'],'box_num'=>$boxNumber])->count();
if($box_result <= 0){
return $this->msg(10002,'未找到对应外箱编码');
}
$result = $zengjie->table('box_code_all')->where(['box_code'=>$data['boxCode'],'box_num'=>$boxNumber])->update(['is_del'=>1]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002,'注销失败');
}
}
######################################################测试######################################################### ######################################################测试#########################################################
######################################################测试######################################################### ######################################################测试#########################################################
######################################################测试######################################################### ######################################################测试#########################################################

View File

@ -32,12 +32,20 @@
<th>MAC地址</th> <th>MAC地址</th>
<th>SN码</th> <th>SN码</th>
<th>箱号</th> <th>箱号</th>
<th>是否注销</th>
</tr> </tr>
{volist name="data" id="item"} {volist name="data" id="item"}
<tr> <tr>
<td>{$item.mac_code|default='未分配'}</td> <td>{$item.mac_code|default='未分配'}</td>
<td>{$item.sn_code}</td> <td>{$item.sn_code}</td>
<td>{$item.box_code}-{$item.box_num}</td> <td>{$item.box_code}-{$item.box_num}</td>
<td>
{if condition="$item.is_del == 0"}
{else /}
{/if}
</td>
</tr> </tr>
{/volist} {/volist}
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -148,7 +148,7 @@ class Base extends Controller{
return ['state'=>false,'language'=>null]; return ['state'=>false,'language'=>null];
} }
$user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->field('id,login_time,language')->find(); $user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token,'is_del'=>0])->field('id,login_time,language')->find();
if(!$user_login){ if(!$user_login){
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败未找到用户token', 'token_log'); Log::record('用户尝试更新token时间token' . $token.',但是更新token失败未找到用户token', 'token_log');
return ['state'=>false,'language'=>null]; return ['state'=>false,'language'=>null];
@ -177,8 +177,8 @@ class Base extends Controller{
return ['state'=>false,'language'=>$user_login['language']]; return ['state'=>false,'language'=>$user_login['language']];
} else { } else {
// echo "未超过 {$specifiedDays} 天"; // echo "未超过 {$specifiedDays} 天";
$user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->update(['login_time'=>date('Y-m-d H:i:s')]); $result = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->update(['login_time'=>date('Y-m-d H:i:s')]);
if($user_login){ if($result){
Log::record('用户尝试更新token时间token' . $token.',记录成功,最新的时间为'.date('Y-m-d H:i:s'), 'token_log'); Log::record('用户尝试更新token时间token' . $token.',记录成功,最新的时间为'.date('Y-m-d H:i:s'), 'token_log');
return ['state'=>true,'language'=>$user_login['language']]; return ['state'=>true,'language'=>$user_login['language']];
}else{ }else{

View File

@ -100,10 +100,17 @@ class Card extends Base{
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005); return $this->msg(10005);
} }
$user_languages = Db::table('app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->field('id,language')->find();
if(!$user_languages){
return $this->msg(10003);
}
// $return_data; // $return_data;
$return_data = $this->get_user_body_data($data); $return_data = $this->get_user_body_data($data);
// $language_data = new Language(); // 处理多语言
// $return_data = $language_data->handling_languages_from_multiple_countries('en', $return_data->getData()); if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){
$language_data = new Language();
$return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData());
}
return $return_data; return $return_data;
} catch (\Exception $e) { } catch (\Exception $e) {
// 捕获异常 // 捕获异常

View File

@ -147,8 +147,8 @@ class Index extends Base{
$url = ''; $url = '';
} }
$user_token_state = $this->token_time_validate($data['token']); $user_token_state = $this->token_time_validate($data['token']);
$language_data = $this->pd_language($user_token_state['language'],$isSupportedLanguage,$language); $language_data = $this->pd_language($user_token_state['language'],$isSupportedLanguage,$language);
if($user_token_state['state'] === false){ if($user_token_state['state'] === false){
return $this->msg(-1,'未登录',['version'=>$version,'url'=>$url,'language'=>$language_data,'language_arr'=>$this->process_Language()]); return $this->msg(-1,'未登录',['version'=>$version,'url'=>$url,'language'=>$language_data,'language_arr'=>$this->process_Language()]);
}else{ }else{

View File

@ -20,6 +20,19 @@ class Language extends Base
protected $languageMap = [ protected $languageMap = [
'en' => [ 'en' => [
'操作成功' => 'Success', '操作成功' => 'Success',
'关键参数缺失' => 'Required parameter missing',
'操作失败' => 'Operation failed',
'信息核实错误' => 'Information verification error',
'未找到有效数据' => 'No valid data found',
'参数格式错误' => 'Parameter format error',
'参数不能为空' => 'Parameter cannot be empty',
'参数错误' => 'Parameter error',
'自定义信息' => 'Custom message',
'登录失效' => 'Login invalid',
'网络异常,请稍后重试' => 'Network error, please try again later',
'年龄' => 'Age',
'岁' => '',
'无' => 'none',
'体重' => 'Weight', '体重' => 'Weight',
'身高' => 'Height', '身高' => 'Height',
'消瘦' => 'Slim', '消瘦' => 'Slim',
@ -80,9 +93,9 @@ class Language extends Base
'3-7岁的孩子骑两轮车、拍踢球、打篮球、游泳、爬山每天高强度运动不超过30分钟。' => "Ages 37: Bicycling, ball games, basketball, swimming, hiking. Limit high-intensity exercise to 30 minutes daily.", '3-7岁的孩子骑两轮车、拍踢球、打篮球、游泳、爬山每天高强度运动不超过30分钟。' => "Ages 37: Bicycling, ball games, basketball, swimming, hiking. Limit high-intensity exercise to 30 minutes daily.",
'该年龄段睡眠时间建议9-11小时' => "Recommended sleep duration for this age group: 911 hours.", '该年龄段睡眠时间建议9-11小时' => "Recommended sleep duration for this age group: 911 hours.",
'孩子开始对于赞赏、鼓励、认同和肯定有需求,而且此阶段父亲在孩子的性格塑造、情绪控制以及责任感培养方面扮演着重要的角色,必须告诉孩子什么事应该做、什么事不应该做,并经常性地给孩子一些积极地暗示。例如,可以时常向孩子表达“我会一直在你身边,不要害怕””我对你的进步都看在眼里等类似的话语。' => "Children begin to crave praise, encouragement, and validation. Fathers play a key role in shaping character, emotional regulation, and responsibility during this phase. Clearly define boundaries while offering positive affirmations (e.g., 'Im always here for you,' 'I see your progress').", '孩子开始对于赞赏、鼓励、认同和肯定有需求,而且此阶段父亲在孩子的性格塑造、情绪控制以及责任感培养方面扮演着重要的角色,必须告诉孩子什么事应该做、什么事不应该做,并经常性地给孩子一些积极地暗示。例如,可以时常向孩子表达“我会一直在你身边,不要害怕””我对你的进步都看在眼里等类似的话语。' => "Children begin to crave praise, encouragement, and validation. Fathers play a key role in shaping character, emotional regulation, and responsibility during this phase. Clearly define boundaries while offering positive affirmations (e.g., 'Im always here for you,' 'I see your progress').",
'《中华人民共和国卫生行业标准WS 423-2013》' => "《Chinese Health Industry Standard WS 423-2013", '《中华人民共和国卫生行业标准WS/T 423-2022》' => "《Chinese Health Industry Standard WS 423-2022",
'《中华人民共和国卫生行业标准WS/T 612-2018》' => "《Chinese Health Industry Standard WS/T 612-2018》", '《中华人民共和国卫生行业标准WS/T 612-2018》' => "《Chinese Health Industry Standard WS/T 612-2018》",
'《中华人民共和国卫生行业标准WS/T1586-2018》' => "《Chinese Health Industry Standard WS/T 1586-2018》", '《中华人民共和国卫生行业标准WS/T 586-2018》' => "《Chinese Health Industry Standard WS/T 586-2018》",
'《WHO 5~19岁身高/体重判定标准》' => "《WHO Growth Reference for Children and Adolescents (519 Years)》", '《WHO 5~19岁身高/体重判定标准》' => "《WHO Growth Reference for Children and Adolescents (519 Years)》",
'头围' => "Head Circumference", '头围' => "Head Circumference",
'头围是指绕头部一周的最大长度,头围的大小与脑的发育密切相关' => "Head circumference refers to the maximum length around the head. Its measurement is closely related to brain development.", '头围是指绕头部一周的最大长度,头围的大小与脑的发育密切相关' => "Head circumference refers to the maximum length around the head. Its measurement is closely related to brain development.",
@ -90,7 +103,6 @@ class Language extends Base
], ],
// 可以添加更多语言映射 // 可以添加更多语言映射
]; ];
/** /**
* 处理多国语言翻译 * 处理多国语言翻译
* *

View File

@ -87,14 +87,24 @@ class Pagingcontrast extends Base{
if(!$this->verify_data_is_ok($data['type'],'intnum')){ if(!$this->verify_data_is_ok($data['type'],'intnum')){
return $this->msg(10005); return $this->msg(10005);
} }
$token = $data['token'];
$user_languages = Db::table('app_account_number')->where(['token'=>$token,'is_del'=>0])->field('id,language')->find();
if(!$user_languages){
return $this->msg(10003);
}
unset($data['token']); unset($data['token']);
if(array_key_exists($data['type'],$this->db_name)){ if(array_key_exists($data['type'],$this->db_name)){
$return_data = $this->jump_transfer_interface_record($data,'page'); $return_data = $this->jump_transfer_interface_record($data,'page');
}else{ }else{
$return_data = $this->msg(10005); $return_data = $this->msg(10005);
} }
// 处理多语言
if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){
$language_data = new Language();
$return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData());
}
// 成功 // 成功
$this->record_api_log($data, null, $return_data); // $this->record_api_log($data, null, $return_data);
return $return_data; return $return_data;
} catch (\Exception $e) { } catch (\Exception $e) {
// 捕获异常 // 捕获异常
@ -127,10 +137,19 @@ class Pagingcontrast extends Base{
if(!$this->verify_data_is_ok($data['type'],'intnum')){ if(!$this->verify_data_is_ok($data['type'],'intnum')){
return $this->msg(10005); return $this->msg(10005);
} }
$token = $data['token'];
$user_languages = Db::table('app_account_number')->where(['token'=>$token,'is_del'=>0])->field('id,language')->find();
if(!$user_languages){
return $this->msg(10003);
}
unset($data['token']); unset($data['token']);
$return_data = $this->jump_transfer_interface_detailed($data); $return_data = $this->jump_transfer_interface_detailed($data);
// 成功 // 成功
$this->record_api_log($data, null, $return_data); // 处理多语言
if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){
$language_data = new Language();
$return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData());
}
return $return_data; return $return_data;
} catch (\Exception $e) { } catch (\Exception $e) {
// 捕获异常 // 捕获异常

View File

@ -637,6 +637,10 @@ Route::any('/z/print_scan_barcode', 'app/ZengJieCode/admin.printaction/print_sca
// 获取大箱没打印的条码 // 获取大箱没打印的条码
Route::any('/z/print_combined_code', 'app/ZengJieCode/admin.printaction/print_combined_code'); Route::any('/z/print_combined_code', 'app/ZengJieCode/admin.printaction/print_combined_code');
// 大箱注销重新录入
Route::any('/z/logout_outbox_code', 'app/ZengJieCode/app.savemsg/logout_outbox_code');
Route::any('/z/logout_outbox_code_action', 'app/ZengJieCode/app.savemsg/logout_outbox_code_action');
################################################################下面是设备入库录入################################################################ ################################################################下面是设备入库录入################################################################
@ -674,6 +678,14 @@ Route::any('/de/admin/device/device_all', 'app/DeviceEnter/admin.device/device_a
################################################################接口API ################################################################接口API
// 默认配置 // 默认配置
Route::any('/reedaw/config', 'app/NewReedaw/app.index/config'); Route::any('/reedaw/config', 'app/NewReedaw/app.index/config');
// 通用数据对比
Route::any('/reedaw/all_data_contrast', 'app/NewReedaw/app.index/all_data_contrast');
################################################################金刚区部分
// 遗传身高
Route::any('/reedaw/genetic_height', 'app/NewReedaw/app.index/genetic_height');
// BMI评测
Route::any('/reedaw/bmi_evaluation', 'app/NewReedaw/app.index/bmi_evaluation');
################################################################登录注册部分 ################################################################登录注册部分
// 注册账号 // 注册账号
@ -705,9 +717,63 @@ Route::any('/reedaw/add_member', 'app/NewReedaw/app.role/add_member');
Route::any('/reedaw/update_member', 'app/NewReedaw/app.role/update_member'); Route::any('/reedaw/update_member', 'app/NewReedaw/app.role/update_member');
// 获取角色列表 // 获取角色列表
Route::any('/reedaw/role_list', 'app/NewReedaw/app.role/role_list'); Route::any('/reedaw/role_list', 'app/NewReedaw/app.role/role_list');
################################################################卡片部分
// 卡片列表
Route::any('/reedaw/card/card_list_msg', 'app/NewReedaw/app.card/card_list_msg');
// 用户卡片排序
Route::any('/reedaw/card/card_user_order', 'app/NewReedaw/app.card/card_user_order');
################################################################身体报告部分 ################################################################身体报告部分
// 获取角色报告 // 获取角色报告
Route::any('/reedaw/body_report', 'app/NewReedaw/app.body/body_report'); Route::any('/reedaw/body/body_report', 'app/NewReedaw/app.body/body_report');
// 手动记录
Route::any('/reedaw/body/manual_record', 'app/NewReedaw/app.body/manual_record');
// 设备记录
Route::any('/reedaw/body/device_record', 'app/NewReedaw/app.body/device_record');
// 历史记录(分页)
Route::any('/reedaw/body/record_list_page', 'app/NewReedaw/app.body/record_list_page');
// 历史记录(分组)
Route::any('/reedaw/body/record_list_group', 'app/NewReedaw/app.body/record_list_group');
// 历史记录(详细)
Route::any('/reedaw/body/detailed_record', 'app/NewReedaw/app.body/detailed_record');
// 历史记录(详细)
Route::any('/reedaw/body/del_record', 'app/NewReedaw/app.body/del_record');
################################################################肺活部分
// 手动记录
Route::any('/reedaw/vitalcapacity/manual_record', 'app/NewReedaw/app.vitalcapacity/manual_record');
// 设备记录
Route::any('/reedaw/vitalcapacity/device_record', 'app/NewReedaw/app.vitalcapacity/device_record');
// 上一次数据
Route::any('/reedaw/vitalcapacity/data_report', 'app/NewReedaw/app.vitalcapacity/data_report');
// 曲线
Route::any('/reedaw/vitalcapacity/curve_chart', 'app/NewReedaw/app.vitalcapacity/curve_chart');
// 历史记录(分页)
Route::any('/reedaw/vitalcapacity/record_list_page', 'app/NewReedaw/app.vitalcapacity/record_list_page');
// 历史记录(分组)
Route::any('/reedaw/vitalcapacity/record_list_group', 'app/NewReedaw/app.vitalcapacity/record_list_group');
// 历史记录(详细)
Route::any('/reedaw/vitalcapacity/detailed_record', 'app/NewReedaw/app.vitalcapacity/detailed_record');
// 历史记录(详细)
Route::any('/reedaw/vitalcapacity/del_record', 'app/NewReedaw/app.vitalcapacity/del_record');
################################################################跳绳部分
// 手动记录
Route::any('/reedaw/skip/manual_record', 'app/NewReedaw/app.skip/manual_record');
// 设备记录
Route::any('/reedaw/skip/device_record', 'app/NewReedaw/app.skip/device_record');
// 上一次数据
Route::any('/reedaw/skip/data_report', 'app/NewReedaw/app.skip/data_report');
// 曲线
Route::any('/reedaw/skip/curve_chart', 'app/NewReedaw/app.skip/curve_chart');
// 历史记录(分页)
Route::any('/reedaw/skip/record_list_page', 'app/NewReedaw/app.skip/record_list_page');
// 历史记录(分组)
Route::any('/reedaw/skip/record_list_group', 'app/NewReedaw/app.skip/record_list_group');
// 历史记录(详细)
Route::any('/reedaw/skip/detailed_record', 'app/NewReedaw/app.skip/detailed_record');
// 历史记录(详细)
Route::any('/reedaw/skip/del_record', 'app/NewReedaw/app.skip/del_record');
################################################################跳绳部分
// 获取单个地区数据
Route::any('/reedaw/gf/get_single_data', 'app/NewReedaw/app.gufen/get_single_data');
#######################################################################下面是外部接口####################################################################### #######################################################################下面是外部接口#######################################################################