PHP婚恋小程序开发源码支持微信+公众号+APP

随着社会的发展和人们生活节奏的加快,传统的相亲方式已经不能满足现代人的需求。在此背景下,有人想到通过线上小程序的方式来满足更多的人进行相亲,所以在此情况下,婚恋相亲小程序由此出现。婚恋相亲小程序的功能有会员功能,红娘管理,后台系统,支付系统,动态管理,通知管理,私人定制管理等等。

在这么多的功能中,今天选择红娘管理给大家做下详细介绍:

联系TA记录:查看A联系B的记录,需要显示联系人方的ID与手机号,联系人发送的被联系人方的ID与手机号,点击按钮的时间,负责的星座红娘。可以按照红娘或时间段筛选

我的联系方式记录:查看联系的红娘,联系人ID,手机号,发送的手机号与微信号

牵线记录:查看A牵线B的记录,需要显示牵线人的ID与手机号,被牵线人的ID与手机号,点击牵线的时间,负责的星座红娘,可以按照红娘或时间段筛选

会员管理:会员管理所有功能

婚恋相亲小程序开发部分源码分享:

<?phpnamespace app\api\controller;use addons\epay\library\Service;
use app\common\controller\Api;
use app\common\model\Activity;
use app\common\model\AppConfig;
use app\common\model\AppUser;
use app\common\model\ChatRoom;
use app\common\model\FlyerOrder;
use app\common\model\Icon;
use app\common\model\Notice;
use app\common\model\OrderActivity;
use app\common\model\SayCommonRule;
use app\common\model\SayLog;
use app\common\model\SayOrder;
use app\common\model\SayPackage;
use app\common\model\User;
use app\common\model\UserWall as UserWallModel;
use app\common\model\VipExperience;
use app\common\model\VipOrder;
use app\common\model\VipPackage;
use im\Ffs;
use im\Im;
use subscribeMsg\SubscribeMsg;
use think\cache\driver\Redis;
use think\Db;
use think\Env;
use think\Exception;
use think\Log;/*** 首页接口*/
class Index extends Api
{protected $noNeedLogin = ['getUserToken','index','activity','vipNotify','activityNotify','sayNotify','updateLngLat','user_wallNotify','getSayConfig','delmsg','getAgr'];protected $noNeedRight = ['*'];/*** 首页**/public function index(){$scene = $this->request->param('scene');$scene = $scene?$scene : 2; // 1 首页   2 推荐$user = $this->auth->getUserinfo();$gender = $this->request->param('gender',1);$is_eject = 0;if ($user){$is_eject = VipExperience::retNotEject($user['id']);}$list = AppUser::getPushUser($user,$gender,$scene);$icon = Icon::where('type',1)->field('icon_img,title,href')->select();// 个人中心背景$center_bg = AppConfig::getValue('center_bg') ;$center_bg = fileUrl($center_bg);// 如果是首页 需要追加推荐墙数据if ($scene == 1){$uw_where['order_status'] = 1;$city = $this->request->param('city');if ($user){$uw_where['gender'] = ['<>',$user['gender']];}$uw_where['live_city'] = $city;$date = date('Y-m-d 00:00:00');$uw_user_id = UserWallModel::where($uw_where)->where('start_time','=',$date)->limit(9)->column('user_id');$uw_list = AppUser::whereIn('id',$uw_user_id)->field('id,nickname,live_address,avatar,birthday,height,photos,job,education,is_completion_data,gender,constellation')->select();foreach ($uw_list as $v){$list[] = $v;}}$this->success('请求成功',compact('list','icon','is_eject','center_bg'));}/*** 每周活动* @throws \think\exception\DbException*/public function activity(){$data = Activity::get(['status'=>1]);$this->success('请求成功',$data);}/*** 参加活动* @throws \think\exception\DbException*/public function joinActivity(){$user_info = $this->auth->getUserinfo();$activity_id = input('activity_id');$activity = Activity::find($activity_id);// 判断是否参加了活动$is_join = OrderActivity::where(['user_id'=>$user_info['id'],'activity_id'=>$activity_id,'status'=>1])->count();if ($is_join) $this->error('已报名该场活动');$gender_key = $user_info['gender'] ? 'male_num' : 'female_num';$join_key = $user_info['gender'] ? 'male_join_num' : 'female_join_num';if($activity[$join_key] >= $activity[$gender_key]) $this->error('活动人数已达上限');$order_num = date("YmdHis") . mt_rand(100000, 999999);$param['price'] = $activity['price'];$param['user_id'] = $user_info['id'];$param['order_num'] = $order_num;$param['activity_id'] = $activity_id;$model = new OrderActivity();$model->data($param);$re = $model->save();if(!$re) $this->error('操作失败');$pay_params = ['amount' => $activity['price'],
//            'amount' => 0.01,'orderid' => $param['order_num'],'type' => "wechat",'title' => "已遇蓝桉",'notifyurl' => Env::get('app.url').'/api/index/activityNotify','method' => "miniapp",'openid' => $user_info['openid'],];$response = Service::submitOrder($pay_params);$this->success('获取成功',['pay_param' => $response,'order_number' => $order_num]);}/*** 参加活动结果* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException*/public function activityResult(){$order_number = input('order_number');$order = OrderActivity::field('id,check_num,check_qr_code,status')->where('order_num',$order_number)->find();if (!$order) $this->error('订单不存在');if ($order['status'] != 1) $this->error('订单未支付');$order['check_qr_code'] = fileUrl($order['check_qr_code']);$this->success('获取成功',$order);}/*** 购买会员回调**/public function vipNotify(){$pay = Service::checkNotify('wechat');if (!$pay) {Log::error('签名错误');
//            $filename = 'miniprogram_pay_notify_info_'.date('Y-m-d');
//            file_put_contents($filename, $pay.PHP_EOL, FILE_APPEND);}$data = $pay->verify();try {$pay_amount = $data['total_fee'] / 100;$out_trade_no = $data['out_trade_no'];$order = VipOrder::where('order_number',$out_trade_no)->find();if (!$order) {throw new \Exception('订单不存在');}
//            if ($order['price'] != $pay_amount) {
//                throw new \Exception('订单异常');
//            }$package = VipPackage::get($order['package_id']);if (!$package) {throw new \Exception('套餐不存在');}//如果用户已有会员,有效期就在原有时间上增加$user = AppUser::get($order['user_id']);$now_expire = $user['vip_expire_time'] && $user['is_vip'] == 1 ? strtotime($user['vip_expire_time']) : time();$time_limit = $package['time_limit'];$expire = date("Y-m-d H:i:s");switch ($package['unit']) {case 0:$expire = date("Y-m-d H:i:s",strtotime("+".$time_limit." day",$now_expire));break;case 1:$expire = date("Y-m-d H:i:s",strtotime("+".$time_limit." month",$now_expire));break;case 2:$expire = date("Y-m-d H:i:s",strtotime("+".$time_limit." year",$now_expire));break;}$user->is_vip = 1;$user->vip_expire_time = $expire;$user->save();$order->status = 1;$order->buy_time = date('Y-m-d H:i:s');$order->expire_time = $expire;$order->save();// 返佣FlyerOrder::returnCommission($order,1);return $pay->success()->send();} catch (\Exception $e) {Log::error($e);}}/*** 购买say豆回调*/public function sayNotify(){$pay = Service::checkNotify('wechat');if (!$pay) {Log::error('签名错误');}$data = $pay->verify();try {$pay_amount = $data['total_fee'] / 100;$out_trade_no = $data['out_trade_no'];$order = SayOrder::where('order_number',$out_trade_no)->find();if (!$order) {throw new \Exception('订单不存在');}
//            if ($order['price'] != $pay_amount) {
//                throw new \Exception('订单异常');
//            }SayLog::saveLog($order['user_id'],$order['say_num'],9,'购买say豆');$order->status = 1;$order->buy_time = date('Y-m-d H:i:s');$order->save();// 返佣FlyerOrder::returnCommission($order,2);return $pay->success()->send();} catch (\Exception $e) {Log::error($e);}}/*** 参加活动回调*/public function activityNotify(){$pay = Service::checkNotify('wechat');if (!$pay) {Log::error('签名错误');}$data = $pay->verify();try {$order = OrderActivity::get(['order_num'=>$data['out_trade_no']]);
//            $order = OrderActivity::get(1);//生成核销码,核销二维码$check_num = time() . mt_rand(100000, 999999);$qr = Common::build($check_num);
//            $qrcode = Common::serverUrl().'/uploads/qrcode/'.$qr;$qrcode = '/uploads/qrcode/'.$qr;$order->check_num = $check_num;$order->check_qr_code = $qrcode;$order->status = 1;$order->save();$user = AppUser::get($order['user_id']);//参加活动对应性别人数加1$key = $user['gender'] ? 'male_join_num' : 'female_join_num' ;Activity::where('id',$order['activity_id'])->setInc($key);// 发送订阅消息$usr_arr = AppUser::getFieldInfo($order['user_id']);$act_info = Activity::where('id',$order['activity_id'])->find();$sub_msg_data['name1'] =  $usr_arr['nickname'];$sub_msg_data['time4'] =  $act_info['start_time'];$sub_msg_data['thing7'] =  $act_info['title'];$sub_msg_data['thing3'] =  '恭喜您已成功预约,客服之后会与您联系';SubscribeMsg::activityMsg($usr_arr['openid'],$sub_msg_data);return $pay->success()->send();} catch (\Exception $e) {Log::error($e);}}/*** 推荐上墙回调*/public function user_wallNotify(){$pay = Service::checkNotify('wechat');if (!$pay) {Log::error('签名错误');}$data = $pay->verify();try {$out_trade_no = $data['out_trade_no'];$order = \app\common\model\UserWall::where('order_number',$out_trade_no)->find();if (!$order) {throw new \Exception('订单不存在');}// 获取顺延时间$date_arr = \app\common\model\UserWall::getPostponedDate($order);$order->order_status = 1;$order->buy_time = date('Y-m-d H:i:s');$order->postponed_count = $date_arr['postponed_count'];$order->start_time = $date_arr['start_time'];$order->end_time = $date_arr['end_time'];$order->save();$msg_time = date('Y年m月d日',strtotime($date_arr['start_time']));// 发送消息// 创建聊天室$room_info = ChatRoom::where(['user_id'=>0,'to_user_id'=>$order['user_id']])->find();if (!$room_info){$room = new ChatRoom();$room->type = 1;$room->user_id = 0;$room->to_user_id = $order['user_id'];$room->status = 2;$room->createtime = time();$room->last_time = time();$room->to_user_id_del = $order['user_id'];$room->to_user_del_time = null;$room->save();}else{$room_info->last_time = time();$room_info->to_user_id_del = $order['user_id'];$room_info->to_user_del_time = null;$room_info->save();}// 上线$redis = new Redis();$redis->sadd(online_key(),$order['user_id']);$msg = "恭喜您已完成预约!您的预约时间是{$msg_time}。在此时间将您的个人形象及信息将展示于我平台【推荐墙】。展示时间为24小时,再次感谢您的预约。";
//            $im = new Im();
//            $im->adminPushMsg($order['user_id'],$msg);return $pay->success()->send();} catch (\Exception $e) {Log::error($e);}}/***  更新经纬度*/public function updateLngLat(){$lng = $this->request->post('lng');$lat = $this->request->post('lat');$user = $this->auth->getUserinfo();if ($user && $lng && $lat){AppUser::where(['id'=>$user['id']])->update(['lng'=>$lng,'lat'=>$lat]);}$this->success('ok');}/*** 返回配置的say豆*/public function getSayConfig(){$list = SayCommonRule::field('scene,beans')->select();$list = toArray($list);$app_config = AppConfig::where('key','in',['release_forum'])->field('value,name')->select();$app_config = toArray($app_config);foreach ($app_config as $k=>$v){$arr['scene'] = $v['name'];$arr['beans'] = $v['value'];$list[] = $arr;}$this->success('ok',$list);}/*** 协议*/public function getAgr(){$data['yh_content'] = config('site.yh_content');$data['ys_content'] = config('site.ys_content');$this->success('ok',$data);}/*** 公告列表*/public function getNotice(){$user = $this->auth->getUserinfo();$page = $this->request->param('page');$size = $this->request->param('size');$notice = Notice::order('id desc')->page($page,$size)->select();foreach ($notice as $k=>$v){// 是否阅读$notice[$k]['is_read'] = Notice::isRead($v['id'],$user['id']);}$data = compact('notice');$this->success('ok',$data);}/*** 清空所有用户的会话记录*/public function delmsg(){//        die;
//        $list = AppUser::order('id asc')->select();
//        foreach ($list as $k=>$v){
//            $v->birthday_int = $v['birthday'] ? strtotime($v['birthday']) : 0;
//            $v->save();
//        }
//
//        die;$where['is_completion_data']=1;$list = AppUser::order('id asc')->where($where)->column('id');$tokens = Db::name('user_token_test')->whereIn('user_id',$list)->select();$tokens = toArray($tokens);foreach ($tokens as $k=>$v){$tokens[$k]['nickname'] = AppUser::order('id asc')->where(['id'=>$v['user_id']])->value('nickname');}dd($tokens);/*for ($i=50;$i<57;$i++){for($j=50;$j<57;$j++){if ($i != $j){$im = new Im();$re = $im->setMsgRead($i.'x',$j.'x');if ($re['ActionStatus'] != 'OK'){d($i.'x-'.$j.'x');d($re);}$im2 = new Im();$re2 = $im2->setMsgRead($i,$j);if ($re2['ActionStatus'] != 'OK'){d($i.'-'.$j);d($re);}}}}*/dd();/*$where['id'] = ['in','50,1,6'];$where['is_completion_data']=1;$page = $this->request->param('page');$list = AppUser::order('id asc')->where($where)->limit(5)->page($page)->column('id');$list2 = AppUser::order('id asc')->where($where)->column('id');$count1 = count($list);$count2 = count($list2);for ($i=0;$i<$count1;$i++){for($j=0;$j<$count2;$j++){if ($list[$i] != $list2[$j]){
//                    d($list[$i].'x'.$list2[$j].'x');$im = new Im();$re = $im->setMsgRead($list[$i].'x',$list2[$j].'x');$im = new Im();$re = $im->setMsgRead($list[$i],$list2[$j]);}}}*/dd($list);$list = ChatRoom::where('id','>',0)->select();foreach ($list as $info){
//            $im = new Im();if ($info['type'] == 1){
//                $im->setMsgRead($info['user_id'],$info['to_user_id']);
//                $im->setMsgRead($info['to_user_id'],$info['user_id']);$im->deleteMsg($info['user_id'],$info['to_user_id']);$im->deleteMsg($info['to_user_id'],$info['user_id']);}else{
//                $im->setMsgRead($info['user_id'].'x',$info['to_user_id'].'x');
//                $im->setMsgRead($info['to_user_id'].'x',$info['user_id'].'x');
//                $im->deleteMsg($info['user_id'].'x',$info['to_user_id'].'x');
//                $im->deleteMsg($info['to_user_id'].'x',$info['user_id'].'x');}
//            $info->delete();}dd($list);$list = AppUser::where('id','>',0)->page(1)->limit(5)->select();foreach ($list as $user){$to_list = AppUser::all();foreach ($to_list as $to_user){
//                $im = new Im();
//                $im->deleteMsg($user['id'],$to_user['id']);
//                $im = new Im();
//                $im->deleteMsg($user['id'].'x',$to_user['id'].'x');}}dd($list);}/*** 测试*/public function test(){$access_token_val = getAccessToken();$url = 'https://api.weixin.qq.com/wxa/generate_urllink?access_token='.$access_token_val;$param['path'] = 'pages/index/index';$param['query'] = 'id='.$this->auth->getUserinfo()['id'];$result = httpRequest( $url, json_encode($param),"POST");$arr = json_decode($result,true);dd($arr);}/*** 获取用户token*/public function getUserToken(){$id = $this->request->param('id');$this->auth->direct($id);$token = $this->auth->getToken();dd($token);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MobX进阶:从基础到高级特性全面探索

MobX 提供了丰富的高级特性,包括计算属性、反应式视图、中间件、异步流程控制、依赖注入和动态 observable 、在服务端渲染和 TypeScript 支持方面提供了良好的集成。这些特性进一步增强了 MobX 在状态管理方面的灵活性和可扩展性,使其成为一个功能强大、易于使用的状态管理解决…

openkylin系统通过网线连接ubuntukylin系统上网攻略

openkylin系统通过网线连接ubuntukylin系统上网攻略 主机1&#xff1a;x64 amd &#xff0c;系统&#xff1a;ubuntukylin 22.04 &#xff0c;状态&#xff1a;通过wifi连接热点进行上网&#xff0c;并共享网络。 主机2&#xff1a;x64 intel &#xff0c;系统&#xff1a;ope…

大世界基尼斯见证辉煌,云仓酒庄首届酒类培训新高度诞生

近日&#xff0c;一场规模盛大的酒类培训盛会&#xff0c;在云仓酒庄的精心组织下圆满落幕。此次培训活动以其卓着的成果和盛大的规模&#xff0c;创下了大世界基尼斯纪录&#xff0c;为酒类培训领域树立了新的标杆。这一成就的取得&#xff0c;背后是云仓酒庄团队无数的心血与…

GPT 作词 + Suno 作曲|2 分钟成就一个音乐梦想!

嗨&#xff01;我是小谷&#xff0c;大家好久不见~ 今天&#xff0c;我要和大家宣布一个好消息&#xff01;&#xff01;&#xff01; 我出歌啦&#xff01;&#xff01; 词曲都是我自己&#xff08;借助 AI&#xff09;创作的 作为个人第一支单曲&#xff0c; 我给这首歌取…

Leetcode 11.盛最多水的容器(暴力->双指针)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例 …

MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。

本篇文章主要讲解MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。通过本篇文章你可以快速掌握brew安装相对应环境的能力。 作者&#xff1a;任聪聪 日期&#xff1a;2024年4月12日 一、brew介绍及安装说明 官网地址&#xff1a;https://b…

2024-8.python作用域+函数其他

变量的作用域 讲到了函数就必须介绍变量的作用域相关。 作用域指的是变量的有效范围。变量并不是在哪个位置都可以访问的&#xff0c;访问权限取决于这个变量是在哪里赋值的&#xff0c;也就是在哪个作用域内赋的值。变量在哪个作用域内赋值&#xff0c;则表示该变量的作用域就…

艾体宝方案 | ITT-Profitap IOTA——铁路运输的远程网络捕获和故障排除方案

在移动互联时代&#xff0c;铁路运输的数字化转型已成不可逆转的趋势。然而&#xff0c;随之而来的是对网络连接质量和故障排查的更高要求。本文将探讨如何利用艾体宝Profitap IOTA技术&#xff0c;在火车上实现远程网络捕获和故障排查&#xff0c;助力铁路运输行业迈向智能化未…

java swing电商出入库管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 电商出入库管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xff1…

WEB前端-用户注册倒计时

<body><textarea name"" id"" cols"30" rows"10">用户注册协议欢迎注册成为京东用户&#xff01;在您注册过程中&#xff0c;您需要完成我们的注册流程并通过点击同意的形式在线签署以下协议&#xff0c;请您务必仔细阅读…

net 5+ 服务创建

worker Service创建 在新版本服务中的创建&#xff0c;名称是Worker Service&#xff0c;从.NET Core 2.1开始&#xff0c;就可以使用辅助角色服务模板了&#xff0c;即Worker Service。它可以编写长期服务&#xff0c;作为 Windows 服务进行托管&#xff0c;还支持跨平台部署…

《幻兽帕鲁》今年夏天将进行游戏重大更新,年内上线竞技场模式 《幻兽帕鲁》是否还能延续热度?Mac电脑玩幻兽帕鲁

千呼唤万等待&#xff0c;《幻兽帕鲁》的0.2.0.6版本终于来了&#xff01;作为2024开年第一爆作&#xff0c;《幻兽帕鲁》在刚上线那段时间可谓是风靡整个互联网&#xff0c;Steam最高在线人数突破200W&#xff0c;但是随着热度过去&#xff0c;目前稳定地在线人数保持在了5W左…

Linux笔记之查看docker容器目录映射

Linux笔记之查看docker容器目录映射 —— 2024-04-15 code review! docker inspect 容器ID或容器名 | grep -A 20 Mounts实践 grep -A 参数详解&#xff1a; grep 的 -A 参数用于在输出中包括匹配行后的指定数目的行。 使用 -A 参数 该参数的基本语法如下&#xff1a; …

路径规划 | RRT结合APF算法快速探索随机树结合人工势场法的路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 RRT结合APF算法的matlab代码。地图为可以替换的栅格地图。代码是在复现华中科技大学发表的英文论文的基础上的进一步改进。RRT算法。人工势场算法。 1.原论文方法简介&#xff1a;针对快速探索随机树&#xff08;RRT&…

【Zabbix】zabbix 软件监控

使用zabbix监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控…

机器学习-随机森林算法预测温度

文章目录 算法简介解决问题获取数据集探索性数据分析查看数据集字段信息查看数据集综合统计结果查看特征值随时间变化趋势 数据预处理处理缺失数据字符列编码数据集分割训练集、验证集、测试集数据集分割 构建模型并训练结果分析与评估进一步优化实际使用经验总结 算法简介 随…

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…

BCLinux8U6系统部署oceanbase分布式数据库社区版之二、数据库服务器准备

本文是在完成步骤一、准备 OBD 中控机后的第二步&#xff0c;准备3台oceanbase分布式数据库服务器。 前序步骤&#xff1a;BCLinux8U6系统部署oceanbase分布式数据库社区版之一、准备 OBD 中控机 一、服务器配置 1、服务器硬件配置 本例采用vmware虚拟机来构建测试平台&…

Python高质量函数编写指南

The Ultimate Guide to Writing Functions 1.视频 https://www.youtube.com/watch?vyatgY4NpZXE 2.代码 https://github.com/ArjanCodes/2022-funcguide Python高质量函数编写指南 1. 一次做好一件事 from dataclasses import dataclass from datetime import datetimedatacl…

latex论文写作学习

首先无论是什么文章&#xff0c;最基础的格式都是这个&#xff1a; 如何修改字体呢&#xff1f;&#xff1a; 这样一来就可以在写完之后统一改掉了&#xff0c;用来做标记 最后记得\par 插图&#xff1a; 命令后面的中括号一般就是option