From 533b0eaad50cfe9138a663e9bc8e43b6f85abe01 Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Tue, 2 Jun 2020 18:54:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=90=8C=E4=B8=80=E8=AF=BE?= =?UTF-8?q?=E7=A8=8B=E5=A4=9A=E6=AC=A1=E8=B4=AD=E4=B9=B0=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Caches/Cache.php | 5 +- app/Caches/Counter.php | 2 - app/Caches/CourseUser.php | 33 ++++++++++ app/Console/Tasks/OrderTask.php | 60 +------------------ app/Console/Tasks/SyncLearningTask.php | 23 +++++-- .../Admin/Controllers/PackageController.php | 8 +++ app/Http/Admin/Services/AuthNode.php | 10 +++- app/Http/Admin/Services/Course.php | 6 +- app/Http/Admin/Services/Package.php | 35 +++++++++-- app/Http/Admin/Views/course/search.volt | 4 +- app/Http/Admin/Views/package/search.volt | 45 ++++++++++++++ app/Http/Web/Views/course/packages.volt | 3 + app/Http/Web/Views/course/show.volt | 2 +- app/Models/ChapterUser.php | 2 +- app/Models/Course.php | 8 +++ app/Models/CourseUser.php | 9 +++ app/Models/Learning.php | 2 +- app/Repos/ChapterUser.php | 1 + app/Repos/Course.php | 31 +++++----- app/Repos/Package.php | 8 ++- app/Services/Frontend/Chapter/ChapterInfo.php | 15 +++-- app/Services/Frontend/ChapterTrait.php | 7 +++ app/Services/Frontend/Course/ChapterList.php | 8 +-- app/Services/Frontend/Course/CourseInfo.php | 1 + app/Services/Frontend/Course/PackageList.php | 37 +++++++++++- app/Services/Frontend/CourseTrait.php | 12 ++-- app/Services/Refund.php | 28 ++++++++- app/Traits/Auth.php | 5 -- public/static/web/css/common.css | 14 ++++- storage/cache/annotations/.gitignore | 2 + 30 files changed, 298 insertions(+), 128 deletions(-) create mode 100644 app/Caches/CourseUser.php create mode 100644 app/Http/Admin/Views/package/search.volt create mode 100644 storage/cache/annotations/.gitignore diff --git a/app/Caches/Cache.php b/app/Caches/Cache.php index 757e5c0e..c832247c 100644 --- a/app/Caches/Cache.php +++ b/app/Caches/Cache.php @@ -32,10 +32,7 @@ abstract class Cache extends Component $content = $this->getContent($id); - /** - * 原始内容为空,设置较短的生存时间,简单防止穿透 - */ - $lifetime = $content ? $this->getLifetime() : 5 * 60; + $lifetime = $this->getLifetime(); $this->cache->save($key, $content, $lifetime); diff --git a/app/Caches/Counter.php b/app/Caches/Counter.php index f023b40b..7c2dcbca 100644 --- a/app/Caches/Counter.php +++ b/app/Caches/Counter.php @@ -40,11 +40,9 @@ abstract class Counter extends Component if (!$this->cache->exists($key)) { $content = $this->getContent($id); - $lifetime = $this->getLifetime(); $this->redis->hMSet($key, $content); - $this->redis->expire($key, $lifetime); } diff --git a/app/Caches/CourseUser.php b/app/Caches/CourseUser.php new file mode 100644 index 00000000..b4ec6e92 --- /dev/null +++ b/app/Caches/CourseUser.php @@ -0,0 +1,33 @@ +lifetime; + } + + public function getKey($id = null) + { + return "course_user:{$id}"; + } + + public function getContent($id = null) + { + list($courseId, $userId) = explode('_', $id); + + $repo = new CourseUserRepo(); + + $courseUser = $repo->findCourseUser($courseId, $userId); + + return $courseUser ?: null; + } + +} diff --git a/app/Console/Tasks/OrderTask.php b/app/Console/Tasks/OrderTask.php index 29afa0ff..a7182496 100644 --- a/app/Console/Tasks/OrderTask.php +++ b/app/Console/Tasks/OrderTask.php @@ -2,14 +2,11 @@ namespace App\Console\Tasks; -use App\Models\ChapterUser as ChapterUserModel; use App\Models\CourseUser as CourseUserModel; -use App\Models\Learning as LearningModel; use App\Models\Order as OrderModel; use App\Models\Refund as RefundModel; use App\Models\Task as TaskModel; use App\Models\Trade as TradeModel; -use App\Repos\CourseUser as CourseUserRepo; use App\Repos\Order as OrderRepo; use App\Repos\User as UserRepo; use App\Services\Smser\Order as OrderSmser; @@ -116,8 +113,6 @@ class OrderTask extends Task if ($courseUser->create($data) === false) { throw new \RuntimeException('Create CourseQuery User Failed'); } - - $this->handleCourseHistory($data['course_id'], $data['user_id']); } protected function handlePackageOrder(OrderModel $order) @@ -140,10 +135,8 @@ class OrderTask extends Task $courseUser = new CourseUserModel(); if ($courseUser->create($data) === false) { - throw new \RuntimeException('Create CourseQuery User Failed'); + throw new \RuntimeException('Create Course User Failed'); } - - $this->handleCourseHistory($data['course_id'], $data['user_id']); } } @@ -196,57 +189,6 @@ class OrderTask extends Task $refund->create(); } - protected function handleCourseHistory($courseId, $userId) - { - $courseUserRepo = new CourseUserRepo(); - - $courseUser = $courseUserRepo->findCourseStudent($courseId, $userId); - - if ($courseUser) { - $courseUser->update(['deleted' => 1]); - } - - $chapterUsers = $this->findPlanChapterUsers($courseId, $userId); - - if ($chapterUsers->count() > 0) { - $chapterUsers->update(['deleted' => 1]); - } - - $learnings = $this->findPlanLearnings($courseId, $userId); - - if ($learnings->count() > 0) { - $learnings->update(['deleted' => 1]); - } - } - - /** - * @param int $courseId - * @param int $userId - * @return ResultsetInterface|Resultset|CourseUserModel[] - */ - protected function findPlanChapterUsers($courseId, $userId) - { - return ChapterUserModel::query() - ->where('course_id = :course_id:', ['course_id' => $courseId]) - ->andWhere('user_id = :user_id:', ['user_id' => $userId]) - ->andWhere('deleted = 0') - ->execute(); - } - - /** - * @param int $courseId - * @param int $userId - * @return ResultsetInterface|Resultset|CourseUserModel[] - */ - protected function findPlanLearnings($courseId, $userId) - { - return LearningModel::query() - ->where('course_id = :course_id:', ['course_id' => $courseId]) - ->andWhere('user_id = :user_id:', ['user_id' => $userId]) - ->andWhere('deleted = 0') - ->execute(); - } - /** * @param int $orderId * @return Model|TradeModel diff --git a/app/Console/Tasks/SyncLearningTask.php b/app/Console/Tasks/SyncLearningTask.php index b9e79800..e0e11a1f 100644 --- a/app/Console/Tasks/SyncLearningTask.php +++ b/app/Console/Tasks/SyncLearningTask.php @@ -153,21 +153,34 @@ class SyncLearningTask extends Task return; } - $userLearnings = $courseRepo->findConsumedUserLearnings($courseId, $userId); + $userLearnings = $courseRepo->findUserLearnings($courseId, $userId, $courseUser->plan_id); if ($userLearnings->count() == 0) { return; } + /** + * @var array $consumedUserLearnings + */ + $consumedUserLearnings = $userLearnings->filter(function ($item) { + if ($item->consumed == 1) { + return $item; + } + }); + + if (count($consumedUserLearnings) == 0) { + return; + } + $duration = 0; - foreach ($userLearnings as $learning) { - $duration += $learning->duration; + foreach ($consumedUserLearnings as $learning) { + $duration += $learning['duration']; } $courseLessonIds = kg_array_column($courseLessons->toArray(), 'id'); - $userLessonIds = kg_array_column($userLearnings->toArray(), 'chapter_id'); - $consumedLessonIds = array_intersect($courseLessonIds, $userLessonIds); + $consumedUserLessonIds = kg_array_column($consumedUserLearnings, 'chapter_id'); + $consumedLessonIds = array_intersect($courseLessonIds, $consumedUserLessonIds); $totalCount = count($courseLessonIds); $consumedCount = count($consumedLessonIds); diff --git a/app/Http/Admin/Controllers/PackageController.php b/app/Http/Admin/Controllers/PackageController.php index 5850ae87..3c177089 100644 --- a/app/Http/Admin/Controllers/PackageController.php +++ b/app/Http/Admin/Controllers/PackageController.php @@ -10,6 +10,14 @@ use App\Http\Admin\Services\Package as PackageService; class PackageController extends Controller { + /** + * @Get("/search", name="admin.package.search") + */ + public function searchAction() + { + + } + /** * @Get("/guiding", name="admin.package.guiding") */ diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 46bf4b56..1f000edf 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -105,18 +105,24 @@ class AuthNode extends Service ], [ 'id' => '1-3-2', + 'title' => '搜索套餐', + 'type' => 'menu', + 'route' => 'admin.package.search', + ], + [ + 'id' => '1-3-3', 'title' => '添加套餐', 'type' => 'menu', 'route' => 'admin.package.add', ], [ - 'id' => '1-3-3', + 'id' => '1-3-4', 'title' => '编辑套餐', 'type' => 'button', 'route' => 'admin.package.edit', ], [ - 'id' => '1-3-4', + 'id' => '1-3-5', 'title' => '删除套餐', 'type' => 'button', 'route' => 'admin.package.delete', diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index ff170bbc..b2a86046 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -358,7 +358,7 @@ class Course extends Service } } - $newTeacherIds = explode(',', $teacherIds); + $newTeacherIds = $teacherIds ? explode(',', $teacherIds) : []; $addedTeacherIds = array_diff($newTeacherIds, $originTeacherIds); if ($addedTeacherIds) { @@ -412,7 +412,7 @@ class Course extends Service } } - $newCategoryIds = explode(',', $categoryIds); + $newCategoryIds = $categoryIds ? explode(',', $categoryIds) : []; $addedCategoryIds = array_diff($newCategoryIds, $originCategoryIds); if ($addedCategoryIds) { @@ -463,7 +463,7 @@ class Course extends Service } } - $newRelatedIds = explode(',', $courseIds); + $newRelatedIds = $courseIds ? explode(',', $courseIds) : []; $addedRelatedIds = array_diff($newRelatedIds, $originRelatedIds); $courseRelatedRepo = new CourseRelatedRepo(); diff --git a/app/Http/Admin/Services/Package.php b/app/Http/Admin/Services/Package.php index 318fd89d..8e33997b 100644 --- a/app/Http/Admin/Services/Package.php +++ b/app/Http/Admin/Services/Package.php @@ -2,6 +2,7 @@ namespace App\Http\Admin\Services; +use App\Caches\CoursePackageList as CoursePackageListCache; use App\Caches\Package as PackageCache; use App\Caches\PackageCourseList as PackageCourseListCache; use App\Library\Paginator\Query as PagerQuery; @@ -93,7 +94,7 @@ class Package extends Service $package->update($data); - $this->updateCourseCount($package); + $this->updatePackageCourseCount($package); $this->rebuildPackageCache($package); @@ -193,7 +194,7 @@ class Package extends Service } } - $newCourseIds = explode(',', $courseIds); + $newCourseIds = $courseIds ? explode(',', $courseIds) : []; $addedCourseIds = array_diff($newCourseIds, $originCourseIds); if ($addedCourseIds) { @@ -203,6 +204,8 @@ class Package extends Service 'course_id' => $courseId, 'package_id' => $package->id, ]); + $this->updateCoursePackageCount($courseId); + $this->rebuildCoursePackageCache($courseId); } } @@ -212,14 +215,14 @@ class Package extends Service $coursePackageRepo = new CoursePackageRepo(); foreach ($deletedCourseIds as $courseId) { $coursePackage = $coursePackageRepo->findCoursePackage($courseId, $package->id); - if ($coursePackage) { - $coursePackage->delete(); - } + $coursePackage->delete(); + $this->updateCoursePackageCount($courseId); + $this->rebuildCoursePackageCache($courseId); } } } - protected function updateCourseCount(PackageModel $package) + protected function updatePackageCourseCount(PackageModel $package) { $packageRepo = new PackageRepo(); @@ -230,6 +233,19 @@ class Package extends Service $package->update(); } + protected function updateCoursePackageCount($courseId) + { + $courseRepo = new CourseRepo(); + + $course = $courseRepo->findById($courseId); + + $packageCount = $courseRepo->countPackages($courseId); + + $course->package_count = $packageCount; + + $course->update(); + } + protected function rebuildPackageCache(PackageModel $package) { $cache = new PackageCache(); @@ -241,6 +257,13 @@ class Package extends Service $cache->rebuild($package->id); } + protected function rebuildCoursePackageCache($courseId) + { + $cache = new CoursePackageListCache(); + + $cache->rebuild($courseId); + } + protected function findOrFail($id) { $validator = new PackageValidator(); diff --git a/app/Http/Admin/Views/course/search.volt b/app/Http/Admin/Views/course/search.volt index 5ae683f4..c6267acd 100644 --- a/app/Http/Admin/Views/course/search.volt +++ b/app/Http/Admin/Views/course/search.volt @@ -5,9 +5,9 @@
- +
- +
diff --git a/app/Http/Admin/Views/package/search.volt b/app/Http/Admin/Views/package/search.volt new file mode 100644 index 00000000..ed247d84 --- /dev/null +++ b/app/Http/Admin/Views/package/search.volt @@ -0,0 +1,45 @@ +
+ +
+ 搜索套餐 +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
\ No newline at end of file diff --git a/app/Http/Web/Views/course/packages.volt b/app/Http/Web/Views/course/packages.volt index 320df573..dbe83c00 100644 --- a/app/Http/Web/Views/course/packages.volt +++ b/app/Http/Web/Views/course/packages.volt @@ -23,6 +23,9 @@
{{ course.title }}
{{ course.title }}
+ {% if loop.first %} +
+ {% endif %} {% endfor %} diff --git a/app/Http/Web/Views/course/show.volt b/app/Http/Web/Views/course/show.volt index f20a9ad3..643cc834 100644 --- a/app/Http/Web/Views/course/show.volt +++ b/app/Http/Web/Views/course/show.volt @@ -21,7 +21,7 @@
- {% set show_tab_packages = 1 %} + {% set show_tab_packages = course.package_count > 0 ? 1 : 0 %} {% set show_tab_consults = course.consult_count > 0 ? 1 : 0 %} {% set show_tab_reviews = course.review_count > 0 ? 1 : 0 %} diff --git a/app/Models/ChapterUser.php b/app/Models/ChapterUser.php index d3d027d1..5ade5b66 100644 --- a/app/Models/ChapterUser.php +++ b/app/Models/ChapterUser.php @@ -15,7 +15,7 @@ class ChapterUser extends Model public $id; /** - * 计划编号(course_user主键) + * 计划编号 * * @var int */ diff --git a/app/Models/Course.php b/app/Models/Course.php index b3ccd69f..c96bdb5e 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -178,6 +178,13 @@ class Course extends Model */ public $lesson_count; + /** + * 套餐数 + * + * @var int + */ + public $package_count; + /** * 评论数 * @@ -349,6 +356,7 @@ class Course extends Model 'rating' => '评价', 'latest' => '最新', 'popular' => '最热', + 'free' => '免费', ]; } diff --git a/app/Models/CourseUser.php b/app/Models/CourseUser.php index c3d38774..985171e0 100644 --- a/app/Models/CourseUser.php +++ b/app/Models/CourseUser.php @@ -27,6 +27,13 @@ class CourseUser extends Model */ public $id; + /** + * 计划编号 + * + * @var int + */ + public $plan_id; + /** * 课程编号 * @@ -123,6 +130,8 @@ class CourseUser extends Model public function beforeCreate() { + $this->plan_id = (int)date('Y-m-d'); + $this->create_time = time(); } diff --git a/app/Models/Learning.php b/app/Models/Learning.php index 98029f41..74ae6b00 100644 --- a/app/Models/Learning.php +++ b/app/Models/Learning.php @@ -28,7 +28,7 @@ class Learning extends Model public $request_id; /** - * 计划编号(course_user主键) + * 计划编号 * * @var int */ diff --git a/app/Repos/ChapterUser.php b/app/Repos/ChapterUser.php index ff671552..668c5a9c 100644 --- a/app/Repos/ChapterUser.php +++ b/app/Repos/ChapterUser.php @@ -45,6 +45,7 @@ class ChapterUser extends Repository return ChapterUserModel::findFirst([ 'conditions' => 'chapter_id = ?1 AND user_id = ?2 AND deleted = 0', 'bind' => [1 => $chapterId, 2 => $userId], + 'order' => 'id DESC', ]); } diff --git a/app/Repos/Course.php b/app/Repos/Course.php index 59e9a3e4..db2e6c2b 100644 --- a/app/Repos/Course.php +++ b/app/Repos/Course.php @@ -60,6 +60,10 @@ class Course extends Repository $builder->andWhere('level = :level:', ['level' => $where['level']]); } + if ($sort == 'free') { + $where['free'] = 1; + } + if (isset($where['free'])) { if ($where['free'] == 1) { $builder->andWhere('market_price = 0'); @@ -215,28 +219,15 @@ class Course extends Repository /** * @param int $courseId * @param int $userId + * @param int $planId * @return ResultsetInterface|Resultset|ChapterUserModel[] */ - public function findUserLearnings($courseId, $userId) + public function findUserLearnings($courseId, $userId, $planId) { return ChapterUserModel::query() ->where('course_id = :course_id:', ['course_id' => $courseId]) ->andWhere('user_id = :user_id:', ['user_id' => $userId]) - ->andWhere('deleted = 0') - ->execute(); - } - - /** - * @param int $courseId - * @param int $userId - * @return ResultsetInterface|Resultset|ChapterUserModel[] - */ - public function findConsumedUserLearnings($courseId, $userId) - { - return ChapterUserModel::query() - ->where('course_id = :course_id:', ['course_id' => $courseId]) - ->andWhere('user_id = :user_id:', ['user_id' => $userId]) - ->andWhere('consumed = 1 AND deleted = 0') + ->andWhere('plan_id = :plan_id:', ['plan_id' => $planId]) ->execute(); } @@ -280,6 +271,14 @@ class Course extends Repository ]); } + public function countPackages($courseId) + { + return CoursePackageModel::count([ + 'conditions' => 'course_id = :course_id:', + 'bind' => ['course_id' => $courseId], + ]); + } + public function countUsers($courseId) { return CourseUserModel::count([ diff --git a/app/Repos/Package.php b/app/Repos/Package.php index 52bf3a44..d75cabc2 100644 --- a/app/Repos/Package.php +++ b/app/Repos/Package.php @@ -21,8 +21,12 @@ class Package extends Repository $builder->where('1 = 1'); - if (!empty($where['user_id'])) { - $builder->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]); + if (!empty($where['id'])) { + $builder->andWhere('id = :id:', ['id' => $where['id']]); + } + + if (!empty($where['title'])) { + $builder->andWhere('title LIKE :title:', ['title' => "%{$where['title']}%"]); } if (isset($where['published'])) { diff --git a/app/Services/Frontend/Chapter/ChapterInfo.php b/app/Services/Frontend/Chapter/ChapterInfo.php index b7228dbf..2f230d8e 100644 --- a/app/Services/Frontend/Chapter/ChapterInfo.php +++ b/app/Services/Frontend/Chapter/ChapterInfo.php @@ -170,7 +170,7 @@ class ChapterInfo extends FrontendService protected function handleCourseUser(CourseModel $course, UserModel $user) { - if (empty($user->id)) return; + if ($user->id == 0) return; if ($this->joinedCourse) return; @@ -182,7 +182,6 @@ class ChapterInfo extends FrontendService $courseUser->user_id = $user->id; $courseUser->source_type = CourseUserModel::SOURCE_FREE; $courseUser->role_type = CourseUserModel::ROLE_STUDENT; - $courseUser->expiry_time = strtotime('+3 years'); $courseUser->create(); @@ -191,14 +190,22 @@ class ChapterInfo extends FrontendService protected function handleChapterUser(ChapterModel $chapter, UserModel $user) { - if (empty($user->id)) return; + if ($user->id == 0) return; - if ($this->joinedChapter) return; + /** + * 一个课程可能购买学习多次 + */ + if ($this->chapterUser && $this->courseUser) { + if ($this->chapterUser->plan_id == $this->courseUser->plan_id) { + return; + } + } if (!$this->ownedChapter) return; $chapterUser = new ChapterUserModel(); + $chapterUser->plan_id = $this->courseUser->plan_id; $chapterUser->course_id = $chapter->course_id; $chapterUser->chapter_id = $chapter->id; $chapterUser->user_id = $user->id; diff --git a/app/Services/Frontend/ChapterTrait.php b/app/Services/Frontend/ChapterTrait.php index 750d9c3d..864b7c8b 100644 --- a/app/Services/Frontend/ChapterTrait.php +++ b/app/Services/Frontend/ChapterTrait.php @@ -3,6 +3,7 @@ namespace App\Services\Frontend; use App\Models\Chapter as ChapterModel; +use App\Models\ChapterUser as ChapterUserModel; use App\Models\User as UserModel; use App\Repos\ChapterUser as ChapterUserRepo; use App\Validators\Chapter as ChapterValidator; @@ -20,6 +21,11 @@ trait ChapterTrait */ protected $joinedChapter = false; + /** + * @var ChapterUserModel + */ + protected $chapterUser; + public function checkChapter($id) { $validator = new ChapterValidator(); @@ -41,6 +47,7 @@ trait ChapterTrait $chapterUser = $chapterUserRepo->findChapterUser($chapter->id, $user->id); if ($chapterUser) { + $this->chapterUser = $chapterUser; $this->joinedChapter = true; } diff --git a/app/Services/Frontend/Course/ChapterList.php b/app/Services/Frontend/Course/ChapterList.php index 74b1ec38..0c6f5523 100644 --- a/app/Services/Frontend/Course/ChapterList.php +++ b/app/Services/Frontend/Course/ChapterList.php @@ -31,7 +31,7 @@ class ChapterList extends FrontendService $chapters = $cache->get($course->id); - if (empty($chapters)) { + if (count($chapters) == 0) { return []; } @@ -46,7 +46,7 @@ class ChapterList extends FrontendService } } } else { - $mappings = $this->getLearningMappings($course, $user); + $mappings = $this->getLearningMappings($course->id, $user->id, $this->courseUser->plan_id); foreach ($chapters as &$chapter) { foreach ($chapter['children'] as &$lesson) { $lesson['me'] = [ @@ -61,11 +61,11 @@ class ChapterList extends FrontendService return $chapters; } - protected function getLearningMappings(CourseModel $course, UserModel $user) + protected function getLearningMappings($courseId, $userId, $planId) { $courseRepo = new CourseRepo(); - $userLearnings = $courseRepo->findUserLearnings($course->id, $user->id); + $userLearnings = $courseRepo->findUserLearnings($courseId, $userId, $planId); if ($userLearnings->count() == 0) { return []; diff --git a/app/Services/Frontend/Course/CourseInfo.php b/app/Services/Frontend/Course/CourseInfo.php index e7c29961..290e8336 100644 --- a/app/Services/Frontend/Course/CourseInfo.php +++ b/app/Services/Frontend/Course/CourseInfo.php @@ -45,6 +45,7 @@ class CourseInfo extends FrontendService 'attrs' => $course->attrs, 'user_count' => $course->user_count, 'lesson_count' => $course->lesson_count, + 'package_count' => $course->package_count, 'review_count' => $course->review_count, 'comment_count' => $course->comment_count, 'consult_count' => $course->consult_count, diff --git a/app/Services/Frontend/Course/PackageList.php b/app/Services/Frontend/Course/PackageList.php index bd184d72..56d4d854 100644 --- a/app/Services/Frontend/Course/PackageList.php +++ b/app/Services/Frontend/Course/PackageList.php @@ -28,18 +28,21 @@ class PackageList extends FrontendService $result = []; + $firstCourseId = $course->id; + foreach ($packages as $package) { $courses = $cache->get($package['id']); $package['origin_price'] = 0.00; + $package['courses'] = []; if ($courses) { foreach ($courses as $course) { $package['origin_price'] += $course['market_price']; } - $package['courses'] = $courses; + $package['courses'] = $this->sortCourses($courses, $firstCourseId); } $result[] = $package; @@ -48,4 +51,36 @@ class PackageList extends FrontendService return $result; } + /** + * 把特定课程排在第一位 + * + * @param array $courses + * @param int $firstCourseId + * @return array + */ + protected function sortCourses(array $courses, $firstCourseId) + { + $firstCourse = []; + + foreach ($courses as $course) { + if ($course['id'] == $firstCourseId) { + $firstCourse = $course; + } + } + + $result = []; + + if ($firstCourse) { + $result[] = $firstCourse; + } + + foreach ($courses as $course) { + if ($course['id'] != $firstCourseId) { + $result[] = $course; + } + } + + return $result; + } + } diff --git a/app/Services/Frontend/CourseTrait.php b/app/Services/Frontend/CourseTrait.php index 537ff95f..28e896a3 100644 --- a/app/Services/Frontend/CourseTrait.php +++ b/app/Services/Frontend/CourseTrait.php @@ -22,7 +22,7 @@ trait CourseTrait protected $joinedCourse = false; /** - * @var CourseUserModel + * @var CourseUserModel|null */ protected $courseUser; @@ -42,12 +42,16 @@ trait CourseTrait public function setCourseUser(CourseModel $course, UserModel $user) { - $courseUserRepo = new CourseUserRepo(); + $courseUser = null; - $courseUser = $courseUserRepo->findCourseUser($course->id, $user->id); + if ($user->id > 0) { + $courseUserRepo = new CourseUserRepo(); + $courseUser = $courseUserRepo->findCourseUser($course->id, $user->id); + } + + $this->courseUser = $courseUser; if ($courseUser) { - $this->courseUser = $courseUser; $this->joinedCourse = true; } diff --git a/app/Services/Refund.php b/app/Services/Refund.php index f4752f24..525ad9fe 100644 --- a/app/Services/Refund.php +++ b/app/Services/Refund.php @@ -4,6 +4,7 @@ namespace App\Services; use App\Models\Order as OrderModel; use App\Repos\Course as CourseRepo; +use App\Repos\CourseUser as CourseUserRepo; class Refund extends Service { @@ -104,15 +105,36 @@ class Refund extends Service return 1.00; } - $userLearnings = $courseRepo->findConsumedUserLearnings($courseId, $userId); + $courseUserRepo = new CourseUserRepo(); + + $courseUser = $courseUserRepo->findCourseUser($courseId, $userId); + + if (!$courseUser) { + return 1.00; + } + + $userLearnings = $courseRepo->findUserLearnings($courseId, $userId, $courseUser->plan_id); if ($userLearnings->count() == 0) { return 1.00; } + /** + * @var array $consumedUserLearnings + */ + $consumedUserLearnings = $userLearnings->filter(function ($item) { + if ($item->consumed == 1) { + return $item; + } + }); + + if (count($consumedUserLearnings) == 0) { + return 1.00; + } + $courseLessonIds = kg_array_column($courseLessons->toArray(), 'id'); - $userLessonIds = kg_array_column($userLearnings->toArray(), 'chapter_id'); - $consumedLessonIds = array_intersect($courseLessonIds, $userLessonIds); + $consumedUserLessonIds = kg_array_column($consumedUserLearnings, 'chapter_id'); + $consumedLessonIds = array_intersect($courseLessonIds, $consumedUserLessonIds); $totalCount = count($courseLessonIds); $consumedCount = count($consumedLessonIds); diff --git a/app/Traits/Auth.php b/app/Traits/Auth.php index 9659d32b..9041e22a 100644 --- a/app/Traits/Auth.php +++ b/app/Traits/Auth.php @@ -4,7 +4,6 @@ namespace App\Traits; use App\Caches\User as UserCache; use App\Models\User as UserModel; -use App\Repos\User as UserRepo; use App\Services\Auth as AuthService; use App\Validators\Validator as AppValidator; use Phalcon\Di; @@ -33,10 +32,6 @@ trait Auth */ public function getLoginUser() { - $userRepo = new UserRepo(); - - return $userRepo->findById(100015); - $authUser = $this->getAuthUser(); $validator = new AppValidator(); diff --git a/public/static/web/css/common.css b/public/static/web/css/common.css index 8a8b1235..16d7b420 100644 --- a/public/static/web/css/common.css +++ b/public/static/web/css/common.css @@ -419,7 +419,7 @@ body { } .package-item { - margin-bottom: 15px; + margin-bottom: 25px; border-bottom: 1px dashed #ccc; } @@ -468,16 +468,24 @@ body { } .package-course-list { - width: 560px; + width: 580px; height: 170px; overflow-x: auto; white-space: nowrap; } +.separator { + color: #666; + display: inline-block; + padding-top: 35px; + margin-left: -5px; + margin-right: 4px; +} + .package-course-card { width: 175px; display: inline-block; - margin-right: 5px; + margin-right: 8px; vertical-align: top; } diff --git a/storage/cache/annotations/.gitignore b/storage/cache/annotations/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/storage/cache/annotations/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file