From f1b5ff9a0b244b3ad8319fe9ba7e4bf84cd0fa87 Mon Sep 17 00:00:00 2001 From: manghe Date: Mon, 31 Mar 2025 14:56:31 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A0=E9=99=90=E8=B5=8F?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=8A=BD=E5=A5=96=E6=96=B9=E5=BC=8F=E3=80=82?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 53 ++++++++++ app/admin/controller/Advert.php | 1 + app/admin/controller/Goods.php | 2 +- app/admin/controller/User.php | 3 +- app/admin/controller/WelfareHouse.php | 135 +++++++++++++++++++++++++ app/admin/route/app.php | 11 +- app/admin/view/public/footer.html | 1 + app/admin/view/public/header.html | 57 +++++++++++ app/admin/view/public/header2.html | 18 ++++ app/admin/view/welfare_house/add.html | 104 +++++++++++++++++++ app/admin/view/welfare_house/edit.html | 105 +++++++++++++++++++ app/api/controller/Notify.php | 51 +++++++--- app/api/controller/WelfareHouse.php | 19 ++++ app/api/route/app.php | 7 +- app/common/model/WelfareHouse.php | 26 +++++ config/menu.php | 4 + public/storage/poster/share/6157.png | Bin 0 -> 17073 bytes 17 files changed, 579 insertions(+), 18 deletions(-) create mode 100644 app/admin/controller/WelfareHouse.php create mode 100644 app/admin/view/public/footer.html create mode 100644 app/admin/view/public/header.html create mode 100644 app/admin/view/public/header2.html create mode 100644 app/admin/view/welfare_house/add.html create mode 100644 app/admin/view/welfare_house/edit.html create mode 100644 app/api/controller/WelfareHouse.php create mode 100644 app/common/model/WelfareHouse.php create mode 100644 public/storage/poster/share/6157.png diff --git a/README.md b/README.md index ea59ef4..c2a217a 100755 --- a/README.md +++ b/README.md @@ -68,3 +68,56 @@ composer require yzalis/identicon composer require topthink/think-image php think UserStatisticsHour ``` + + +原抽无限赏奖逻辑(内存消耗过大,不在使用) +```sh + // #组合中奖商品 + // $all_goods_id = []; + // foreach ($goodslist as $value) { + // $real_pro1 = $value['real_pro']; + // $real_pro = $real_pro1 * 100000; + // for ($i = 1; $i <= $real_pro; $i++) { + // $all_goods_id[] = $value['id']; + // } + // } + + // for ($i = 0; $i < $prize_num; $i++) { + // #随机打乱 + // shuffle($all_goods_id); + // shuffle($all_goods_id); + // $prize_id = $all_goods_id[0]; + // $prize_info = GoodsList::where(['id' => $prize_id])->find(); + // #编号 + // $luck_no = OrderList::field('id') + // ->where('goods_id', '=', $goods_id) + // ->where('num', '=', 0) + // ->where('order_type', '=', $order_type) + // ->order('id desc') + // ->value('luck_no'); + // $luck_no++; + // #新增记录 + // $save_prize_info = [ + // 'order_id' => $order_id, + // 'user_id' => $user_id, + // 'status' => 0,#0未操作 1选择兑换 2选择发货 + // 'goods_id' => $goods_id, + // 'num' => 0, + // 'shang_id' => $prize_info['shang_id'], + // 'goodslist_id' => $prize_info['id'], + // 'goodslist_title' => $prize_info['title'], + // 'goodslist_imgurl' => $prize_info['imgurl'], + // 'goodslist_price' => $prize_info['price'], + // 'goodslist_money' => $prize_info['money'], + // 'goodslist_type' => $prize_info['goods_type'], + // 'goodslist_sale_time' => $prize_info['sale_time'], + // 'addtime' => time(), + // 'prize_code' => $prize_info['prize_code'], + // 'order_type' => $order_type, + // 'luck_no' => $luck_no, + // ]; + // #入库=== + // $res[] = OrderList::insert($save_prize_info); + // } + +``` \ No newline at end of file diff --git a/app/admin/controller/Advert.php b/app/admin/controller/Advert.php index 97ac90f..5b0e42d 100755 --- a/app/admin/controller/Advert.php +++ b/app/admin/controller/Advert.php @@ -53,6 +53,7 @@ class Advert extends Base */ public function add(Request $request) { + if (!$request->isPost()) { $types = AdvertTypeModel::order('sort asc, id asc')->select(); View::assign('types', $types); diff --git a/app/admin/controller/Goods.php b/app/admin/controller/Goods.php index deb155c..f1f9771 100755 --- a/app/admin/controller/Goods.php +++ b/app/admin/controller/Goods.php @@ -770,7 +770,7 @@ class Goods extends Base if ($type == 1 || $type == 5 || $type == 10 || $type == 6 || $type == 11) { } elseif ($type == 2 || $type == 8 || $type == 9) { - if (RegMoney($data['real_pro']*100)) { + if (RegMoney($data['real_pro']*1000)) { return $this->renderError('真实概率设置错误,最多保留两位小数'); } } else if ($type == 3) { diff --git a/app/admin/controller/User.php b/app/admin/controller/User.php index e92ec57..d0999fe 100755 --- a/app/admin/controller/User.php +++ b/app/admin/controller/User.php @@ -965,9 +965,10 @@ class User extends Base { $id = input('id'); View::assign('id',$id); + View::assign('user_id',$id); $nickname = input('nickname'); View::assign('nickname',$nickname); - return View::fetch(); + return View::fetch('User/user_order'); } /** diff --git a/app/admin/controller/WelfareHouse.php b/app/admin/controller/WelfareHouse.php new file mode 100644 index 0000000..1b3ff50 --- /dev/null +++ b/app/admin/controller/WelfareHouse.php @@ -0,0 +1,135 @@ +isAjax()) { + $param = input('param.'); + $limit = $param['limit'] ?? 15; + $offset = $param['offset'] ?? 0; + + $where = []; + if (!empty($param['name'])) { + $where[] = ['name', 'like', '%' . $param['name'] . '%']; + } + + $count = WelfareHouseModel::where($where)->count(); + $list = WelfareHouseModel::where($where) + ->order('sort asc, id desc') + ->limit($offset, $limit) + ->select(); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $count, + 'data' => $list + ]); + // json(['total' => $count, 'rows' => $list]); + } + + return View::fetch(); + } + + // 添加 + public function add() + { + if (request()->isPost()) { + $param = input('post.'); + + $validate = validate([ + 'name|名称' => 'require', + 'image|图片' => 'require', + 'url|跳转路径' => 'require', + 'sort|排序' => 'require|number', + ]); + + if (!$validate->check($param)) { + return json(['status' => 0, 'msg' => $validate->getError()]); + } + + $param['status'] = isset($param['status']) ? 1 : 0; + $result = WelfareHouseModel::create($param); + + if ($result) { + return json(['status' => 1, 'msg' => '添加成功']); + } else { + return json(['status' => 0, 'msg' => '添加失败']); + } + } + + return View::fetch(); + } + + // 编辑 + public function edit() + { + $id = input('id'); + $info = WelfareHouseModel::find($id); + if (!$info) { + return json(['status' => 0, 'msg' => '数据不存在']); + } + + if (request()->isPost()) { + $param = input('post.'); + + $validate = validate([ + 'name|名称' => 'require', + 'image|图片' => 'require', + 'url|跳转路径' => 'require', + 'sort|排序' => 'require|number', + ]); + + if (!$validate->check($param)) { + return json(['status' => 0, 'msg' => $validate->getError()]); + } + + $param['status'] = isset($param['status']) ? 1 : 0; + $result = WelfareHouseModel::update($param); + + if ($result) { + return json(['status' => 1, 'msg' => '编辑成功']); + } else { + return json(['status' => 0, 'msg' => '编辑失败']); + } + } + + View::assign('info', $info); + return View::fetch(); + } + + // 删除 + public function del() + { + $id = input('id'); + $result = WelfareHouseModel::destroy($id); + + if ($result) { + return json(['status' => 1, 'msg' => '删除成功']); + } else { + return json(['status' => 0, 'msg' => '删除失败']); + } + } + + // 修改状态 + public function status() + { + $id = input('id'); + $status = input('status'); + + $result = WelfareHouseModel::where('id', $id)->update(['status' => $status]); + + if ($result) { + return json(['status' => 1, 'msg' => '操作成功']); + } else { + return json(['status' => 0, 'msg' => '操作失败']); + } + } +} \ No newline at end of file diff --git a/app/admin/route/app.php b/app/admin/route/app.php index f7dfe53..dd1ad6f 100755 --- a/app/admin/route/app.php +++ b/app/admin/route/app.php @@ -333,4 +333,13 @@ Route::post('goodstype/add', 'GoodsType/add'); Route::rule('goodstype/edit', 'GoodsType/edit', 'GET|POST'); Route::post('goodstype/delete', 'GoodsType/delete'); Route::post('goodstype/status', 'GoodsType/status'); -Route::get('goodstype/getTypeList', 'GoodsType/getTypeList'); \ No newline at end of file +Route::get('goodstype/getTypeList', 'GoodsType/getTypeList'); + +#============================ +#WelfareHouse.php福利屋管理 +#============================ +Route::rule('welfare_house', 'WelfareHouse/index', 'GET|POST'); +Route::rule('welfare_house_add', 'WelfareHouse/add', 'GET|POST'); +Route::rule('welfare_house_edit', 'WelfareHouse/edit', 'GET|POST'); +Route::rule('welfare_house_del', 'WelfareHouse/del', 'POST'); +Route::rule('welfare_house_status', 'WelfareHouse/status', 'POST'); \ No newline at end of file diff --git a/app/admin/view/public/footer.html b/app/admin/view/public/footer.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/app/admin/view/public/footer.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/admin/view/public/header.html b/app/admin/view/public/header.html new file mode 100644 index 0000000..f677c2f --- /dev/null +++ b/app/admin/view/public/header.html @@ -0,0 +1,57 @@ + + + + + 后台管理 -{$config.title} + + + + + + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/app/admin/view/public/header2.html b/app/admin/view/public/header2.html new file mode 100644 index 0000000..4fcd896 --- /dev/null +++ b/app/admin/view/public/header2.html @@ -0,0 +1,18 @@ + + + + + 后台管理 - {$config.title} + + + + + + + + + \ No newline at end of file diff --git a/app/admin/view/welfare_house/add.html b/app/admin/view/welfare_house/add.html new file mode 100644 index 0000000..3bab475 --- /dev/null +++ b/app/admin/view/welfare_house/add.html @@ -0,0 +1,104 @@ +{include file="Public:header2"/} +
+
+
+
+
添加福利屋
+
+
+
+ +
+ +
+
+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+{include file="Public:footer"/} + diff --git a/app/admin/view/welfare_house/edit.html b/app/admin/view/welfare_house/edit.html new file mode 100644 index 0000000..5f395c2 --- /dev/null +++ b/app/admin/view/welfare_house/edit.html @@ -0,0 +1,105 @@ +{include file="Public:header2"/} +
+
+
+
+
编辑福利屋
+
+
+ +
+ +
+ +
+
+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+{include file="Public:footer"/} + diff --git a/app/api/controller/Notify.php b/app/api/controller/Notify.php index c71245a..2130b82 100755 --- a/app/api/controller/Notify.php +++ b/app/api/controller/Notify.php @@ -43,10 +43,10 @@ class Notify extends Base // 获取微信支付配置 $wxpayConfig = \app\common\helper\WxPayHelper::getWxPayConfig(); $merchant = $wxpayConfig['merchant']; - + // 使用随机商户的密钥 static::$secretKey = $merchant['keys']; - + // 获取公众号密钥 static::$secretKeyAccount = getConfig('wechatofficialaccount')['keys']; } @@ -1186,21 +1186,41 @@ class Notify extends Base ->where($where) ->select()->toArray(); if ($goodslist) { - #组合中奖商品 - $all_goods_id = []; - foreach ($goodslist as $value) { - $real_pro = $value['real_pro'] * 10000; - for ($i = 1; $i <= $real_pro; $i++) { - $all_goods_id[] = $value['id']; - } + + // 计算总概率 + $totalProbability = array_sum(array_column($goodslist, 'real_pro')); + + // 构建概率区间 + $probabilityRanges = []; + $currentRange = 0; + foreach ($goodslist as $good) { + $rangeStart = $currentRange; + $currentRange += $good['real_pro']; + $probabilityRanges[] = [ + 'id' => $good['id'], + 'start' => $rangeStart, + 'end' => $currentRange + ]; } for ($i = 0; $i < $prize_num; $i++) { - #随机打乱 - shuffle($all_goods_id); - shuffle($all_goods_id); - $prize_id = $all_goods_id[0]; + // 生成随机数 (保持与原始方法相同的精度:100000) + + $maxRand = (int) ($totalProbability * 100000); + $random = mt_rand(0, $maxRand) / 100000; + + // 查找中奖奖品 + $prize_id = null; + foreach ($probabilityRanges as $range) { + if ($random >= $range['start'] && $random < $range['end']) { + $prize_id = $range['id']; + break; + } + } + + // 获取奖品信息 $prize_info = GoodsList::where(['id' => $prize_id])->find(); + #编号 $luck_no = OrderList::field('id') ->where('goods_id', '=', $goods_id) @@ -1209,6 +1229,7 @@ class Notify extends Base ->order('id desc') ->value('luck_no'); $luck_no++; + #新增记录 $save_prize_info = [ 'order_id' => $order_id, @@ -1229,10 +1250,12 @@ class Notify extends Base 'order_type' => $order_type, 'luck_no' => $luck_no, ]; + #入库=== $res[] = OrderList::insert($save_prize_info); } + //去除秘宝池次数 if ($infinite_goods['type'] == 9 && $order['is_mibao'] == 1) { User::where('id', $user_id)->dec('mb_number', $prize_num)->update(); @@ -1960,7 +1983,7 @@ class Notify extends Base { //微信官方发货 $wxServer = new \app\common\server\Wx($this->app); - + $access_token = $wxServer->get_access_token(); $open_id = Db::name('user')->where('id', $user_id)->value('openid'); $wxServer->post_order($open_id, $access_token, $order_num); diff --git a/app/api/controller/WelfareHouse.php b/app/api/controller/WelfareHouse.php new file mode 100644 index 0000000..f12ecb8 --- /dev/null +++ b/app/api/controller/WelfareHouse.php @@ -0,0 +1,19 @@ +order('sort asc, id desc') + ->select() + ->toArray(); + + return json(['status' => 1, 'msg' => '获取成功', 'data' => $list]); + } +} \ No newline at end of file diff --git a/app/api/route/app.php b/app/api/route/app.php index 25bca7e..e3af10a 100755 --- a/app/api/route/app.php +++ b/app/api/route/app.php @@ -169,4 +169,9 @@ Route::any('mall_orderbuy', 'Mall/mall_orderbuy'); Route::rule('goods/receive_sync', 'Goods/receive_sync', 'POST'); // 配置信息接口 -Route::rule('config', 'Config/index', 'GET'); \ No newline at end of file +Route::rule('config', 'Config/index', 'GET'); + +#============================ +#WelfareHouse.php福利屋 +#============================ +Route::any('welfare_house_list', 'WelfareHouse/getList'); \ No newline at end of file diff --git a/app/common/model/WelfareHouse.php b/app/common/model/WelfareHouse.php new file mode 100644 index 0000000..da460ac --- /dev/null +++ b/app/common/model/WelfareHouse.php @@ -0,0 +1,26 @@ + '禁用', 1 => '启用']; + return $status[$data['status']]; + } + + // 图片获取器 + public function getImageAttr($value) + { + return imageUrl($value); + } +} \ No newline at end of file diff --git a/config/menu.php b/config/menu.php index 33e49d3..929f3a8 100755 --- a/config/menu.php +++ b/config/menu.php @@ -180,6 +180,10 @@ return [ 'url' => '/admin/advert', 'name' => '图片管理', ], + [ + 'url' => '/admin/welfare_house', + 'name' => '福利屋管理', + ], ], ], [ diff --git a/public/storage/poster/share/6157.png b/public/storage/poster/share/6157.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f70ed18c37a01ca74cae639cc3560593c7b60b GIT binary patch literal 17073 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