diff --git a/CHANGELOG.md b/CHANGELOG.md index 903b5edc..90eadbb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +### [v1.4.6](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.6)(2021-10-18) + +- 完善首页文章缓存的获取条件 +- 完善热门专题的获取条件 +- 优化课程章节列表逻辑 +- 更新教学中心我的课程获取逻辑 +- 修正后台点播和面授类型课时列表宽度未100%铺满问题 +- 完善添加积分礼品的逻辑 +- 修正编辑课程类型礼品时编辑器初始化js报错 +- 修正非root用户后台添加用户时报错 +- 修正微信等第三方登录code被重用问题 +- 手机端访问web端地址自动跳转到手机端 +- 增加锁定用户逻辑(会自动登出锁定用户) +- 增加虚假课程订阅数(用于营销效果) + ### [v1.4.5](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.5)(2021-09-27) - 修正点击内容分享到微信会额外出现公众号二维码的问题 diff --git a/README.md b/README.md index 377dd248..16c93aba 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,15 @@ 演示账号:100015@163.com / 123456 (前后台通用) -移动端演示: +H5手机端演示: - + + +演示账号:13507083515 / 123456 + +微信公众号演示: + + 演示账号:13507083515 / 123456 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/CourseTopicList.php b/app/Caches/CourseTopicList.php index 33d612bb..0d9e95aa 100644 --- a/app/Caches/CourseTopicList.php +++ b/app/Caches/CourseTopicList.php @@ -64,6 +64,7 @@ class CourseTopicList extends Cache { return TopicModel::query() ->where('published = 1') + ->andWhere('deleted = 0') ->orderBy('RAND()') ->limit($limit) ->execute(); diff --git a/app/Caches/IndexArticleList.php b/app/Caches/IndexArticleList.php index 6b6f20cc..c892923f 100644 --- a/app/Caches/IndexArticleList.php +++ b/app/Caches/IndexArticleList.php @@ -32,6 +32,7 @@ class IndexArticleList extends Cache $where = [ 'published' => ArticleModel::PUBLISH_APPROVED, + 'private' => 0, 'deleted' => 0, ]; 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/Controllers/ArticleController.php b/app/Http/Admin/Controllers/ArticleController.php index cc832423..d6d8a7b9 100644 --- a/app/Http/Admin/Controllers/ArticleController.php +++ b/app/Http/Admin/Controllers/ArticleController.php @@ -26,7 +26,7 @@ class ArticleController extends Controller ['type' => CategoryModel::TYPE_ARTICLE] ); - $this->response->redirect($location); + return $this->response->redirect($location); } /** diff --git a/app/Http/Admin/Controllers/Controller.php b/app/Http/Admin/Controllers/Controller.php index 451e245a..dc93c72c 100644 --- a/app/Http/Admin/Controllers/Controller.php +++ b/app/Http/Admin/Controllers/Controller.php @@ -8,6 +8,8 @@ namespace App\Http\Admin\Controllers; use App\Models\Audit as AuditModel; +use App\Models\Role as RoleModel; +use App\Models\User as UserModel; use App\Services\Auth\Admin as AdminAuth; use App\Traits\Response as ResponseTrait; use App\Traits\Security as SecurityTrait; @@ -21,6 +23,11 @@ class Controller extends \Phalcon\Mvc\Controller */ protected $authInfo; + /** + * @var UserModel + */ + protected $authUser; + use ResponseTrait; use SecurityTrait; @@ -41,10 +48,12 @@ class Controller extends \Phalcon\Mvc\Controller return false; } + $this->authUser = $this->getAuthUser(); + /** - * 管理员忽略权限检查 + * root用户忽略权限检查 */ - if ($this->authInfo['root'] == 1) { + if ($this->authUser->admin_role == RoleModel::ROLE_ROOT) { return true; } @@ -90,7 +99,7 @@ class Controller extends \Phalcon\Mvc\Controller public function initialize() { - $this->view->setVar('auth_info', $this->authInfo); + $this->view->setVar('auth_user', $this->authUser); } public function afterExecuteRoute(Dispatcher $dispatcher) @@ -99,8 +108,8 @@ class Controller extends \Phalcon\Mvc\Controller $audit = new AuditModel(); - $audit->user_id = $this->authInfo['id']; - $audit->user_name = $this->authInfo['name']; + $audit->user_id = $this->authUser->id; + $audit->user_name = $this->authUser->name; $audit->user_ip = $this->request->getClientAddress(); $audit->req_route = $this->router->getMatchedRoute()->getName(); $audit->req_path = $this->request->getServer('REQUEST_URI'); @@ -120,4 +129,14 @@ class Controller extends \Phalcon\Mvc\Controller return $auth->getAuthInfo(); } + protected function getAuthUser() + { + /** + * @var AdminAuth $auth + */ + $auth = $this->getDI()->get('auth'); + + return $auth->getCurrentUser(); + } + } diff --git a/app/Http/Admin/Controllers/CourseController.php b/app/Http/Admin/Controllers/CourseController.php index 9030307c..aab1a83f 100644 --- a/app/Http/Admin/Controllers/CourseController.php +++ b/app/Http/Admin/Controllers/CourseController.php @@ -26,7 +26,7 @@ class CourseController extends Controller ['type' => CategoryModel::TYPE_COURSE] ); - $this->response->redirect($location); + return $this->response->redirect($location); } /** diff --git a/app/Http/Admin/Controllers/HelpController.php b/app/Http/Admin/Controllers/HelpController.php index 147b7108..d81cb9e3 100644 --- a/app/Http/Admin/Controllers/HelpController.php +++ b/app/Http/Admin/Controllers/HelpController.php @@ -26,7 +26,7 @@ class HelpController extends Controller ['type' => CategoryModel::TYPE_HELP] ); - $this->response->redirect($location); + return $this->response->redirect($location); } /** diff --git a/app/Http/Admin/Controllers/PublicController.php b/app/Http/Admin/Controllers/PublicController.php index 1e7db339..7030f285 100644 --- a/app/Http/Admin/Controllers/PublicController.php +++ b/app/Http/Admin/Controllers/PublicController.php @@ -28,7 +28,7 @@ class PublicController extends \Phalcon\Mvc\Controller return $this->jsonError(['msg' => '会话已过期,请重新登录']); } - $this->response->redirect(['for' => 'admin.login']); + return $this->response->redirect(['for' => 'admin.login']); } /** diff --git a/app/Http/Admin/Controllers/QuestionController.php b/app/Http/Admin/Controllers/QuestionController.php index 4f28ed16..0bc2aebf 100644 --- a/app/Http/Admin/Controllers/QuestionController.php +++ b/app/Http/Admin/Controllers/QuestionController.php @@ -26,7 +26,7 @@ class QuestionController extends Controller ['type' => CategoryModel::TYPE_ARTICLE] ); - $this->response->redirect($location); + return $this->response->redirect($location); } /** diff --git a/app/Http/Admin/Controllers/SessionController.php b/app/Http/Admin/Controllers/SessionController.php index aa6b44ae..e554bf05 100644 --- a/app/Http/Admin/Controllers/SessionController.php +++ b/app/Http/Admin/Controllers/SessionController.php @@ -31,7 +31,7 @@ class SessionController extends \Phalcon\Mvc\Controller $user = $this->getCurrentUser(); if ($user->id > 0) { - $this->response->redirect(['for' => 'admin.index']); + return $this->response->redirect(['for' => 'admin.index']); } $sessionService = new SessionService(); @@ -66,7 +66,7 @@ class SessionController extends \Phalcon\Mvc\Controller $sessionService->logout(); - $this->response->redirect(['for' => 'admin.login']); + return $this->response->redirect(['for' => 'admin.login']); } } diff --git a/app/Http/Admin/Controllers/UserController.php b/app/Http/Admin/Controllers/UserController.php index 25dfb78f..7877b6bf 100644 --- a/app/Http/Admin/Controllers/UserController.php +++ b/app/Http/Admin/Controllers/UserController.php @@ -62,7 +62,7 @@ class UserController extends Controller $adminRole = $this->request->getPost('admin_role', 'int', 0); if ($adminRole == RoleModel::ROLE_ROOT) { - $this->response->redirect(['action' => 'list']); + return $this->response->redirect(['action' => 'list']); } $userService = new UserService(); @@ -91,7 +91,7 @@ class UserController extends Controller $adminRoles = $userService->getAdminRoles(); if ($user->admin_role == RoleModel::ROLE_ROOT) { - $this->response->redirect(['for' => 'admin.user.list']); + return $this->response->redirect(['for' => 'admin.user.list']); } $this->view->setVar('user', $user); @@ -119,7 +119,7 @@ class UserController extends Controller $adminRole = $this->request->getPost('admin_role', 'int', 0); if ($adminRole == RoleModel::ROLE_ROOT) { - $this->response->redirect(['action' => 'list']); + return $this->response->redirect(['action' => 'list']); } $type = $this->request->getPost('type', 'string', 'user'); 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/Services/PointGift.php b/app/Http/Admin/Services/PointGift.php index 23932e3f..4ce0d39e 100644 --- a/app/Http/Admin/Services/PointGift.php +++ b/app/Http/Admin/Services/PointGift.php @@ -25,7 +25,11 @@ class PointGift extends Service { $courseRepo = new CourseRepo(); - $where = ['free' => 0, 'published' => 1]; + $where = [ + 'free' => 0, + 'published' => 1, + 'deleted' => 0, + ]; $pager = $courseRepo->paginate($where, $sort = 'latest', 1, 10000); @@ -162,10 +166,22 @@ class PointGift extends Service $course = $validator->checkCourse($post['xm_course_id']); + $giftRepo = new PointGiftRepo(); + + $gift = $giftRepo->findByCourseId($course->id); + + if ($gift) return $gift; + $gift = new PointGiftModel(); $gift->type = PointGiftModel::TYPE_COURSE; $gift->name = $course->title; + $gift->cover = $course->cover; + $gift->attrs = [ + 'id' => $course->id, + 'title' => $course->title, + 'price' => $course->market_price, + ]; $gift->create(); diff --git a/app/Http/Admin/Services/Session.php b/app/Http/Admin/Services/Session.php index ff7bccab..cdffacd7 100644 --- a/app/Http/Admin/Services/Session.php +++ b/app/Http/Admin/Services/Session.php @@ -26,28 +26,30 @@ class Session extends Service public function login() { - $currentUser = $this->getCurrentUser(); + $user = $this->getCurrentUser(); - if ($currentUser->id > 0) { - $this->response->redirect(['for' => 'home.index']); + if ($user->id > 0) { + return $this->response->redirect(['for' => 'home.index']); } $post = $this->request->getPost(); - $accountValidator = new AccountValidator(); + $validator = new AccountValidator(); - $user = $accountValidator->checkAdminLogin($post['account'], $post['password']); + $user = $validator->checkAdminLogin($post['account'], $post['password']); - $captchaSettings = $this->getSettings('captcha'); + $validator->checkIfAllowLogin($user); + + $captcha = $this->getSettings('captcha'); /** * 验证码是一次性的,放到最后检查,减少第三方调用 */ - if ($captchaSettings['enabled'] == 1) { + if ($captcha['enabled'] == 1) { - $captchaValidator = new CaptchaValidator(); + $validator = new CaptchaValidator(); - $captchaValidator->checkCode($post['ticket'], $post['rand']); + $validator->checkCode($post['ticket'], $post['rand']); } $this->auth->saveAuthInfo($user); diff --git a/app/Http/Admin/Services/User.php b/app/Http/Admin/Services/User.php index 78b3c10b..97d7f694 100644 --- a/app/Http/Admin/Services/User.php +++ b/app/Http/Admin/Services/User.php @@ -18,6 +18,8 @@ use App\Repos\Account as AccountRepo; use App\Repos\Online as OnlineRepo; use App\Repos\Role as RoleRepo; use App\Repos\User as UserRepo; +use App\Services\Auth\Api as ApiAuth; +use App\Services\Auth\Home as HomeAuth; use App\Validators\Account as AccountValidator; use App\Validators\User as UserValidator; @@ -209,6 +211,10 @@ class User extends Service $user->update($data); + if ($user->locked == 1) { + $this->destroyUserLogin($user); + } + if ($oldAdminRole > 0) { $this->updateAdminUserCount($oldAdminRole); } @@ -271,6 +277,17 @@ class User extends Service $cache->rebuild($user->id); } + protected function destroyUserLogin(UserModel $user) + { + $homeAuth = new HomeAuth(); + + $homeAuth->logoutClients($user->id); + + $apiAuth = new ApiAuth(); + + $apiAuth->logoutClients($user->id); + } + protected function updateAdminUserCount($roleId) { $roleRepo = new RoleRepo(); diff --git a/app/Http/Admin/Views/chapter/lessons_offline.volt b/app/Http/Admin/Views/chapter/lessons_offline.volt index 6032519c..91b9fa67 100644 --- a/app/Http/Admin/Views/chapter/lessons_offline.volt +++ b/app/Http/Admin/Views/chapter/lessons_offline.volt @@ -15,7 +15,6 @@