This commit is contained in:
tsf 2025-12-23 13:27:30 +08:00
commit 3363e2a349
25 changed files with 9494 additions and 24 deletions

View File

@ -0,0 +1,172 @@
<?php
namespace app\KitchenScale\controller\admin;
use think\Controller;
use think\Db;
use think\Cache;
use think\Log;
use PHPMailer\PHPMailer\PHPMailer;
class Base extends Controller{
protected $base_use_db_name = [
'1'=>'test_app_data_log',
];
protected $return_data_all = [
'10001'=>'关键参数缺失',
'10002'=>'操作失败',
'10003'=>'信息核实错误',
'10004'=>'未找到有效数据',
'10005'=>'参数格式错误',
'10006'=>'参数不能为空',
'10007'=>'参数错误',
'10008'=>'',
'10009'=>'',
'10010'=>'自定义信息',
'20001'=>'登录失效',
'99999'=>'网络异常,请稍后重试',
];
protected $file_max = 1024*1024*2;//xxxMB
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 验证
public function verify_data_is_ok($data = 2,$type){
if($type == 'str'){
if (is_string($data)) {
return true;
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为字符串',[]]);
return false;
}
}else if($type == 'num'){
if (is_numeric($data)) {
return true;
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为数字',[]]);
return false;
}
}else if($type == 'intnum'){
$pattern = '/^\d+$/';
if (preg_match($pattern, $data)) {
return true; // 匹配成功,返回 true
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为整数数字',[]]);
return false; // 匹配失败,返回 false
}
}else if($type == 'datetime'){
$formats = ['Y-m-d','Y-m-d H:i:s'];
foreach ($formats as $format) {
$dateTime = \DateTime::createFromFormat($format, $data);
// 检查时间字符串是否成功解析,并且解析后的日期时间与原始字符串表示的时间一致
if ($dateTime && $dateTime->format($format) === $data) {
return true;
}
}
// 如果所有格式都解析失败,则返回 false
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为日期格式',[]]);
return false;
}else if($type == 'other'){
}
}
####################################################图片选择上传start##############################################################
public function pic_index($page = 1) {
$data = input();
$pd = true;
if(array_key_exists('page',$data)){
$page = $data['page'];
$pd = false;
}
$cfc = Db::connect('cfc_db');
$num = $cfc->table('app_user_upload_img')->where(['special_record_str'=>'admin'])->count();
$result = $cfc->table('app_user_upload_img')->where(['special_record_str'=>'admin'])->order('id desc')->page($page,20)->field('id,pic_url')->select();
if(!$pd){
$return_result['num'] = $num;
$return_result['result'] = $result;
return $this->msg(0,'success',$return_result);
}
$this->assign([
'result' => $result,
'num' => $num,
]);
return $this->fetch();
}
public function pic_upload_action(){
$save_data = [];
$error_data = [];
// 获取表单上传文件
$files = request()->file('image');
foreach($files as $file){
$name = $file->getInfo()['name'];
// 使用 pathinfo() 函数获取文件名的扩展名
$pathinfo = pathinfo($name);
$extension = strtolower($pathinfo['extension']); // 转换为小写以进行不区分大小写的比较
$file_name = $pathinfo['filename'];
// 判断扩展名是否不是 .png 或 .gif
if ($extension !== 'png' && $extension !== 'gif') {
// 修改文件名,将扩展名改为 .jpg
$new_filename = date('YmdHis').$file_name . '.jpg';
} else {
$new_filename = date('YmdHis').$name;
}
$info = $file->validate(['size'=>$this->file_max,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'kitchenscale_all' . DS . 'user_upload',$new_filename);
if($info){
array_push($save_data,[
'user_token'=>'caadd1be045a65f30b92aa805f1de54a',
'pic_name'=>$new_filename,
'pic_url'=>'https://tc.pcxbc.com/kitchenscale_all/user_upload/'.$new_filename,
'create_time'=>date('Y-m-d H:i:s'),
'special_record_str'=>'admin',
'operate_log'=>1
]);
}else{
array_push($error_data,[
'pic_name'=>$name,
'error_msg'=>$file->getError(),
]);
}
}
$cfc = Db::connect('cfc_db');
$pic_result = $cfc->table('app_user_upload_img')->insertAll ($save_data);
if($pic_result){
return $this->msg(['success'=>count($save_data),'error_data'=>$error_data]);
}else{
for ($i=0; $i < count($save_data); $i++) {
unlink(ROOT_PATH . 'public' . DS . 'kitchenscale_all' . DS . 'user_upload' . DS . $new_filename);
}
return $this->msg(10002,'图片数据保存失败');
}
}
####################################################图片选择上传end##############################################################
public function msg($data,$str='',$result = []){
if(is_array($data)){
if($str != ''){
return json(['code'=>0,'msg'=>$str,'data'=>$data]);
}else{
return json(['code'=>0,'msg'=>'操作成功','data'=>$data]);
}
}else{
if($str != ''){
return json(['code'=>$data,'msg'=>$str,'data'=>$result]);
}
return json(['code'=>$data,'msg'=>$this->return_data_all[$data],'data'=>$result]);
}
}
}

View File

@ -0,0 +1,178 @@
<?php
namespace app\KitchenScale\controller\admin;
use think\Db;
class Cookbook extends Base{
// protected $login_hours_out = 24;
protected $page_num = 15;
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 登录
public function index($page = 1){
$data = input();
$pd = true;
$parameter = [];
// $parameter['is_del'] = 0;
if(array_key_exists('tt', $data)){
$page = $data['page_num'];
unset($data['page_num']);
unset($data['tt']);
$pd = false;
// if($data['status_num'] === "0" || $data['status_num'] === "1"){
// $parameter['is_del'] = $data['status_num'];
// }
// if($data['tel']){
// $parameter['tel'] = $data['tel'];
// }
// if($data['email']){
// $parameter['email'] = $data['email'];
// }
// if($data['s_time']){
// $parameter['create_time'] = ['>=',$data['s_time']];
// }
// if($data['e_time']){
// $parameter['create_time'] = ['<=',$data['e_time']];
// }
}
$where = '1=1';
$cfc = Db::connect('cfc_db');
$num = $cfc->table('app_user_cookbook')->where($parameter)->count();
$sql = "
SELECT
a.id,
a.title,
a.create_user_nickname,
a.likes_num,
a.read_it,
a.is_del,
a.create_time,
b.pic_url
FROM
app_user_cookbook a
LEFT JOIN
app_user_upload_img b ON a.cover = b.id
WHERE
$where
ORDER BY
a.id DESC
OFFSET (".($page - 1)." * ".$this->page_num.") ROWS
FETCH NEXT ".$this->page_num." ROWS ONLY;
";
$result = $cfc->query($sql);
if(!$pd){
$return_data['num'] = $num;
$return_data['data'] = $result;
return $this->msg($return_data);
}
$this->assign([
'result' => $result,
'num' => $num,
]);
return $this->fetch();
}
public function add_cookbook(){
$cfc = Db::connect('cfc_db');
$result = $cfc->table('app_user_cookbook_label')->where(['is_del'=>0])->select();
$this->assign([
'result' => $result,
]);
return $this->fetch();
}
public function add_cookbook_action(){
$data = input();
$cfc = Db::connect('cfc_db');
// dump($data);
// 处理食谱数据
$id_list = [];
$food_cookbook_relationship = [];
foreach ($data['foodList'] as $key => $value) {
if(!in_array($value['id'],$id_list)){
array_push($id_list,$value['id']);
array_push($food_cookbook_relationship,[
'cookbook_id' => '',
'food_id' => $value['id']
]);
}
}
$kcal_data = $cfc->table('app_z_national_standard_food_type_3')->where("id in (".implode(',',$id_list).")")->field('id,Calorie_val')->select();
for ($i=0; $i < count($kcal_data); $i++) {
$id_list[$kcal_data[$i]['id']] = $kcal_data[$i]['Calorie_val'];
}
foreach ($data['foodList'] as $key => $value) {
$data['foodList'][$key]['kcal'] = bcmul(bcdiv($value['weight'],100,20),$id_list[$value['id']],2);
$data['foodList'][$key]['unit'] = 'g';
}
// 设置食谱信息
$cookbook_data = [
'title'=>$data['title'],
'cover'=>$data['cover'],
'create_user_token'=>'caadd1be045a65f30b92aa805f1de54a',
'create_user_head_pic'=>'https://tc.pcxbc.com/tsf/head_pic.png',
'create_user_nickname'=>'clown',
'describe_data'=>$data['description'],
'food_data'=>json_encode($data['foodList']),
'step_data'=>json_encode($data['stepList']),
'create_time'=>date('Y-m-d H:i:s'),
'original_cookbook_id'=>'admin',
'cook_label'=>$data['cook_label'],
'is_del'=>1,
];
$cfc->startTrans();
try {
$cookbook_id = $cfc->table('app_user_cookbook')->insertGetId($cookbook_data);
for ($i=0; $i < count($food_cookbook_relationship); $i++) {
$food_cookbook_relationship[$i]['cookbook_id'] = $cookbook_id;
}
$cfc->table('app_user_cookbook_food_relation')->insertAll($food_cookbook_relationship);
$cfc->commit();
return $this->msg([]);
} catch (\Exception $e) {
$cfc->rollback();
return $this->msg(10002,'数据保存失败,'.$e->getMessage());
}
}
public function stop_and_run(){
$data = input();
$cfc = Db::connect('cfc_db');
$result = $cfc->table('app_user_cookbook')->where(['id'=>$data['id']])->update(['is_del'=>$data['status']]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function find_food_list(){
$data = input();
$cfc = Db::connect('cfc_db');
$result = $cfc->table('app_z_national_standard_food_type_3')->where("food_name like '%". $data['search_data'] ."%'")->field('id,food_name,Calorie_val')->select();
return $this->msg(0,'success',$result);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace app\KitchenScale\controller\admin;
use think\Db;
class Index extends Base{
// protected $login_hours_out = 24;
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 登录
public function index(){
// $this->assign('domain',$a);
return $this->fetch();
}
public function welcome(){
// $this->assign('domain',$a);
return $this->fetch();
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace app\KitchenScale\controller\admin;
use think\Db;
class Login extends Base{
// protected $login_hours_out = 24;
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 登录
public function login(){
return $this->fetch();
}
// 检测登录信息是否超时
public function login_action(){
$data = input();
// 验证数据项是否完整
if(!array_key_exists('username', $data) || !array_key_exists('password', $data)){
return $this->msg(10001);
}
$cfc = Db::connect('cfc_db');
$account = $cfc->table('admin_user_account_number')->where(['account_num'=>$data['username'],'password'=>$data['password']])->count();
if($account>0){
return $this->msg([]);
}else{
return $this->msg(10003);
}
}
}

View File

@ -0,0 +1,548 @@
<?php
namespace app\KitchenScale3\controller\app;
use think\Controller;
use think\Db;
use think\Cache;
use think\Log;
use PHPMailer\PHPMailer\PHPMailer;
class Base extends Controller{
protected $base_use_db_name = [
'search_history'=>'app_user_search_history_multilingual',
'foodlist4'=>'app_z_national_standard_food_type_4_multilingual',
'user'=>'app_user_data_multilingual'
];
protected $token_time = 30;//30天的秒数
protected $file_size = 5*1024*1024;
protected $return_data_all = [
'10001'=>'关键参数缺失',
'10002'=>'操作失败',
'10003'=>'信息核实错误',
'10004'=>'未找到有效数据',
'10005'=>'参数格式错误',
'10006'=>'参数不能为空',
'10007'=>'参数错误',
'10008'=>'',
'10009'=>'',
'10010'=>'自定义信息',
'20001'=>'登录失效',
'99999'=>'网络异常,请稍后重试',
];
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口监控################################################################
################################################################接口监控################################################################
################################################################接口监控################################################################
// 接口记录
public function record_api_log($params, $error = null, $response = null){
// dump($params);
// dump($error);
// die;
$logContent = "接口请求参数:" . json_encode($params, JSON_UNESCAPED_UNICODE) . PHP_EOL;
if ($error) {
$logContent .= "错误信息:" . $error['all_content'] . PHP_EOL;
if(!cache($error['flie']."_".$error['line'])){
cache($error['flie']."_".$error['line'],"API错误",3600);
$this->send_email_api_error(["tsf3920322@126.com"],['title'=>'接口报错','from_user_name'=>'厨房秤(海外)(后台)','content'=>$logContent]);
}
}
if ($response) {
$logContent .= "返回信息:" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL;
}
// 使用ThinkPHP的日志记录方法
Log::record($logContent, 'api_log');
}
/* 接口说明(发邮件)
* $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 check_code($data = 18530934717 , $code = 123456){
// // 默认验证码正确
if(cache($data) == false){
return '验证码过期';
}else{
if($code != cache($data)){
return '验证码错误';
}
}
return true;
}
// 判断字符串是手机还是邮箱
public function is_tel_email($str) {
// 手机号码的正则表达式(中国大陆格式)(下面正则实际判断的是是否为11位数字)
$mobilePattern = '/^\d{11}$/';
// 电子邮件地址的正则表达式
$emailPattern = '/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
// 判断是否为手机号码
if (preg_match($mobilePattern, $str)) {
return 'tel';
}
// 判断是否为电子邮件地址
if (preg_match($emailPattern, $str)) {
return 'email';
}
// 如果都不是,返回其他
return false;
}
// 判断token是否过期
public function token_time_validate($token){
// 591b70e0d80b5fa6d77e6e1384453ab9
if(is_string($token)){
$length = strlen($token);
if ($length < 10 ) {
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败字符串长度小于10', 'token_log');
return false;
}
}else{
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败不是字符串', 'token_log');
return false;
}
$cfc = Db::connect('cfc_db');
$user_login = $cfc->table($this->base_use_db_name['user'])->where(['token'=>$token])->field('id,login_time')->find();
if(!$user_login){
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败未找到用户token', 'token_log');
return false;
}
// 创建 DateTime 对象来表示指定的日期和时间
$specifiedDateTime = new \DateTime($user_login['login_time']);
// 获取当前时间的 DateTime 对象
$currentDateTime = new \DateTime();
// 计算两个日期之间的差异(以秒为单位)
$interval = $currentDateTime->diff($specifiedDateTime);
// 将差异转换为天数(注意:这里的天数可能不是整数,因为差异可能包括小时、分钟等)
$daysDifference = $interval->days;
// 如果需要更精确的计算(包括小时、分钟等转换成的天数),可以使用以下方式:
// $totalSecondsDifference = $interval->format('%a') * 86400 + $interval->format('%h') * 3600 + $interval->format('%i') * 60 + $interval->format('%s');
// $daysDifference = floor($totalSecondsDifference / 86400); // 将总秒数转换为天数并取整
// 判断差异是否超过指定的天数
if ($daysDifference > $this->token_time) {
// echo "超过 {$specifiedDays} 天";
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败原因没有找到该token,或该token已经超过30天', 'token_log');
return false;
} else {
// echo "未超过 {$specifiedDays} 天";
$user_login = $cfc->table($this->base_use_db_name['user'])->where(['token'=>$token])->update(['login_time'=>date('Y-m-d H:i:s')]);
if($user_login){
Log::record('用户尝试更新token时间token' . $token.',记录成功,最新的时间为'.date('Y-m-d H:i:s'), 'token_log');
return true;
}else{
Log::record('用户尝试更新token时间token' . $token.',但是更新token失败数据库更新时间未成功', 'token_log');
return true;
}
}
}
// 验证数据类型
public function verify_data_is_ok($data = 2,$type){
if($type == 'str'){
if (is_string($data)) {
return true;
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为字符串',[]]);
return false;
}
}else if($type == 'num'){
if (is_numeric($data)) {
return true;
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为数字',[]]);
return false;
}
}else if($type == 'intnum'){
$pattern = '/^\d+$/';
// dump($data);
if (preg_match($pattern, $data)) {
return true; // 匹配成功,返回 true
} else {
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为整数数字',[]]);
return false; // 匹配失败,返回 false
}
}else if($type == 'datetime'){
$formats = ['Y-m-d','Y-m-d H:i:s'];
foreach ($formats as $format) {
$dateTime = \DateTime::createFromFormat($format, $data);
// 检查时间字符串是否成功解析,并且解析后的日期时间与原始字符串表示的时间一致
if ($dateTime && $dateTime->format($format) === $data) {
return true;
}
}
// 如果所有格式都解析失败,则返回 false
$this->record_api_log($data, null, ['code'=>10005,'msg'=>'校验参数不为日期格式',[]]);
return false;
}else if($type == 'other'){
}
}
// 计算年龄
public function calculate_age($data = '1991-04-20'){
$today = time(); // 获取当前时间的 Unix 时间戳
$birthDate = strtotime($data); // 将出生日期字符串转换为 Unix 时间戳
if ($birthDate !== false) {
$age = date('Y', $today) - date('Y', $birthDate);
// 如果当前年份的月份和日期小于出生年份的月份和日期,那么年龄减一
if (date('m-d', $today) < date('m-d', $birthDate)) {
$age--;
}
return $age;
} else {
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
if(array_key_exists('activity_level',$data)){
if($data['activity_level'] != null){
$tdee = bcmul($bmr,$data['activity_level'],2);
}else{
$tdee = bcmul($bmr,1.55,2);
}
}else{
$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_p = 0.5;
$carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2);
if($data['age_num'] < 65){
$protein_p = 0.2;
$fat_p = 0.3;
$protein = bcdiv(bcmul($tdee,0.2,20),4,2);
$fat = bcdiv(bcmul($tdee,0.3,20),9,2);
}else{
$protein_p = 0.25;
$fat_p = 0.25;
$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,'carbohydrate_p'=>$carbohydrate_p,'protein_p'=>$protein_p,'fat_p'=>$fat_p];
}
/**
* 将重量转换为克(g)
* @param string $weight 重量值
* @param string $unit 单位 (g, oz, lb, lb:oz)
* @return float 转换后的克重
*/
function convertWeightToGrams($weight, $unit) {
// 定义精确的转换常量
$G_PER_OZ = '28.349523125';
$G_PER_LB = '453.59237';
$unit = strtolower($unit);
$result = 0;
switch ($unit) {
case 'g':
case '克':
// 已经是克,直接返回
$result = $weight;
break;
case 'oz':
case '盎司':
// 盎司转克
$result = bcmul($weight,$G_PER_OZ,2);
break;
case 'lb':
case '磅':
// 磅转克
$result = bcmul($weight,$G_PER_LB,2);
break;
case 'lb:oz':
case '磅:盎司':
// 磅:盎司复合单位处理
if (strpos($weight, ':') !== false) {
$temporary_data = explode(':', $weight);
$result = bcadd(bcmul($temporary_data[0],$G_PER_LB,20),bcmul($temporary_data[1],$G_PER_OZ,20),2);
} else {
// 如果格式不正确可以抛出异常或返回0
$result = '0';
}
break;
default:
$result = '0';
}
// 保留两位小数并返回
return $result;
}
// 计算营养物质
public function calculate_nutrients($data){
// dump($data);
$food_id_arr = [];
for ($i=0; $i < count($data); $i++) {
$food_id_arr[] = $data[$i]['food_id'];
}
$cfc = Db::connect('cfc_db');
$nutrients_list = $cfc->table($this->base_use_db_name['foodlist4'])
->where("father_id in ('".implode("','",$food_id_arr)."')")
// ->field()
->select();
$nutrients_arr = ['VitaminA','VitaminB1','VitaminB2','VitaminB6','VitaminB12','VitaminD','VitaminK','Niacin','VitaminC','VitaminE','FolicAcid','Biotin','PantothenicAcid','TotalCholine','Ca','Phosphorus','Kalium','Mg','Na','Fe','Zn','Se','Cu','Mn','Iodine'];
// dump($nutrients_list);
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
for ($i=0; $i < count($data); $i++) {
$zong_all = bcadd($data[$i]['protein_val'],bcadd($data[$i]['fat_val'],$data[$i]['carbohydrate_val'],20),20);
$data[$i]['nutrients_four'][] = [
'name' => '卡路里',
'unit' => 'kcal',
'color' => '',
'value' => $data[$i]['kcal_val'],
'proportion' => 0,
];
$data[$i]['nutrients_four'][] = [
'name' => '蛋白质',
'unit' => 'g',
'color' => '#5180D8',
'value' => $data[$i]['protein_val'],
'proportion' => $zong_all == 0?0:bcmul(bcdiv($data[$i]['protein_val'],$zong_all,2),100,0),
];
$data[$i]['nutrients_four'][] = [
'name' => '脂肪',
'unit' => 'g',
'color' => '#ED7886',
'value' => $data[$i]['fat_val'],
'proportion' => $zong_all == 0?0:bcmul(bcdiv($data[$i]['fat_val'],$zong_all,2),100,0),
];
$data[$i]['nutrients_four'][] = [
'name' => '碳水化合物',
'unit' => 'g',
'color' => '#FFB169',
'value' => $data[$i]['carbohydrate_val'],
'proportion' => $zong_all == 0?0:bcmul(bcdiv($data[$i]['carbohydrate_val'],$zong_all,2),100,0),
];
$data[$i]['nutrients_list'][] = [
'name' => 'Calorie',
'name_ch' => '卡路里',
'unit' => 'kcal',
'value' => $data[$i]['kcal_val'],
'type' => 1,
'type_name' => '能量及宏量营养素',
'color' => '#C4FFE0',
];
$data[$i]['nutrients_list'][] = [
'name' => 'Protein',
'name_ch' => '蛋白质',
'unit' => 'g',
'value' => $data[$i]['protein_val'],
'type' => 1,
'type_name' => '能量及宏量营养素',
'color' => '#C4FFE0',
];
$data[$i]['nutrients_list'][] = [
'name' => 'Fat',
'name_ch' => '脂肪',
'unit' => 'g',
'value' => $data[$i]['fat_val'],
'type' => 1,
'type_name' => '能量及宏量营养素',
'color' => '#C4FFE0',
];
$data[$i]['nutrients_list'][] = [
'name' => 'Carbohydrate',
'name_ch' => '碳水化合物',
'unit' => 'g',
'value' => $data[$i]['carbohydrate_val'],
'type' => 1,
'type_name' => '能量及宏量营养素',
'color' => '#C4FFE0',
];
foreach ($nutrients_list as $key => $value) {
if($value['father_id'] == $data[$i]['food_id']){
if(in_array($value['name'],$nutrients_arr)){
$data[$i]['nutrients_list'][] = [
'name' => $value['name'],
'name_ch' => $value['name_ch'],
'unit' => $value['unit'],
'value' => bcmul($value['value'],bcdiv($data[$i]['weight'],100,20),2),
'type' => $value['type'],
'type_name' => $value['type'] == 1?'能量及宏量营养素':($value['type'] == 2?'维生素':($value['type'] == 3?'矿物质':'')),
'color' => $value['type'] == 1?'#C4FFE0':($value['type'] == 2?'#FFEFB7':($value['type'] == 3?'#7DA8E0':'')),
];
}
}
}
}
return $data;
}
public function add_search_history_action($data){
// 添加一条搜索记录start
$cfc = Db::connect('cfc_db');
$insert_search_log = $cfc->table($this->base_use_db_name['search_history'])->where(['user_id'=>$data['id'],'keyword'=>$data['search_data'],'type'=>$data['type']])->field('id,search_count')->find();
if($insert_search_log){
$cfc->table($this->base_use_db_name['search_history'])->where(['id'=>$insert_search_log['id']])->update([
'search_count'=>$insert_search_log['search_count']+1,
'last_searched_at'=>date('Y-m-d H:i:s'),
]);
}else{
$cfc->table($this->base_use_db_name['search_history'])->insert([
'user_id'=>$data['id'],
'keyword'=>$data['search_data'],
'type'=>$data['type'],
]);
}
// 添加一条搜索记录end
}
####################################################图片选择上传start##############################################################
####################################################图片选择上传start##############################################################
####################################################图片选择上传start##############################################################
####################################################图片选择上传end##############################################################
####################################################图片选择上传end##############################################################
####################################################图片选择上传end##############################################################
########################################################其他工具########################################################
########################################################其他工具########################################################
########################################################其他工具########################################################
public function msg($data,$str='',$result = []){
if(is_array($data)){
if($str != ''){
return json(['code'=>0,'msg'=>$str,'data'=>$data]);
}else{
return json(['code'=>0,'msg'=>'操作成功','data'=>$data]);
}
}else{
if($str != ''){
return json(['code'=>$data,'msg'=>$str,'data'=>$result]);
}
return json(['code'=>$data,'msg'=>$this->return_data_all[$data],'data'=>$result]);
}
}
public function generateRandomString($length = 10) {
$characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
public function ceshi(){
echo 'hello';
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,418 @@
<?php
namespace app\KitchenScale3\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', //食谱标签表
'cookbook_food_relation' => 'app_user_cookbook_food_relation', //食谱跟食材关系表
'foodlist2' => 'app_z_national_standard_food_type_2_multilingual', //食材标签表2
'foodlist3' => 'app_z_national_standard_food_type_3_multilingual', //食材表
'kcal_log' => 'app_user_kcal_log_multilingual', //用户饮食记录表记录用户吃了什么食材
'search_history' => 'app_user_search_history_multilingual', //用户搜索记录表,记录用户搜索过什么内容
// 'tag_preference' => 'app_user_tag_preference', //用户标签偏好表
'recommend_cache' => 'app_recommend_cache_multilingual' //智能推荐缓存表
];
protected $config = [
'tag_limit' => 2,
'item_limit' => 12,
'cache_time' => 3600
];
/**
* 猜你喜欢主接口
*/
public function getGuessYouLike($user_id = 1, $type = 'food', $limit = null) {
try {
$cfc = Db::connect('cfc_db');
// dump(1);
// 设置限制数量
$tag_limit = $limit ? intval($limit) : $this->config['tag_limit'];
$item_limit = $this->config['item_limit'];
// 检查缓存
// $cache_key = $user_id . ':' . $type;
// $cache_result = $this->getCache($cfc, $cache_key);
// // die;
// if ($cache_result !== null) {
// return $cache_result;
// }
// 判断用户是否有历史数据
$has_history = $this->checkUserHistory($cfc, $user_id);
if (!$has_history) {
// 新用户,返回最火信息(仅一个标签)
$result = $this->getPopularRecommendations($cfc, $type, 1, $item_limit);
} else {
// 老用户,根据类型返回个性化推荐
if ($type === 'cookbook') {
$result = $this->getCookbookRecommendations($cfc, $user_id, $tag_limit, $item_limit);
} else {
$result = $this->getFoodRecommendations($cfc, $user_id, $tag_limit, $item_limit);
}
}
// 确保返回格式正确
if (!is_array($result)) {
$result = [];
}
// 更新缓存
// $this->updateCache($cfc, $cache_key, $user_id, $type, $result);
return $result;
} catch (\Exception $e) {
// 记录错误日志
\think\Log::error('猜你喜欢功能错误: ' . $e->getMessage());
return [];
}
}
/**
* 检查用户是否有历史数据
*/
private function checkUserHistory($db, $user_id) {
try {
// 检查饮食记录
$kcal_result = $db->query("
SELECT COUNT(*) as count
FROM {$this->kitchenscale_db_msg['kcal_log']}
WHERE aud_id = ? AND is_del = 0
", [$user_id]);
$kcal_count = $kcal_result[0]['count'] ?? 0;
// 检查搜索记录
$search_result = $db->query("
SELECT COUNT(*) as count
FROM {$this->kitchenscale_db_msg['search_history']}
WHERE user_id = ? AND is_del = 0
", [$user_id]);
$search_count = $search_result[0]['count'] ?? 0;
return ($kcal_count > 0 || $search_count > 0);
} catch (\Exception $e) {
return false;
}
}
/**
* 获取缓存数据
*/
private function getCache($db, $cache_key) {
try {
$cache_result = $db->query("
SELECT id, cache_key, user_id, keyword, recommend_data, hit_count, last_hit, is_del, create_time
FROM {$this->kitchenscale_db_msg['recommend_cache']}
WHERE cache_key = ? AND is_del = 0
", [$cache_key]);
if (!empty($cache_result)) {
$cache = $cache_result[0];
$last_hit_timestamp = strtotime($cache['last_hit']);
if (time() - $last_hit_timestamp < $this->config['cache_time']) {
// 更新命中次数和时间
$db->execute("
UPDATE {$this->kitchenscale_db_msg['recommend_cache']}
SET hit_count = hit_count + 1, last_hit = GETDATE()
WHERE id = ?
", [$cache['id']]);
$data = json_decode($cache['recommend_data'], true);
return is_array($data) ? $data : null;
}
}
} catch (\Exception $e) {
// 忽略缓存错误,继续执行
}
return null;
}
/**
* 更新缓存
*/
private function updateCache($db, $cache_key, $user_id, $keyword, $data) {
try {
$current_time = date('Y-m-d H:i:s');
$recommend_data = json_encode($data, JSON_UNESCAPED_UNICODE);
// 检查是否存在缓存
$existing_result = $db->query("
SELECT id FROM {$this->kitchenscale_db_msg['recommend_cache']}
WHERE cache_key = ? AND is_del = 0
", [$cache_key]);
if (!empty($existing_result)) {
// 更新现有缓存
$db->execute("
UPDATE {$this->kitchenscale_db_msg['recommend_cache']}
SET user_id = ?, keyword = ?, recommend_data = ?, hit_count = 1,
last_hit = ?, create_time = ?
WHERE cache_key = ? AND is_del = 0
", [$user_id, $keyword, $recommend_data, $current_time, $current_time, $cache_key]);
} else {
// 插入新缓存
$db->execute("
INSERT INTO {$this->kitchenscale_db_msg['recommend_cache']}
(cache_key, user_id, keyword, recommend_data, hit_count, last_hit, create_time, is_del)
VALUES (?, ?, ?, ?, 1, ?, ?, 0)
", [$cache_key, $user_id, $keyword, $recommend_data, $current_time, $current_time]);
}
} catch (\Exception $e) {
// 忽略缓存更新错误
}
}
/**
* 获取热门推荐(新用户)
*/
private function getPopularRecommendations($db, $type, $tag_limit, $item_limit) {
// dump($type);
if ($type === 'cookbook') {
return $this->getPopularCookbooks($db, $tag_limit, $item_limit);
} else {
// dump(111);
return $this->getPopularFoods($db, $tag_limit, $item_limit);
}
}
/**
* 获取热门食谱(新用户)
*/
private function getPopularCookbooks($db, $tag_limit, $item_limit) {
try {
// 简化查询,避免复杂关联导致的错误
$popular_cookbooks = $db->query("
SELECT TOP {$item_limit}
id,
title as name
FROM {$this->kitchenscale_db_msg['cookbook']}
WHERE is_del = 0
ORDER BY likes_num DESC, read_it DESC, create_time DESC
");
// dump('sp');
// dump($popular_cookbooks);
$result = [];
$label_data = [];
foreach ($popular_cookbooks as $cookbook) {
$label_data[] = [
'name' => $cookbook['name'] ?? '未知食谱',
'id' => $cookbook['id'] ?? 0,
'type' => 'cookbook'
];
}
if (!empty($label_data)) {
$result['最火食谱搜索'] = $label_data;
}
return $result;
} catch (\Exception $e) {
return [];
}
}
/**
* 获取热门食材(新用户)
*/
private function getPopularFoods($db, $tag_limit, $item_limit) {
try {
// dump(2222);
// // 简化查询,避免复杂关联导致的错误
$popular_foods = $db->query("
SELECT TOP {$item_limit}
id,
keyword as name,
COUNT(*) as num
FROM {$this->kitchenscale_db_msg['search_history']}
WHERE is_del = 0 AND type = 'food'
GROUP BY id, keyword
ORDER BY num DESC
");
// dump('sc');
// dump($popular_foods);
$popular_foods_2 = [];
if(count($popular_foods) < $item_limit){
$num = $item_limit - count($popular_foods);
$popular_foods_2 = $db->query("
SELECT TOP {$num}
id,
food_name as name
FROM {$this->kitchenscale_db_msg['foodlist3']}
WHERE is_del = 0
ORDER BY is_popular DESC, food_name ASC
");
}
foreach ($popular_foods_2 as $key => $value) {
$popular_foods[] = $value;
}
$result = [];
$label_data = [];
foreach ($popular_foods as $food) {
$label_data[] = [
'name' => $food['name'] ?? '未知食材',
'id' => $food['id'] ?? 0,
'type' => 'food'
];
}
if (!empty($label_data)) {
$result['最火食材搜索'] = $label_data;
}
return $result;
} catch (\Exception $e) {
return [];
}
}
/**
* 获取个性化食谱推荐(老用户)
*/
private function getCookbookRecommendations($db, $user_id, $tag_limit, $item_limit) {
try {
// 获取用户最常吃的食材
$user_top_foods = $db->query("
SELECT TOP 10 food_id, COUNT(*) as eat_count
FROM {$this->kitchenscale_db_msg['kcal_log']}
WHERE aud_id = ? AND is_del = 0
GROUP BY food_id
ORDER BY eat_count DESC
", [$user_id]);
if (empty($user_top_foods)) {
return $this->getPopularCookbooks($db, $tag_limit, $item_limit);
}
$food_ids = array_column($user_top_foods, 'food_id');
if (empty($food_ids)) {
return $this->getPopularCookbooks($db, $tag_limit, $item_limit);
}
$food_ids_str = implode(',', $food_ids);
// 获取包含这些食材的食谱标签
$preferred_labels = $db->query("
SELECT TOP {$tag_limit} lbl.id, lbl.name, COUNT(DISTINCT cb.id) as match_count
FROM {$this->kitchenscale_db_msg['cookbook_label']} lbl
INNER JOIN {$this->kitchenscale_db_msg['cookbook']} cb ON lbl.id = cb.cook_label AND cb.is_del = 0
INNER JOIN {$this->kitchenscale_db_msg['cookbook_food_relation']} cfr ON cb.id = cfr.cookbook_id
WHERE lbl.is_del = 0 AND cfr.food_id IN ({$food_ids_str})
GROUP BY lbl.id, lbl.name
ORDER BY match_count DESC
");
$result = [];
foreach ($preferred_labels as $label) {
// 使用子查询避免GROUP BY复杂性问题
$cookbooks = $db->query("
SELECT TOP {$item_limit} cb.id, cb.title as name
FROM {$this->kitchenscale_db_msg['cookbook']} cb
WHERE cb.id IN (
SELECT DISTINCT cfr.cookbook_id
FROM {$this->kitchenscale_db_msg['cookbook_food_relation']} cfr
WHERE cfr.food_id IN ({$food_ids_str})
)
AND cb.cook_label = ?
AND cb.is_del = 0
ORDER BY cb.likes_num DESC, cb.read_it DESC
", [$label['id']]);
$label_data = [];
foreach ($cookbooks as $cookbook) {
$label_data[] = [
'name' => $cookbook['name'] ?? '未知食谱',
'id' => $cookbook['id'] ?? 0,
'type' => 'cookbook'
];
}
if (!empty($label_data)) {
$result[$label['name'] ?? '未知标签'] = $label_data;
}
}
return $result;
} catch (\Exception $e) {
return $this->getPopularCookbooks($db, $tag_limit, $item_limit);
}
}
/**
* 获取个性化食材推荐(老用户)
*/
private function getFoodRecommendations($db, $user_id, $tag_limit, $item_limit) {
try {
// 获取用户最常吃的食材
$user_top_foods = $db->query("
SELECT TOP 10 food_id, COUNT(*) as eat_count
FROM {$this->kitchenscale_db_msg['kcal_log']}
WHERE aud_id = ? AND is_del = 0
GROUP BY food_id
ORDER BY eat_count DESC
", [$user_id]);
if (empty($user_top_foods)) {
return $this->getPopularFoods($db, $tag_limit, $item_limit);
}
$food_ids = array_column($user_top_foods, 'food_id');
if (empty($food_ids)) {
return $this->getPopularFoods($db, $tag_limit, $item_limit);
}
$food_ids_str = implode(',', $food_ids);
// 获取用户偏好食材的分类
$preferred_categories = $db->query("
SELECT TOP {$tag_limit} f2.id, f2.name, COUNT(DISTINCT f3.id) as food_count
FROM {$this->kitchenscale_db_msg['foodlist2']} f2
INNER JOIN {$this->kitchenscale_db_msg['foodlist3']} f3 ON f2.id = f3.two_id
WHERE f3.id IN ({$food_ids_str}) AND f2.is_del = 0 AND f3.is_del = 0
GROUP BY f2.id, f2.name
ORDER BY food_count DESC
");
$result = [];
foreach ($preferred_categories as $category) {
// 获取该分类下的其他食材
$foods = $db->query("
SELECT TOP {$item_limit} id, food_name as name
FROM {$this->kitchenscale_db_msg['foodlist3']}
WHERE two_id = ? AND is_del = 0 AND id NOT IN ({$food_ids_str})
ORDER BY is_popular DESC, food_name ASC
", [$category['id']]);
$category_data = [];
foreach ($foods as $food) {
$category_data[] = [
'name' => $food['name'] ?? '未知食材',
'id' => $food['id'] ?? 0,
'type' => 'food'
];
}
if (!empty($category_data)) {
$result[$category['name'] ?? '未知分类'] = $category_data;
}
}
return $result;
} catch (\Exception $e) {
return $this->getPopularFoods($db, $tag_limit, $item_limit);
}
}
}

View File

@ -0,0 +1,898 @@
<?php
namespace app\KitchenScale3\controller\app;
use think\Db;
use app\KitchenScale3\controller\app\Guessyoulike;
use app\KitchenScale3\controller\app\Language;
class Index extends Base{
protected $code_time = 50;
// protected $token_time = 2592000;//30天的秒数
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
// protected $reedaw_db_msg = [
// 'zhanghao'=>'app_account_number',//账号表
// 'juese'=>'app_user_data',//角色表
// ];
protected $kitchenscale_db_msg = [
'cookbook'=>'app_user_cookbook',//菜谱表
'cookbook_label'=>'app_user_cookbook_label',//菜谱标签表
'uploadimg'=>'app_user_upload_img',//图片素材表
'foodlist1'=>'app_z_national_standard_food_type_1',//食材列表1
'foodlist2'=>'app_z_national_standard_food_type_2',//食材列表2
'foodlist3'=>'app_z_national_standard_food_type_3',//食材列表3
'foodlist4'=>'app_z_national_standard_food_type_4',//食材列表3
'collect_list'=>'app_user_collect_list',//点赞表
'banner'=>'app_banner_data',//banner
'version'=>'app_version_log',//版本表
'user'=>'app_user_data',//用户表
'kcal_log'=>'app_user_kcal_log',//饮食记录表
'search_history'=>'app_user_search_history',//搜索历史表
'business_cooperation'=>'app_business_cooperation',//搜索历史表
];
protected $reedaw_db_name = [
'banner'=>'admin_notice_banner',//菜谱表
];
protected $language_country = [
'zh' => ['中文','zh'], // 中文(简体)★
'en' => ['English','en'], // 英语(通用)★
'jp' => ['日本語(Japanese)','ja'], // 日语(变化)
'fra' => ['Français(French)','fr'], // 法语(变化)
'de' => ['Deutsch(German)','de'], // 德语
'kor' => ['한국어(Korean)','ko'], // 韩语(变化)
'ru' => ['Русский(Russian)','ru'], // 俄语
'pt' => ['Português(Portuguese)','pt'], // 葡萄牙
'spa' => ["Español(Spanish)",'es'], // 西班牙(变化)
'ara' => ['Arabic(العربية)','ar'], // 阿拉伯(变化)
];
// zh, //中文
// en, // 英语
// jp, //日语(变化)
// fra, //法语(变化)
// de, //德语
// kor, //韩语(变化)
// ru, //俄语
// pt, //葡萄牙
// spa, //西班牙(变化)
// ara, //阿拉伯(变化)
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 检测版本及判断是否登录失效
public function login_invalid_version($data = ['token'=>'']){
try {
// 获取客户端IP
$ip = request()->ip();
// 调用IP识别方法
$region = $this->getIpInfo($ip);
// dump($region);
// 解析地区信息
$regionParts = explode('|', $region);
$country = $regionParts[0] ?? '';
// 判断国家是否在支持的语言列表中
$language = '';
if ($country && $country !== '0') {
$languageMap = [
'中国' => 'zh',
'美国' => 'en',
'英国' => 'en',
'西班牙' => 'spa',
'法国' => 'fra',
'葡萄牙' => 'pt',
'阿拉伯联合酋长国' => 'ara',
'俄罗斯' => 'ru',
'德国' => 'de'
];
$language = $languageMap[$country] ?? '';
}
// 检查语言是否在支持列表中
$language_all = new Language();
$isSupportedLanguage = array_key_exists($language, $language_all->getSupportedLanguages());
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001);
}
$cfc = Db::connect('cfc_db');
$result = $cfc->table($this->kitchenscale_db_msg['version'])->order('is_del,id desc')->find();
if($result){
$version = $result['version_num_original'];
$url = $result['download_url'];
}else{
$version = '';
$url = '';
}
if($data['token'] == ''){
return $this->msg(-2,'未登录',['version'=>$version,'url'=>$url,'language'=>'en']);
}
// dump($data);
$user_token_state = $this->token_time_validate($data['token']);
// dump($user_token_state);
$language_data = $this->pd_language($user_token_state['language'],$isSupportedLanguage,$language);
// dump($user_token_state);
// dump($language_data);
if($user_token_state['state'] === false){
return $this->msg(-1,'未登录',['version'=>$version,'url'=>$url,'language'=>$language_data]);
}else{
return $this->msg(['version'=>$version,'url'=>$url,'language'=>$language_data]);
}
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 添加IP信息获取方法
protected function getIpInfo($ip) {
// 默认IP
$ip = $ip ?: request()->ip();
try {
$ip2region = new \Ip2Region();
$info = $ip2region->memorySearch($ip);
// 返回国家信息
return $info['region'] ?: '未知';
} catch (\Exception $e) {
return '未知';
}
}
// 获取默认配置信息(包含:食材的分类列表,用户角色信息)(OK)
public function get_default_config(){
try {
$data = input('post.');
$return_data = $this->get_default_config_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 首页搜索接口(OK)
public function search_column($data = ['search_data'=>'鱼','token'=>'caadd1be045a65f30b92aa805f1de54a','page'=>1]){
try {
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('search_data', $data)){
return $this->msg(10001);
}
if(!array_key_exists('page', $data)){
return $this->msg(10001,'page is miss');
}
if(!$this->verify_data_is_ok($data['search_data'],'str')){
return $this->msg(10005);
}
if(!$this->verify_data_is_ok($data['page'],'intnum')){
return $this->msg(10005,'page type is error');
}
$return_data = $this->search_column_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: (search_column)\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
#######################################################################action#######################################################################
#######################################################################action#######################################################################
#######################################################################action#######################################################################
// 新版
public function get_default_config_action($data){
$return_data = [
'business_cooperation'=>[],
'banner_data'=>[],
'search_history'=>['cookbook'=>[],'food'=>[]],
'search_guess'=>[],
'default_count_foot'=>[
'date'=>'', //时间
"nutrients_four"=>[
[
"name"=>"卡路里",
"unit"=>"kcal",
"suggestion"=>0,
"today_intake"=>0,
"icon"=>"https://tc.pcxbc.com/kitchenscale_all/icon_kcal.png",
"color"=>"#5180D8",
"proportion"=>0,
"proportion_fp"=>0
],
[
"name"=>"碳水",
"unit"=>"g",
"suggestion"=>0,
"today_intake"=>0,
"icon"=>"https://tc.pcxbc.com/kitchenscale_all/icon_carbohydrate.png",
"color"=>"#ED7886",
"proportion"=>0,
"proportion_fp"=>0
],
[
"name"=>"蛋白质",
"unit"=>"g",
"suggestion"=>0,
"today_intake"=>0,
"icon"=>"https://tc.pcxbc.com/kitchenscale_all/icon_protein.png",
"color"=>"#FFB169",
"proportion"=>0,
"proportion_fp"=>0
],
[
"name"=>"脂肪",
"unit"=>"g",
"suggestion"=>0,
"today_intake"=>0,
"icon"=>"https://tc.pcxbc.com/kitchenscale_all/icon_fat.png",
"color"=>"#3CB383",
"proportion"=>0,
"proportion_fp"=>0
]
],
'remaining_kcal'=>0, //剩下可摄入卡路里量
'details'=>[ //当天营养元素能量占比
'carbohydrate'=>['name'=>'碳水','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_carbohydrate.png','color'=>'#ED7886','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
'protein'=>['name'=>'蛋白质','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_protein.png','color'=>'#FFB169','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
'fat'=>['name'=>'脂肪','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_fat.png','color'=>'#3CB383','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
],
'trace_elements_all_day' => [
[
'name' => 'VitaminA',
'name_ch' => '维生素A',
'unit' => 'μg RAE',
'value' => 0
],
[
'name' => 'VitaminB1',
'name_ch' => '硫胺素',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB2',
'name_ch' => '核黄素',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB6',
'name_ch' => '维生素B6',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB12',
'name_ch' => '维生素B12',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'VitaminD',
'name_ch' => '维生素D',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'VitaminK',
'name_ch' => '维生素K',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Niacin',
'name_ch' => '烟酸',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminC',
'name_ch' => '维生素C',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminE',
'name_ch' => '维生素E',
'unit' => 'mg α-TE',
'value' => 0
],
[
'name' => 'FolicAcid',
'name_ch' => '叶酸',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Biotin',
'name_ch' => '生物素',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'PantothenicAcid',
'name_ch' => '泛酸',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'TotalCholine',
'name_ch' => '总胆碱',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Ca',
'name_ch' => '钙',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Phosphorus',
'name_ch' => '磷',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Kalium',
'name_ch' => '钾',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Mg',
'name_ch' => '镁',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Na',
'name_ch' => '钠',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Fe',
'name_ch' => '铁',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Zn',
'name_ch' => '锌',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Se',
'name_ch' => '硒',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Cu',
'name_ch' => '铜',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Mn',
'name_ch' => '锰',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Iodine',
'name_ch' => '碘',
'unit' => 'μg',
'value' => 0
]
],
'list'=>[
[
'name'=>'早餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#0992B4',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_1.png',
'icon_home'=>'/static/1.png',
'bgimg_home'=>'/static/2.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'午餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#4F9211',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_2.png',
'icon_home'=>'/static/3.png',
'bgimg_home'=>'/static/4.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'晚餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#B354B0',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_3.png',
'icon_home'=>'/static/5.png',
'bgimg_home'=>'/static/6.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'加餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#C08433',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_4.png',
'icon_home'=>'/static/7.png',
'bgimg_home'=>'/static/8.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
],
],
'activity_level'=>[
['name'=>'久坐(很少或没有运动)','val'=>'1.2'],
['name'=>'轻度活动每周1-3天轻度运动','val'=>'1.375'],
['name'=>'中度活动每周3-5天中度运动','val'=>'1.55'],
['name'=>'高度活动每周6-7天高强度运动','val'=>'1.725'],
['name'=>'极高活动(体力劳动或每天高强度训练)','val'=>'1.9'],
],
'language_arr'=>$this->process_Language()
];
$cfc = Db::connect('cfc_db');
// 如果有账号信息
if(array_key_exists('token', $data)){
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005);
}
// 获取账号下信息以及用户信息 start
$user = $cfc->table($this->kitchenscale_db_msg['user'])->where(["token"=>$data['token']])->find();
if($user){
// return $this->msg(20001,'账号信息错误');
// 处理搜索历史 start
$search_history_cookbook = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where(["user_id"=>$user['id'],'is_del'=>0,'type'=>'cookbook'])
->field('id,keyword,last_searched_at,type')
->order('last_searched_at desc')
->limit(10)
->select();
$search_history_food = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where(["user_id"=>$user['id'],'is_del'=>0,'type'=>'food'])
->field('id,keyword,last_searched_at,type')
->order('last_searched_at desc')
->limit(10)
->select();
// 去重
foreach ($search_history_cookbook as $key => $value) {
unset($search_history_cookbook[$key]['type']);
unset($search_history_cookbook[$key]['ROW_NUMBER']);
}
foreach ($search_history_food as $key => $value) {
unset($search_history_food[$key]['type']);
unset($search_history_food[$key]['ROW_NUMBER']);
}
$return_data['search_history']['cookbook'] = $search_history_cookbook;
$return_data['search_history']['food'] = $search_history_food;
// 处理搜索历史 end
}
// $return_data['user_data'] = $user;
// if($return_data['user_data']['birthday']){
// $return_data['user_data']['age'] = $this->calculate_age($return_data['user_data']['birthday']);
// }
// 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'];
// $return_data['kcal_data']['time'] = $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{
// $return_data['kcal_data']['list'][3]['value'] = bcadd($return_data['kcal_data']['list'][3]['value'],$value['kcal_val'],2);
// }
// }
// foreach ($return_data['kcal_data']['list'] as $key => $value) {
// if($value['value'] <= 0){
// $return_data['kcal_data']['list'][$key]['value'] = '-';
// }
// }
// }
// 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
// dump($return_data);
}else{
}
// 处理banner信息 start
// $banner_list = Db::table($this->reedaw_db_name['banner'])->where(['scene_data' => '3','is_del'=>0])->cache(43200)->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']);
// }
// $return_data['banner_data'] = $banner_list;
// 处理banner信息 end
// 处理猜你喜欢信息start
// 使用三元运算符判断$user是否存在
$user_id = isset($user) ? $user['id'] : 9999999;
$cnxh = new Guessyoulike;
$cookbook_data = $cnxh->getGuessYouLike($user_id,'cookbook');
$food_data = $cnxh->getGuessYouLike($user_id,'food');
foreach ($cookbook_data as $key => $value) {
$return_data['search_guess']['cookbook'][] = ['title'=>$key,'list'=>$value];
}
foreach ($food_data as $key => $value) {
$return_data['search_guess']['food_data'][] = ['title'=>$key,'list'=>$value];
}
// 处理猜你喜欢信息end
// 添加商务合作信息start
$business_cooperation = $cfc->table($this->kitchenscale_db_msg['business_cooperation'])->where(["is_del"=>0])->field('id,title,data_url as jump_url')->find();
$return_data['business_cooperation'] = $business_cooperation;
// 添加商务合作信息start
// 添加菜谱label start
$cookbook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])->where(["is_del"=>0])->field('id,name')->select();
$return_data['cookbook_label'] = $cookbook_label;
// 添加菜谱label end
// 添加每餐背景图start
$return_data['meal_list'] = [
['icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_1.png','name'=>'早餐','icon_bg'=>'https://tc.pcxbc.com/kitchenscale_all/meal_1_bg.jpg'],
['icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_2.png','name'=>'午餐','icon_bg'=>'https://tc.pcxbc.com/kitchenscale_all/meal_2_bg.jpg'],
['icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_3.png','name'=>'晚餐','icon_bg'=>'https://tc.pcxbc.com/kitchenscale_all/meal_3_bg.jpg'],
['icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_4.png','name'=>'加餐','icon_bg'=>'https://tc.pcxbc.com/kitchenscale_all/meal_4_bg.jpg'],
];
// 添加每餐背景图start
return $this->msg($return_data);
}
public function search_column_action($data){
// $cookbook = new Cookbook();
$cfc = Db::connect('cfc_db');
$page_now = array_key_exists('page',$data)?$data['page']:1;
$page_total = $page_now;
$page_num = 20;
// 获取菜谱信息
$content_num = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->where("title LIKE '%".$data['search_data']."%' OR describe_data LIKE '%".$data['search_data']."%'")
->count();
$page_total = ceil($content_num/$page_num);
$content_list = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->alias('cookbook')
->join($this->kitchenscale_db_msg['uploadimg'].' uploadimg','cookbook.cover = uploadimg.id','LEFT')
->where("cookbook.title LIKE '%".$data['search_data']."%' OR cookbook.describe_data LIKE '%".$data['search_data']."%'")
->field("cookbook.id,cookbook.title,cookbook.create_user_head_pic,cookbook.create_user_nickname,cookbook.likes_num,uploadimg.pic_url as cover")
->page("$page_now,$page_num")
->select();
if(count($content_list)<=0){
return $this->msg([]);
}
if(array_key_exists('token',$data)){
if($data['token'] != ''){
// 获取账号下信息以及用户信息
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if($user_data){
// 获取用户收藏列表
$my_collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->where(['token'=>$data['token']])
->column('cookbook_id');
// dump();
// 处理菜谱收藏信息
foreach ($content_list as $key => $value) {
if(array_key_exists($value['id'],$my_collect_list)){
$content_list[$key]['is_me_like_it'] = 'yes';
}else{
$content_list[$key]['is_me_like_it'] = 'no';
}
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
if($data['search_data'] != ''){
$this->add_search_history_action(['id'=>$user_data['id'],'search_data'=>$data['search_data'],'type'=>'cookbook']);
}
}else{
foreach ($content_list as $key => $value) {
$content_list[$key]['is_me_like_it'] = 'no';
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}
}else{
foreach ($content_list as $key => $value) {
$content_list[$key]['is_me_like_it'] = 'no';
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}
}else{
foreach ($content_list as $key => $value) {
$content_list[$key]['is_me_like_it'] = 'no';
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}
return $this->msg([
'page_now'=>$page_now,
'page_total'=>$page_total,
'content_list'=>$content_list
]);
}
########################################################################################################################################################################
########################################################################################################################################################################
########################################################################################################################################################################
public function create_random_string($length = 12)
{
//创建随机字符
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
public function pd_language($user_language,$isSupportedLanguage,$language){
if(!$user_language){
if($isSupportedLanguage){
$result = $language;
}else{
$result = 'zh'; // 默认语言为中文
}
}else{
$result = $user_language;
}
return $result;
}
// 处理返回的语言数组
public function process_Language(){
$temporary_arr = [];
foreach ($this->language_country as $key => $value) {
array_push($temporary_arr,['name'=>$value[0],'val'=>$key,'key'=>$value[1]]);
}
return $temporary_arr;
}
}

View File

@ -0,0 +1,240 @@
<?php
namespace app\KitchenScale2\controller\app;
class Language extends Base
{
// 支持的语言列表
protected $supportedLanguages = [
'en' => 'English',
'zh-Hans' => 'Chinese',
'es' => 'Spanish',
'fr' => 'French',
'pt' => 'Portuguese',
'ar' => 'Arabic',
'ru' => 'Russian',
'de' => 'German'
];
// 语言映射表
protected $languageMap = [
'en' => [
'操作成功' => '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',
'身高' => 'Height',
'消瘦' => 'Slim',
'正常' => 'Normal',
'偏重' => 'Overweight',
'肥胖' => 'Obesity',
'反映和衡量一个人健康状况的重要标志之一' => "One of the important indicators reflecting and measuring a person's health status",
'人体纵向部分的长度,源于人体的纵向生长,受遗传因素的影响较大' => "The length of the longitudinal part of the human body is derived from its longitudinal growth and is greatly influenced by genetic factors",
'BMI是身体质量指数,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。' => "BMI is the body mass index, which is currently a commonly used international standard for measuring the degree of body fat, thinness, and health.",
'公斤' => "kg",
'CM' => "cm",
'年' => "-",
'月' => "-",
'日' => "",
'身体得分' => "Physical score",
'分' => "score",
'身体类型' => "body type",
'健美肌肉型' => "Bodybuilding muscle type",
'低' => "Low",
'偏低' => "Slightly low",
'标准' => "Standard",
'偏高' => "Slightly high",
'高' => "High",
'矮' => "Short",
'偏矮' => "Slightly short",
'脂肪率' => "Body Fat Percentage",
'体脂率是指身体成分中,脂肪组织所占的比率。测量体脂率比单纯的只测量体重更能反映我们身体的脂肪水平(肥胖程度)。' => "Body fat percentage refers to the proportion of fat tissue in body composition. Measuring it provides a more accurate reflection of body fat levels (degree of obesity) than weight measurement alone.",
'脂肪量' => "Fat Mass",
'人体脂肪的重量' => "Body Fat Weight",
'肌肉率' => "Muscle Percentage",
'优' => "Excellent",
'根据人体肌肉总量和人体体重、身高等相结合得到的人体的一个比例值,这个值的范围决定一个人的身体健康状况以及力量的多少。' => "Muscle percentage is a ratio derived from total muscle mass, body weight, height, etc. Its range determines a person's health status and strength level.",
'肌肉量' => "Muscle Mass",
'不足' => "Insufficient",
'肌肉量=实际体重*肌肉率' => "Muscle Mass = Actual Weight × Muscle Percentage",
'水分' => "Body Water",
'指人体内水分比例。' => "Refers to the proportion of water in the human body.",
'蛋白量' => "Protein Mass",
'蛋白量=实际体重*蛋白率' => "Protein Mass = Actual Weight × Protein Percentage",
'骨重' => "Bone Mass",
'单位体积内,骨组织、骨矿物质(钙、磷等)和骨基质(骨胶原、蛋白率、无机盐等等)含量,骨量代表它们骨骼健康的情况。' => "Bone mass refers to the content of bone tissue, minerals (calcium, phosphorus, etc.), and bone matrix (collagen, proteins, inorganic salts, etc.) per unit volume, reflecting skeletal health.",
'蛋白率' => "Protein Percentage",
'人体内蛋白率含量。' => "The proportion of protein in the human body.",
'基础代谢' => "Basal Metabolic Rate (BMR)",
'指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率' => "The energy expenditure rate when the body is awake, completely at rest, and unaffected by muscle activity, ambient temperature, food intake, or mental stress.",
'内脏指数' => "Visceral Fat Index",
'警惕' => "Caution",
'危险' => "Danger",
'内脏脂肪指数' => "Visceral Fat Level",
'皮下脂肪' => "Subcutaneous Fat",
'皮下脂脂肪就是贮存于皮下的脂肪组织人体的脂肪大约有2/3贮存在皮下组织' => "Subcutaneous fat refers to adipose tissue stored under the skin. About two-thirds of body fat is stored subcutaneously.",
'肥胖等级' => "Obesity Level",
'体重不足' => "Underweight",
'肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。' => "Obesity level indicates the disparity between actual and ideal weight, serving as a diagnostic criterion for obesity.",
'孩子可能存在营养不良对于处在生长发育期的孩子而言蛋白质、碳水化合物、维生素和矿物质这四类营养素非常重要。建议补充足够的蛋白质、锌、钙、铁、维生素D、赖氨酸等营养。建议补充含鸡内金山楂膏健脾开胃类药食同源食物。' => "The child may be malnourished: For growing children, protein, carbohydrates, vitamins, and minerals are critical. Ensure adequate intake of protein, zinc, calcium, iron, vitamin D, lysine, etc. Consider herbal foods like chicken gizzard-hawthorn paste to improve digestion and appetite.",
'孩子可能存在营养不良对于处在生长发育期的孩子而言最有利于长高的营养素是蛋白质、碳水化合物、维生素和矿物质四类。建议补充足够的蛋白质、锌、铁、钙、维生素D、赖氨酸等营养。' => "The child may be malnourished: For children in their growth and development stage, the most beneficial nutrients for height growth are proteins, carbohydrates, vitamins, and minerals. It is recommended to ensure adequate intake of nutrients such as protein, zinc, iron, calcium, vitamin D, and lysine.",
'坚持适当、科学的跳跃运动能够科学地增加学生体重,能够改善学 生体重过低的情况;同时运动会消耗能量并加速胃肠蠕动,这会使孩子的食欲大开,再配合均衡的营养有利于孩子增重。' => "Moderate, scientifically designed jumping exercises can help underweight students gain weight by boosting energy expenditure and gastrointestinal motility, thereby increasing appetite. Combined with balanced nutrition, this supports healthy weight gain.",
'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.",
'孩子开始对于赞赏、鼓励、认同和肯定有需求,而且此阶段父亲在孩子的性格塑造、情绪控制以及责任感培养方面扮演着重要的角色,必须告诉孩子什么事应该做、什么事不应该做,并经常性地给孩子一些积极地暗示。例如,可以时常向孩子表达“我会一直在你身边,不要害怕””我对你的进步都看在眼里等类似的话语。' => "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/T 423-2022》' => "《Chinese Health Industry Standard WS 423-2022》",
'《中华人民共和国卫生行业标准WS/T 612-2018》' => "《Chinese Health Industry Standard WS/T 612-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)》",
'头围' => "Head Circumference",
'头围是指绕头部一周的最大长度,头围的大小与脑的发育密切相关' => "Head circumference refers to the maximum length around the head. Its measurement is closely related to brain development.",
'心率' => "Heart rate",
'过缓' => "Too slow",
'过速' => "Too fast",
'心率变化与心脏疾病密切相关,请随时关注心率变化情况,尤其是运动时期。' => "Heart rate changes are closely related to heart disease, please keep an eye on heart rate changes, especially during exercise.",
'心率图' => "heart rate chart",
'第1次' => "1st",
'第2次' => "2nd",
'第3次' => "3rd",
'第4次' => "4th",
'第5次' => "5th",
'第6次' => "6th",
'第7次' => "7th",
'第8次' => "8th",
'第9次' => "9th",
'第10次' => "10th",
'第11次' => "11th",
'第12次' => "12th",
],
// 可以添加更多语言映射
];
/**
* 处理多国语言翻译
*
* @param string $language 目标语言代码
* @param mixed $data 要翻译的数据(字符串或数组)
* @return mixed 翻译后的数据
*/
public function handling_languages_from_multiple_countries($language, $data)
{
// dump($data);
// 验证语言是否支持
if (!$this->isLanguageSupported($language)) {
return $this->msg($data['data']);
}
// 如果是数组,递归处理每个元素
if (is_array($data)) {
// dump(2);
$data = $this->translateArray($language, $data);
return $this->msg($data['data']);
}
// 如果是字符串,直接翻译
if (is_string($data)) {
// dump(3);
return $this->translateString($language, $data);
}
// dump($data);
// 其他类型直接返回
return $this->msg($data['data']);
}
/**
* 检查语言是否支持
*
* @param string $language 语言代码
* @return bool
*/
protected function isLanguageSupported($language)
{
return isset($this->supportedLanguages[$language]);
}
/**
* 翻译数组
*
* @param string $language 目标语言
* @param array $array 要翻译的数组
* @return array 翻译后的数组
*/
protected function translateArray($language, array $array)
{
$result = [];
foreach ($array as $key => $value) {
// 保持键不变,只翻译值
$result[$key] = is_array($value)
? $this->translateArray($language, $value)
: $this->translateString($language, $value);
}
return $result;
}
/**
* 翻译字符串
*
* @param string $language 目标语言
* @param string $string 要翻译的字符串
* @return string 翻译后的字符串
*/
protected function translateString($language, $string)
{
// dump($string);
// 检查是否有该语言的映射表
if (!isset($this->languageMap[$language])) {
return $string;
}
// 检查是否有对应的翻译
return $this->languageMap[$language][$string] ?? $string;
}
/**
* 获取支持的语言列表
*
* @return array
*/
public function getSupportedLanguages()
{
return $this->supportedLanguages;
}
/**
* 添加新的语言翻译
*
* @param string $language 语言代码
* @param array $translations 翻译映射数组
* @return bool
*/
public function addTranslations($language, array $translations)
{
if (!$this->isLanguageSupported($language)) {
return false;
}
if (!isset($this->languageMap[$language])) {
$this->languageMap[$language] = [];
}
$this->languageMap[$language] = array_merge(
$this->languageMap[$language],
$translations
);
return true;
}
}

View File

@ -0,0 +1,705 @@
<?php
namespace app\KitchenScale2\controller\app;
use think\Db;
use PHPMailer\PHPMailer\PHPMailer;
use app\app\controller\Wechat;// 引入Wechat服务类
class Login extends Base{
protected $code_time = 50;
// protected $token_time = 2592000;//30天的秒数
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
protected $login_use_db_name = [
'1'=>'app_account_number',
];
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 注册
public function register_action($data = ['data'=>13408173311,'password'=>'123','code'=>'746119']){
try {
// 你的业务逻辑
// 验证是否前段发送过来的数据
if(count(input('post.')) > 0){
$data = input('post.');
}
// 验证数据项是否完整
if(!array_key_exists('data', $data) || !array_key_exists('password', $data) || !array_key_exists('code', $data)){
return $this->msg(10001);
}
// 验证数据值是否合规
if(!$data['data'] || !$data['password'] || !$data['code']){
return $this->msg(10006);
}
if(!$this->verify_data_is_ok($data['password'],'str')){
return $this->msg(10005);
}
if(!$this->verify_data_is_ok($data['code'],'num')){
return $this->msg(10005);
}
// 验证是手机还是邮箱
$montage_data = $this->is_tel_email($data['data']);
if($montage_data == false){
return $this->msg(10005);
}
// 查询账号是否已经注册
$inspect_repeat = Db::table($this->login_use_db_name['1'])->where([$montage_data=>$data['data'],'is_del'=>0])->count();
if($inspect_repeat > 0){
return $this->msg(10002,'注册失败,账号已存在');
}
// 检查验证码
$code_result = $this->check_code($data['data'],$data['code']);
if($code_result !== true){
return $this->msg(10002,$code_result);
}
// 验证完之后
$set_data = [];
if($montage_data == 'tel'){
$set_data['tel'] = $data['data'];
}else{
$set_data['email'] = $data['data'];
}
$set_data['password'] = $data['password'];
$set_data['head_pic'] = $this->default_head_pic;
$set_data['nickname'] = '用户'.time();
$set_data['create_time'] = date('Y-m-d H:i:s');
$set_data['login_time'] = date('Y-m-d H:i:s');
$set_data['token'] = md5($data['data'].$this->create_random_string(12).time());
$result = Db::table($this->login_use_db_name['1'])->insertGetId($set_data);
if($result){
$return_data = $this->msg(['token'=>$set_data['token'],'aan_id'=>$result]);
}else{
$return_data = $this->msg(10002);
}
// 成功
$this->record_api_log($data, null, $return_data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 重置密码
public function reset_password($data = ['data'=>'18530934717','password'=>'ceshi1','c_password'=>'ceshi1','code'=>'491661']){
try {
// 你的业务逻辑
// 验证是否前段发送过来的数据
if(count(input('post.')) > 0){
$data = input('post.');
}
// 验证数据项是否完整
if(!array_key_exists('data', $data) || !array_key_exists('password', $data) || !array_key_exists('c_password', $data) || !array_key_exists('code', $data)){
return $this->msg(10001);
}
// 验证数据值是否合规
if($data['password'] != $data['c_password']){
return $this->msg(10003,'两次密码不一致');
}
if($data['password'] == ''){
return $this->msg(10003,'密码不能为空');
}
if(!$this->verify_data_is_ok($data['password'],'str')){
return $this->msg(10005);
}
if(!$this->verify_data_is_ok($data['code'],'num')){
return $this->msg(10005);
}
// 检查验证码
$code_result = $this->check_code($data['data'],$data['code']);
if($code_result !== true){
return $this->msg(10003,$code_result);
}
$t_y = $this->is_tel_email($data['data']);
if($t_y === false){
return $this->msg(10003,'账号格式错误');
}
// 检查账号是否存在
$find_data = Db::table($this->login_use_db_name['1'])->where([$t_y=>$data['data'],'is_del'=>0])->field('id,token')->find();
if(!$find_data){
return $this->msg(10003);
}
$result = Db::table($this->login_use_db_name['1'])->where([$t_y=>$data['data']])->update(['password'=>$data['password']]);
if($result){
$return_data = $this->msg(['token'=>$find_data['token'],'aan_id'=>$find_data['id']]);
}else{
$return_data = $this->msg(10002);
}
// 成功
$this->record_api_log($data, null, $return_data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 登录
public function login_action($data = ['data'=>'18530934717','validate_data'=>'0932','type'=>'login','validate_type'=>'password']){
try {
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('data', $data) || !array_key_exists('validate_data', $data) || !array_key_exists('validate_type', $data)){
return $this->msg(10001);
}
// 检测是否为手机
$montage_data = $this->is_tel_email($data['data']);
if($montage_data == false){
return $this->msg(10005);
}
$verify_result[$montage_data] = $data['data'];
$verify_result['is_del'] = 0;
// 检测校验途径
if($data['validate_type'] == 'code'){
$code_name = $data['data'];
if($this->check_code($code_name,$data['validate_data']) === true){
$result = Db::table($this->login_use_db_name['1'])->where($verify_result)->field('id,token')->find();
if($result){
Db::table($this->login_use_db_name['1'])->where($verify_result)->update(['login_time'=>date('Y-m-d H:i:s')]);
$return_data = $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']]);
}else{
$set_data['password'] = '';
$set_data[$montage_data] = $data['data'];
$set_data['head_pic'] = $this->default_head_pic;
$set_data['nickname'] = '用户'.$data['data'];
$set_data['create_time'] = date('Y-m-d H:i:s');
$set_data['login_time'] = date('Y-m-d H:i:s');
$set_data['token'] = md5($data['data'].$this->create_random_string(12).time());
$result = Db::table($this->login_use_db_name['1'])->insertGetId($set_data);
if($result){
$return_data = $this->msg(['token'=>$set_data['token'],'aan_id'=>$result],'登录成功');
}else{
$return_data = $this->msg(10002);
}
}
}else{
$return_data = $this->msg(10003,'登录失败,验证码错误或失效');
}
}else if($data['validate_type'] == 'password'){
// $verify_result['password'] = $data['validate_data'];
$result = Db::table($this->login_use_db_name['1'])->where($verify_result)->field('id,token,password')->find();
if($result){
if($result['password'] == ''){
$return_data = $this->msg(10003,'该账户未设密码,请用验证码登录');
}
if($data['validate_data'] != $result['password']){
$return_data = $this->msg(10003,'账号密码错误');
}else{
Db::table($this->login_use_db_name['1'])->where($verify_result)->update(['login_time'=>date('Y-m-d H:i:s')]);
$return_data = $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']],'登录成功');
}
}else{
$return_data = $this->msg(10003,'账号未注册,请先注册');
}
}else{
$return_data = $this->msg(10003,'校验参数错误');
}
// 成功
$this->record_api_log($data, null, $return_data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 微信手机号快捷登录
public function wechat_quick_login(){
try {
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('code', $data)){
// return $this->msg(10001,'');
return $this->msg(10001,'code is miss');
}
if(!array_key_exists('encryptedData', $data)){
return $this->msg(10001,'encryptedData is miss');
}
if(!array_key_exists('iv', $data)){
return $this->msg(10001,'iv is miss');
}
// 校验参数
if (empty($data['code'])) {
return $this->msg(10001,'code is miss.');
}
if (empty($data['encryptedData'])) {
return $this->msg(10001,'encryptedData is miss.');
}
if (empty($data['iv'])) {
return $this->msg(10001,'iv is miss.');
}
// 调用Wechat服务类处理微信登录逻辑
$wechatService = new Wechat();
$result = $wechatService->handleWechatLogin($data['code'], $data['encryptedData'], $data['iv']);
// die;
if($result['code'] == 0){
// return $this->msg($result['code'],$result['msg']);
$user_data = Db::table($this->login_use_db_name['1'])->where(['tel'=>$result['data']['phoneNumber'],'is_del'=>0])->find();
if($user_data){
Db::table($this->login_use_db_name['1'])->where(['token'=>$user_data['token']])->update(['login_time'=>date('Y-m-d H:i:s')]);
$return_data = $this->msg(['token'=>$user_data['token'],'aan_id'=>$user_data['id']]);
}else{
$set_data['password'] = '';
$set_data['tel'] = $result['data']['phoneNumber'];
$set_data['head_pic'] = $this->default_head_pic;
$set_data['nickname'] = '用户'.$result['data']['phoneNumber'];
$set_data['create_time'] = date('Y-m-d H:i:s');
$set_data['login_time'] = date('Y-m-d H:i:s');
$set_data['token'] = md5($result['data']['phoneNumber'].$this->create_random_string(12).time());
$set_user_result = Db::table($this->login_use_db_name['1'])->insertGetId($set_data);
if($set_user_result){
$return_data = $this->msg(['token'=>$set_data['token'],'aan_id'=>$set_user_result],'登录成功');
}else{
$return_data = $this->msg(10002);
}
}
return $return_data;
}else{
return $this->msg($result['code'],$result['msg']);
}
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 退出登录操作
public function user_quit_account($data=['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){
try {
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
$return_data = $this->msg(10001);
}
if($this->token_time_validate($data['token']) === false){
$return_data = $this->msg(20001);
}
$result = Db::table($this->login_use_db_name['1'])->where(['token'=>$data['token']])->update(['login_time'=>'2024-09-01 00:00:00']);
if($result){
$return_data = $this->msg([]);
}else{
$return_data = $this->msg(10002);
}
// 成功
$this->record_api_log($data, null, $return_data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 删除账号
public function delete_account($data=['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){
try {
// 你的业务逻辑
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
$return_data = $this->msg(10001);
}
$result = Db::table($this->login_use_db_name['1'])->where(['token'=>$data['token']])->update(['is_del'=>1,'login_time'=>'2024-09-01 00:00:00']);
if($result){
$return_data = $this->msg([]);
}else{
$return_data = $this->msg(10002);
}
// 成功
$this->record_api_log($data, null, $return_data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "方法: " . __METHOD__ . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 发送验证码 手机/邮箱
/* 接口说明(发邮件)
* $data手机或者邮箱信息 字符串
* $type验证类型是注册用还是其他用途 字符串 默认register注册register、login、reset_password
* $road是手机还是邮箱还是其他 字符串 默认tel或email
*/
//18736019909
public function send_phone_email_code($data = ['data'=>'18736019909']){
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('data', $data)){
return $this->msg(10001);
}
if(cache($data['data'])){
return $this->msg(10002,'60秒仅可发送一次验证码');
}
$num = mt_rand(100000,999999);
if (preg_match('/^\d{11}$/', $data['data'])) {
// 本公司短信
$result = $this->send_tel_code($data['data'],$num);
// 阿里云短信
// $sms_all = new Smsaliyun;
// $result = $sms_all->send_sms($data['data'],$num);
// dump($result);
$road = 'tel';
}else{
$result = $this->send_email_code([$data['data']],['title'=>'体测APP验证码','from_user_name'=>'体测APP','content'=>$num]);
$road = 'email';
}
if(is_array($result) && $result['code'] == 0){
cache($data['data'], $num, $this->code_time);
// return $this->msg(['code'=>$num]);
return $this->msg([]);
// return true;
}else{
return $this->msg(10010,'验证码发送失败');
// return false;
}
}
################################内部调用################################
/* 接口说明(发手机短信)
*/
public function send_tel_code($tel,$code){
// 初始化cURL会话
$ch = curl_init();
$headers = [
'Accept: application/json',
'Content-Type: application/json',
];
// 设置头部信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 设置请求的URL
$url = "http://sms.ybhdmob.com/Message/Send?token=ybhdmob";
curl_setopt($ch, CURLOPT_URL, $url);
// 设置为POST请求
curl_setopt($ch, CURLOPT_POST, 1);
// 设置POST数据
$postData = array(
'phone' => $tel,
// 'content' => '【巨天】您好欢迎使用Reedaw您的手机验证码是'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信'
// 'content' => '【郑州品传科技】您好欢迎使用Reedaw您的手机验证码是'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信'
// 'content' => '【每日一称】您好欢迎使用Reedaw您的手机验证码是'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信'
'content' => '【小白健康】您好欢迎使用Reedaw您的手机验证码是'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信'
);
$postData = json_encode($postData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
// 设置返回结果不直接输出,而是返回到变量中
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 发送请求并获取响应
$response = curl_exec($ch);
// dump($response);
// 检查是否有错误发生
if (curl_errno($ch)) {
$error_message = curl_error($ch);
return "请求错误: " . $error_message;
}
// 关闭cURL会话
curl_close($ch);
// 处理响应
// dump(json_decode($response,true));
if ($response) {
return json_decode($response,true);
} else {
echo "未收到响应";
}
}
// 手机号区分
function getCarrierByPhone($phone) {
// 验证手机号格式11位数字且以1开头
if (!preg_match('/^1[3-9]\d{9}$/', $phone)) {
return '无效手机号';
}
$prefix3 = substr($phone, 0, 3);
// 2025年最新3位号段排除4位号段
$carriers = [
'中国移动' => ['134', '135', '136', '137', '138', '139', '150', '151', '152', '157', '158', '159', '178', '182', '183', '184', '187', '188', '195', '197', '198'],
'中国联通' => ['130', '131', '132', '155', '156', '166', '175', '176', '185', '186', '196'],
'中国电信' => ['133', '153', '173', '177', '180', '181', '189', '190', '191', '193', '199'],
'中国广电' => ['192']
];
foreach ($carriers as $carrier => $segments) {
if (in_array($prefix3, $segments)) {
return $carrier;
}
}
return '未知运营商';
}
/* 接口说明(发邮件)
* $address收件人的邮箱地址 数组 格式: ['460834639@qq.com','460834639@qq.com'.......]
* $content邮件的主题数据信息 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123']
* $annex附件路径信息 字符串
*/
public function send_email_code($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 = '<div style="margin: 0; padding: 0;">
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background: #f3f3f3; min-width: 350px; font-size: 1px; line-height: normal;">
<tbody><tr>
<td align="center" valign="top">
<table cellpadding="0" cellspacing="0" border="0" width="750" class="table750" style="width: 100%; max-width: 750px; min-width: 350px; background: #f3f3f3;">
<tbody><tr>
<td class="mob_pad" width="25" style="width: 25px; max-width: 25px; min-width: 25px;">&nbsp;</td>
<td align="center" valign="top" style="background: #ffffff;">
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="width: 100% !important; min-width: 100%; max-width: 100%; background: #f3f3f3;">
<tbody><tr>
<td align="right" valign="top">
<div class="top_pad" style="height: 25px; line-height: 25px; font-size: 23px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="left" valign="top">
<div style="height: 39px; line-height: 39px; font-size: 37px;">&nbsp;</div>
<font class="mob_title1" face="\'Source Sans Pro\', sans-serif" color="#1a1a1a" style="font-size: 52px; line-height: 55px; font-weight: 300; letter-spacing: -1.5px;">
<span class="mob_title1" style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #fb966e; font-size: 48px; line-height: 55px; font-weight: 700; letter-spacing: -1.5px;">Reedaw!</span>
</font>
<div style="height: 73px; line-height: 73px; font-size: 71px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="left" valign="top">
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #585858; font-size: 24px; line-height: 32px;">感谢您选择锐动产品!</span>
</font>
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #585858; font-size: 24px; line-height: 32px;">以下6位数字是邮箱验证码请在需要的位置填写以通过验证</span>
</font>
<div style="height: 18px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #aaaaaa; font-size: 16px; line-height: 32px;">(如果您从未请求发送邮箱验证码,请忽略此邮件)</span>
</font>
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<table class="mob_btn" cellpadding="0" cellspacing="0" border="0" style="background: #fb966e; border-radius: 4px;">
<tbody><tr>
<td align="center" valign="top">
<span style="display: block; border: 1px solid #fb966e; border-radius: 0px; padding: 6px 12px; font-family: \'Nunito\', Arial, Verdana, Tahoma, Geneva, sans-serif; color: #ffffff; font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">
<font face="\'Nunito\', sans-serif" color="#ffffff" style="font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">
<span style="font-family: \'Nunito\', Arial, Verdana, Tahoma, Geneva, sans-serif; color: #ffffff; font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">'.$content['content'].'</span>
</font>
</span>
</td>
</tr>
</tbody></table>
<div style="height: 75px; line-height: 75px; font-size: 73px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="width: 100% !important; min-width: 100%; max-width: 100%; background: #f3f3f3;">
<tbody><tr>
<td align="center" valign="top">
<div style="height: 34px; line-height: 34px; font-size: 32px;">&nbsp;</div>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="center" valign="top">
<div style="height:12px; line-height: 34px; font-size: 32px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#868686" style="font-size: 17px; line-height: 20px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #868686; font-size: 17px; line-height: 20px;">© Zhengzhou Pinchuan Technology Co., Ltd. </span>
</font>
<div style="height: 3px; line-height: 3px; font-size: 1px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#1a1a1a" style="font-size: 17px; line-height: 20px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #1a1a1a; font-size: 17px; line-height: 20px;"><a target="_blank" style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #1a1a1a; font-size: 17px; line-height: 20px; text-decoration: none;" href="https://paoluz.link/"></a></span>
</font>
<div style="height: 35px; line-height: 35px; font-size: 33px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
<td class="mob_pad" width="25" style="width: 25px; max-width: 25px; min-width: 25px;">&nbsp;</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</div>';
$mail->Body = $neirong; //邮件主体内容
//发送
if (!$mail->Send()) {
return ['code' => 10003,'msg'=>$mail->ErrorInfo];
// return $mail->ErrorInfo;
} else {
return ['code' => 0];
// return 'success';
}
}
public function check_code($data = 18530934717 , $code = 123456){
// // 默认验证码正确
if(cache($data) == false){
return '验证码过期';
}else{
if($code != cache($data)){
return '验证码错误';
}
}
return true;
}
################################################################other################################################################
################################################################other################################################################
################################################################other################################################################
public function create_random_string($length = 12)
{
//创建随机字符
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
}

View File

@ -0,0 +1,75 @@
<?php
namespace app\KitchenScale2\controller\app;
// use think\Controller;
use think\Db;
class Product extends Base
{
protected $is_default = 1;
// 获取配置信息
public function get_default_configuration()
{
$cfc = Db::connect('cfc_db');
// $data = input();
// 2. 获取所点击选项的所有直属上级配置项
$content_num = $cfc->table("ceshi3_option")
->alias('xuanxiang')
->join('ceshi2_configuration peizhi','xuanxiang.parent_id = peizhi.id','LEFT')
->where(['peizhi.is_default'=>$this->is_default])
->field("xuanxiang.*,peizhi.name")
->select();
$temporary = [];
foreach ($content_num as $key => $value) {
$temporary[$value['name']]['id'] = $value['parent_id'];
$temporary[$value['name']]['name'] = $value['name'];
$temporary[$value['name']]['type'] = "configuration";
$temporary[$value['name']]['list'][$value['value']] = [];
$temporary[$value['name']]['list'][$value['value']]['id'] = $value['id'];
$temporary[$value['name']]['list'][$value['value']]['name'] = $value['value'];
$temporary[$value['name']]['list'][$value['value']]['type'] = "parameter";
$temporary[$value['name']]['list'][$value['value']]['list'] = [];
}
// dump($temporary);
// die;
return $this->msg($temporary);
}
// 获取所点击选项的所有直属上级配置项
private function getAncestorConfigurations($cfc, $optionId)
{
$ancestors = [];
// 获取当前选项的配置项
$currentConfig = $cfc->query("
SELECT c.id, c.name, c.parent_id
FROM configurations c
JOIN options o ON c.id = o.config_id
WHERE o.id = ?
", [$optionId]);
if (!empty($currentConfig)) {
$currentConfig = $currentConfig[0];
// 获取直属上级配置项
if ($currentConfig['parent_id']) {
$parentConfig = $cfc->query("
SELECT c.id, c.name
FROM configurations c
WHERE c.id = ?
", [$currentConfig['parent_id']]);
if (!empty($parentConfig)) {
$parentConfig = $parentConfig[0];
$ancestors[] = $parentConfig;
}
}
}
return $ancestors;
}
}

View File

@ -0,0 +1,892 @@
<?php
namespace app\KitchenScale2\controller\app;
use think\Db;
use app\KitchenScale2\controller\app\Countfood;
class Usercenter extends Base{
protected $code_time = 50;
// protected $token_time = 2592000;//30天的秒数
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
protected $page_num = 20;
protected $reedaw_db_msg = [
'zhanghao'=>'app_account_number',//账号表
'juese'=>'app_user_data',//角色表
];
protected $kitchenscale_db_msg = [
'cookbook'=>'app_user_cookbook',//菜谱表
'cookbook_label'=>'app_user_cookbook_label',//菜谱标签表
'uploadimg'=>'app_user_upload_img',//图片素材表
'foodlist1'=>'app_z_national_standard_food_type_1',//食材列表1
'foodlist2'=>'app_z_national_standard_food_type_2',//食材列表2
'foodlist3'=>'app_z_national_standard_food_type_3',//食材列表3
'collect_list'=>'app_user_collect_list',//点赞表
'banner'=>'app_banner_data',//banner
'user'=>'app_user_data',//用户表
'search_history'=>'app_user_search_history',//用户搜索表
'business_cooperation'=>'app_business_cooperation_log',//商务合作
'eat_log'=>'app_user_kcal_log',//食材列表3
];
protected $language_country = [
'zh' => '中文', // 中文(简体)★
'en' => 'English', // 英语(通用)★
'jp' => '日本語', // 日语(变化)
'fra' => 'Français', // 法语(变化)
'de' => 'Deutsch', // 德语
'kor' => '한국어', // 韩语(变化)
'ru' => 'Русский', // 俄语
'pt' => 'Português', // 葡萄牙
'spa' => 'Español', // 西班牙(变化)
'ara' => 'العربية', // 阿拉伯(变化)
];
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 获取角色信息
public function get_user_msg(){
try {
$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);
}
$return_data = $this->get_user_msg_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 修改用户
public function update_user_msg(){
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('nickname', $data)){
return $this->msg(10001,'nickname is miss');
}
if(!array_key_exists('gender', $data)){
return $this->msg(10001,'gender is miss');
}
if(!array_key_exists('birthday', $data)){
return $this->msg(10001,'birthday is miss');
}
if(!array_key_exists('height', $data)){
return $this->msg(10001,'height is miss');
}
if(!array_key_exists('weight', $data)){
return $this->msg(10001,'weight is miss');
}
if(!array_key_exists('activity_level', $data)){
return $this->msg(10001,'weight is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['nickname'],'str')){
return $this->msg(10005,'nickname type is error');
}
if(!$this->verify_data_is_ok($data['gender'],'intnum')){
return $this->msg(10005,'gender type is error');
}
if(!$this->verify_data_is_ok($data['birthday'],'datetime')){
return $this->msg(10005,'birthday type is error');
}
if(!$this->verify_data_is_ok($data['height'],'num')){
return $this->msg(10005,'height type is error');
}
if(!$this->verify_data_is_ok($data['weight'],'num')){
return $this->msg(10005,'weight type is error');
}
if(!$this->verify_data_is_ok($data['activity_level'],'num')){
return $this->msg(10005,'activity_level type is error');
}
$return_data = $this->update_user_msg_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 获取用户收藏点赞列表(OK)
// public function get_user_collect_list(){
// try {
// $data = input('post.');
// if(!array_key_exists('token', $data)){
// return $this->msg(10001,'token is miss');
// }
// if(!array_key_exists('page', $data)){
// return $this->msg(10001,'page is miss');
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005,'token type is error');
// }
// if(!$this->verify_data_is_ok($data['page'],'intnum')){
// return $this->msg(10005,'page type is error');
// }
// $return_data = $this->get_user_collect_list_action($data);
// return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "接口: get_default_config\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// $this->record_api_log($data, $logContent, null);
// return $this->msg(99999);
// }
// }
// 我的菜谱
// public function get_my_cookbook(){
// try {
// $data = input('post.');
// if(!array_key_exists('token', $data)){
// return $this->msg(10001,'token is miss');
// }
// if(!array_key_exists('page', $data)){
// return $this->msg(10001,'page is miss');
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005,'token type is error');
// }
// if(!$this->verify_data_is_ok($data['page'],'intnum')){
// return $this->msg(10005,'page type is error');
// }
// $return_data = $this->get_my_cookbook_action($data);
// return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "接口: get_default_config\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// $this->record_api_log($data, $logContent, null);
// return $this->msg(99999);
// }
// }
// 菜谱删除
// public function del_my_cookbook(){
// try {
// $data = input('post.');
// if(!array_key_exists('token', $data)){
// return $this->msg(10001,'token is miss');
// }
// if(!array_key_exists('aud_id', $data)){
// return $this->msg(10001,'aud_id is miss');
// }
// if(!array_key_exists('cookbook_id', $data)){
// return $this->msg(10001,'cookbook_id is miss');
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005,'token type is error');
// }
// if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
// return $this->msg(10005,'aud_id type is error');
// }
// if(!$this->verify_data_is_ok($data['cookbook_id'],'intnum')){
// return $this->msg(10005,'cookbook_id type is error');
// }
// $return_data = $this->del_my_cookbook_action($data);
// return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "接口: get_default_config\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// $this->record_api_log($data, $logContent, null);
// return $this->msg(99999);
// }
// }
// 搜索历史删除
public function del_search_history(){
// 尝试捕获异常
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!array_key_exists('del_arr', $data)){
return $this->msg(10001,'del_arr is miss');
}
if(!$this->verify_data_is_ok($data['del_arr'],'str')){
return $this->msg(10005,'del_arr type is error');
}
$data['del_arr'] = strval($data['del_arr']);
$data['del_arr'] = trim($data['del_arr']);
// 判断是否是 "all"(不区分大小写)
if (strtolower($data['del_arr']) !== 'all' && preg_match('/^\d+(,\d+)*$/', $data['del_arr']) !== 1) {
return $this->msg(10005,'del_arr type is error');
}
$return_data = $this->del_search_history_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 商务合作
public function business_cooperation(){
return $this->fetch();
}
// 设置营养比例
public function set_nutrition_proportion(){
// 尝试捕获异常
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!array_key_exists('set_kcal', $data)){
return $this->msg(10001,'set_kcal is miss');
}
if(!$this->verify_data_is_ok($data['set_kcal'],'num')){
return $this->msg(10005,'set_kcal type is error');
}
if(!array_key_exists('carbohydrate_v', $data)){
return $this->msg(10001,'carbohydrate_v is miss');
}
if(!$this->verify_data_is_ok($data['carbohydrate_v'],'num')){
return $this->msg(10005,'carbohydrate_v type is error');
}
if(!array_key_exists('carbohydrate_p', $data)){
return $this->msg(10001,'carbohydrate_p is miss');
}
if(!$this->verify_data_is_ok($data['carbohydrate_p'],'num')){
return $this->msg(10005,'carbohydrate_p type is error');
}
if(!array_key_exists('protein_v', $data)){
return $this->msg(10001,'protein_v is miss');
}
if(!$this->verify_data_is_ok($data['protein_v'],'num')){
return $this->msg(10005,'protein_v type is error');
}
if(!array_key_exists('protein_p', $data)){
return $this->msg(10001,'protein_p is miss');
}
if(!$this->verify_data_is_ok($data['protein_p'],'num')){
return $this->msg(10005,'protein_p type is error');
}
if(!array_key_exists('fat_v', $data)){
return $this->msg(10001,'fat_v is miss');
}
if(!$this->verify_data_is_ok($data['fat_v'],'num')){
return $this->msg(10005,'fat_v type is error');
}
if(!array_key_exists('fat_p', $data)){
return $this->msg(10001,'fat_p is miss');
}
if(!$this->verify_data_is_ok($data['fat_p'],'num')){
return $this->msg(10005,'fat_p type is error');
}
// $data['del_arr'] = strval($data['del_arr']);
// $data['del_arr'] = trim($data['del_arr']);
// 判断是否是 "all"(不区分大小写)
// if (strtolower($data['del_arr']) !== 'all' && preg_match('/^\d+(,\d+)*$/', $data['del_arr']) !== 1) {
// return $this->msg(10005,'del_arr type is error');
// }
$return_data = $this->set_nutrition_proportion_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 重置密码
public function update_my_password(){
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('password', $data)){
return $this->msg(10001,'password is miss');
}
if(!array_key_exists('c_password', $data)){
return $this->msg(10001,'c_password is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if($data['password'] != $data['c_password']){
return $this->msg(10005,'两次密码不一致');
}
if($data['password'] == ''){
return $this->msg(10005,'密码不能为空');
}
if(!$this->verify_data_is_ok($data['password'],'str')){
return $this->msg(10005,'password type is error');
}
if(!$this->verify_data_is_ok($data['c_password'],'str')){
return $this->msg(10005,'c_password type is error');
}
$return_data = $this->update_my_password_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 绑定手机/邮箱
public function update_my_account_msg(){
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('data', $data)){
return $this->msg(10001,'data is miss');
}
if(!array_key_exists('code', $data)){
return $this->msg(10001,'code is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['data'],'str')){
return $this->msg(10005,'data type is error');
}
if(!$this->verify_data_is_ok($data['code'],'intnum')){
return $this->msg(10005,'code type is error');
}
$return_data = $this->update_my_account_msg_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
public function update_language(){
try {
$data = input('post.');
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('language', $data)){
return $this->msg(10001,'language is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!array_key_exists($data['language'],$this->language_country)){
return $this->msg(10005,'language type is error');
}
$return_data = $this->update_language_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "接口: get_default_config\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
#######################################################################action#######################################################################
#######################################################################action#######################################################################
#######################################################################action#######################################################################
public function get_user_msg_action($data){
// 获取账号下信息以及用户信息
$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(10004);
}
// $return_data = [];
// 获取账号下信息以及用户信息start
$user_all_data['aud_id'] = '';
$user_all_data['token'] = $user_data['token'];
$user_all_data['nickname'] = $user_data['nickname'];
$user_all_data['head_pic'] = $user_data['head_pic'];
$user_all_data['gender'] = '';
$user_all_data['age'] = '';
$user_all_data['height'] = '';
$user_all_data['weight'] = '';
$user_all_data['set_kcal'] = '';
$user_all_data['is_use_set_kcal'] = '';
$user_all_data['tel'] = $user_data['tel'];
$user_all_data['email'] = $user_data['email'];
$cfc = Db::connect('cfc_db');
$user_account = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["token"=>$data['token']])
->field('id as aud_id,token,nickname,head_pic,gender,age,height,weight,set_kcal,is_use_set_kcal,birthday,activity_level')
->find();
if($user_account){
if($user_account['set_kcal'] == '.00'){
$user_account['set_kcal'] = 0;
}
$user_all_data['aud_id'] = $user_account['aud_id'];
$user_all_data['gender'] = $user_account['gender'];
$user_all_data['age'] = $user_account['age']?$user_account['age']:$this->calculate_age($user_account['birthday']);
$user_all_data['height'] = $user_account['height'];
$user_all_data['weight'] = $user_account['weight'];
$user_all_data['set_kcal'] = $user_account['set_kcal'];
$user_all_data['is_use_set_kcal'] = $user_account['is_use_set_kcal'];
$user_all_data['birthday'] = $user_account['birthday'];
$user_all_data['activity_level'] = $user_account['activity_level'];
if($user_all_data['gender'] == 2){
if($user_all_data['age'] <= 18){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/woman1.png";
}else if($user_all_data['age'] <= 39 && $user_all_data['age'] > 18){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/woman2.png";
}else if($user_all_data['age'] <= 59 && $user_all_data['age'] > 39){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/woman3.png";
}else if($user_all_data['age'] >= 60){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/woman4.png";
}
}else{
if($user_all_data['age'] <= 18){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/man1.png";
}else if($user_all_data['age'] <= 39 && $user_all_data['age'] > 18){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/man2.png";
}else if($user_all_data['age'] <= 59 && $user_all_data['age'] > 39){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/man3.png";
}else if($user_all_data['age'] >= 60){
$user_all_data['head_pic'] = "https://tc.pcxbc.com/kitchenscale_all/man4.png";
}
}
$countfood = new Countfood;
$user_all_data['food_count'] = $countfood->get_countfoot_content_action(['token'=>$data['token'],'aud_id'=>$user_all_data['aud_id'],'time'=>date('Y-m-d')]);
$user_all_data['food_count'] = ($user_all_data['food_count']->getData())['data'];
// dump($user_all_data['food_count']);
}else{
return $this->msg(10004);
}
// $return_data = $user_all_data;
return $this->msg($user_all_data);
// 获取账号下信息以及用户信息end
}
public function update_user_msg_action($data){
if($data['gender'] == 0){
return $this->msg(10005,'性别信息错误');
}
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->count();
if($user_data<=0){
return $this->msg(10005,'账号信息错误');
}
$cfc = Db::connect('cfc_db');
$is_user_true = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->count();
$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['gender'] = $data['gender'];
$user_msg['birthday'] = $data['birthday'];
$user_msg['height'] = $data['height'];
$user_msg['weight'] = $data['weight'];
$user_msg['activity_level'] = $data['activity_level'];
if($is_user_true>0){
$user_msg['update_time'] = date('Y-m-d H:i:s');
$result = $cfc->table($this->kitchenscale_db_msg['user'])
->where(['token'=>$data['token']])
->update($user_msg);
}else{
$user_msg['token'] = $data['token'];
$result = $cfc->table($this->kitchenscale_db_msg['user'])
->insert($user_msg);
}
Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->update(['nickname'=>$user_msg['nickname']]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function get_user_collect_list_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->count();
if($user_data<=0){
return $this->msg(10005,'账号信息错误');
}
$search_sql_str = "a.token = '".$data['token']."' AND a.is_del = 0 AND b.is_del = 0";
if(!array_key_exists('search_data', $data)){
$data['search_data'] = "";
}else{
if($data['search_data'] === ""){
$data['search_data'] = "";
}else{
$data['search_data'] = " AND (b.title LIKE '%".$data['search_data']."%' OR b.describe_data LIKE '%".$data['search_data']."%')";
}
}
$search_sql_str = $search_sql_str.$data['search_data'];
// "a.token = 'asdasdasdasda' AND a.is_del = 0 AND b.title LIKE '%鱼%' OR b.describe_data LIKE '%鱼%'";
$cfc = Db::connect('cfc_db');
$content_num = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->alias('a')
->join($this->kitchenscale_db_msg['cookbook'].' b','a.cookbook_id = b.id','LEFT')
->join($this->kitchenscale_db_msg['uploadimg'].' c','b.cover = c.id','LEFT')
->where($search_sql_str)
->count();
$page_total = ceil($content_num/$this->page_num);;
$collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->alias('a')
->join($this->kitchenscale_db_msg['cookbook'].' b','a.cookbook_id = b.id','LEFT')
->join($this->kitchenscale_db_msg['uploadimg'].' c','b.cover = c.id','LEFT')
->where($search_sql_str)
->field("b.id,b.title,b.cover as cover_id,c.pic_url as cover_url,b.likes_num,b.create_user_token,b.create_user_head_pic,b.create_user_nickname")
->page($data['page'],$this->page_num)
->select();
foreach ($collect_list as $key => $value) {
$collect_list[$key]['is_me_like_it'] = 'yes';
}
return $this->msg([
'page_now'=>$data['page'],
'page_total'=>$page_total,
'content_list'=>$collect_list
]);
}
public function get_my_cookbook_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->count();
if($user_data<=0){
return $this->msg(10005,'账号信息错误');
}
$search_sql_str = "b.create_user_token = '".$data['token']."' AND b.is_del = 0";
if(!array_key_exists('search_data', $data)){
$data['search_data'] = "";
}else{
if($data['search_data'] === ""){
$data['search_data'] = "";
}else{
$data['search_data'] = " AND (b.title LIKE '%".$data['search_data']."%' OR b.describe_data LIKE '%".$data['search_data']."%')";
}
}
$search_sql_str = $search_sql_str.$data['search_data'];
$cfc = Db::connect('cfc_db');
$content_num = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->alias('b')
->join($this->kitchenscale_db_msg['uploadimg'].' c','b.cover = c.id','LEFT')
->where($search_sql_str)
->count();
$page_total = ceil($content_num/$this->page_num);;
$content_list = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->alias('b')
->join($this->kitchenscale_db_msg['uploadimg'].' c','b.cover = c.id','LEFT')
->where($search_sql_str)
->field("b.id,b.title,b.cover as cover_id,c.pic_url as cover_url,b.likes_num,b.create_user_token,b.create_user_head_pic,b.create_user_nickname")
->page($data['page'],$this->page_num)
->select();
// 获取用户收藏列表
$my_collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->where(['token'=>$data['token'],'is_del'=>0])
->column('cookbook_id');
// dump($my_collect_list);
// 处理菜谱收藏信息
foreach ($content_list as $key => $value) {
// if(in_array($value['id'],$my_collect_list)){
if(array_key_exists($value['id'],$my_collect_list)){
$content_list[$key]['is_me_like_it'] = 'yes';
}else{
$content_list[$key]['is_me_like_it'] = 'no';
}
// if($value['cover'] == null){
// $content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
// }
unset($content_list[$key]['ROW_NUMBER']);
}
// foreach ($collect_list as $key => $value) {
// $collect_list[$key]['is_me_like_it'] = 'yes';
// }
return $this->msg([
'page_now'=>$data['page'],
'page_total'=>$page_total,
'content_list'=>$content_list
]);
}
public function del_my_cookbook_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->count();
if($user_data<=0){
return $this->msg(10005,'账号信息错误');
}
$cfc = Db::connect('cfc_db');
$cookbook_data = $cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id'],'create_user_token'=>$data['token']])->find();
if($cookbook_data){
// 启动事务
$cfc->startTrans();
try{
$cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->update(['is_del'=>1]);
$result_banner = $cfc->table($this->kitchenscale_db_msg['banner'])->where(['cookbook_id'=>$cookbook_data['id']])->count();
if($result_banner > 0){
$cfc->table($this->kitchenscale_db_msg['banner'])->where(['cookbook_id'=>$cookbook_data['id']])->update(['is_del'=>1]);
}
// 提交事务
$cfc->commit();
return $this->msg([]);
} catch (\Exception $e) {
// 回滚事务
$cfc->rollback();
return $this->msg(10002);
}
}else{
return $this->msg(10003);
}
}
public function del_search_history_action($data){
// $data['del_arr'] = strval($data['del_arr']);
// $data['del_arr'] = trim($data['del_arr']);
// // 正确的判断逻辑如果不是all 并且 不是ID列表就报错
// if (strtolower($data['del_arr']) !== 'all' && preg_match('/^\d+(,\d+)*$/', $data['del_arr']) !== 1) {
// return $this->msg(10005, 'del_arr type is error');
// }
$cfc = Db::connect('cfc_db');
$user = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->field('id,token')->find();
if(!$user){
return $this->msg(20001,'账号信息错误');
}
if($data['del_arr'] == 'all'){
$result = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where(['user_id'=>$user['id']])
->update(['is_del'=>1]);
}else{
$result = $cfc->table($this->kitchenscale_db_msg['search_history'])
->where("user_id = ".$user['id']." AND id IN (".$data['del_arr'].")")
->update(['is_del'=>1]);
}
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
// 获取菜谱分类标签end
}
public function business_cooperation_action(){
$data = input();
$cfc = Db::connect('cfc_db');
$result = $cfc->table($this->kitchenscale_db_msg['business_cooperation'])
->insert([
'name'=>$data['name'],
'tel'=>$data['phone'],
'company'=>$data['company'],
'intention_data'=> implode(',',$data['selectedValues']),
'notes_data'=>$data['remark'],
'create_time'=>date('Y-m-s H:i:s'),
]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function set_nutrition_proportion_action($data){
$cfc = Db::connect('cfc_db');
$result = $cfc->table($this->kitchenscale_db_msg['user'])
->where(['token'=>$data['token']])
->update([
'is_use_set_kcal'=>1,
'set_kcal'=>$data['set_kcal'],
'set_carbohydrate_v'=>$data['carbohydrate_v'],
'set_carbohydrate_p'=>$data['carbohydrate_p'],
'set_protein_v'=>$data['protein_v'],
'set_protein_p'=>$data['protein_p'],
'set_fat_v'=>$data['fat_v'],
'set_fat_p'=>$data['fat_p'],
]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function update_my_password_action($data){
// $cfc = Db::connect('cfc_db');
// 检查账号是否存在
$find_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token'],'is_del'=>0])->count();
if(!$find_data){
return $this->msg(10003);
}
$result = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token'],'is_del'=>0])->update(['password'=>$data['password']]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function update_my_account_msg_action($data){
$validate_result = $this->check_code($data['data'],$data['code']);
if($validate_result !== true){
return $this->msg(10001,$validate_result);
}
$montage_data = $this->is_tel_email($data['data']);
if($montage_data == false){
return $this->msg(10005);
}
$result = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token'],'is_del'=>0])->update([
$montage_data=>$data['data'],
'update_time'=>date('Y-m-d H:i:s')
]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function update_language_action($data){
$cfc = Db::connect('cfc_db');
$result = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->update(['language'=>$data['language']]);
if($result){
return $this->msg([]);
}else{
return $this->msg([10002]);
}
}
}

View File

@ -0,0 +1,121 @@
<?php
namespace app\KitchenScale2\controller\app;
class Wechat extends Base{
// reedaw的小程序信息
private $app_id = 'wx1f32af4f93c913f6'; // 轻厨记的微信小程序的AppID
private $app_secret = '851f809f6abbbeeeb95d313ada80d025'; // 轻厨记的微信小程序的AppSecret
// ed7cda5874f0eef3360e782a3db73c80
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
/**
* 处理微信登录
*
* @param string $code 微信登录凭证
* @param string $encryptedData 加密的用户信息
* @param string $iv 解密算法的初始向量
* @return array
*/
public function handleWechatLogin($code, $encryptedData, $iv)
{
// try {
// 1. 通过code获取openid和session_key
$sessionData = $this->getSessionKey($code);
if (empty($sessionData['openid']) || empty($sessionData['session_key'])) {
// throw new Exception('获取openid或session_key失败');
// return false;
// return $this->msg(10001);
return ['code'=>10002,'msg'=>'获取openid或session_key失败'];
}
// 2. 解密用户信息
$userInfo = $this->decryptData($encryptedData, $iv, $sessionData['session_key']);
if(array_key_exists('phoneNumber',$userInfo)){
return ['code'=>0,'msg'=>'seccess','data'=>$userInfo];
}else{
return ['code'=>10002,'msg'=>'解密用户信息失败'];
}
// if (empty($userInfo['phoneNumber'])) {
// // throw new Exception('获取手机号失败');
// }else{
// }
// // 3. 保存或更新用户信息
// $user = User::where('openid', $sessionData['openid'])->find();
// if (!$user) {
// $user = new User();
// $user->openid = $sessionData['openid'];
// }
// $user->phone = $userInfo['phoneNumber'];
// $user->save();
// 返回成功信息
// return ['code' => 0, 'msg' => '登录成功', 'data' => $user];
// } catch (Exception $e) {
// // 返回错误信息
// return ['code' => 500, 'msg' => $e->getMessage()];
// }
}
/**
* 通过code获取openid和session_key
*
* @param string $code
* @return array
* @throws Exception
*/
private function getSessionKey($code)
{
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->app_id}&secret={$this->app_secret}&js_code={$code}&grant_type=authorization_code";
$result = file_get_contents($url);
$data = json_decode($result, true);
if (isset($data['openid']) && isset($data['session_key'])) {
return $data;
} else {
return ['code'=>10002,'msg'=>'获取openid或session_key失败'];
}
}
/**
* 解密用户信息
*
* @param string $encryptedData
* @param string $iv
* @param string $sessionKey
* @return array
* @throws Exception
*/
private function decryptData($encryptedData, $iv, $sessionKey)
{
// require_once 'wx_crypt/WXBizDataCrypt.php'; // 引入微信解密类
// require_once env('root_path') . 'extend/wx_crypt/WXBizDataCrypt.php';
// dump(ROOT_PATH . 'extend\wx_crypt\wxBizDataCrypt.php');
require_once ROOT_PATH . 'extend\wx_crypt\wxBizDataCrypt.php';
$pc = new \WXBizDataCrypt($this->app_id, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data);
if ($errCode == 0) {
return json_decode($data, true);
} else {
return ['code'=>10002,'msg'=>'解密用户信息失败('.$errCode.')'];
// throw new Exception('解密失败: ' . $errCode);
}
}
// 注册
}

View File

@ -0,0 +1,209 @@
<!doctype html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>图片管理</title>
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<script type="text/javascript" src="/x_admin/js/jq.js"></script>
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script type="text/javascript" src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<style>
.content{
width: 100%;
max-height: 70%;
overflow: auto;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: center;
justify-content: space-evenly;
}
.pic_box_upload{
width: 100px;
height: 100px;
margin: 5px 5px;
}
.pic_box_upload img{
width: 100%;
height: 100%;
}
.pic_box{
width: 100px;
height: 100px;
margin: 5px 5px;
}
.pic_box:hover {
box-shadow: 0px 0px 1px;
}
.pic_box img{
width: 100%;
height: 100%;
}
#fileInput {
display: none; /* 隐藏文件输入元素 */
}
.jz{
position: fixed;
bottom: 0;
left: 0;
right: 0;
margin: auto 0;
}
</style>
</head>
<body>
<div class="content">
<div class="pic_box_upload" onclick="upload_action()"><img src="https://tc.pcxbc.com/tsf/upload_pic.jpg" alt=""></div>
{volist name="result" id="vo"}
<div class="pic_box" onclick="sendParamToParent('{$vo.id}','{$vo.pic_url}')"><img src="{$vo.pic_url}" alt=""></div>
{/volist}
</div>
<div class="layui-card-body jz">
<div id="page" style="text-align: center;">
</div>
</div>
<input type="file" id="fileInput" multiple>
</body>
</html>
<script>
var page_num;
var laypage;
var all_page = "{$num}";
layui.use('laypage', function () {
laypage = layui.laypage;
laypage.render({
elem: 'page',
count: all_page, //数据总数,从服务端得到
limit: 20,
groups:20,
jump: function (obj, first) {
//首次不执行
if (!first) {
//obj包含了当前分页的所有参数比如
console.log(obj.curr); //得到当前页,以便向服务端请求对应页的数据。
console.log(obj.limit); //得到每页显示的条数
page_num = obj.curr;
jump_page(page_num)
}
}
});
});
function jump_page(num){
load()
$.ajax({
url: "/k/admin/pic", //请求的url地址s
dataType: "json", //返回格式为json
async: true,//请求是否异步默认为异步这也是ajax重要特性
data: {'page': num}, //参数值
type: "POST", //请求方式
success: function (req) {
console.log(req)
c_load();
if(req['code'] == 0){
var str,str_s,str_all="";
for (let i = 0; i < req['data']['result'].length; i++) {
str = '<div class="pic_box" onclick="sendParamToParent(\''+req['data']['result'][i]['id']+'\',\''+req['data']['result'][i]['url_data']+'\')"><img src="'+req['data']['result'][i]['url_data']+'" alt=""></div>'
str_all = str_all+str;
}
$('.content').each(function() {
$(this).find('.pic_box').remove();
});
$('.content').append(str_all);
}
},
error: function () {
//请求出错处理
}
});
}
</script>
<script type="text/javascript">
function sendParamToParent(id,data) {
var param = [id,data]; // 这是要传递的参数
// 调用父窗口的一个函数,并传递参数
if (window.parent && window.parent.receiveParamFromIframe) {
window.parent.receiveParamFromIframe(param);
} else {
layer.msg('图片选择失败');
}
xadmin.close();
}
function upload_action(){
document.getElementById('fileInput').click();
}
$('#fileInput').on('change', function() {
// 获取所有被选择的文件
var fileInput = $(this)[0];
var files = fileInput.files;
// 检查是否有文件被选择
if (files.length > 0) {
load()
var formdata = new FormData();
// 添加所有文件到FormData
for (var i = 0; i < files.length; i++) {
formdata.append('image[]', files[i]); // 注意这里改为数组形式
}
$.ajax({
url:"/k/admin/pic_upload_action", //请求的url地址
contentType:false,
processData:false,
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:formdata, //参数值
type:"POST", //请求方式
success:function(req){
c_load()
//请求成功时处理
if(req.code == 0){
var content = '<div style="padding:20px;">';
content += '<p>成功上传:' + req.data.success + '个文件</p>';
if (req.data.error_data && req.data.error_data.length > 0) {
content += '<p>失败文件:</p><ul style="margin-left:20px;">';
req.data.error_data.forEach(function(item) {
content += '<li>' + item.pic_name + ' (' + item.error_msg + ')</li>';
});
content += '</ul>';
}
content += '</div>';
layer.open({
type: 1,
title: '上传结果',
area: ['500px', '300px'], // 宽高
content: content,
btn: ['确定'],
yes: function(index, layero) {
window.location.reload();
},
cancel: function() {
window.location.reload(); // 点击右上角关闭也刷新
}
});
}else{
layer.msg(req.msg);
}
},
error:function(){
//请求出错处理
}
});
}
});
//加载提示开启
function load() {
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
}
// 关闭加载提示
function c_load() {
layer.close(layer.index)
}
</script>

View File

@ -0,0 +1,420 @@
<!DOCTYPE html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>菜谱管理</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script type="text/javascript" src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<script type="text/javascript" src="/x_admin/js/jq.js"></script>
<style>
.step-container {
display: flex;
margin-bottom: 15px;
border: 1px solid #eee;
padding: 15px;
border-radius: 4px;
}
.step-content {
flex: 1;
padding-right: 15px;
}
.step-image {
width: 200px;
display: flex;
flex-direction: column;
align-items: center;
}
.step-preview {
max-width: 100%;
max-height: 150px;
margin-bottom: 10px;
display: none;
}
.step-buttons {
display: flex;
justify-content: space-between;
margin-top: 10px;
}
</style>
</head>
<body>
<div class="layui-fluid">
<div class="layui-row">
<form class="layui-form layui-form-pane">
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>菜谱标题
</label>
<div class="layui-input-inline" style="width: 80%;">
<input type="text" id="recipe_title" name="recipe_title" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<!-- 图片选择器html部分 -->
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>选择封面
</label>
<div class="layui-input-inline">
<div class="layui-btn" onclick="openImageManager('preview_img', 'cove_img')">点击选择</div>
<input type="hidden" id="cove_img" name="cove_img">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>预览
</label>
<div class="layui-input-inline">
<img id="preview_img" style="max-width: 200px; display: none; border: 1px solid #eee; margin-top: 10px;" src="" alt="">
</div>
</div>
<!-- 图片选择器html部分 -->
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>菜谱类型
</label>
<div class="layui-input-inline" style="width: 80%;">
<select name="recipe_type" lay-verify="required" id="recipe_type">
<option value="0">请选择菜谱类型</option>
{volist name="result" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>菜谱描述
</label>
<div class="layui-input-inline" style="width: 80%;">
<textarea name="recipe_desc" id="recipe_desc" required lay-verify="required" placeholder="请输入菜谱描述" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>食材
</label>
<div class="layui-input-inline" style="width: 80%;">
<div id="ingredients_container">
<div class="layui-form-item ingredient-item" style="margin-bottom: 10px;">
<div class="layui-inline">
<input type="text" name="ingredient_name[]" placeholder="食材名称" autocomplete="off" class="layui-input ingredient-name" style="width: 150px; display: inline-block;">
<div class="ingredient-suggest" style="position: absolute; z-index: 999; display: none; width: 150px; max-height: 200px; overflow-y: auto; border: 1px solid #d2d2d2; background: #fff;"></div>
<input type="text" name="ingredient_amount[]" placeholder="用量(g)" autocomplete="off" class="layui-input" style="width: 100px; display: inline-block; margin-left: 10px;">
<button type="button" class="layui-btn layui-btn-danger layui-btn-xs remove-ingredient" style="margin-left: 10px;">删除</button>
</div>
</div>
</div>
<button type="button" id="add_ingredient" class="layui-btn layui-btn-xs">添加食材</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width: 120px; text-align: right;">
<span class="x-red"></span>步骤
</label>
<div class="layui-input-inline" style="width: 80%;">
<div id="steps_container">
<div class="step-container">
<div class="step-content">
<label class="layui-form-label" style="width: auto; padding: 9px 5px; text-align: left;">步骤1</label>
<textarea name="step_desc[]" placeholder="请输入步骤描述" class="layui-textarea"></textarea>
</div>
<div class="step-image">
<img class="step-preview" src="" alt="步骤图片预览">
<input type="hidden" class="step-image-id" name="step_image[]" value="">
<div class="step-buttons">
<button type="button" class="layui-btn layui-btn-xs select-step-image">选择图片</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-xs remove-step">删除步骤</button>
</div>
</div>
</div>
</div>
<button type="button" id="add_step" class="layui-btn layui-btn-xs">添加步骤</button>
</div>
</div>
<div class="layui-form-item" style="display: flex;flex-direction: row;justify-content: center;">
<button class="layui-btn" lay-filter="add" lay-submit="" style="width: 150px;">增加</button>
</div>
</form>
</div>
</div>
<script>
// 图片选择器js部分~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 全局变量存储当前操作的预览和隐藏字段ID
var currentImageSelection = {
previewId: '',
hiddenFieldId: ''
};
// 打开图片管理器函数
function openImageManager(previewId, hiddenFieldId) {
// 存储当前操作的ID
currentImageSelection.previewId = previewId;
currentImageSelection.hiddenFieldId = hiddenFieldId;
// 打开图片管理窗口
xadmin.open('图片管理', '/k/admin/pic', '80%', '80%');
}
// 接收从图片管理窗口返回的参数
function receiveParamFromIframe(param) {
if(param.length > 0 && currentImageSelection.previewId && currentImageSelection.hiddenFieldId){
// 更新预览图片
var img = document.getElementById(currentImageSelection.previewId);
img.src = param[1];
img.style.display = 'block';
// 更新隐藏字段值
document.getElementById(currentImageSelection.hiddenFieldId).value = param[0];
// 重置当前操作的ID
currentImageSelection.previewId = '';
currentImageSelection.hiddenFieldId = '';
} else {
layer.msg('图片选择失败');
}
}
// 图片选择器js部分~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$(document).ready(function(){
var stepCounter = 1;
var ingredientCounter = 1;
// 添加食材
$('#add_ingredient').on('click', function() {
ingredientCounter++;
var html = `
<div class="layui-form-item ingredient-item" style="margin-bottom: 10px;">
<div class="layui-inline">
<input type="text" name="ingredient_name[]" placeholder="食材名称" autocomplete="off" class="layui-input ingredient-name" style="width: 150px; display: inline-block;">
<div class="ingredient-suggest" style="position: absolute; z-index: 999; display: none; width: 150px; max-height: 200px; overflow-y: auto; border: 1px solid #d2d2d2; background: #fff;"></div>
<input type="text" name="ingredient_amount[]" placeholder="用量(g)" autocomplete="off" class="layui-input" style="width: 100px; display: inline-block; margin-left: 10px;">
<button type="button" class="layui-btn layui-btn-danger layui-btn-xs remove-ingredient" style="margin-left: 10px;">删除</button>
</div>
</div>
`;
$('#ingredients_container').append(html);
});
// 食材名称输入自动完成
$(document).on('input', '.ingredient-name', function() {
var input = $(this);
var keyword = input.val().trim();
var suggestBox = input.next('.ingredient-suggest');
if (keyword.length < 1) {
suggestBox.hide();
return;
}
console.log(keyword)
// 发送AJAX请求
$.ajax({
url: '/k/a/cookbook/find_food_list',
dataType:"json", //返回格式为json
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:{"id":"value"}, //参数值
data: {'search_data': keyword},
type: 'POST',
success: function(res) {
if (res.code === 0 && res.data && res.data.length > 0) {
var html = '';
res.data.forEach(function(item) {
html += '<div class="suggest-item" style="padding: 5px 10px; cursor: pointer;" data-id="' + item.id + '" data-name="' + item.food_name + '" data-kcal="' + item.Calorie_val + '">' + item.food_name + '</div>';
});
suggestBox.html(html).show();
} else {
suggestBox.hide();
}
},
error: function() {
suggestBox.hide();
}
});
});
// 点击建议项填充到输入框
$(document).on('click', '.suggest-item', function() {
var id = $(this).data('id');
var name = $(this).data('name');
var kcal = $(this).data('kcal');
var parentDiv = $(this).closest('.layui-inline');
parentDiv.find('.ingredient-name').val(name).data('id', id).data('kcal', kcal);
parentDiv.find('.ingredient-suggest').hide();
});
// 点击其他地方隐藏建议框并清空输入框
$(document).on('click', function(e) {
if (!$(e.target).closest('.ingredient-suggest').length && !$(e.target).hasClass('ingredient-name')) {
$('.ingredient-suggest').hide();
// 清空未选择食材的输入框
$('.ingredient-name').each(function() {
if (!$(this).data('id')) { // 如果没有选择过食材(没有data-id)
$(this).val(''); // 清空输入框
}
});
}
});
// 删除食材
$(document).on('click', '.remove-ingredient', function() {
if($('.ingredient-item').length > 1) {
$(this).closest('.ingredient-item').remove();
} else {
layer.msg('至少保留一个食材');
}
});
// 添加步骤
$('#add_step').on('click', function() {
stepCounter++;
var html = `
<div class="step-container">
<div class="step-content">
<label class="layui-form-label" style="width: auto; padding: 9px 5px; text-align: left;">步骤${stepCounter}</label>
<textarea name="step_desc[]" placeholder="请输入步骤描述" class="layui-textarea"></textarea>
</div>
<div class="step-image">
<img class="step-preview" src="" alt="步骤图片预览">
<input type="hidden" class="step-image-id" name="step_image[]" value="">
<div class="step-buttons">
<button type="button" class="layui-btn layui-btn-xs select-step-image">选择图片</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-xs remove-step">删除步骤</button>
</div>
</div>
</div>
`;
$('#steps_container').append(html);
});
// 为步骤选择图片
$(document).on('click', '.select-step-image', function() {
var container = $(this).closest('.step-container');
var previewImg = container.find('.step-preview');
var hiddenInput = container.find('.step-image-id');
// 为元素设置唯一ID
var previewId = 'step-preview-' + Math.random().toString(36).substr(2, 9);
var hiddenId = 'step-image-' + Math.random().toString(36).substr(2, 9);
previewImg.attr('id', previewId);
hiddenInput.attr('id', hiddenId);
// 打开图片管理器
openImageManager(previewId, hiddenId);
});
// 删除步骤
$(document).on('click', '.remove-step', function() {
if($('.step-container').length > 1) {
$(this).closest('.step-container').remove();
// 重新编号步骤
$('.step-container').each(function(index) {
$(this).find('.layui-form-label').text('步骤' + (index + 1));
});
stepCounter--;
} else {
layer.msg('至少保留一个步骤');
}
});
// 表单提交时收集数据
layui.use(['form', 'layer'], function() {
var form = layui.form,
layer = layui.layer;
// 监听提交
form.on('submit(add)', function(data) {
// 显示加载中
var loadIndex = layer.load(1);
// 收集表单数据
var formData = {
cook_label: $('#recipe_type').val(),
title: $('#recipe_title').val(),
description: $('#recipe_desc').val(),
cover: $('#cove_img').val(), // 封面图片ID
foodList: [],
stepList: []
};
// 收集食材数据
$('.ingredient-item').each(function() {
var nameInput = $(this).find('.ingredient-name');
var amountInput = $(this).find('input[placeholder="用量(g)"]');
var id = nameInput.data('id');
var name = nameInput.val();
var weight = amountInput.val();
if (id && name && weight && weight > 0) {
formData.foodList.push({
id: id,
name: name,
weight: weight
});
}
});
// 收集步骤数据
$('.step-container').each(function() {
var desc = $(this).find('textarea').val();
var imageId = $(this).find('.step-image-id').val();
if (desc && desc.trim() !== '') {
formData.stepList.push({
pic_list: [imageId] || [],
description: desc.trim()
});
}
});
// 调试输出
console.log('提交数据:', formData);
// 发送AJAX请求
$.ajax({
url: "/k/a/cookbook/add_cookbook_action",
type: "POST",
data: JSON.stringify(formData),
contentType: "application/json",
success: function(res) {
layer.close(loadIndex);
if (res.code === 0) {
layer.alert("添加成功", {icon: 1}, function() {
xadmin.close();
xadmin.father_reload();
});
} else {
layer.alert("添加失败:" + res.msg, {icon: 2});
}
},
error: function() {
layer.close(loadIndex);
layer.alert("请求失败,请稍后再试", {icon: 2});
}
});
return false;
});
});
//加载提示开启
function load() {
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
}
// 关闭加载提示
function c_load() {
layer.close(layer.index)
}
});
</script>
</body>
</html>

View File

@ -0,0 +1,232 @@
<!DOCTYPE html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>app版本管理</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script type="text/javascript" src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<script type="text/javascript" src="/x_admin/js/jq.js"></script>
<!-- 让IE8/9支持媒体查询从而兼容栅格 -->
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="layui-fluid">
<div class="layui-row">
<form class="layui-form">
<div class="layui-form-item">
<label for="L_email" class="layui-form-label">
<span class="x-red"></span>卡片图标</label>
</label>
<div class="layui-input-inline">
<!-- <input type="text" id="L_email" name="email" required="" lay-verify="email" autocomplete="off" class="layui-input"> -->
<input type="file" id="upload_file_app" lay-verify="upload_file_app" name="file_data">
</div>
<!-- <div class="layui-form-mid layui-word-aux">
<span class="x-red">*</span>将会成为您唯一的登入名
</div> -->
</div>
<div class="layui-form-item">
<label for="card_name" class="layui-form-label">
<span class="x-red"></span>卡片名称</label>
<div class="layui-input-inline">
<input type="text" id="card_name" name="card_name" required="" lay-verify="card_name" autocomplete="off" class="layui-input" value="{$result.name}">
</div>
</div>
<div class="layui-form-item">
<label for="page_url_record" class="layui-form-label">
<span class="x-red">*</span>手动记录路径</label>
<div class="layui-input-inline">
<input type="text" id="page_url_record" name="page_url_record" required="" lay-verify="page_url_record" autocomplete="off" class="layui-input" value="{$result.page_url_record}"></div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label for="page_url_report" class="layui-form-label">
<span class="x-red">*</span>报告页路径</label>
<div class="layui-input-inline">
<input type="text" id="page_url_report" name="page_url_report" required="" lay-verify="page_url_report" autocomplete="off" class="layui-input" value="{$result.page_url_report}"></div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label for="page_url_bluetooth" class="layui-form-label">
<span class="x-red">*</span>蓝牙路径</label>
<div class="layui-input-inline">
<input type="text" id="page_url_bluetooth" name="page_url_bluetooth" required="" lay-verify="page_url_bluetooth" autocomplete="off" class="layui-input" value="{$result.page_url_bluetooth}"></div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label for="content" class="layui-form-label">
<span class="x-red">*</span>描述</label>
<div class="layui-input-inline">
<input type="text" id="content" name="content" required="" lay-verify="content" autocomplete="off" class="layui-input" value="{$result.content}"></div>
</div>
<div class="layui-form-item">
<label for="L_repass" class="layui-form-label"></label>
<!-- <div class="layui-btn" id="add" lay-filter="add" lay-submit="">增加</div>
<input value="登录" lay-submit lay-filter="add" type="submit" class="layui-btn"> -->
<button class="layui-btn" lay-filter="add" lay-submit="">修改</button>
</div>
</form>
</div>
</div>
<!-- <div class="layui-fluid">
<div id="official_1" class="layui-row">
<div style="margin-left: 8%;margin-top: 5%;font-size: 25px;">请先下载模板文件,信息填写完成并上传该文件后点击生成</div>
<img style="width: 90%;margin-left: 3%;"src="/uploads/code_demo.png?v=1.0" alt="">
<div class="layui-form-item" style="width: 30%;margin-left: 33%;margin-top: 5%;">
<span>步骤1</span><a href="/uploads/code_demo.xlsx" class="layui-btn" lay-filter="add">下载模板文件</a>
</div>
<div class="layui-form-item" style="width: 50%;margin-left: 33%;margin-top: 5%;">
<span>步骤2</span><input type="file" id="data_excel" name="data_excel">
</div>
<div class="layui-form-item" style="width: 30%;margin-left: 33%;margin-top: 5%;">
<span>步骤3</span><button class="layui-btn" lay-filter="add" lay-submit="" onclick="add_data()">生成</button>
</div>
</div>
</div> -->
<script>
$(document).ready(function(){
var id = "{$result.id}"
var file_name_all = ''
var file_name = ''
var file_extension = ''
var pd = true
$('#upload_file_app').on('change', function() {
// 获取被选择的文件
var fileInput = $(this)[0];
var file = fileInput.files[0];
// 检查是否有文件被选择
if (file) {
// 获取文件的名称
file_name_all = file.name;
// 使用lastIndexOf和substring来获取文件名不包括后缀
var lastIndex = file_name_all.lastIndexOf('.');
file_name = lastIndex !== -1 ? file_name_all.substring(0, lastIndex) : file_name_all;
// 获取文件后缀
file_extension = lastIndex !== -1 ? file_name_all.substring(lastIndex + 1) : '';
$('#file_name').val(file_name)
// console.log($('#upload_file_app')[0].files[0])
// formdata.append('apk',$('#upload_file_app')[0].files[0])
}
});
function edit_data(){
if(pd === false){
return
}
var formdata = new FormData();
formdata.append('upload_file_app',$('#upload_file_app')[0].files[0])
formdata.append('card_name',$('#card_name').val())
formdata.append('page_url_record',$('#page_url_record').val())
formdata.append('page_url_report',$('#page_url_report').val())
formdata.append('page_url_bluetooth',$('#page_url_bluetooth').val())
formdata.append('content',$('#content').val())
formdata.append('file_extension',file_extension)
formdata.append('id',id)
load()
pd = false
console.log('进来了')
$.ajax({
url:"/card/card_edit_action", //请求的url地址
contentType:false,
processData:false,
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:formdata, //参数值
type:"POST", //请求方式
success:function(req){
c_load()
pd = true
if(req.code == 0){
layer.alert("修改成功", {icon: 6},function() {
//关闭当前frame
xadmin.close();
// 可以对父窗口进行刷新
xadmin.father_reload();
});
}else{
layer.alert("修改失败"+req.msg, {icon: 6},function() {
//关闭当前frame
xadmin.close();
// 可以对父窗口进行刷新
xadmin.father_reload();
});
}
//请求成功时处理
console.log(req)
},
error:function(){
//请求出错处理
pd = true
}
});
}
layui.use(['form', 'layer','jquery'],function() {
$ = layui.jquery;
var form = layui.form,
layer = layui.layer;
//自定义验证规则
form.verify({
// upload_file_app: function(value) {
// if (value == '') {
// return '请先选择文件';
// }
// },
file_name: function(value) {
if (value == '') {
return '必须填写文件名';
}
},
// version_num: [/[\d.]{0,9}$/, '版本号必须以大写V开头最多10个字符由数字跟英文"."组成)'],
content: function(value) {
if (value == '') {
return '必须填写描述';
}
},
});
//监听提交
form.on('submit(add)',function(data) {
//发异步把数据提交给php
edit_data()
return false;
});
});
//加载提示开启
function load() {
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
}
// 关闭加载提示
function c_load() {
layer.close(layer.index)
}
});
// });
</script>
</body>
</html>

View File

@ -0,0 +1,288 @@
<!DOCTYPE html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>所有卡片管理</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<style>
/* th{
min-width:30px;
} */
</style>
</head>
<body>
<div class="x-nav">
<span class="layui-breadcrumb">
<a href="">首页</a>
<a href="">演示</a>
<a>
<cite>导航元素</cite></a>
</span>
<a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" onclick="location.reload()" title="刷新">
<i class="layui-icon layui-icon-refresh" style="line-height:30px"></i></a>
</div>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<!-- <div class="layui-card-body ">
<form class="layui-form layui-col-space5">
<div class="layui-inline layui-show-xs-block">
<input class="layui-input" autocomplete="off" placeholder="开始日" name="start" id="s_time">
</div>
<div class="layui-inline layui-show-xs-block">
<input class="layui-input" autocomplete="off" placeholder="截止日" name="end" id="e_time">
</div>
<div class="layui-inline layui-show-xs-block">
<input type="text" name="username" placeholder="请输入用户手机" autocomplete="off" class="layui-input" id="tel">
</div>
<div class="layui-inline layui-show-xs-block">
<input type="text" name="username" placeholder="请输入用户邮箱" autocomplete="off" class="layui-input" id="email">
</div>
<div class="layui-input-inline layui-show-xs-block">
<select name="contrller" id="status_num">
<option value="">状态</option>
<option value="0">启用</option>
<option value="1">停用</option>
</select>
</div>
<div class="layui-inline layui-show-xs-block">
<div class="layui-btn" lay-submit="" lay-filter="sreach" onclick="find('y')"><i class="layui-icon">&#xe615;</i></div>
</div>
</form>
</div> -->
<div class="layui-card-header">
<!-- <button class="layui-btn layui-btn-danger" onclick="delAll()"><i class="layui-icon"></i>批量停用</button> -->
<!-- <button class="layui-btn" onclick="xadmin.open('添加用户','/appversion/app_add','100%','100%')"><i class="layui-icon"></i>添加</button> -->
<button class="layui-btn" onclick="xadmin.open('添加版本','/k/a/cookbook/add_cookbook','100%','100%')"><i class="layui-icon"></i>添加</button>
</div>
<div class="layui-card-body layui-table-body layui-table-main">
<table class="layui-table layui-form">
<thead>
<tr>
<th>ID</th>
<th>食谱名称</th>
<th>预览图</th>
<th>创建人</th>
<th>点赞数</th>
<th>阅读数</th>
<th>创建时间</th>
<th>状态</th>
<th>操作</th></tr>
</thead>
<tbody id='content'>
{volist name="result" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.title}</td>
<th><img style="height: 100px;" src="{$vo.pic_url}" alt=""></th>
<td>{$vo.create_user_nickname}</td>
<td>{$vo.likes_num}</td>
<td>{$vo.read_it}</td>
<td>{$vo.create_time}</td>
<td class="td-status">
{if condition="$vo.is_del == 1"}
<span onclick="app_stop(this,'{$vo.id}')" class="layui-btn layui-btn-normal layui-btn-mini layui-btn-disabled" title="停用">已停用</span>
{else /}
<span onclick="app_stop(this,'{$vo.id}')" class="layui-btn layui-btn-normal layui-btn-mini" title="启用">已启用</span>
{/if}
</td>
<td>
<!-- <button class="layui-btn" onclick="xadmin.open('修改','/card/card_edit?id={$vo.id}','80%','60%')">修改</button> -->
</td>
</tr>
{/volist}
</tbody>
</table>
</div>
<div class="layui-card-body ">
<div id="page" style="text-align: center;">
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var form
layui.use(['laydate','form'], function(){
var laydate = layui.laydate;
form = layui.form;
});
var page_num;
var laypage;
var all_page = "{$num}";
layui.use('laypage', function () {
laypage = layui.laypage;
//执行一个laypage实例
laypage.render({
elem: 'page',
count: all_page, //数据总数,从服务端得到
limit: 15,
groups:5, //显示几个分页按钮
jump: function (obj, first) {
//首次不执行
if (!first) {
//obj包含了当前分页的所有参数比如
console.log(obj.curr); //得到当前页,以便向服务端请求对应页的数据。
console.log(obj.limit); //得到每页显示的条数
page_num = obj.curr;
find("n")
}
}
});
});
/*用户-停用*/
function app_stop(obj,id){
// return
var title = '',status,num
if($(obj).attr('title')=='启用'){
title = '停用'
status = 1
num = 5
}else{
title = '启用'
status = 0
num = 6
}
// console.log('点击时'+$(obj).attr('title')+'====='+id+'===传到后台是否删除:'+is_del)
layer.confirm('确认要'+ title +'吗?',function(index){
load()
$.ajax({
url:"/k/a/cookbook/stop_and_run", //请求的url地址
dataType:"json", //返回格式为json
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:{"id":id,'status':status}, //参数值
type:"POST", //请求方式
success:function(req){
c_load()
//请求成功时处理
if(req['code'] == 0){
//发异步把用户状态进行更改
$(obj).attr('title',title)
if(status == 1){
$(obj).parents("tr").find(".td-status").find('span').addClass('layui-btn-disabled').html('已'+ title);
}else{
$(obj).parents("tr").find(".td-status").find('span').removeClass('layui-btn-disabled').html('已'+ title);
}
layer.msg('已'+ title,{icon: num});
}else{
layer.msg('操作失败!',{icon: 5});
}
},
error:function(){
//请求出错处理
}});
});
}
function find(pd) {
if(!page_num || pd == 'y'){
page_num = 1;
}
page({
"status_num":$('#status_num').val(),
"tel":$('#tel').val(),
"email":$('#email').val(),
"s_time":$('#s_time').val(),
"e_time":$('#e_time').val(),
"page_num":page_num,
"tt":1},pd);
}
function page(data,pd) {
console.log(data)
load()
$.ajax({
url: "/k/a/cookbook/index", //请求的url地址s
dataType: "json", //返回格式为json
async: true,//请求是否异步默认为异步这也是ajax重要特性
data: data, //参数值
type: "POST", //请求方式
success: function (req) {
console.log(req)
c_load();
if (req['code'] == 0) {
var str,str_s,str_c,str_all="";
for (let i = 0; i < req['data']['data'].length; i++) {
if(req['data']['data'][i]['is_del'] == 1){
str = '<span onclick="app_stop(this,\''+req['data']['data'][i]['id']+'\')" class="layui-btn layui-btn-normal layui-btn-mini layui-btn-disabled" title="停用">已停用</span>'
}else{
str = '<span onclick="app_stop(this,\''+ req['data']['data'][i]['id'] +'\')" class="layui-btn layui-btn-normal layui-btn-mini" title="启用">已启用</span>'
}
str_c = '<tr>'+
'<td>'+req['data']['data'][i]['id']+'</td>'+
'<td>'+req['data']['data'][i]['title']+'</td>'+
'<td><img style="height: 100px;" src="'+req['data']['data'][i]['pic_url']+'" alt=""></td>'+
'<td>'+req['data']['data'][i]['create_user_nickname']+'</td>'+
'<td>'+req['data']['data'][i]['likes_num']+'</td>'+
'<td>'+req['data']['data'][i]['read_it']+'</td>'+
'<td>'+req['data']['data'][i]['create_time']+'</td>'+
'<td class="td-status">'+
str+
'</td>'+
// '<td>'+
// '<button class="layui-btn" onclick="xadmin.open(\'修改\',\'/card/card_edit?id={$vo.id}\',\'80%\',\'60%\')">修改</button>'+
// '</td>'+
'</tr>'
str_all = str_all+str_c;
}
console.log(str_all)
$('#content').html(str_all);
form.render();
if(pd == 'y'){
$("#page").html("")
laypage.render({
elem: 'page',
count: req['data']['num'], //数据总数,从服务端得到
limit: 10,
groups:10,
jump: function (obj, first) {
//首次不执行
if (!first) {
//obj包含了当前分页的所有参数比如
console.log(obj.curr); //得到当前页,以便向服务端请求对应页的数据。
console.log(obj.limit); //得到每页显示的条数
page_num = obj.curr;
// page({"page":page_num,"tt":1});
find("n")
}
}
});
}
} else {
layer.msg(req['msg'])
}
},
error: function () {
//请求出错处理
}
});
}
//加载提示开启
function load() {
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
}
// 关闭加载提示
function c_load() {
layer.close(layer.index)
}
</script>
</html>

View File

@ -0,0 +1,230 @@
<!doctype html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>后台登录-X-admin2.2</title>
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<!-- <link rel="stylesheet" href="./css/theme5.css"> -->
<script src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<script>
// 是否开启刷新记忆tab功能
// var is_remember = false;
</script>
</head>
<body class="index">
<!-- 顶部开始 -->
<div class="container">
<div class="logo">
<a href="./index.html">X-admin v2.2</a></div>
<div class="left_open">
<a><i title="展开左侧栏" class="iconfont">&#xe699;</i></a>
</div>
<ul class="layui-nav right" lay-filter="">
<li class="layui-nav-item">
<a href="javascript:;">admin</a>
<dl class="layui-nav-child">
<!-- 二级菜单 -->
<dd>
<a onclick="xadmin.open('切换帐号','http://www.baidu.com')">切换帐号</a></dd>
<dd>
<a href="./login.html">退出</a></dd>
</dl>
</li>
</ul>
</div>
<!-- 顶部结束 -->
<!-- 中部开始 -->
<!-- 左侧菜单开始 -->
<div class="left-nav">
<div id="side-nav">
<ul id="nav">
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="食谱管理">&#xe6b8;</i>
<cite>食谱管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('食谱列表','/k/a/cookbook/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>食谱列表</cite></a>
</li>
<!-- <li>
<a onclick="xadmin.add_tab('APP角色数据列表','/member/user_list')">
<i class="iconfont">&#xe6a7;</i>
<cite>APP角色数据列表</cite></a>
</li>
<li>
<a onclick="xadmin.add_tab('APP角色数据列表','/member/user_list')">
<i class="iconfont">&#xe6a7;</i>
<cite>角色使用记录查询</cite></a>
</li> -->
</ul>
</li>
<!-- <li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="卡片管理">&#xe723;</i>
<cite>卡片管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('所有卡片管理','/card/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>所有卡片管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="设备管理">&#xe723;</i>
<cite>设备管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('所有设备管理','/device/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>设备管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="估分功能管理">&#xe723;</i>
<cite>估分功能管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('地市规则列表','/estimate/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>地市规则列表</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="APP版本管理">&#xe723;</i>
<cite>APP版本管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('APP版本管理','/appversion/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>APP版本管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="资讯管理">&#xe723;</i>
<cite>资讯管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('资讯推荐栏管理','/editortext/index')">
<i class="iconfont">&#xe6a7;</i>
<cite>资讯推荐栏管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="Banner图&公告管理">&#xe723;</i>
<cite>Banner图&公告&弹窗</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('操作管理','/notice/banner_index')">
<i class="iconfont">&#xe6a7;</i>
<cite>操作管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="商业合作">&#xe723;</i>
<cite>商业合作</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('操作管理','/business/business_index')">
<i class="iconfont">&#xe6a7;</i>
<cite>操作管理</cite></a>
</li>
</ul>
</li>
<li>
<a href="javascript:;">
<i class="iconfont left-nav-li" lay-tips="厨房秤"></i>
<cite>厨房秤</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a href="javascript:;">
<i class="iconfont"></i>
<cite>食材管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('食材列表','/kitchenscale/food_ingredients_index_1')">
<i class="iconfont">&#xe6a7;</i>
<cite>食材列表</cite></a>
</li>
</ul>
</li>
</ul>
<ul class="sub-menu">
<li>
<a href="javascript:;">
<i class="iconfont">&#xe70b;</i>
<cite>菜谱管理</cite>
<i class="iconfont nav_right">&#xe697;</i></a>
<ul class="sub-menu">
<li>
<a onclick="xadmin.add_tab('菜谱列表','member-del.html')">
<i class="iconfont">&#xe6a7;</i>
<cite>菜谱列表</cite></a>
</li>
</ul>
</li>
</ul>
</li> -->
</ul>
</div>
</div>
<!-- <div class="x-slide_left"></div> -->
<!-- 左侧菜单结束 -->
<!-- 右侧主体开始 -->
<div class="page-content">
<div class="layui-tab tab" lay-filter="xbs_tab" lay-allowclose="false">
<ul class="layui-tab-title">
<li class="home">
<i class="layui-icon">&#xe68e;</i>我的桌面</li></ul>
<div class="layui-unselect layui-form-select layui-form-selected" id="tab_right">
<dl>
<dd data-type="this">关闭当前</dd>
<dd data-type="other">关闭其它</dd>
<dd data-type="all">关闭全部</dd></dl>
</div>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<iframe src='/admin/welcome' frameborder="0" scrolling="yes" class="x-iframe"></iframe>
</div>
</div>
<div id="tab_show"></div>
</div>
</div>
<div class="page-content-bg"></div>
<style id="theme_style"></style>
<!-- 右侧主体结束 -->
<!-- 中部结束 -->
</body>
</html>

View File

@ -0,0 +1,219 @@
<!DOCTYPE html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>欢迎页面-X-admin2.2</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">最新一周新增用户</div>
<div class="layui-card-body" style="min-height: 280px;">
<div id="main1" class="layui-col-sm12" style="height: 300px;"></div>
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">最新一周PV/UV量</div>
<div class="layui-card-body" style="min-height: 280px;">
<div id="main2" class="layui-col-sm12" style="height: 300px;"></div>
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">用户来源</div>
<div class="layui-card-body" style="min-height: 280px;">
<div id="main3" class="layui-col-sm12" style="height: 300px;"></div>
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">硬盘使用量</div>
<div class="layui-card-body" style="min-height: 280px;">
<div id="main4" class="layui-col-sm12" style="height: 300px;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js"></script>
<script type="text/javascript">
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById('main1'));
// 指定图表的配置项和数据
var option = {
grid: {
top: '5%',
right: '1%',
left: '1%',
bottom: '10%',
containLabel: true
},
tooltip: {
trigger: 'axis'
},
xAxis: {
type: 'category',
data: ['周一','周二','周三','周四','周五','周六','周日']
},
yAxis: {
type: 'value'
},
series: [{
name:'用户量',
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line',
smooth: true
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById('main2'));
// 指定图表的配置项和数据
var option = {
tooltip : {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
grid: {
top: '5%',
right: '2%',
left: '1%',
bottom: '10%',
containLabel: true
},
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'PV',
type:'line',
areaStyle: {normal: {}},
data:[120, 132, 101, 134, 90, 230, 210],
smooth: true
},
{
name:'UV',
type:'line',
areaStyle: {normal: {}},
data:[45, 182, 191, 234, 290, 330, 310],
smooth: true,
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById('main3'));
// 指定图表的配置项和数据
var option = {
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
left: 'left',
data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
},
series : [
{
name: '访问来源',
type: 'pie',
radius : '55%',
center: ['50%', '60%'],
data:[
{value:335, name:'直接访问'},
{value:310, name:'邮件营销'},
{value:234, name:'联盟广告'},
{value:135, name:'视频广告'},
{value:1548, name:'搜索引擎'}
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById('main4'));
// 指定图表的配置项和数据
var option = {
tooltip : {
formatter: "{a} <br/>{b} : {c}%"
},
series: [
{
name: '硬盘使用量',
type: 'gauge',
detail: {formatter:'{value}%'},
data: [{value: 88, name: '已使用'}]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>

View File

@ -0,0 +1,77 @@
<!doctype html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>后台登录-X-admin2.2</title>
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" href="/x_admin/css/font.css">
<link rel="stylesheet" href="/x_admin/css/login.css">
<link rel="stylesheet" href="/x_admin/css/xadmin.css">
<script type="text/javascript" src="/x_admin/js/jq.js"></script>
<script src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
</head>
<body class="login-bg">
<div class="login layui-anim layui-anim-up">
<div class="message">轻厨记管理后台</div>
<div id="darkbannerwrap"></div>
<form method="post" class="layui-form" >
<input name="username" placeholder="用户名" type="text" lay-verify="required" class="layui-input" >
<hr class="hr15">
<input name="password" lay-verify="required" placeholder="密码" type="password" class="layui-input">
<hr class="hr15">
<input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
<hr class="hr20" >
</form>
</div>
<script>
$(function () {
var pd = true
layui.use('form', function(){
var form = layui.form;
// layer.msg('玩命卖萌中', function(){
// //关闭后的操作
// });
//监听提交
form.on('submit(login)', function(data){
if(pd){
pd = false
console.log('进来了')
$.ajax({
url:"/k/a/login_action", //请求的url地址
dataType:"json", //返回格式为json
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:{"username":data.field.username,"password":data.field.password}, //参数值
type:"POST", //请求方式
success:function(req){
//请求成功时处理
if(req.code == 0){
layer.msg('登录成功,准备跳转',function(){
location.href='/k/a/index'
},200);
}else{
layer.msg('登录失败',function(){
pd = true
});
}
},
error:function(){
//请求出错处理
pd = true
}
});
}
return false;
});
});
})
</script>
<!-- 底部结束 -->
</body>
</html>

View File

@ -0,0 +1,398 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1,minimum-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no, email=no">
<meta name="full-screen" content="true">
<meta name="screen-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="360-fullscreen" content="true">
<title>商务合作</title>
<script src="/x_admin/js/jq.js"></script>
<script type="text/javascript" src="/x_admin/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/x_admin/js/xadmin.js"></script>
<style>
*{
padding: 0 0;
margin: 0 0;
}
.big_box{
width: 100vw;
min-height: 100vh;
position: absolute;
top: 0;
left: 0;
background: url(/tsf/business_bg.jpg) no-repeat;
background-size: 100% 100%;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-items: center;
}
.content{
width: 85vw;
max-width: 880px;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
border-radius: 1vw;
background-color: white;
margin: 24px 0;
overflow: hidden;
align-items: center;
}
.content img{
width: 100%;
height: auto;
}
.content_c{
width: 100%;
padding: 2% 12%;
box-sizing: border-box;
}
.title_t{
border: none;
text-align: center;
color: rgba(8, 14, 23, 0.9);
font-weight: 600;
font-size: 28px;
line-height: 40px;
word-break: break-all;
white-space: pre-wrap;
overflow: visible;
margin: 4% 0;
}
.title_c2{
font-size: 12px;
margin-bottom: 10%;
}
.title_c2 span{
color: rgb(17, 106, 240);
}
.write_box{
width: 100%;
font-size: 16px;
margin: 10% 0;
}
.write_box_t{
font-weight: 600;
}
.write_box_r{
color: red;
}
.write_k{
padding: 8px 12px;
position: relative;
border-radius: 6px;
border: 1px solid rgba(8, 14, 23, 0.24);
display: flex;
outline: 0 !important;
word-break: break-all;
margin: 2% 0;
}
.write_k textarea{
width: 100%;
resize: none;
text-overflow: ellipsis;
line-height: 22px;
border: none !important;
border-radius: 0;
background: transparent !important;
box-shadow: none !important;
outline: 0 !important;
cursor: auto;
padding: 0;
min-height: 22px;
margin: 0 1%;
}
.ksapc-select-write {
width: 100%;
}
.ksapc-select-write-tip {
margin-bottom: 10px;
font-size: 14px;
color: #8E9095;
}
.ksapc-select-write-tile {
width: 100%;
}
.ksapc-checkboxgroup {
width: 100%;
}
.ksapc-row {
display: flex;
flex-wrap: wrap;
gap: 14px;
}
.ksapc-col {
flex: 1 1 48%; /* 两列布局 */
}
.ksapc-checkbox {
display: flex;
align-items: center;
}
.ksapc-checkbox input {
margin-right: 8px;
}
.ksapc-checkbox span{
font-size: 14px;
cursor: pointer;
}
#onload{
width: 20vw;
height: 5vw;
min-width: 200px;
min-height: 45px;
background-color: #0A6CFF;
color: white;
border-radius: 10px;
line-height: 5vw;
text-align: center;
font-size: 15px;
font-weight: bold;
margin-bottom: 35px;
cursor: pointer; /* 添加小手图标 */
}
</style>
</head>
<body id="box_k">
<div class="big_box">
<div class="content">
<img src="/tsf/business_title.jpg" alt="">
<div class="content_c">
<div class="title_t">商务合作意向登记表</div>
<div class="title_c2">
<!-- 智能设备产品包<span>含身高测量仪、体重体脂秤、宠物秤, 母婴秤,厨房秤,商业秤,身高体重/体脂秤,八电极体脂秤,运动训练设备</span>等;软件包含就智能健康管理系统,智能硬件管理系统等,支持智能设备选购/定制、健康系统对接/定制行业解决方案等您也可以直接拨打或微信联系13590959084期待与您合作 -->
</div>
<div class="write_box">
<div class="write_box_t">
<span class="write_box_r">*</span>&nbsp; 1.姓名
</div>
<div class="write_k">
<textarea placeholder="请输入" rows="1" oninput="autoResize(this)" class="name-input"></textarea>
</div>
</div>
<div class="write_box">
<div class="write_box_t">
<span class="write_box_r">*</span>&nbsp; 2.联系电话
</div>
<div class="write_k">
<textarea placeholder="请输入手机号" rows="1" oninput="autoResize(this)" class="phone-input"></textarea>
</div>
</div>
<div class="write_box">
<div class="write_box_t">
<span class="write_box_r">*</span>&nbsp; 3.行业
</div>
<div class="write_k">
<textarea placeholder="请输入" rows="1" oninput="autoResize(this)" class="company-input"></textarea>
</div>
</div>
<div class="write_box">
<div class="write_box_t">
<span class="write_box_r">*</span>&nbsp; 4.合作意向
</div>
<div class="write_k" style="border: none;">
<div class="ksapc-select-write">
<div class="ksapc-select-write-tip" id="selectedCount">此题已选择 0/4 项</div>
<div class="ksapc-select-write-tile">
<div class="ksapc-checkboxgroup">
<div class="ksapc-row">
<!-- <div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="智能设备">
<span>智能设备</span>
</label>
</div>
<div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="健康软件">
<span>健康软件</span>
</label>
</div> -->
<div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="解决方案">
<span>解决方案</span>
</label>
</div>
<div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="系统定制">
<span>系统定制</span>
</label>
</div>
<div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="设备定制">
<span>设备定制</span>
</label>
</div>
<div class="ksapc-col">
<label class="ksapc-checkbox">
<input type="checkbox" class="option-checkbox" value="其它">
<span>其它可联系商务合作13590959084</span>
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="write_box">
<div class="write_box_t">
<span class="write_box_r">*</span>&nbsp; 5.备注
</div>
<div class="write_k">
<textarea placeholder="请输入" rows="1" oninput="autoResize(this)" class="remark-input"></textarea>
</div>
</div>
<div class="write_box" style="color: #8E9095;">
商务合作电话/微信13590959084
</div>
</div>
<div id="onload">提交</div>
</div>
</div>
</body>
</html>
<script>
var selectedValues = [];
function autoResize(textarea) {
textarea.style.height = 'auto'; // 重置高度
textarea.style.height = textarea.scrollHeight + 'px'; // 设置为内容高度
}
document.addEventListener('DOMContentLoaded', function() {
// 获取 #onload 元素
const onloadElement = document.getElementById('onload');
// 计算 #onload 元素的高度
const height = onloadElement.offsetHeight;
// 设置 #onload 元素的行高与高度一致
onloadElement.style.lineHeight = height + 'px';
const checkboxes = document.querySelectorAll('.option-checkbox');
const selectedCountElement = document.getElementById('selectedCount');
let selectedCount = 0;
function updateSelectedCount() {
selectedCount = 0;
selectedValues = [];
checkboxes.forEach(checkbox => {
if (checkbox.checked) {
selectedCount++;
selectedValues.push(checkbox.value);
}
});
selectedCountElement.textContent = `此题已选择 ${selectedCount}/4 项`;
console.log('Selected Values:', selectedValues);
}
checkboxes.forEach(checkbox => {
checkbox.addEventListener('change', updateSelectedCount);
});
$('#onload').on('click', function() {
// 获取所有需要检查的输入字段
const nameInput = document.querySelector('.name-input');
const phoneInput = document.querySelector('.phone-input');
const companyInput = document.querySelector('.company-input');
const remarkInput = document.querySelector('.remark-input');
// 检查每个字段是否为空
let hasError = false;
let errorMessage = '';
if (!nameInput || nameInput.value.trim() === '') {
hasError = true;
errorMessage += '1. 姓名\n';
}
if (!phoneInput || phoneInput.value.trim() === '') {
hasError = true;
errorMessage += '2. 联系电话\n';
}
if (!companyInput || companyInput.value.trim() === '') {
hasError = true;
errorMessage += '3. 行业\n';
}
if (selectedCount === 0) {
hasError = true;
errorMessage += '4. 合作意向\n';
}
if (!remarkInput || remarkInput.value.trim() === '') {
hasError = true;
errorMessage += '5. 备注\n';
}
if (hasError) {
layer.msg('以下项目未填写或未选择:\n' + errorMessage, {icon: 2});
// alert('以下项目未填写或未选择:\n' + errorMessage);
return;
}
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
// 如果所有字段都填写了,执行提交操作
$.ajax({
url: "business_cooperation_action", // 请求的url地址
dataType: "json", // 返回格式为json
async: true, // 请求是否异步默认为异步这也是ajax重要特性
data: {
"name": nameInput.value,
"phone": phoneInput.value,
"company": companyInput.value,
"selectedValues": selectedValues,
"remark": remarkInput.value
},
type: "POST", // 请求方式
success: function(req) {
layer.close(layer.index)
// 请求成功时处理
if(req.code == 0){
layer.msg(req.msg, {icon: 1});
setTimeout(() => {
window.location.reload();
}, 2000);
}else{
layer.msg(req.msg, {icon: 2});
}
},
error: function() {
layer.close(layer.index)
// 请求出错处理
layer.msg('网络错误了,请直接联系商务合作电话/微信13590959084', {icon: 2});
}
});
});
});
</script>

View File

@ -461,8 +461,8 @@ Route::any('/open_wechat_content', 'app/Msginformation/open_wechat_content');
################################################################下面是厨房秤################################################################
###########################################################################################################################################
################################################################下面是厨房秤(国内版)################################################################
####################################################################################################################################################
#########################################################前端接口############################################################
// 微信小程序快捷登录接口
@ -640,6 +640,96 @@ Route::any('/k/a/cookbook/find_food_list', 'app/kitchenscale/admin.cookbook/find
Route::any('/k/a/cookbook/stop_and_run', 'app/kitchenscale/admin.cookbook/stop_and_run');
################################################################下面是厨房秤(国际版)################################################################
####################################################################################################################################################
#########################################################前端接口############################################################
// 公共内容################################################################
// 首页内容################################################################
// 检测版本及判断是否登录失效
Route::any('/kitchenscale2/login_invalid_version', 'app/kitchenscale2/app.Index/login_invalid_version');
// 获取配置类信息
Route::any('/kitchenscale2/get_default_config', 'app/Kitchenscale2/app.Index/get_default_config');
// 首页搜索接口
Route::any('/kitchenscale2/search_column', 'app/kitchenscale2/app.index/search_column');
// 菜谱内容################################################################
// 根据菜谱标签查询列表(首页用)
// Route::any('/kitchenscale2/find_by_cook_label', 'app/kitchenscale2/app.cookbook/find_by_cook_label');
// 根据食材详细查找列表
// Route::any('/kitchenscale2/find_by_food', 'app/kitchenscale2/app.cookbook/find_by_food');
// 查询食谱的详情
// Route::any('/kitchenscale2/cookbook_details', 'app/kitchenscale2/app.cookbook/cookbook_details');
// 收藏菜谱
// Route::any('/kitchenscale2/cookbook_like', 'app/kitchenscale2/app.cookbook/cookbook_like');
// 获取当前食材重量卡路里
// Route::any('/kitchenscale2/food_count_kcal', 'app/kitchenscale2/app.cookbook/food_count_kcal');
// 食材列表查询接口
Route::any('/kitchenscale2/find_food', 'app/kitchenscale2/app.cookbook/find_food');
// 获取所有食材列表
Route::any('/kitchenscale2/get_food_list', 'app/kitchenscale2/app.cookbook/get_food_list');
// 获取查询页页面导航食材列表
Route::any('/kitchenscale2/get_search_food_page_list', 'app/kitchenscale2/app.cookbook/get_search_food_page_list');
// 计食器################################################################
// 添加每日摄入记录
Route::any('/kitchenscale2/add_intake_food', 'app/kitchenscale2/app.countfood/add_intake_food');
// 获取记食器板块内容
Route::any('/kitchenscale2/get_countfoot_content', 'app/kitchenscale2/app.countfood/get_countfoot_content');
// 获取记食器记录
Route::any('/kitchenscale2/get_log_list', 'app/kitchenscale2/app.countfood/get_log_list');
// 计食器板块-设置内容
Route::any('/kitchenscale2/set_up_content', 'app/kitchenscale2/app.countfood/set_up_content');
// 删除用户某个饮食记录
Route::any('/kitchenscale2/del_user_eat_log', 'app/kitchenscale/app.countfood/del_user_eat_log');
// 删除用户某个饮食记录
Route::any('/kitchenscale2/del_user_eat_list_log', 'app/kitchenscale2/app.countfood/del_user_eat_list_log');
// 获取指定饮食记录的四大营养分析
Route::any('/kitchenscale2/current_food_statistics', 'app/kitchenscale2/app.countfood/current_food_statistics');
// 我的################################################################
// 获取角色信息
Route::any('/kitchenscale2/get_user_msg', 'app/kitchenscale2/app.usercenter/get_user_msg');
// 修改角色信息
Route::any('/kitchenscale2/update_user_msg', 'app/kitchenscale2/app.usercenter/update_user_msg');
// 账号收藏点赞列表
// Route::any('/kitchenscale2/get_user_collect_list', 'app/kitchenscale2/app.usercenter/get_user_collect_list');
// 我的菜谱
// Route::any('/kitchenscale2/get_my_cookbook', 'app/kitchenscale2/app.usercenter/get_my_cookbook');
// 菜谱删除
// Route::any('/kitchenscale2/del_my_cookbook', 'app/kitchenscale2/app.usercenter/del_my_cookbook');
// 删除用户搜索记录
Route::any('/kitchenscale2/del_search_history', 'app/kitchenscale2/app.usercenter/del_search_history');
// 商务合作
Route::any('/kitchenscale2/business_cooperation', 'app/kitchenscale2/app.usercenter/business_cooperation');
// 商务合作提交
Route::any('/kitchenscale2/business_cooperation_action', 'app/kitchenscale2/app.usercenter/business_cooperation_action');
// ☆设置用户的卡路里&营养占比
Route::any('/kitchenscale2/set_user_kcal', 'app/kitchenscale2/app.usercenter/set_nutrition_proportion');
// ☆重置密码
Route::any('/kitchenscale2/update_my_password', 'app/kitchenscale2/app.usercenter/update_my_password');
// ☆修改个人信息
Route::any('/kitchenscale2/update_my_account_msg', 'app/kitchenscale2/app.usercenter/update_my_account_msg');
// ☆修改语言设置(多语言)
Route::any('/kitchenscale2/update_language', 'app/kitchenscale2/app.usercenter/update_language');
#########################################################管理后台############################################################
################################################################下面是增杰SN码打印################################################################
################################################################################################################################################
@ -888,6 +978,11 @@ Route::any('/xishuju1/next_pass_action', 'test/xishuju1/next_pass_action');
Route::any('/xishuju1/new_step1_action', 'test/xishuju1/new_step1_action');
Route::any('/xishuju1/new_step2_action', 'test/xishuju1/new_step2_action');
Route::any('/xishuju1/new_step3_action', 'test/xishuju1/new_step3_action');
Route::any('/xishuju1/ceshiyong', 'test/xishuju1/ceshiyong');

View File

@ -326,8 +326,12 @@ class Xishuju1 extends Controller{
// 处理食物表数据
$cfc = Db::connect('cfc_db');
// 获取一条数据
$shicai_data = $cfc->table('app_z_national_standard_food_type_3_multilingual')->where("food_name is null")->order('id')->find();
$shicai_data = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')->where("food_name = ''")->order('id')->find();
if(!$shicai_data){
return $this->msg(10004,'没了');
}
// dump($shicai_data);
// die;
$baidufanyi = new Baidufanyi;
$result = $baidufanyi->fanyi_action($shicai_data['food_name_en'], 'en', 'zh');
// dump($result);
@ -335,14 +339,14 @@ class Xishuju1 extends Controller{
// die;
// $fanyi_result = '';
if($result['success'] == true){
$fanyi_result = $cfc->table('app_z_national_standard_food_type_3_multilingual')->where(['id'=>$shicai_data['id']])->update(['food_name'=>$result['data']['trans_result'][0]['dst']]);
$fanyi_result = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')->where(['id'=>$shicai_data['id']])->update(['food_name'=>$result['data']['trans_result'][0]['dst']]);
if($fanyi_result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}else{
return $this->msg(12002);
return $this->msg(10002,'翻译失败');
}
}
@ -1397,6 +1401,108 @@ class Xishuju1 extends Controller{
}
public function new_step2_action(){
$foodCategories = [
'Dairy and Egg Products' => 1,
'Spices and Herbs' => 2,
'Baby Foods' => 3,
'Fats and Oils' => 4,
'Poultry Products' => 5,
'Soups, Sauces, and Gravies' => 6,
'Sausages and Luncheon Meats' => 7,
'Breakfast Cereals' => 8,
'Fruits and Fruit Juices' => 9,
'Pork Products' => 10,
'Vegetables and Vegetable Products' => 11,
'Nut and Seed Products' => 12,
'Beef Products' => 13,
'Beverages' => 14,
'Finfish and Shellfish Products' => 15,
'Legumes and Legume Products' => 16,
'Lamb, Veal, and Game Products' => 17,
'Baked Products' => 18,
'Sweets' => 19,
'Cereal Grains and Pasta' => 20,
'Fast Foods' => 21,
'Meals, Entrees, and Side Dishes' => 22,
'Snacks' => 23,
'American Indian/Alaska Native Foods' => 24,
'Restaurant Foods' => 25,
'Branded Food Products Database' => 26,
'Quality Control Materials' => 27,
'Alcoholic Beverages' => 28
];
$cfc = Db::connect('cfc_db');
$congfu_num = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')
->where("status is null")
->order('id')
->find();
if(!$congfu_num){
return $this->msg(11006,'没了');
}
if(array_key_exists($congfu_num['two_id'],$foodCategories)){
$result = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')->where(['id'=>$congfu_num['id']])->update(['two_id'=>$foodCategories[$congfu_num['two_id']],'status'=>'ok']);
}else{
$result = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')->where(['id'=>$congfu_num['id']])->update(['two_id'=>$foodCategories[$congfu_num['two_id']],'status'=>'nothing']);
}
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function new_step3_action(){
$foodCategories = [
'Dairy and Egg Products' => 1,
'Spices and Herbs' => 2,
'Baby Foods' => 3,
'Fats and Oils' => 4,
'Poultry Products' => 5,
'Soups, Sauces, and Gravies' => 6,
'Sausages and Luncheon Meats' => 7,
'Breakfast Cereals' => 8,
'Fruits and Fruit Juices' => 9,
'Pork Products' => 10,
'Vegetables and Vegetable Products' => 11,
'Nut and Seed Products' => 12,
'Beef Products' => 13,
'Beverages' => 14,
'Finfish and Shellfish Products' => 15,
'Legumes and Legume Products' => 16,
'Lamb, Veal, and Game Products' => 17,
'Baked Products' => 18,
'Sweets' => 19,
'Cereal Grains and Pasta' => 20,
'Fast Foods' => 21,
'Meals, Entrees, and Side Dishes' => 22,
'Snacks' => 23,
'American Indian/Alaska Native Foods' => 24,
'Restaurant Foods' => 25,
'Branded Food Products Database' => 26,
'Quality Control Materials' => 27,
'Alcoholic Beverages' => 28
];
$cfc = Db::connect('cfc_db');
$congfu_num = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')
->where("Calorie_unit = 'kJ'")
->order('id')
->find();
if(!$congfu_num){
return $this->msg(11006,'没了');
}
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
$kcal_val = bcdiv($congfu_num['Calorie_val'],4.184,2);
$result = $cfc->table('app_z_national_standard_food_type_3_multilingual_copy1')->where(['id'=>$congfu_num['id']])->update(['Calorie_unit'=>'KCAL','Calorie_val'=>$kcal_val]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
/**
@ -1448,7 +1554,9 @@ class Xishuju1 extends Controller{
###################################################################################################################
###################################################################################################################
###################################################################################################################
public function ceshiyong(){
}
public function msg($data,$str='',$result = []){
if(is_array($data)){

View File

@ -112,7 +112,8 @@
+ "<p>处理失败:"+content2+"项</p>"
$('.centent').html(str)
setTimeout(() => {
error_action(req.data.id,req.code)
// error_action(req.data.id,req.code)
start_action()
}, 100);
}
},
@ -158,39 +159,55 @@
function start_action2(){
$.ajax({
url:"new_step1_action", //请求的url地址
// url:"new_step1_action", //请求的url地址
// url:"new_step2_action", //请求的url地址
url:"new_step3_action", //请求的url地址
dataType:"json", //返回格式为json
async:true,//请求是否异步默认为异步这也是ajax重要特性
data:{"page":page}, //参数值
type:"POST", //请求方式
success:function(req){
//请求成功时处理
// if(req.code == 0){
// success_num = success_num+req.data.success_num
// fail_num = fail_num+req.data.fail_num
// chongfu_num = chongfu_num+req.data.chongfu_num
// total_num = total_num+req.data.total_num
// str = "<p>处理成功:"+(success_num)+"项</p>"
// + "<p>处理失败:"+(fail_num)+"项</p>"
// + "<p>处理重复:"+(chongfu_num)+"项</p>"
// + "<p>总计处理:"+(total_num)+"项</p>"
// $('.centent').html(str)
// page = page+1
// setTimeout(() => {
// start_action2()
// }, 100);
// }else if(req.code == 10006){
// $('.centent').append('<p>处理完成!</p>');
// }else{
// setTimeout(() => {
// start_action2()
// }, 100);
// }
if(req.code == 0){
success_num = success_num+req.data.success_num
fail_num = fail_num+req.data.fail_num
chongfu_num = chongfu_num+req.data.chongfu_num
total_num = total_num+req.data.total_num
// console.log(success_num)
// console.log(chongfu_num)
// console.log(fail_num)
// console.log(total_num)
success_num = success_num+1
total_num = total_num+1
str = "<p>处理成功:"+(success_num)+"项</p>"
+ "<p>处理失败:"+(fail_num)+"项</p>"
+ "<p>处理重复:"+(chongfu_num)+"项</p>"
+ "<p>总计处理:"+(total_num)+"项</p>"
$('.centent').html(str)
page = page+1
setTimeout(() => {
start_action2()
}, 100);
}else if(req.code == 10006){
}else if(req.code == 11006){
$('.centent').append('<p>处理完成!</p>');
// $('.centent').html(str)
// setTimeout(() => {
// error_action(req.data.id,req.code)
// }, 100);
}else{
total_num = total_num+1
fail_num = fail_num+1
str = "<p>处理成功:"+(success_num)+"项</p>"
+ "<p>处理失败:"+(fail_num)+"项</p>"
+ "<p>总计处理:"+(total_num)+"项</p>"
$('.centent').html(str)
setTimeout(() => {
start_action2()
}, 100);