From 92d9395065a368e4c02244e0fceefe7080bfaef7 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Wed, 15 Apr 2020 19:35:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E8=B5=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Admin/Views/index.volt | 2 +- app/Http/Admin/Views/index/index.volt | 8 +- app/Http/Admin/Views/order/macro.volt | 11 +- app/Http/Web/Views/templates/base.volt | 2 +- app/Models/Reward.php | 84 +++++++++++++ app/Repos/Reward.php | 52 ++++++++ app/Services/Frontend/Order/OrderCancel.php | 4 +- app/Services/Frontend/Order/OrderConfirm.php | 88 +++++++------ app/Services/Frontend/Order/OrderCreate.php | 118 +++++++++--------- app/Services/Frontend/Order/OrderInfo.php | 3 +- app/Services/Frontend/Order/OrderTrade.php | 4 +- app/Validators/Order.php | 20 ++- .../admin/css/{style.css => common.css} | 0 public/static/admin/js/common.js | 11 +- .../static/web/css/{style.css => common.css} | 0 15 files changed, 297 insertions(+), 110 deletions(-) create mode 100644 app/Models/Reward.php create mode 100644 app/Repos/Reward.php rename public/static/admin/css/{style.css => common.css} (100%) rename public/static/web/css/{style.css => common.css} (100%) diff --git a/app/Http/Admin/Views/index.volt b/app/Http/Admin/Views/index.volt index f73a11c5..4d357c6f 100644 --- a/app/Http/Admin/Views/index.volt +++ b/app/Http/Admin/Views/index.volt @@ -9,7 +9,7 @@ {{ icon_link("favicon.ico") }} {{ css_link('lib/layui/css/layui.css') }} {{ css_link('lib/layui/extends/dropdown.css') }} - {{ css_link('admin/css/style.css') }} + {{ css_link('admin/css/common.css') }} {{ js_include('lib/layui/layui.js') }} {{ js_include('admin/js/common.js') }} diff --git a/app/Http/Admin/Views/index/index.volt b/app/Http/Admin/Views/index/index.volt index 002b3017..0e09b8c0 100644 --- a/app/Http/Admin/Views/index/index.volt +++ b/app/Http/Admin/Views/index/index.volt @@ -5,8 +5,9 @@ 管理后台 + {{ icon_link('favicon.ico') }} {{ css_link('lib/layui/css/layui.css') }} - {{ css_link('admin/css/style.css') }} + {{ css_link('admin/css/common.css') }} {{ js_include('lib/layui/layui.js') }} {{ js_include('admin/js/index.js') }} @@ -62,15 +63,14 @@
- +
- \ No newline at end of file diff --git a/app/Http/Admin/Views/order/macro.volt b/app/Http/Admin/Views/order/macro.volt index 9d1778b6..3d9fe1af 100644 --- a/app/Http/Admin/Views/order/macro.volt +++ b/app/Http/Admin/Views/order/macro.volt @@ -21,6 +21,13 @@

商品名称:{{ order.subject }}

商品价格:¥{{ order.amount }}

+ {% elseif order.item_type == 'reward' %} + {% set course = order.item_info['course'] %} + {% set reward = order.item_info['reward'] %} +
+

课程名称:{{ course['title'] }}

+

打赏金额:¥{{ reward['price'] }}

+
{% elseif order.item_type == 'test' %}

商品名称:{{ order.subject }}

@@ -35,7 +42,9 @@ {% elseif value == 'package' %} 套餐 {% elseif value == 'vip' %} - 会员 + 会员 + {% elseif value == 'reward' %} + 打赏 {% elseif value == 'test' %} 测试 {% endif %} diff --git a/app/Http/Web/Views/templates/base.volt b/app/Http/Web/Views/templates/base.volt index 76f02fba..85a4b500 100644 --- a/app/Http/Web/Views/templates/base.volt +++ b/app/Http/Web/Views/templates/base.volt @@ -8,7 +8,7 @@ {{ seo.getTitle() }} {{ icon_link("favicon.ico") }} {{ css_link("lib/layui/css/layui.css") }} - {{ css_link("web/css/style.css") }} + {{ css_link("web/css/common.css") }} {% block link_css %}{% endblock %} {% block inline_css %}{% endblock %} diff --git a/app/Models/Reward.php b/app/Models/Reward.php new file mode 100644 index 00000000..099168e8 --- /dev/null +++ b/app/Models/Reward.php @@ -0,0 +1,84 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + + public function afterFetch() + { + $this->price = (float)$this->price; + } + +} diff --git a/app/Repos/Reward.php b/app/Repos/Reward.php new file mode 100644 index 00000000..daa22d4e --- /dev/null +++ b/app/Repos/Reward.php @@ -0,0 +1,52 @@ +where('1 = 1'); + + if (isset($where['deleted'])) { + $query->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]); + } + + return $query->execute(); + } + + /** + * @param int $id + * @return RewardModel|Model|bool + */ + public function findById($id) + { + return RewardModel::findFirst($id); + } + + /** + * @param array $ids + * @param array|string $columns + * @return ResultsetInterface|Resultset|RewardModel[] + */ + public function findByIds($ids, $columns = '*') + { + return RewardModel::query() + ->columns($columns) + ->inWhere('id', $ids) + ->execute(); + } + +} diff --git a/app/Services/Frontend/Order/OrderCancel.php b/app/Services/Frontend/Order/OrderCancel.php index 588237d9..c8aeb98d 100644 --- a/app/Services/Frontend/Order/OrderCancel.php +++ b/app/Services/Frontend/Order/OrderCancel.php @@ -1,8 +1,10 @@ checkItem($query['item_id'], $query['item_type']); + $validator->checkItemType($query['item_type']); $result = []; @@ -29,24 +31,41 @@ class OrderConfirm extends Service if ($query['item_type'] == OrderModel::ITEM_COURSE) { - $course = $this->getCourseInfo($query['item_id']); + $course = $validator->checkCourseItem($query['item_id']); + $courseInfo = $this->handleCourseInfo($course); - $result['item_info']['course'] = $course; - $result['amount'] = $user->vip ? $course['vip_price'] : $course['market_price']; + $result['item_info']['course'] = $courseInfo; + $result['amount'] = $user->vip ? $course->vip_price : $course->market_price; } elseif ($query['item_type'] == OrderModel::ITEM_PACKAGE) { - $package = $this->getPackageInfo($query['item_id']); + $package = $validator->checkPackageItem($query['item_id']); + $packageInfo = $this->handlePackageInfo($package); - $result['item_info']['package'] = $package; - $result['amount'] = $user->vip ? $package['vip_price'] : $package['market_price']; + $result['item_info']['package'] = $packageInfo; + $result['amount'] = $user->vip ? $package->vip_price : $package->market_price; } elseif ($query['item_type'] == OrderModel::ITEM_VIP) { - $vip = $this->getVipInfo($query['item_id']); + $vip = $validator->checkVipItem($query['item_id']); + $vipInfo = $this->handleVipInfo($vip); - $result['item_info']['vip'] = $vip; - $result['amount'] = $vip['price']; + $result['item_info']['vip'] = $vipInfo; + $result['amount'] = $vip->price; + + } elseif ($query['item_type'] == OrderModel::ITEM_REWARD) { + + list($courseId, $rewardId) = explode('-', $query['item_id']); + + $course = $validator->checkCourseItem($courseId); + $reward = $validator->checkRewardItem($rewardId); + + $courseInfo = $this->handleCourseInfo($course); + $rewardInfo = $this->handleRewardInfo($reward); + + $result['item_info']['course'] = $courseInfo; + $result['item_info']['reward'] = $rewardInfo; + $result['amount'] = $reward->price; } $validator->checkAmount($result['amount']); @@ -54,15 +73,11 @@ class OrderConfirm extends Service return $result; } - protected function getCourseInfo($id) + protected function handleCourseInfo(CourseModel $course) { - $courseRepo = new CourseRepo(); - - $course = $courseRepo->findById($id); - $course->cover = kg_ci_img_url($course->cover); - $result = [ + return [ 'id' => $course->id, 'title' => $course->title, 'cover' => $course->cover, @@ -74,16 +89,10 @@ class OrderConfirm extends Service 'market_price' => $course->market_price, 'vip_price' => $course->vip_price, ]; - - return $result; } - protected function getPackageInfo($id) + protected function handlePackageInfo(PackageModel $package) { - $packageRepo = new PackageRepo(); - - $package = $packageRepo->findById($id); - $result = [ 'id' => $package->id, 'title' => $package->title, @@ -92,10 +101,9 @@ class OrderConfirm extends Service 'vip_price' => $package->vip_price, ]; - /** - * @var CourseModel[] $courses - */ - $courses = $packageRepo->findCourses($id); + $packageRepo = new PackageRepo(); + + $courses = $packageRepo->findCourses($package->id); $baseUrl = kg_ci_base_url(); @@ -120,13 +128,23 @@ class OrderConfirm extends Service return $result; } - protected function getVipInfo($id) + protected function handleVipInfo(VipModel $vip) { - $vipRepo = new VipRepo(); + return [ + 'id' => $vip->id, + 'title' => $vip->title, + 'expiry' => $vip->expiry, + 'price' => $vip->price, + ]; + } - $result = $vipRepo->findById($id); - - return $result; + protected function handleRewardInfo(RewardModel $reward) + { + return [ + 'id' => $reward->id, + 'title' => $reward->title, + 'price' => $reward->price, + ]; } } diff --git a/app/Services/Frontend/Order/OrderCreate.php b/app/Services/Frontend/Order/OrderCreate.php index d1a1da36..d0df627c 100644 --- a/app/Services/Frontend/Order/OrderCreate.php +++ b/app/Services/Frontend/Order/OrderCreate.php @@ -1,14 +1,16 @@ status == OrderModel::STATUS_PENDING; $caseB = time() - $order->create_time < 6 * 3600; - if ($caseA && $caseB) { return $order; } @@ -51,7 +51,7 @@ class OrderCreate extends Service if ($post['item_type'] == OrderModel::ITEM_COURSE) { - $course = $validator->checkItemCourse($post['item_id']); + $course = $validator->checkCourseItem($post['item_id']); $validator->checkIfBoughtCourse($user->id, $course->id); @@ -59,7 +59,7 @@ class OrderCreate extends Service } elseif ($post['item_type'] == OrderModel::ITEM_PACKAGE) { - $package = $validator->checkItemPackage($post['item_id']); + $package = $validator->checkPackageItem($post['item_id']); $validator->checkIfBoughtPackage($user->id, $package->id); @@ -67,9 +67,18 @@ class OrderCreate extends Service } elseif ($post['item_type'] == OrderModel::ITEM_VIP) { - $vip = $validator->checkItemVip($post['item_id']); + $vip = $validator->checkVipItem($post['item_id']); $order = $this->createVipOrder($vip, $user); + + } elseif ($post['item_type'] == OrderModel::ITEM_REWARD) { + + list($courseId, $rewardId) = explode('-', $post['item_id']); + + $course = $validator->checkCourseItem($courseId); + $reward = $validator->checkRewardItem($rewardId); + + $order = $this->createRewardOrder($course, $reward, $user); } $this->incrUserDailyOrderCount($user); @@ -77,29 +86,11 @@ class OrderCreate extends Service return $order; } - /** - * @param CourseModel $course - * @param UserModel $user - * @return OrderModel $order - */ public function createCourseOrder(CourseModel $course, UserModel $user) { - $studyExpiryTime = strtotime("+{$course->study_expiry} months"); - $refundExpiryTime = strtotime("+{$course->refund_expiry} days"); + $itemInfo = []; - $itemInfo = [ - 'course' => [ - 'id' => $course->id, - 'title' => $course->title, - 'cover' => $course->cover, - 'market_price' => $course->market_price, - 'vip_price' => $course->vip_price, - 'study_expiry' => $course->study_expiry, - 'refund_expiry' => $course->refund_expiry, - 'study_expiry_time' => $studyExpiryTime, - 'refund_expiry_time' => $refundExpiryTime, - ] - ]; + $itemInfo['course'] = $this->handleCourseInfo($course); $amount = $user->vip ? $course->vip_price : $course->market_price; @@ -117,18 +108,10 @@ class OrderCreate extends Service return $order; } - /** - * @param PackageModel $package - * @param UserModel $user - * @return OrderModel $order - */ public function createPackageOrder(PackageModel $package, UserModel $user) { $packageRepo = new PackageRepo(); - /** - * @var CourseModel[] $courses - */ $courses = $packageRepo->findCourses($package->id); $itemInfo = []; @@ -141,21 +124,7 @@ class OrderCreate extends Service ]; foreach ($courses as $course) { - - $studyExpiryTime = strtotime("+{$course->study_expiry} months"); - $refundExpiryTime = strtotime("+{$course->refund_expiry} days"); - - $itemInfo['courses'][] = [ - 'id' => $course->id, - 'title' => $course->title, - 'cover' => $course->cover, - 'market_price' => $course->market_price, - 'vip_price' => $course->vip_price, - 'study_expiry' => $course->study_expiry, - 'refund_expiry' => $course->refund_expiry, - 'study_expiry_time' => $studyExpiryTime, - 'refund_expiry_time' => $refundExpiryTime, - ]; + $itemInfo['courses'][] = $this->handleCourseInfo($course); } $amount = $user->vip ? $package->vip_price : $package->market_price; @@ -174,11 +143,6 @@ class OrderCreate extends Service return $order; } - /** - * @param VipModel $vip - * @param UserModel $user - * @return OrderModel - */ public function createVipOrder(VipModel $vip, UserModel $user) { $baseTime = $user->vip_expiry_time > time() ? $user->vip_expiry_time : time(); @@ -208,9 +172,49 @@ class OrderCreate extends Service return $order; } - /** - * @param UserModel $user - */ + public function createRewardOrder(CourseModel $course, RewardModel $reward, UserModel $user) + { + $itemInfo = [ + 'course' => $this->handleCourseInfo($course), + 'reward' => [ + 'id' => $reward->id, + 'title' => $reward->title, + 'price' => $reward->price, + ] + ]; + + $order = new OrderModel(); + + $order->user_id = $user->id; + $order->item_id = $course->id; + $order->item_type = OrderModel::ITEM_REWARD; + $order->item_info = $itemInfo; + $order->amount = $reward->price; + $order->subject = "打赏 - {$course->title}"; + + $order->create(); + + return $order; + } + + protected function handleCourseInfo(CourseModel $course) + { + $studyExpiryTime = strtotime("+{$course->study_expiry} months"); + $refundExpiryTime = strtotime("+{$course->refund_expiry} days"); + + return [ + 'id' => $course->id, + 'title' => $course->title, + 'cover' => $course->cover, + 'market_price' => $course->market_price, + 'vip_price' => $course->vip_price, + 'study_expiry' => $course->study_expiry, + 'refund_expiry' => $course->refund_expiry, + 'study_expiry_time' => $studyExpiryTime, + 'refund_expiry_time' => $refundExpiryTime, + ]; + } + protected function incrUserDailyOrderCount(UserModel $user) { $this->eventsManager->fire('userDailyCounter:incrOrderCount', $this, $user); diff --git a/app/Services/Frontend/Order/OrderInfo.php b/app/Services/Frontend/Order/OrderInfo.php index 8f6b3977..43bea552 100644 --- a/app/Services/Frontend/Order/OrderInfo.php +++ b/app/Services/Frontend/Order/OrderInfo.php @@ -1,8 +1,9 @@ findById($itemId); + + if (!$item) { + throw new BadRequestException('order.item_not_found'); + } + + return $item; + } + public function checkAmount($amount) { $value = $this->filter->sanitize($amount, ['trim', 'float']); diff --git a/public/static/admin/css/style.css b/public/static/admin/css/common.css similarity index 100% rename from public/static/admin/css/style.css rename to public/static/admin/css/common.css diff --git a/public/static/admin/js/common.js b/public/static/admin/js/common.js index ae0e4e0b..3dbc27c0 100644 --- a/public/static/admin/js/common.js +++ b/public/static/admin/js/common.js @@ -21,27 +21,28 @@ layui.use(['jquery', 'form', 'element', 'layer', 'dropdown'], function () { form.on('submit(go)', function (data) { var submit = $(this); - submit.attr('disabled', true).text('提交中...'); + submit.attr('disabled', true).addClass('layui-btn-disabled'); $.ajax({ type: 'POST', url: data.form.action, data: data.field, success: function (res) { - var icon = res.code == 0 ? 1 : 2; - if (res.msg != '') { + var icon = res.code === 0 ? 1 : 2; + if (res.msg) { layer.msg(res.msg, {icon: icon}); } if (res.location) { setTimeout(function () { window.location.href = res.location; }, 1500); + } else { + submit.attr('disabled', false).removeClass('layui-btn-disabled'); } - submit.attr('disabled', false).text('提交'); }, error: function (xhr) { var json = JSON.parse(xhr.responseText); layer.msg(json.msg, {icon: 2}); - submit.attr('disabled', false).text('提交'); + submit.attr('disabled', false).removeClass('layui-btn-disabled'); } }); return false; diff --git a/public/static/web/css/style.css b/public/static/web/css/common.css similarity index 100% rename from public/static/web/css/style.css rename to public/static/web/css/common.css