mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-28 05:11:39 +08:00
增加虚假课程订阅数逻辑
This commit is contained in:
parent
3c774d2b89
commit
76c46348d7
@ -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)
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -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']);
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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[] = [
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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']);
|
||||||
|
@ -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)';
|
||||||
|
32
db/migrations/20211017085325.php
Normal file
32
db/migrations/20211017085325.php
Normal 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user