1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-27 21:10:24 +08:00

增加虚假课程订阅数逻辑

This commit is contained in:
koogua 2021-10-17 18:54:34 +08:00
parent 3c774d2b89
commit 76c46348d7
15 changed files with 123 additions and 13 deletions

View File

@ -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用户后台添加用户时报错 - 修正非root用户后台添加用户时报错
- 手机端访问web端地址自动跳转到手机端 - 手机端访问web端地址自动跳转到手机端
- 增加锁定用户逻辑(会自动登出锁定用户) - 增加锁定用户逻辑(会自动登出锁定用户)
- 增加虚假课程订阅数(用于营销效果)
### [v1.4.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.5)(2021-09-27) ### [v1.4.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.5)(2021-09-27)

View File

@ -45,7 +45,7 @@ class CourseUserList extends Builder
'id', 'title', 'cover', 'id', 'title', 'cover',
'market_price', 'vip_price', 'market_price', 'vip_price',
'rating', 'model', 'level', 'attrs', 'published', 'deleted', '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); $courses = $courseRepo->findByIds($ids, $columns);
@ -55,8 +55,15 @@ class CourseUserList extends Builder
$result = []; $result = [];
foreach ($courses->toArray() as $course) { 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['cover'] = $baseUrl . $course['cover'];
$course['attrs'] = json_decode($course['attrs'], true); $course['attrs'] = json_decode($course['attrs'], true);
$result[$course['id']] = $course; $result[$course['id']] = $course;
} }

View File

@ -47,6 +47,12 @@ class CourseRecommendedList extends Cache
foreach ($courses as $course) { foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$result[] = [ $result[] = [
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
@ -55,7 +61,7 @@ class CourseRecommendedList extends Cache
'vip_price' => $course->vip_price, 'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'user_count' => $course->user_count, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
]; ];
} }

View File

@ -48,6 +48,12 @@ class CourseRelatedList extends Cache
foreach ($courses as $course) { foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$result[] = [ $result[] = [
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
@ -56,7 +62,7 @@ class CourseRelatedList extends Cache
'vip_price' => $course->vip_price, 'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'user_count' => $course->user_count, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
]; ];
} }

View File

@ -47,6 +47,13 @@ class PackageCourseList extends Cache
$result = []; $result = [];
foreach ($courses as $course) { foreach ($courses as $course) {
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
$result[] = [ $result[] = [
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
@ -56,7 +63,7 @@ class PackageCourseList extends Cache
'vip_price' => $course->vip_price, 'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'user_count' => $course->user_count, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
]; ];
} }

View File

@ -162,6 +162,10 @@ class Course extends Service
$data['level'] = $validator->checkLevel($post['level']); $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'])) { if (isset($post['study_expiry'])) {
$data['study_expiry'] = $validator->checkStudyExpiry($post['study_expiry']); $data['study_expiry'] = $validator->checkStudyExpiry($post['study_expiry']);
} }

View File

@ -1,4 +1,13 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.course.update','id':course.id}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.course.update','id':course.id}) }}">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">虚构订阅</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="fake_user_count" value="{{ course.fake_user_count }}" lay-verify="number">
</div>
<div class="layui-form-mid layui-word-aux">人</div>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">原始价格</label> <label class="layui-form-label">原始价格</label>

View File

@ -235,12 +235,19 @@ class Course extends Model
public $resource_count = 0; public $resource_count = 0;
/** /**
* 学员数 * 真实学员数
* *
* @var int * @var int
*/ */
public $user_count = 0; 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); $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(); $this->update_time = time();
} }

View File

@ -27,9 +27,16 @@ class BasicInfo extends LogicService
public function handleBasicInfo(CourseModel $course) 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); $teachers = $this->handleTeachers($course);
$ratings = $this->handleRatings($course); $ratings = $this->handleRatings($course);
return [ return [
@ -37,7 +44,7 @@ class BasicInfo extends LogicService
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'summary' => $course->summary, 'summary' => $course->summary,
'details' => $course->details, 'details' => $details,
'keywords' => $course->keywords, 'keywords' => $course->keywords,
'origin_price' => $course->origin_price, 'origin_price' => $course->origin_price,
'market_price' => $course->market_price, 'market_price' => $course->market_price,
@ -51,7 +58,7 @@ class BasicInfo extends LogicService
'attrs' => $course->attrs, 'attrs' => $course->attrs,
'published' => $course->published, 'published' => $course->published,
'deleted' => $course->deleted, 'deleted' => $course->deleted,
'user_count' => $course->user_count, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'resource_count' => $course->resource_count, 'resource_count' => $course->resource_count,
'package_count' => $course->package_count, 'package_count' => $course->package_count,

View File

@ -72,6 +72,10 @@ class CourseList extends LogicService
foreach ($courses as $course) { foreach ($courses as $course) {
if ($course['fake_user_count'] > $course['user_count']) {
$course['user_count'] = $course['fake_user_count'];
}
$course['cover'] = $baseUrl . $course['cover']; $course['cover'] = $baseUrl . $course['cover'];
$items[] = [ $items[] = [

View File

@ -25,9 +25,7 @@ class PackageList extends LogicService
$packages = $cache->get($course->id); $packages = $cache->get($course->id);
if (empty($packages)) { if (empty($packages)) return [];
return [];
}
$cache = new PackageCourseListCache(); $cache = new PackageCourseListCache();

View File

@ -63,6 +63,12 @@ class CourseDocument extends Injectable
$course->cover = CourseModel::getCoverPath($course->cover); $course->cover = CourseModel::getCoverPath($course->cover);
$userCount = $course->user_count;
if ($course->fake_user_count > $course->user_count) {
$userCount = $course->fake_user_count;
}
return [ return [
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
@ -83,7 +89,7 @@ class CourseDocument extends Injectable
'tags' => $course->tags, 'tags' => $course->tags,
'category' => $category, 'category' => $category,
'teacher' => $teacher, 'teacher' => $teacher,
'user_count' => $course->user_count, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count, 'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count, 'favorite_count' => $course->favorite_count,

View File

@ -166,6 +166,17 @@ class Course extends Validator
return implode('', $list); 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) public function checkOriginPrice($price)
{ {
$value = $this->filter->sanitize($price, ['trim', 'float']); $value = $this->filter->sanitize($price, ['trim', 'float']);

View File

@ -176,6 +176,7 @@ $error['course.details_too_long'] = '详情太长多于5000个字符';
$error['course.invalid_model'] = '无效的模型类别'; $error['course.invalid_model'] = '无效的模型类别';
$error['course.invalid_level'] = '无效的难度级别'; $error['course.invalid_level'] = '无效的难度级别';
$error['course.invalid_cover'] = '无效的封面'; $error['course.invalid_cover'] = '无效的封面';
$error['course.invalid_user_count'] = '无效的学员数量范围0-999999';
$error['course.invalid_origin_price'] = '无效的原始价格范围0-999999'; $error['course.invalid_origin_price'] = '无效的原始价格范围0-999999';
$error['course.invalid_market_price'] = '无效的优惠价格范围0-999999'; $error['course.invalid_market_price'] = '无效的优惠价格范围0-999999';
$error['course.invalid_vip_price'] = '无效的会员价格范围0-999999'; $error['course.invalid_vip_price'] = '无效的会员价格范围0-999999';

View File

@ -0,0 +1,32 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
use Phinx\Db\Adapter\MysqlAdapter;
use Phinx\Migration\AbstractMigration;
final class V20211017085325 extends AbstractMigration
{
public function up()
{
$this->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();
}
}