diff --git a/CHANGELOG.md b/CHANGELOG.md index 283b4ca9..f4519d58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### [v1.4.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.6)(2021-10-09) +### [v1.4.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.6)(2021-10-17) - 完善首页文章缓存的获取条件 - 完善热门专题的获取条件 @@ -10,6 +10,7 @@ - 修正非root用户后台添加用户时报错 - 手机端访问web端地址自动跳转到手机端 - 增加锁定用户逻辑(会自动登出锁定用户) +- 增加虚假课程订阅数(用于营销效果) ### [v1.4.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.5)(2021-09-27) diff --git a/app/Builders/CourseUserList.php b/app/Builders/CourseUserList.php index 1d7836fc..ea3a3d09 100644 --- a/app/Builders/CourseUserList.php +++ b/app/Builders/CourseUserList.php @@ -45,7 +45,7 @@ class CourseUserList extends Builder 'id', 'title', 'cover', 'market_price', 'vip_price', 'rating', 'model', 'level', 'attrs', 'published', 'deleted', - 'user_count', 'lesson_count', 'review_count', 'favorite_count', + 'user_count', 'fake_user_count', 'lesson_count', 'review_count', 'favorite_count', ]; $courses = $courseRepo->findByIds($ids, $columns); @@ -55,8 +55,15 @@ class CourseUserList extends Builder $result = []; foreach ($courses->toArray() as $course) { + + if ($course['fake_user_count'] > $course['user_count']) { + $course['user_count'] = $course['fake_user_count']; + } + $course['cover'] = $baseUrl . $course['cover']; + $course['attrs'] = json_decode($course['attrs'], true); + $result[$course['id']] = $course; } diff --git a/app/Caches/CourseRecommendedList.php b/app/Caches/CourseRecommendedList.php index 51ed746d..23d35b4d 100644 --- a/app/Caches/CourseRecommendedList.php +++ b/app/Caches/CourseRecommendedList.php @@ -47,6 +47,12 @@ class CourseRecommendedList extends Cache foreach ($courses as $course) { + $userCount = $course->user_count; + + if ($course->fake_user_count > $course->user_count) { + $userCount = $course->fake_user_count; + } + $result[] = [ 'id' => $course->id, 'title' => $course->title, @@ -55,7 +61,7 @@ class CourseRecommendedList extends Cache 'vip_price' => $course->vip_price, 'model' => $course->model, 'level' => $course->level, - 'user_count' => $course->user_count, + 'user_count' => $userCount, 'lesson_count' => $course->lesson_count, ]; } diff --git a/app/Caches/CourseRelatedList.php b/app/Caches/CourseRelatedList.php index e397c7e2..00220871 100644 --- a/app/Caches/CourseRelatedList.php +++ b/app/Caches/CourseRelatedList.php @@ -48,6 +48,12 @@ class CourseRelatedList extends Cache foreach ($courses as $course) { + $userCount = $course->user_count; + + if ($course->fake_user_count > $course->user_count) { + $userCount = $course->fake_user_count; + } + $result[] = [ 'id' => $course->id, 'title' => $course->title, @@ -56,7 +62,7 @@ class CourseRelatedList extends Cache 'vip_price' => $course->vip_price, 'model' => $course->model, 'level' => $course->level, - 'user_count' => $course->user_count, + 'user_count' => $userCount, 'lesson_count' => $course->lesson_count, ]; } diff --git a/app/Caches/PackageCourseList.php b/app/Caches/PackageCourseList.php index 02bf22a5..0a4965ef 100644 --- a/app/Caches/PackageCourseList.php +++ b/app/Caches/PackageCourseList.php @@ -47,6 +47,13 @@ class PackageCourseList extends Cache $result = []; foreach ($courses as $course) { + + $userCount = $course->user_count; + + if ($course->fake_user_count > $course->user_count) { + $userCount = $course->fake_user_count; + } + $result[] = [ 'id' => $course->id, 'title' => $course->title, @@ -56,7 +63,7 @@ class PackageCourseList extends Cache 'vip_price' => $course->vip_price, 'model' => $course->model, 'level' => $course->level, - 'user_count' => $course->user_count, + 'user_count' => $userCount, 'lesson_count' => $course->lesson_count, ]; } diff --git a/app/Http/Admin/Services/Course.php b/app/Http/Admin/Services/Course.php index 00c4f1ce..4c53af65 100644 --- a/app/Http/Admin/Services/Course.php +++ b/app/Http/Admin/Services/Course.php @@ -162,6 +162,10 @@ class Course extends Service $data['level'] = $validator->checkLevel($post['level']); } + if (isset($post['fake_user_count'])) { + $data['fake_user_count'] = $validator->checkUserCount($post['fake_user_count']); + } + if (isset($post['study_expiry'])) { $data['study_expiry'] = $validator->checkStudyExpiry($post['study_expiry']); } diff --git a/app/Http/Admin/Views/course/edit_sale.volt b/app/Http/Admin/Views/course/edit_sale.volt index 690ae5e9..8cc7b640 100644 --- a/app/Http/Admin/Views/course/edit_sale.volt +++ b/app/Http/Admin/Views/course/edit_sale.volt @@ -1,4 +1,13 @@
+
+
+ +
+ +
+
+
+
diff --git a/app/Models/Course.php b/app/Models/Course.php index 957451f1..f460a13d 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -235,12 +235,19 @@ class Course extends Model public $resource_count = 0; /** - * 学员数 + * 真实学员数 * * @var int */ public $user_count = 0; + /** + * 伪造学员数 + * + * @var int + */ + public $fake_user_count = 0; + /** * 课时数 * @@ -342,6 +349,10 @@ class Course extends Model $this->attrs = kg_json_encode($this->attrs); } + if ($this->fake_user_count < $this->user_count) { + $this->fake_user_count = $this->user_count; + } + $this->update_time = time(); } diff --git a/app/Services/Logic/Course/BasicInfo.php b/app/Services/Logic/Course/BasicInfo.php index 658b1aad..28eaaf44 100644 --- a/app/Services/Logic/Course/BasicInfo.php +++ b/app/Services/Logic/Course/BasicInfo.php @@ -27,9 +27,16 @@ class BasicInfo extends LogicService public function handleBasicInfo(CourseModel $course) { - $course->details = kg_parse_markdown($course->details); + $details = kg_parse_markdown($course->details); + + $userCount = $course->user_count; + + if ($course->fake_user_count > $course->user_count) { + $userCount = $course->fake_user_count; + } $teachers = $this->handleTeachers($course); + $ratings = $this->handleRatings($course); return [ @@ -37,7 +44,7 @@ class BasicInfo extends LogicService 'title' => $course->title, 'cover' => $course->cover, 'summary' => $course->summary, - 'details' => $course->details, + 'details' => $details, 'keywords' => $course->keywords, 'origin_price' => $course->origin_price, 'market_price' => $course->market_price, @@ -51,7 +58,7 @@ class BasicInfo extends LogicService 'attrs' => $course->attrs, 'published' => $course->published, 'deleted' => $course->deleted, - 'user_count' => $course->user_count, + 'user_count' => $userCount, 'lesson_count' => $course->lesson_count, 'resource_count' => $course->resource_count, 'package_count' => $course->package_count, diff --git a/app/Services/Logic/Course/CourseList.php b/app/Services/Logic/Course/CourseList.php index 4d29d144..f3f62db1 100644 --- a/app/Services/Logic/Course/CourseList.php +++ b/app/Services/Logic/Course/CourseList.php @@ -72,6 +72,10 @@ class CourseList extends LogicService foreach ($courses as $course) { + if ($course['fake_user_count'] > $course['user_count']) { + $course['user_count'] = $course['fake_user_count']; + } + $course['cover'] = $baseUrl . $course['cover']; $items[] = [ diff --git a/app/Services/Logic/Course/PackageList.php b/app/Services/Logic/Course/PackageList.php index f759a76d..aa8f29b5 100644 --- a/app/Services/Logic/Course/PackageList.php +++ b/app/Services/Logic/Course/PackageList.php @@ -25,9 +25,7 @@ class PackageList extends LogicService $packages = $cache->get($course->id); - if (empty($packages)) { - return []; - } + if (empty($packages)) return []; $cache = new PackageCourseListCache(); diff --git a/app/Services/Search/CourseDocument.php b/app/Services/Search/CourseDocument.php index 52247a04..b38d356f 100644 --- a/app/Services/Search/CourseDocument.php +++ b/app/Services/Search/CourseDocument.php @@ -63,6 +63,12 @@ class CourseDocument extends Injectable $course->cover = CourseModel::getCoverPath($course->cover); + $userCount = $course->user_count; + + if ($course->fake_user_count > $course->user_count) { + $userCount = $course->fake_user_count; + } + return [ 'id' => $course->id, 'title' => $course->title, @@ -83,7 +89,7 @@ class CourseDocument extends Injectable 'tags' => $course->tags, 'category' => $category, 'teacher' => $teacher, - 'user_count' => $course->user_count, + 'user_count' => $userCount, 'lesson_count' => $course->lesson_count, 'review_count' => $course->review_count, 'favorite_count' => $course->favorite_count, diff --git a/app/Validators/Course.php b/app/Validators/Course.php index 6262b8e2..86a0b74c 100644 --- a/app/Validators/Course.php +++ b/app/Validators/Course.php @@ -166,6 +166,17 @@ class Course extends Validator return implode(',', $list); } + public function checkUserCount($userCount) + { + $value = $this->filter->sanitize($userCount, ['trim', 'int']); + + if ($value < 0 || $value > 999999) { + throw new BadRequestException('course.invalid_user_count'); + } + + return $value; + } + public function checkOriginPrice($price) { $value = $this->filter->sanitize($price, ['trim', 'float']); diff --git a/config/errors.php b/config/errors.php index 57d2704e..53a22bf1 100644 --- a/config/errors.php +++ b/config/errors.php @@ -176,6 +176,7 @@ $error['course.details_too_long'] = '详情太长(多于5000个字符)'; $error['course.invalid_model'] = '无效的模型类别'; $error['course.invalid_level'] = '无效的难度级别'; $error['course.invalid_cover'] = '无效的封面'; +$error['course.invalid_user_count'] = '无效的学员数量(范围:0-999999)'; $error['course.invalid_origin_price'] = '无效的原始价格(范围:0-999999)'; $error['course.invalid_market_price'] = '无效的优惠价格(范围:0-999999)'; $error['course.invalid_vip_price'] = '无效的会员价格(范围:0-999999)'; diff --git a/db/migrations/20211017085325.php b/db/migrations/20211017085325.php new file mode 100644 index 00000000..6d01c66a --- /dev/null +++ b/db/migrations/20211017085325.php @@ -0,0 +1,32 @@ +alterCourseTable(); + } + + protected function alterCourseTable() + { + $this->table('kg_course') + ->addColumn('fake_user_count', 'integer', [ + 'null' => false, + 'default' => '0', + 'limit' => MysqlAdapter::INT_REGULAR, + 'signed' => false, + 'comment' => '伪造用户数', + 'after' => 'user_count', + ])->save(); + } + +}