From 7a43ccc813bdafc46220ce2397f920eb703a2383 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 2 Jan 2025 13:04:13 +0800 Subject: [PATCH 01/14] readme --- doc/deploy.md | 4 +++- doc/image/deploy/release-page.png | Bin 0 -> 55849 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 doc/image/deploy/release-page.png diff --git a/doc/deploy.md b/doc/deploy.md index f4d01d9..96bfd3c 100644 --- a/doc/deploy.md +++ b/doc/deploy.md @@ -25,7 +25,9 @@ ## 3. 下载项目代码 -到项目 [Release页面]() 下载最新安装包到服务器,解压到指定目录如 `/www/wwwroot/luna-lite-server` +到项目 [Release页面](https://github.com/loxi-opensource/luna-lite-server/releases) 下载最新安装包到服务器,解压到指定目录如 `/www/wwwroot/luna-lite-server` + + ## 4. 配置Nginx 1. 网站域名创建(确保域名已经解析到服务器IP地址) diff --git a/doc/image/deploy/release-page.png b/doc/image/deploy/release-page.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5f394cb5f377e3afdd238a3017229447bc0060 GIT binary patch literal 55849 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%0AJW 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 literal 0 HcmV?d00001 From 8c2874b74f1be34e4b476e7b9eaeb2a12ec5363d Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 2 Jan 2025 13:06:05 +0800 Subject: [PATCH 02/14] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3beb779..5ff3f23 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ TODO 付费能力:支持微信小程序支付,充值购买点数 TODO 多人换脸:支持多人合影、情侣合照、明星合影、宠物合影 -### 管理后台 +**管理后台功能** From 4b0d7698bdfd65951a1ea1f078d403b5433a2281 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 2 Jan 2025 13:07:38 +0800 Subject: [PATCH 03/14] readme --- doc/deploy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/deploy.md b/doc/deploy.md index 96bfd3c..f22cfb0 100644 --- a/doc/deploy.md +++ b/doc/deploy.md @@ -99,7 +99,7 @@ php artisan app:sync-resource-to-oss ## 7. 配置换脸算法KEY -请前往《商汤科技-日日新开放平台》注册账号并创建应用,获取应用ID和应用密钥。 +请前往 [《商汤科技-日日新开放平台》](https://signin.sensecore.cn/?login_challenge) 注册账号并创建应用,获取应用ID和应用密钥。 目前不支持自主购买,需在申请AK和SK之后联系他们的商务对接同学开通。详情参考[飞书文档](https://iwqiw8uo3k0.feishu.cn/docx/ElnKdsKH1oQsA5x5X2ocFTcTnLg) From 040f781f53452891afd92c87d53dd003fa3ff050 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 2 Jan 2025 15:51:21 +0800 Subject: [PATCH 04/14] =?UTF-8?q?feat=20=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E5=85=88=E5=8E=BB=E6=8E=89=E6=A3=80=E6=9F=A5IP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Adminapi/Middleware/AuthMiddleware.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Adminapi/Middleware/AuthMiddleware.php b/app/Adminapi/Middleware/AuthMiddleware.php index c3d2172..79fb91c 100644 --- a/app/Adminapi/Middleware/AuthMiddleware.php +++ b/app/Adminapi/Middleware/AuthMiddleware.php @@ -23,9 +23,9 @@ public function handle(Request $request, Closure $next) $adminInfo = $request->attributes->get('adminInfo'); // 检查IP地址 - if ($adminInfo['login_ip'] !== $request->ip()) { - return JsonService::fail('IP 地址发生变化,请重新登录', [], -1); - } +// if ($adminInfo['login_ip'] !== $request->ip()) { +// return JsonService::fail('IP 地址发生变化,请重新登录', [], -1); +// } // 系统默认超级管理员,无需权限验证 if ($adminInfo['root'] === 1) { From a56a77658c6694bcc70416ae7f2b4185af39d7af Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 2 Jan 2025 22:27:53 +0800 Subject: [PATCH 05/14] =?UTF-8?q?fix=20=E7=B3=BB=E7=BB=9F=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E4=B8=8D=E8=83=BD=E5=87=BA=E7=8E=B0=E4=B8=AD?= =?UTF-8?q?=E6=96=87=20+=20=E4=BF=AE=E5=A4=8D=E5=AD=98=E5=82=A8=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E6=8A=BD=E8=B1=A1=E6=96=B9=E6=B3=95=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Common/Service/Storage/Engine/Local.php | 4 ++++ app/Common/Service/Storage/Engine/Qcloud.php | 4 ++++ app/Common/Service/Storage/Engine/Qiniu.php | 4 ++++ config/project.php | 4 ++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/Common/Service/Storage/Engine/Local.php b/app/Common/Service/Storage/Engine/Local.php index 331a209..56483a9 100644 --- a/app/Common/Service/Storage/Engine/Local.php +++ b/app/Common/Service/Storage/Engine/Local.php @@ -28,6 +28,10 @@ public function upload($save_dir) return true; } + public function syncDir($localDir, $targetDir) + { + } + public function fetch($url, $key = null) { } diff --git a/app/Common/Service/Storage/Engine/Qcloud.php b/app/Common/Service/Storage/Engine/Qcloud.php index 6244829..9c7bb3e 100644 --- a/app/Common/Service/Storage/Engine/Qcloud.php +++ b/app/Common/Service/Storage/Engine/Qcloud.php @@ -62,6 +62,10 @@ public function upload($save_dir) } } + public function syncDir($localDir, $targetDir) + { + } + /** * notes: 抓取远程资源(最大支持上传5G文件) * @param $url diff --git a/app/Common/Service/Storage/Engine/Qiniu.php b/app/Common/Service/Storage/Engine/Qiniu.php index 44dccec..6b69bb5 100644 --- a/app/Common/Service/Storage/Engine/Qiniu.php +++ b/app/Common/Service/Storage/Engine/Qiniu.php @@ -62,6 +62,10 @@ public function upload($save_dir) } } + public function syncDir($localDir, $targetDir) + { + } + /** * @notes 抓取远程资源 * @param $url diff --git a/config/project.php b/config/project.php index 1107cf3..6bdf657 100644 --- a/config/project.php +++ b/config/project.php @@ -1,7 +1,7 @@ 'LunaAI换脸 / Lite版本 / v1.0.0', + // 系统版本号(不能出现中文) + 'version' => 'Lite v1.0.0', // 官网 'website' => [ From f5f89853b17f878b5d1fd41384d84f66cc68c3e5 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 17:11:58 +0800 Subject: [PATCH 06/14] =?UTF-8?q?feat=20=E5=85=85=E5=80=BC=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/RechargePackageController.php | 101 +++++++++++++++ app/Adminapi/Lists/RechargePackageLists.php | 74 +++++++++++ app/Adminapi/Logic/RechargePackageLogic.php | 117 ++++++++++++++++++ app/Adminapi/Route/recharge_package.php | 27 ++++ .../Validate/RechargePackageValidate.php | 74 +++++++++++ app/Common/Model/RechargePackage.php | 37 ++++++ database/change.sql | 19 +++ 7 files changed, 449 insertions(+) create mode 100644 app/Adminapi/Controller/RechargePackageController.php create mode 100644 app/Adminapi/Lists/RechargePackageLists.php create mode 100644 app/Adminapi/Logic/RechargePackageLogic.php create mode 100644 app/Adminapi/Route/recharge_package.php create mode 100644 app/Adminapi/Validate/RechargePackageValidate.php create mode 100644 app/Common/Model/RechargePackage.php create mode 100644 database/change.sql diff --git a/app/Adminapi/Controller/RechargePackageController.php b/app/Adminapi/Controller/RechargePackageController.php new file mode 100644 index 0000000..2d2a449 --- /dev/null +++ b/app/Adminapi/Controller/RechargePackageController.php @@ -0,0 +1,101 @@ +dataLists(new RechargePackageLists()); + } + + + /** + * @notes 添加 + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public function add() + { + $params = (new RechargePackageValidate())->post()->goCheck('add'); + $result = RechargePackageLogic::add($params); + if (true === $result) { + return $this->success('添加成功', [], 1, 1); + } + return $this->fail(RechargePackageLogic::getError()); + } + + + /** + * @notes 编辑 + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public function edit() + { + $params = (new RechargePackageValidate())->post()->goCheck('edit'); + $result = RechargePackageLogic::edit($params); + if (true === $result) { + return $this->success('编辑成功', [], 1, 1); + } + return $this->fail(RechargePackageLogic::getError()); + } + + + /** + * @notes 删除 + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public function delete() + { + $params = (new RechargePackageValidate())->post()->goCheck('delete'); + RechargePackageLogic::delete($params); + return $this->success('删除成功', [], 1, 1); + } + + + /** + * @notes 获取详情 + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public function detail() + { + $params = (new RechargePackageValidate())->goCheck('detail'); + $result = RechargePackageLogic::detail($params); + return $this->data($result); + } + + +} diff --git a/app/Adminapi/Lists/RechargePackageLists.php b/app/Adminapi/Lists/RechargePackageLists.php new file mode 100644 index 0000000..14cb2ef --- /dev/null +++ b/app/Adminapi/Lists/RechargePackageLists.php @@ -0,0 +1,74 @@ +searchWhere) + ->select(['id', 'name', 'describe', 'sell_price', 'draw_number', 'sort', 'status']) + ->limit($this->limitLength) + ->offset($this->limitOffset) + ->orderBy('sort', 'desc') + ->orderBy('id', 'desc') + ->get() + ->toArray(); + } + + + /** + * @notes 获取数量 + * @return int + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public function count(): int + { + return RechargePackage::applySearchWhere($this->searchWhere)->count(); + } + +} diff --git a/app/Adminapi/Logic/RechargePackageLogic.php b/app/Adminapi/Logic/RechargePackageLogic.php new file mode 100644 index 0000000..69eef6d --- /dev/null +++ b/app/Adminapi/Logic/RechargePackageLogic.php @@ -0,0 +1,117 @@ + $params['name'], + 'describe' => $params['describe'], + 'sell_price' => $params['sell_price'], + 'draw_number' => $params['draw_number'], + 'sort' => $params['sort'], + 'status' => $params['status'] + ]); + + DB::commit(); + return true; + } catch (\Exception $e) { + DB::rollBack(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 编辑 + * @param array $params + * @return bool + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public static function edit(array $params): bool + { + DB::beginTransaction(); + try { + + $model = RechargePackage::findOrFail($params['id']); + $model->fill([ + 'name' => $params['name'], + 'describe' => $params['describe'], + 'sell_price' => $params['sell_price'], + 'draw_number' => $params['draw_number'], + 'sort' => $params['sort'], + 'status' => $params['status'] + ]); + $model->save(); + + DB::commit(); + return true; + } catch (\Exception $e) { + DB::rollBack(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 删除 + * @param array $params + * @return bool + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public static function delete(array $params): bool + { + return RechargePackage::destroy($params['id']); + } + + + /** + * @notes 获取详情 + * @param $params + * @return array + * @author likeadmin + * @date 2025/01/30 16:55 + */ + public static function detail($params): array + { + return RechargePackage::findOrFail($params['id'])->toArray(); + } +} diff --git a/app/Adminapi/Route/recharge_package.php b/app/Adminapi/Route/recharge_package.php new file mode 100644 index 0000000..d3e9f46 --- /dev/null +++ b/app/Adminapi/Route/recharge_package.php @@ -0,0 +1,27 @@ +group(function () { + Route::get('/recharge_package/lists', 'lists'); + Route::post('/recharge_package/add', 'add'); + Route::post('/recharge_package/edit', 'edit'); + Route::post('/recharge_package/delete', 'delete'); + Route::get('/recharge_package/detail', 'detail'); +}); diff --git a/app/Adminapi/Validate/RechargePackageValidate.php b/app/Adminapi/Validate/RechargePackageValidate.php new file mode 100644 index 0000000..d25b9a4 --- /dev/null +++ b/app/Adminapi/Validate/RechargePackageValidate.php @@ -0,0 +1,74 @@ + 'id不能为空', + 'name.required' => '套餐名称不能为空', + 'describe.required' => '套餐描述不能为空', + 'sell_price.required' => '套餐价格不能为空', + 'draw_number.required' => '作图次数不能为空', + 'sort.required' => '排序不能为空', + 'status.required' => '套餐状态不能为空', + ]; + + /** + * 设置校验规则 + * @param $scene + * @return array + */ + public function rules($scene = '') + { + $rules = [ + 'add' => [ + 'name' => 'required', + 'describe' => 'required', + 'sell_price' => 'required', + 'draw_number' => 'required', + 'sort' => 'required', + 'status' => 'required', + ], + 'edit' => [ + 'id' => 'required', + 'name' => 'required', + 'describe' => 'required', + 'sell_price' => 'required', + 'draw_number' => 'required', + 'sort' => 'required', + 'status' => 'required', + ], + 'detail' => [ + 'id' => 'required', + ], + 'delete' => [ + 'id' => 'required', + ], + ]; + + return $rules[$scene] ?? []; + } + +} diff --git a/app/Common/Model/RechargePackage.php b/app/Common/Model/RechargePackage.php new file mode 100644 index 0000000..13300bd --- /dev/null +++ b/app/Common/Model/RechargePackage.php @@ -0,0 +1,37 @@ + Date: Thu, 30 Jan 2025 17:23:39 +0800 Subject: [PATCH 07/14] =?UTF-8?q?feat=20=E5=85=85=E5=80=BC=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E5=88=97=E8=A1=A8API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Api/Controller/RechargeController.php | 8 ++++++++ app/Api/Logic/RechargeLogic.php | 12 +++++++++++- app/Api/Route/recharge.php | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/Api/Controller/RechargeController.php b/app/Api/Controller/RechargeController.php index a247cc2..adecd8f 100644 --- a/app/Api/Controller/RechargeController.php +++ b/app/Api/Controller/RechargeController.php @@ -45,5 +45,13 @@ public function config() return $this->data(RechargeLogic::config($this->getUserId())); } + /** + * @notes 充值套餐列表 + */ + public function package() + { + $result = RechargeLogic::getAllPackages(); + return $this->data($result); + } } diff --git a/app/Api/Logic/RechargeLogic.php b/app/Api/Logic/RechargeLogic.php index 0e0c04d..e939951 100644 --- a/app/Api/Logic/RechargeLogic.php +++ b/app/Api/Logic/RechargeLogic.php @@ -3,8 +3,10 @@ namespace App\Api\Logic; use App\Common\Enum\PayEnum; +use App\Common\Enum\YesNoEnum; use App\Common\Logic\BaseLogic; use App\Common\Model\Recharge\RechargeOrder; +use App\Common\Model\RechargePackage; use App\Common\Model\User\User; use App\Common\Service\ConfigService; use Throwable; @@ -26,7 +28,7 @@ public static function recharge(array $params): array|false 'order_terminal' => $params['terminal'], 'user_id' => $params['user_id'], 'pay_status' => PayEnum::UNPAID, - 'order_amount' => $params['money'], + 'order_amount' => $params['money'], // TODO 从充值计划中获取 ]; $order = RechargeOrder::create($data); @@ -57,5 +59,13 @@ public static function config($userId): array ]; } + public static function getAllPackages() + { + return RechargePackage::where(['status' => YesNoEnum::YES]) + ->orderBy('sort', 'desc') + ->orderBy('id', 'desc') + ->get() + ->toArray(); + } } diff --git a/app/Api/Route/recharge.php b/app/Api/Route/recharge.php index 556b619..b3a24de 100644 --- a/app/Api/Route/recharge.php +++ b/app/Api/Route/recharge.php @@ -6,4 +6,5 @@ Route::get('/recharge/lists', 'lists'); Route::post('/recharge/recharge', 'recharge'); Route::get('/recharge/config', 'config'); + Route::get('/recharge/package', 'package'); }); From 3bfc381145c28adb6c314296f1afd92c5723e167 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 17:49:33 +0800 Subject: [PATCH 08/14] =?UTF-8?q?feat=20=E6=94=AF=E4=BB=98=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E9=80=BB=E8=BE=91=E9=80=82=E9=85=8D=E5=85=85=E5=80=BC?= =?UTF-8?q?=E5=A5=97=E9=A4=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Api/Logic/RechargeLogic.php | 8 +++- app/Api/Validate/RechargeValidate.php | 3 ++ app/Common/Logic/PayNotifyLogic.php | 9 ++-- app/Common/Model/Recharge/RechargeOrder.php | 4 ++ app/Console/Commands/AppTest.php | 49 ++------------------- 5 files changed, 21 insertions(+), 52 deletions(-) diff --git a/app/Api/Logic/RechargeLogic.php b/app/Api/Logic/RechargeLogic.php index e939951..9ee6e3d 100644 --- a/app/Api/Logic/RechargeLogic.php +++ b/app/Api/Logic/RechargeLogic.php @@ -23,14 +23,18 @@ class RechargeLogic extends BaseLogic public static function recharge(array $params): array|false { try { + $rechargePackage = RechargePackage::query()->findOrFail($params['package_id']); + $data = [ 'sn' => generate_sn(RechargeOrder::class, 'sn'), 'order_terminal' => $params['terminal'], 'user_id' => $params['user_id'], 'pay_status' => PayEnum::UNPAID, - 'order_amount' => $params['money'], // TODO 从充值计划中获取 + 'order_amount' => $rechargePackage->sell_price, + 'recharge_package_snapshot' => $rechargePackage, ]; - $order = RechargeOrder::create($data); + $order = new RechargeOrder(); + $order->fill($data)->save(); return [ 'order_id' => (int)$order->id, diff --git a/app/Api/Validate/RechargeValidate.php b/app/Api/Validate/RechargeValidate.php index 7a4237c..c42bf62 100644 --- a/app/Api/Validate/RechargeValidate.php +++ b/app/Api/Validate/RechargeValidate.php @@ -12,6 +12,7 @@ public function rules($scene = '') { $rules = [ 'recharge' => [ + 'package_id' => 'required|exists:recharge_package,id', 'money' => [ 'required', 'numeric', @@ -38,6 +39,8 @@ function ($attribute, $value, Closure $fail) { protected $messages = [ 'money.required' => '请填写充值金额', 'money.gt' => '请填写大于0的充值金额', + 'package_id.required' => '请选择充值套餐', + 'package_id.exists' => '充值套餐不存在', ]; public function messages() diff --git a/app/Common/Logic/PayNotifyLogic.php b/app/Common/Logic/PayNotifyLogic.php index 81abd8b..4dbcab0 100644 --- a/app/Common/Logic/PayNotifyLogic.php +++ b/app/Common/Logic/PayNotifyLogic.php @@ -6,6 +6,7 @@ use App\Common\Enum\User\AccountLogEnum; use App\Common\Model\Recharge\RechargeOrder; use App\Common\Model\User\User; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Throwable; @@ -45,13 +46,13 @@ public static function recharge(string $orderSn, array $extra = []) $user = User::findOrFail($order->user_id); $user->increment('total_recharge_amount', $order->order_amount); - $user->increment('user_money', $order->order_amount); + $user->increment('balance_draw', Arr::get($order->recharge_package_snapshot, 'draw_number')); AccountLogLogic::add( - $order->user_id, - AccountLogEnum::UM_INC_RECHARGE, + $user, + AccountLogEnum::DRAW_INC_RECHARGE, AccountLogEnum::INC, - $order->order_amount, + Arr::get($order->recharge_package_snapshot, 'draw_number'), $order->sn, '用户充值' ); diff --git a/app/Common/Model/Recharge/RechargeOrder.php b/app/Common/Model/Recharge/RechargeOrder.php index 616298e..0a4c951 100644 --- a/app/Common/Model/Recharge/RechargeOrder.php +++ b/app/Common/Model/Recharge/RechargeOrder.php @@ -17,6 +17,10 @@ class RechargeOrder extends BaseModel protected $appends = ['pay_way_text', 'pay_status_text']; + public $casts = [ + 'recharge_package_snapshot' => 'array' + ]; + protected function getDeletedAtColumn() { return 'delete_time'; diff --git a/app/Console/Commands/AppTest.php b/app/Console/Commands/AppTest.php index 5080881..1c76255 100644 --- a/app/Console/Commands/AppTest.php +++ b/app/Console/Commands/AppTest.php @@ -2,12 +2,8 @@ namespace App\Console\Commands; -use App\Common\Model\SwapTemplate; -use App\Common\Model\SwapTemplateGroup; +use App\Common\Model\Recharge\RechargeOrder; use Illuminate\Console\Command; -use Illuminate\Support\Facades\File; -use Overtrue\Pinyin\Pinyin; -use Symfony\Component\Finder\SplFileInfo; class AppTest extends Command { @@ -30,47 +26,8 @@ class AppTest extends Command */ public function handle() { - $pinyinNameMapTemplateGroup = SwapTemplateGroup::query()->select([ - 'id', - 'name', - ])->get()->map(function (SwapTemplateGroup $group) { - $group->pinyin = self::getPinyin($group->name); - return $group; - })->keyBy('pinyin')->toArray(); - - $localDir = public_path('resource/image/faceswap'); - // 遍历文件夹 - $files = File::allFiles($localDir); - collect($files)->each(function (SplFileInfo $file) use ($pinyinNameMapTemplateGroup) { - $relativePath = str_replace(public_path(), '', $file->getPathname()); - $relativePath = str_replace('\\', '/', $relativePath); - $relativePath = ltrim($relativePath, '/'); - // 查找出匹配拼音的模板组。拼音正则匹配 luna_之后的一个词 - $pinyin = preg_match('/luna_(\w+)/', $relativePath, $matches) ? $matches[1] : ''; - $group = $pinyinNameMapTemplateGroup[$pinyin] ?? null; - if ($group) { - $this->info("Matched: {$relativePath} => {$group['name']}"); - - if (SwapTemplate::query()->where('group_id', $group['id'])->where('target_image', $relativePath)->exists()) { - return; - } else { - SwapTemplate::query()->create([ - 'group_id' => $group['id'], - 'name' => $group['name'], - 'status' => 1, - 'target_image' => $relativePath, - ]); - } - } else { - $this->warn("Not Matched: {$relativePath}"); - } - }); - } - - static function getPinyin($chinese) - { - $pinyin = Pinyin::sentence($chinese, 'none'); - return $pinyin->join(''); + $res = RechargeOrder::query()->orderBy('id', 'desc')->first(); + dd($res->toArray()); } From e1e748cd4d95b9847270645237e8309a94b7ddbc Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 20:34:26 +0800 Subject: [PATCH 09/14] =?UTF-8?q?feat=20=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=80=82=E9=85=8D=E5=85=85=E5=80=BC=E5=A5=97=E9=A4=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Adminapi/Lists/Recharge/RechargeLists.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/Adminapi/Lists/Recharge/RechargeLists.php b/app/Adminapi/Lists/Recharge/RechargeLists.php index f3b2559..b366613 100644 --- a/app/Adminapi/Lists/Recharge/RechargeLists.php +++ b/app/Adminapi/Lists/Recharge/RechargeLists.php @@ -20,13 +20,14 @@ class RechargeLists extends BaseAdminDataLists implements ListsSearchInterface, public function setExcelFields(): array { return [ - 'sn' => '充值单号', 'nickname' => '用户昵称', - 'order_amount' => '充值金额', + 'sn' => '订单号', + 'order_amount' => '订单金额', + 'recharge_package_description' => '充值套餐', 'pay_way_text' => '支付方式', 'pay_status_text' => '支付状态', - 'pay_time' => '支付时间', 'create_time' => '下单时间', + 'pay_time' => '支付时间', ]; } @@ -82,7 +83,7 @@ public function lists(): array ->select( 'ro.id', 'ro.sn', 'ro.order_amount', 'ro.pay_way', 'ro.pay_time', 'ro.pay_status', 'ro.create_time', 'ro.refund_status', - 'u.avatar', 'u.nickname', 'u.account' + 'u.avatar', 'u.nickname', 'u.account', 'ro.recharge_package_snapshot' ) ->orderBy('ro.id', 'desc') ->limit($this->limitLength) @@ -95,6 +96,11 @@ public function lists(): array $item->create_time = date('Y-m-d H:i:s', $item->create_time); $item->pay_status_text = PayEnum::getPayStatusDesc($item->pay_status); $item->pay_way_text = PayEnum::getPayDesc($item->pay_way); + $item->recharge_package_snapshot = json_decode($item->recharge_package_snapshot, true); + $item->recharge_package_description = + $item->recharge_package_snapshot + ? $item->recharge_package_snapshot['name'] . '(' . $item->recharge_package_snapshot['describe'] . ')' + : ''; return (array)$item; })->toArray(); } From 8b632422fedaf477db6537e16079ce526f84d375 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 20:58:15 +0800 Subject: [PATCH 10/14] =?UTF-8?q?fix=20=E6=A1=86=E6=9E=B6bug-=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E7=B1=BB=E5=91=BD=E5=90=8D=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/QueryRefund.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/QueryRefund.php b/app/Console/Commands/QueryRefund.php index b512813..8732de5 100644 --- a/app/Console/Commands/QueryRefund.php +++ b/app/Console/Commands/QueryRefund.php @@ -7,7 +7,7 @@ use App\Common\Model\Recharge\RechargeOrder; use App\Common\Model\Refund\RefundLog; use App\Common\Model\Refund\RefundRecord; -use App\Common\Service\Pay\WeChatPayService; +use App\Common\Service\Pay\WechatPayService; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; @@ -96,7 +96,7 @@ private function checkRefundStatus(array $record, RechargeOrder $order) private function checkWechatRefund($orderTerminal, $refundLogSn) { - $result = (new WeChatPayService($orderTerminal))->queryRefund($refundLogSn); + $result = (new WechatPayService($orderTerminal))->queryRefund($refundLogSn); if (isset($result['status']) && $result['status'] === 'SUCCESS') { return true; From 8bbaaf702ea088ed94dc0d9a5a0fc3567bd2f959 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 20:59:06 +0800 Subject: [PATCH 11/14] =?UTF-8?q?feat=20=E7=94=A8=E6=88=B7=E9=92=B1?= =?UTF-8?q?=E5=8C=85=E4=BD=99=E9=A2=9D=E9=BB=98=E8=AE=A4=E6=94=B9=E6=88=90?= =?UTF-8?q?=E6=98=AF=E4=BD=9C=E5=9B=BE=E4=BD=99=E9=A2=9D+=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Adminapi/Logic/Recharge/RechargeLogic.php | 9 +++++---- .../Validate/Recharge/RechargeRefundValidate.php | 7 +++++-- app/Adminapi/Validate/User/AdjustUserMoney.php | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/Adminapi/Logic/Recharge/RechargeLogic.php b/app/Adminapi/Logic/Recharge/RechargeLogic.php index c1646fd..4f29b46 100644 --- a/app/Adminapi/Logic/Recharge/RechargeLogic.php +++ b/app/Adminapi/Logic/Recharge/RechargeLogic.php @@ -12,6 +12,7 @@ use App\Common\Model\Refund\RefundRecord; use App\Common\Model\User\User; use App\Common\Service\ConfigService; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Throwable; @@ -74,14 +75,14 @@ public static function refund($params, $adminId) User::query()->where('id', $order->user_id) ->decrement('total_recharge_amount', $order->order_amount); User::query()->where('id', $order->user_id) - ->decrement('user_money', $order->order_amount); + ->decrement('balance_draw', Arr::get($order->recharge_package_snapshot, 'draw_number')); // 记录日志 AccountLogLogic::add( - $order->user_id, - AccountLogEnum::UM_DEC_RECHARGE_REFUND, + User::findOrFail($order->user_id), + AccountLogEnum::DRAW_DEC_RECHARGE_REFUND, AccountLogEnum::DEC, - $order->order_amount, + Arr::get($order->recharge_package_snapshot, 'draw_number'), $order->sn, '充值订单退款' ); diff --git a/app/Adminapi/Validate/Recharge/RechargeRefundValidate.php b/app/Adminapi/Validate/Recharge/RechargeRefundValidate.php index 34c2058..de1187b 100644 --- a/app/Adminapi/Validate/Recharge/RechargeRefundValidate.php +++ b/app/Adminapi/Validate/Recharge/RechargeRefundValidate.php @@ -10,6 +10,7 @@ use App\Common\Model\User\User; use App\Common\Validate\BaseValidate; use Closure; +use Illuminate\Support\Arr; class RechargeRefundValidate extends BaseValidate { @@ -34,7 +35,8 @@ function ($attribute, $value, Closure $fail) { } $user = User::find($order->user_id); - if ($user && $user->user_money < $order->order_amount) { + $orderDrawNumber = Arr::get($order->recharge_package_snapshot, 'draw_number'); + if ($user && $user->balance_draw < $orderDrawNumber) { return $fail('退款失败:用户余额已不足退款金额'); } }, @@ -56,7 +58,8 @@ function ($attribute, $value, Closure $fail) { $order = RechargeOrder::find($record->order_id); $user = User::find($record->user_id); - if ($user && $user->user_money < $order->order_amount) { + $orderDrawNumber = Arr::get($order->recharge_package_snapshot, 'draw_number'); + if ($user && $user->balance_draw < $orderDrawNumber) { return $fail('退款失败:用户余额已不足退款金额'); } }, diff --git a/app/Adminapi/Validate/User/AdjustUserMoney.php b/app/Adminapi/Validate/User/AdjustUserMoney.php index 72e223d..6f63f62 100644 --- a/app/Adminapi/Validate/User/AdjustUserMoney.php +++ b/app/Adminapi/Validate/User/AdjustUserMoney.php @@ -28,9 +28,9 @@ function ($attribute, $value, Closure $fail) { return; } - $surplusMoney = $user->user_money - $value; + $surplusMoney = $user->balance_draw - $value; if ($surplusMoney < 0) { - return $fail('用户可用余额仅剩' . $user->user_money); + return $fail('用户可用余额仅剩' . $user->balance_draw); } }, ], From d5d58af513c3acbe0dda124c85c6583551edb86a Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 21:03:47 +0800 Subject: [PATCH 12/14] todo --- database/change.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/database/change.sql b/database/change.sql index b4ef250..00c9896 100644 --- a/database/change.sql +++ b/database/change.sql @@ -17,3 +17,5 @@ CREATE TABLE `lite_recharge_package` alter table lite_recharge_order add column `recharge_package_snapshot` json COMMENT '充值套餐快照'; + +# TODO 充值套餐-菜单SQL From d923e84030059d40d6e26350ff62f782d456fb0c Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 21:12:00 +0800 Subject: [PATCH 13/14] =?UTF-8?q?feat=20=E4=BD=BF=E7=94=A8=E5=85=91?= =?UTF-8?q?=E6=8D=A2=E7=A0=81=E6=8F=90=E9=86=92=E9=9C=80=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=89=88=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Api/Controller/PayController.php | 8 ++++++++ app/Api/Route/pay.php | 1 + 2 files changed, 9 insertions(+) diff --git a/app/Api/Controller/PayController.php b/app/Api/Controller/PayController.php index a03d5bd..4991996 100644 --- a/app/Api/Controller/PayController.php +++ b/app/Api/Controller/PayController.php @@ -96,4 +96,12 @@ public function aliNotify() } } + /** + * @notes 使用兑换码 + */ + public function useCardCode() + { + return $this->fail("功能未开通!请联系管理员购买高级版授权"); + } + } diff --git a/app/Api/Route/pay.php b/app/Api/Route/pay.php index 49cf403..6925cd0 100644 --- a/app/Api/Route/pay.php +++ b/app/Api/Route/pay.php @@ -10,4 +10,5 @@ Route::post('/pay/notifyMnp', 'notifyMnp')->name('pay.notifyMnp'); Route::post('/pay/notifyOa', 'notifyOa')->name('pay.notifyOa'); Route::post('/pay/aliNotify', 'aliNotify')->name('pay.aliNotify'); + Route::post('/pay/useCardCode', 'useCardCode'); }); From 557b88a91043311d4b416627965351105c713009 Mon Sep 17 00:00:00 2001 From: 1nFrastr <960843127@qq.com> Date: Thu, 30 Jan 2025 21:51:28 +0800 Subject: [PATCH 14/14] =?UTF-8?q?feat=20feat=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=BC=95=E6=B5=81=E5=AE=A2=E6=9C=8D=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Adminapi/Logic/Channel/MnpSettingsLogic.php | 2 +- app/Api/Logic/IndexLogic.php | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/Adminapi/Logic/Channel/MnpSettingsLogic.php b/app/Adminapi/Logic/Channel/MnpSettingsLogic.php index 0bb074d..58d5538 100644 --- a/app/Adminapi/Logic/Channel/MnpSettingsLogic.php +++ b/app/Adminapi/Logic/Channel/MnpSettingsLogic.php @@ -17,7 +17,7 @@ class MnpSettingsLogic extends BaseLogic public function getConfig() { $domainName = $_SERVER['SERVER_NAME']; - $qrCode = ConfigService::get('mnp_setting', 'qr_code', ''); + $qrCode = ConfigService::get('mnp_setting', 'qr_code', ConfigService::get('website', 'pc_logo')); $qrCode = empty($qrCode) ? $qrCode : FileService::getFileUrl($qrCode); $config = [ 'name' => ConfigService::get('mnp_setting', 'name', ''), diff --git a/app/Api/Logic/IndexLogic.php b/app/Api/Logic/IndexLogic.php index 5963f40..921d723 100644 --- a/app/Api/Logic/IndexLogic.php +++ b/app/Api/Logic/IndexLogic.php @@ -2,12 +2,14 @@ namespace App\Api\Logic; +use App\Adminapi\Logic\Channel\MnpSettingsLogic; use App\Common\Logic\BaseLogic; use App\Common\Model\Article\Article; use App\Common\Model\Decorate\DecoratePage; use App\Common\Model\Decorate\DecorateTabbar; use App\Common\Service\ConfigService; use App\Common\Service\FileService; +use Illuminate\Support\Arr; class IndexLogic extends BaseLogic { @@ -112,6 +114,12 @@ public static function getConfigData() // 备案信息 $copyright = ConfigService::get('copyright', 'config', []); + // 小程序相关 + $mnpSetting = (new MnpSettingsLogic())->getConfig(); + $mnp = [ + 'contact_qr_code' => Arr::get($mnpSetting, 'qr_code') + ]; + return [ 'domain' => FileService::getFileUrl(), 'style' => $style, @@ -121,6 +129,7 @@ public static function getConfigData() 'webPage' => $webPage, 'version' => config('project.version'), 'copyright' => $copyright, + 'mnp' => $mnp, ]; }