diff --git a/.gitignore b/.gitignore index 0da71a39..aff1e894 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ /db/migrations/schema.php /public/robots.txt /public/sitemap.xml +/public/h5 *KgTest* diff --git a/CHANGELOG.md b/CHANGELOG.md index 95530986..af6041a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### [v1.2.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.0)(2020-11-25) +- 增加客户端api +- 代码优化以及问题修复 + ### [v1.1.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.1.0)(2020-10-08) - 增加运营统计功能 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 1afa4e89..00000000 --- a/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -使用协议 - -1. 本系统属于强业务类型,非通用类库框架,不适合再次衍生发布。 -2. 在保留我们版权标识的前提下,用户可以修改以满足自己的需求,可以用于商业用途。 -3. 有限社区支持,用户对自己的行为负责。 \ No newline at end of file diff --git a/README.md b/README.md index abfadbd8..1d264fff 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,45 @@ ## 酷瓜云课堂 +![酷瓜云网课GPL协议开源](https://images.gitee.com/uploads/images/2020/1127/092621_3805cf8f_23592.png) + #### 项目介绍 -酷瓜云课堂,依托腾讯云基础服务架构,采用 C 扩展框架 Phalcon 开发,致力网络教育软件。 +酷瓜云课堂,依托腾讯云基础服务架构,采用C扩展框架Phalcon开发,GPL-2.0开源协议,致力开源网课系统,开源网校系统,开源在线教育系统。 + +![](https://img.shields.io/static/v1?label=release&message=1.2.0&color=blue) +![](https://img.shields.io/static/v1?label=stars&message=101&color=blue) +![](https://img.shields.io/static/v1?label=forks&message=40&color=blue) +![](https://img.shields.io/static/v1?label=license&message=GPL-2.0&color=blue) #### 系统功能 实现了点播、直播、专栏、会员、微聊等,是一个完整的产品,具体功能我也不想写一大堆,自己体验吧! -- [前台演示](https://ctc.koogua.com) -- [后台演示](https://ctc.koogua.com/admin) - -帐号:100015@163.com / 123456 (前后台通用) - 友情提示: - 系统配置低(1核 1G 1M 跑多个容器),切莫压测 - 课程数据来源于网络(无实质内容),切莫购买 - 管理后台已禁止数据提交,私密配置已过滤 +演示帐号:**13507083515 / 123456** (前后台通用) + +桌面端演示: + +- [前台演示](https://ctc.koogua.com) +- [后台演示](https://ctc.koogua.com/admin) + +移动端演示: + +![移动端二维码](https://images.gitee.com/uploads/images/2020/1127/093203_265221a2_23592.png) + +支付流程演示: + +- [MySQL提升课程全面讲解MySQL架构设计(0.01元)](https://ctc.koogua.com/order/confirm?item_id=1390&item_type=1) +- [Nginx入门到实践Nginx中间件(0.01元)](https://ctc.koogua.com/order/confirm?item_id=1286&item_type=1) +- [数据库与中间件的基础必修课(0.02元)](https://ctc.koogua.com/order/confirm?item_id=80&item_type=2) + +Tips: 测试支付请用手机号注册一个新账户,以便接收订单通知,以及避免课程无法购买 + #### 项目组件 - 后台框架:[phalcon 3.4.5](https://phalcon.io) @@ -27,14 +48,6 @@ - 即时通讯:[workerman 3.5.22](https://workerman.net) - 基础依赖:[php7.3](https://php.net), [mysql5.7](https://mysql.com), [redis5.0](https://redis.io) -#### 使用协议 - -虽然尝试了解过开源协议,但是理解的模棱两可,干脆用自己的协议吧。 - -1. 本系统属于强业务类型,非通用类库框架,不适合再次衍生发布。 -2. 在保留我们版权标识的前提下,用户可以修改以满足自己的需求,可以用于商业用途。 -3. 有限社区支持,用户对自己的行为负责。 - #### 安装指南 - [运行环境搭建](https://gitee.com/koogua/course-tencent-cloud-docker) @@ -43,20 +56,13 @@ #### 开发计划 - 桌面端:进行中 -- 移动端:待启动 +- 移动端:进行中 - 小程序:待启动 #### 意见反馈 - [在线反馈](https://gitee.com/koogua/course-tencent-cloud/issues)(推荐) -- QQ邮箱: 76632555@qq.com -- QQ群组: 787363898 - -#### 加入我们 - -这是一个创业项目,个人能力和精力有限,要兼顾产品规划以及开发,还要处理很多琐碎事情。目前在南山科技园某个众创空间,希望有 **深圳前端同学** 加入我们。 - -联系邮箱:76632555@qq.com +- QQ交流群: 787363898 #### 通过这个项目能学到什么? diff --git a/app/Builders/CategoryTreeList.php b/app/Builders/CategoryTreeList.php index dbc32de9..944b5236 100644 --- a/app/Builders/CategoryTreeList.php +++ b/app/Builders/CategoryTreeList.php @@ -11,7 +11,7 @@ class CategoryTreeList extends Builder public function handle($type) { - $topCategories = $this->findChildCategories($type, 0); + $topCategories = $this->findTopCategories($type); if ($topCategories->count() == 0) { return []; @@ -32,7 +32,7 @@ class CategoryTreeList extends Builder protected function handleChildren(CategoryModel $category) { - $subCategories = $this->findChildCategories($category->type, $category->id); + $subCategories = $this->findChildCategories($category->id); if ($subCategories->count() == 0) { return []; @@ -51,24 +51,31 @@ class CategoryTreeList extends Builder } /** - * @param string $type + * @param int $type + * @return ResultsetInterface|Resultset|CategoryModel[] + */ + protected function findTopCategories($type) + { + $query = CategoryModel::query(); + + $query->where('parent_id = 0'); + $query->andWhere('published = 1'); + $query->andWhere('type = :type:', ['type' => $type]); + $query->orderBy('priority ASC'); + + return $query->execute(); + } + + /** * @param int $parentId * @return ResultsetInterface|Resultset|CategoryModel[] */ - protected function findChildCategories($type = 'course', $parentId = 0) + protected function findChildCategories($parentId) { $query = CategoryModel::query(); $query->where('published = 1'); - - if ($type) { - $query->andWhere('type = :type:', ['type' => $type]); - } - - if ($parentId) { - $query->andWhere('parent_id = :parent_id:', ['parent_id' => $parentId]); - } - + $query->andWhere('parent_id = :parent_id:', ['parent_id' => $parentId]); $query->orderBy('priority ASC'); return $query->execute(); diff --git a/app/Builders/ImGroupUserList.php b/app/Builders/ImGroupUserList.php index 917eecd6..467db5a6 100644 --- a/app/Builders/ImGroupUserList.php +++ b/app/Builders/ImGroupUserList.php @@ -36,7 +36,7 @@ class ImGroupUserList extends Builder $userRepo = new UserRepo(); - $columns = ['id', 'name', 'avatar', 'title', 'about', 'vip']; + $columns = ['id', 'name', 'avatar', 'title', 'about', 'vip', 'gender', 'area']; $users = $userRepo->findByIds($ids, $columns); diff --git a/app/Builders/LiveList.php b/app/Builders/LiveList.php new file mode 100644 index 00000000..a331653e --- /dev/null +++ b/app/Builders/LiveList.php @@ -0,0 +1,90 @@ +getCourses($lives); + + foreach ($lives as $key => $live) { + $lives[$key]['course'] = $courses[$live['course_id']] ?? new \stdClass(); + } + + return $lives; + } + + public function handleChapters(array $lives) + { + $chapters = $this->getChapters($lives); + + foreach ($lives as $key => $live) { + $lives[$key]['chapter'] = $chapters[$live['chapter_id']] ?? new \stdClass(); + } + + return $lives; + } + + public function getCourses(array $lives) + { + $courseIds = kg_array_column($lives, 'course_id'); + + $courseRepo = new CourseRepo(); + + $courses = $courseRepo->findByIds($courseIds, ['id', 'title', 'cover', 'teacher_id']); + + $teacherIds = kg_array_column($courses->toArray(), 'teacher_id'); + + $userRepo = new UserRepo(); + + $users = $userRepo->findByIds($teacherIds, ['id', 'name', 'title', 'avatar', 'about']); + + $baseUrl = kg_cos_url(); + + $teachers = []; + + foreach ($users->toArray() as $user) { + $user['avatar'] = $baseUrl . $user['avatar']; + $teachers[$user['id']] = $user; + } + + $result = []; + + foreach ($courses->toArray() as $course) { + $course['cover'] = $baseUrl . $course['cover']; + $course['teacher'] = $teachers[$course['teacher_id']] ?? new \stdClass(); + $result[$course['id']] = [ + 'id' => $course['id'], + 'title' => $course['title'], + 'cover' => $course['cover'], + 'teacher' => $course['teacher'], + ]; + } + + return $result; + } + + public function getChapters(array $lives) + { + $ids = kg_array_column($lives, 'chapter_id'); + + $chapterRepo = new ChapterRepo(); + + $chapters = $chapterRepo->findByIds($ids, ['id', 'title']); + + $result = []; + + foreach ($chapters->toArray() as $chapter) { + $result[$chapter['id']] = $chapter; + } + + return $result; + } + +} diff --git a/app/Caches/App.php b/app/Caches/App.php new file mode 100644 index 00000000..479ca191 --- /dev/null +++ b/app/Caches/App.php @@ -0,0 +1,31 @@ +lifetime; + } + + public function getKey($id = null) + { + return "app:{$id}"; + } + + public function getContent($id = null) + { + $appRepo = new AppRepo(); + + $result = $appRepo->findByAppKey($id); + + return $result ?: null; + } + +} diff --git a/app/Console/Tasks/MaintainTask.php b/app/Console/Tasks/MaintainTask.php index f360db8f..9ac60365 100644 --- a/app/Console/Tasks/MaintainTask.php +++ b/app/Console/Tasks/MaintainTask.php @@ -4,6 +4,9 @@ namespace App\Console\Tasks; use App\Caches\IndexFreeCourseList as IndexFreeCourseListCache; use App\Caches\IndexNewCourseList as IndexNewCourseListCache; +use App\Caches\IndexSimpleFreeCourseList as IndexSimpleFreeCourseListCache; +use App\Caches\IndexSimpleNewCourseList as IndexSimpleNewCourseListCache; +use App\Caches\IndexSimpleVipCourseList as IndexSimpleVipCourseListCache; use App\Caches\IndexVipCourseList as IndexVipCourseListCache; use App\Http\Admin\Services\Setting as SettingService; use App\Library\Utils\Password as PasswordUtil; @@ -22,20 +25,41 @@ class MaintainTask extends Task { $section = $params[0] ?? null; + $site = $this->getSettings('site'); + + $type = $site['index_tpl_type'] ?: 'full'; + if (!$section || $section == 'new_course') { - $cache = new IndexNewCourseListCache(); - $cache->rebuild(); + if ($type == 'full') { + $cache = new IndexNewCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleNewCourseListCache(); + $cache->rebuild(); + } } if (!$section || $section == 'free_course') { - $cache = new IndexFreeCourseListCache(); - $cache->rebuild(); + if ($type == 'full') { + $cache = new IndexFreeCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleFreeCourseListCache(); + $cache->rebuild(); + } } if (!$section || $section == 'vip_course') { - $cache = new IndexVipCourseListCache(); - $cache->rebuild(); + if ($type == 'full') { + $cache = new IndexVipCourseListCache(); + $cache->rebuild(); + } else { + $cache = new IndexSimpleVipCourseListCache(); + $cache->rebuild(); + } } + + echo 'rebuild index course cache success' . PHP_EOL; } /** diff --git a/app/Console/Tasks/Task.php b/app/Console/Tasks/Task.php index 6478ed18..350cb5ec 100644 --- a/app/Console/Tasks/Task.php +++ b/app/Console/Tasks/Task.php @@ -41,7 +41,7 @@ class Task extends \Phalcon\Cli\Task { $appService = new AppService(); - return $appService->getLogger($section); + return $appService->getSettings($section); } } diff --git a/app/Console/Tasks/UpgradeTask.php b/app/Console/Tasks/UpgradeTask.php index 13bb53fb..8700703d 100644 --- a/app/Console/Tasks/UpgradeTask.php +++ b/app/Console/Tasks/UpgradeTask.php @@ -43,7 +43,6 @@ class UpgradeTask extends Task public function resetAnnotationAction() { $config = $this->getConfig(); - $redis = $this->getRedis(); $dbIndex = $config->path('annotation.db'); @@ -56,9 +55,7 @@ class UpgradeTask extends Task echo "start reset annotation..." . PHP_EOL; if (count($keys) > 0) { - $keys = $this->handlePhKeys($keys); - $redis->del(...$keys); $redis->del($statsKey); } @@ -74,7 +71,6 @@ class UpgradeTask extends Task public function resetMetadataAction() { $config = $this->getConfig(); - $redis = $this->getRedis(); $dbIndex = $config->path('metadata.db'); @@ -87,9 +83,7 @@ class UpgradeTask extends Task echo "start reset metadata..." . PHP_EOL; if (count($keys) > 0) { - $keys = $this->handlePhKeys($keys); - $redis->del(...$keys); $redis->del($statsKey); } diff --git a/app/Http/Admin/Controllers/UploadController.php b/app/Http/Admin/Controllers/UploadController.php index d180c70a..878b784a 100644 --- a/app/Http/Admin/Controllers/UploadController.php +++ b/app/Http/Admin/Controllers/UploadController.php @@ -19,16 +19,16 @@ class UploadController extends Controller $file = $service->uploadCoverImage(); - if ($file) { - return $this->jsonSuccess([ - 'data' => [ - 'src' => $service->getImageUrl($file->path), - 'title' => $file->name, - ] - ]); - } else { + if (!$file) { return $this->jsonError(['msg' => '上传文件失败']); } + + $data = [ + 'src' => $service->getImageUrl($file->path), + 'title' => $file->name, + ]; + + return $this->jsonSuccess(['data' => $data]); } /** @@ -40,16 +40,16 @@ class UploadController extends Controller $file = $service->uploadAvatarImage(); - if ($file) { - return $this->jsonSuccess([ - 'data' => [ - 'src' => $service->getImageUrl($file->path), - 'title' => $file->name, - ] - ]); - } else { + if (!$file) { return $this->jsonError(['msg' => '上传文件失败']); } + + $data = [ + 'src' => $service->getImageUrl($file->path), + 'title' => $file->name, + ]; + + return $this->jsonSuccess(['data' => $data]); } /** @@ -61,16 +61,16 @@ class UploadController extends Controller $file = $service->uploadContentImage(); - if ($file) { - return $this->jsonSuccess([ - 'data' => [ - 'src' => $service->getImageUrl($file->path), - 'title' => $file->name, - ] - ]); - } else { + if (!$file) { return $this->jsonError(['msg' => '上传文件失败']); } + + $data = [ + 'src' => $service->getImageUrl($file->path), + 'title' => $file->name, + ]; + + return $this->jsonSuccess(['data' => $data]); } /** diff --git a/app/Http/Admin/Services/AuthMenu.php b/app/Http/Admin/Services/AuthMenu.php index 8abcfdc1..1d69cd21 100644 --- a/app/Http/Admin/Services/AuthMenu.php +++ b/app/Http/Admin/Services/AuthMenu.php @@ -77,7 +77,7 @@ class AuthMenu extends Component foreach ($routeIdMapping as $key => $value) { $ids = explode('-', $value); - if (in_array($key, $this->authInfo['routes'])) { + if (is_array($this->authInfo['routes']) && in_array($key, $this->authInfo['routes'])) { $owned1stLevelIds[] = $ids[0]; $owned2ndLevelIds[] = $ids[0] . '-' . $ids[1]; $owned3rdLevelIds[] = $value; diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index 86b54761..43fb64fd 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -671,7 +671,7 @@ class AuthNode extends Service { return [ 'id' => '5', - 'title' => '系统配置', + 'title' => '系统管理', 'children' => [ [ 'id' => '5-1', diff --git a/app/Http/Admin/Views/public/login.volt b/app/Http/Admin/Views/public/login.volt index 9b51cbd7..adcbcbc1 100644 --- a/app/Http/Admin/Views/public/login.volt +++ b/app/Http/Admin/Views/public/login.volt @@ -29,7 +29,6 @@ {% endif %}
- diff --git a/app/Http/Admin/Views/setting/storage.volt b/app/Http/Admin/Views/setting/storage.volt index 34ab1e62..9b1d2d6e 100644 --- a/app/Http/Admin/Views/setting/storage.volt +++ b/app/Http/Admin/Views/setting/storage.volt @@ -55,6 +55,10 @@ cover_270 mageMogr2/thumbnail/270x/interlace/0 + + content_800 + mageMogr2/thumbnail/800x/interlace/0 + slide_1100 imageMogr2/thumbnail/1100x/interlace/0 diff --git a/app/Http/Api/Controllers/AccountController.php b/app/Http/Api/Controllers/AccountController.php new file mode 100644 index 00000000..6ce03879 --- /dev/null +++ b/app/Http/Api/Controllers/AccountController.php @@ -0,0 +1,113 @@ +register(); + + return $this->jsonSuccess(['token' => $token]); + } + + /** + * @Post("/password/login", name="api.account.register") + */ + public function loginByPasswordAction() + { + $service = new AccountService(); + + $token = $service->loginByPassword(); + + return $this->jsonSuccess(['token' => $token]); + } + + /** + * @Post("/verify/login", name="api.account.verify_login") + */ + public function loginByVerifyAction() + { + $service = new AccountService(); + + $token = $service->loginByVerify(); + + return $this->jsonSuccess(['token' => $token]); + } + + /** + * @Get("/logout", name="api.account.logout") + */ + public function logoutAction() + { + $service = new AccountService(); + + $service->logout(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/password/reset", name="api.account.reset_pwd") + */ + public function resetPasswordAction() + { + $service = new PasswordResetService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/phone/update", name="api.account.update_phone") + */ + public function updatePhoneAction() + { + $service = new PhoneUpdateService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/email/update", name="api.account.update_email") + */ + public function updateEmailAction() + { + $service = new EmailUpdateService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/password/update", name="api.account.update_pwd") + */ + public function updatePasswordAction() + { + $service = new PasswordUpdateService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/ChapterController.php b/app/Http/Api/Controllers/ChapterController.php new file mode 100644 index 00000000..d990ac62 --- /dev/null +++ b/app/Http/Api/Controllers/ChapterController.php @@ -0,0 +1,83 @@ +handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/resources", name="api.chapter.resourses") + */ + public function resourcesAction($id) + { + $service = new ChapterResourceListService(); + + $resources = $service->handle($id); + + return $this->jsonSuccess(['resources' => $resources]); + } + + /** + * @Get("/{id:[0-9]+}/info", name="api.chapter.info") + */ + public function infoAction($id) + { + $service = new ChapterInfoService(); + + $chapter = $service->handle($id); + + $owned = $chapter['me']['owned'] ?? false; + + if (!$owned) { + return $this->jsonError(['msg' => '没有访问章节权限']); + } + + return $this->jsonSuccess(['chapter' => $chapter]); + } + + /** + * @Post("/{id:[0-9]+}/like", name="api.chapter.like") + */ + public function likeAction($id) + { + $service = new ChapterLikeService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/learning", name="api.chapter.learning") + */ + public function learningAction($id) + { + $service = new ChapterLearningService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/ConsultController.php b/app/Http/Api/Controllers/ConsultController.php new file mode 100644 index 00000000..79f3e03c --- /dev/null +++ b/app/Http/Api/Controllers/ConsultController.php @@ -0,0 +1,97 @@ +handle($id); + + return $this->jsonSuccess(['consult' => $consult]); + } + + /** + * @Post("/create", name="api.consult.create") + */ + public function createAction() + { + $service = new ConsultCreateService(); + + $consult = $service->handle(); + + $service = new ConsultInfoService(); + + $consult = $service->handle($consult->id); + + return $this->jsonSuccess(['consult' => $consult]); + } + + /** + * @Post("/{id:[0-9]+}/update", name="api.consult.update") + */ + public function updateAction($id) + { + $service = new ConsultUpdateService(); + + $consult = $service->handle($id); + + $service = new ConsultInfoService(); + + $consult = $service->handle($consult->id); + + return $this->jsonSuccess(['consult' => $consult]); + } + + /** + * @Post("/{id:[0-9]+}/delete", name="api.consult.delete") + */ + public function deleteAction($id) + { + $service = new ConsultDeleteService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/like", name="api.consult.like") + */ + public function likeAction($id) + { + $service = new ConsultLikeService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/unlike", name="api.consult.unlike") + */ + public function unlikeAction($id) + { + $service = new ConsultLikeService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/Controller.php b/app/Http/Api/Controllers/Controller.php index 24ae2d03..d33b4eeb 100644 --- a/app/Http/Api/Controllers/Controller.php +++ b/app/Http/Api/Controllers/Controller.php @@ -2,6 +2,7 @@ namespace App\Http\Api\Controllers; +use App\Services\Auth\Api as AppAuth; use App\Traits\Response as ResponseTrait; use App\Traits\Security as SecurityTrait; use Phalcon\Mvc\Dispatcher; @@ -14,7 +15,25 @@ class Controller extends \Phalcon\Mvc\Controller public function beforeExecuteRoute(Dispatcher $dispatcher) { - $this->checkRateLimit(); + if ($this->request->getHeader('Origin')) { + $this->setCors(); + } + + if (!$this->request->isOptions()) { + $this->checkRateLimit(); + } + + return true; + } + + protected function getAuthUser() + { + /** + * @var AppAuth $auth + */ + $auth = $this->getDI()->get('auth'); + + return $auth->getCurrentUser(); } } diff --git a/app/Http/Api/Controllers/CourseController.php b/app/Http/Api/Controllers/CourseController.php new file mode 100644 index 00000000..a130533b --- /dev/null +++ b/app/Http/Api/Controllers/CourseController.php @@ -0,0 +1,128 @@ +handle(); + + return $this->jsonSuccess(['categories' => $categories]); + } + + /** + * @Get("/list", name="api.course.list") + */ + public function listAction() + { + $service = new CourseListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/info", name="api.course.info") + */ + public function infoAction($id) + { + $service = new CourseInfoService(); + + $course = $service->handle($id); + + return $this->jsonSuccess(['course' => $course]); + } + + /** + * @Get("/{id:[0-9]+}/chapters", name="api.course.chapters") + */ + public function chaptersAction($id) + { + $service = new CourseChapterListService(); + + $chapters = $service->handle($id); + + return $this->jsonSuccess(['chapters' => $chapters]); + } + + /** + * @Get("/{id:[0-9]+}/packages", name="api.course.packages") + */ + public function packagesAction($id) + { + $service = new CoursePackageListService(); + + $packages = $service->handle($id); + + return $this->jsonSuccess(['packages' => $packages]); + } + + /** + * @Get("/{id:[0-9]+}/consults", name="api.course.consults") + */ + public function consultsAction($id) + { + $service = new CourseConsultListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/reviews", name="api.course.reviews") + */ + public function reviewsAction($id) + { + $service = new CourseReviewListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Post("/{id:[0-9]+}/favorite", name="api.course.favorite") + */ + public function favoriteAction($id) + { + $service = new CourseFavoriteService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/unfavorite", name="api.course.unfavorite") + */ + public function unfavoriteAction($id) + { + $service = new CourseFavoriteService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/HelpController.php b/app/Http/Api/Controllers/HelpController.php new file mode 100644 index 00000000..c64e78da --- /dev/null +++ b/app/Http/Api/Controllers/HelpController.php @@ -0,0 +1,38 @@ +handle(); + + return $this->jsonSuccess(['helps' => $helps]); + } + + /** + * @Get("/{id:[0-9]+}/info", name="api.help.info") + */ + public function infoAction($id) + { + $service = new HelpInfoService(); + + $help = $service->handle($id); + + return $this->jsonSuccess(['help' => $help]); + } + +} diff --git a/app/Http/Api/Controllers/ImGroupController.php b/app/Http/Api/Controllers/ImGroupController.php new file mode 100644 index 00000000..330d7c31 --- /dev/null +++ b/app/Http/Api/Controllers/ImGroupController.php @@ -0,0 +1,51 @@ +handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/info", name="api.im_group.info") + */ + public function infoAction($id) + { + $service = new GroupInfoService(); + + $group = $service->handle($id); + + return $this->jsonSuccess(['group' => $group]); + } + + /** + * @Get("/{id:[0-9]+}/users", name="api.im_group.users") + */ + public function usersAction($id) + { + $service = new GroupUserListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + +} diff --git a/app/Http/Api/Controllers/IndexController.php b/app/Http/Api/Controllers/IndexController.php index b7c9f968..1aba3a64 100644 --- a/app/Http/Api/Controllers/IndexController.php +++ b/app/Http/Api/Controllers/IndexController.php @@ -2,39 +2,63 @@ namespace App\Http\Api\Controllers; +use App\Caches\IndexSimpleFreeCourseList; +use App\Caches\IndexSimpleNewCourseList; +use App\Caches\IndexSimpleVipCourseList; +use App\Caches\IndexSlideList; + /** - * @RoutePrefix("/api") + * @RoutePrefix("/api/index") */ class IndexController extends Controller { /** - * @Get("/", name="api.index") + * @Get("/slides", name="api.index.slides") */ - public function indexAction() + public function slidesAction() { - return $this->jsonSuccess(['data' => 'ok']); + $cache = new IndexSlideList(); + + $slides = $cache->get(); + + return $this->jsonSuccess(['slides' => $slides]); } /** - * @Get("/routes", name="api.routes") + * @Get("/courses/new", name="api.index.new_courses") */ - public function routesAction() + public function newCoursesAction() { - $definitions = []; + $cache = new IndexSimpleNewCourseList(); - $routes = $this->router->getRoutes(); + $courses = $cache->get(); - foreach ($routes as $route) { - if (strpos($route->getPattern(), '/api') !== false) { - $definitions[] = [ - 'pattern' => $route->getPattern(), - 'methods' => $route->getHttpMethods(), - ]; - } - } + return $this->jsonSuccess(['courses' => $courses]); + } - return $this->jsonSuccess(['routes' => $definitions]); + /** + * @Get("/courses/free", name="api.index.free_courses") + */ + public function freeCoursesAction() + { + $cache = new IndexSimpleFreeCourseList(); + + $courses = $cache->get(); + + return $this->jsonSuccess(['courses' => $courses]); + } + + /** + * @Get("/courses/vip", name="api.index.vip_courses") + */ + public function vipCoursesAction() + { + $cache = new IndexSimpleVipCourseList(); + + $courses = $cache->get(); + + return $this->jsonSuccess(['courses' => $courses]); } } diff --git a/app/Http/Api/Controllers/LiveController.php b/app/Http/Api/Controllers/LiveController.php new file mode 100644 index 00000000..520fb26b --- /dev/null +++ b/app/Http/Api/Controllers/LiveController.php @@ -0,0 +1,86 @@ +handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/chats", name="api.live.chats") + */ + public function chatsAction($id) + { + $service = new LiveChapterService(); + + $chats = $service->getRecentChats($id); + + return $this->jsonSuccess(['chats' => $chats]); + } + + /** + * @Get("/{id:[0-9]+}/stats", name="api.live.stats") + */ + public function statsAction($id) + { + $service = new LiveChapterService(); + + $stats = $service->getStats($id); + + return $this->jsonSuccess(['stats' => $stats]); + } + + /** + * @Get("/{id:[0-9]+}/status", name="api.live.status") + */ + public function statusAction($id) + { + $service = new LiveChapterService(); + + $status = $service->getStatus($id); + + return $this->jsonSuccess(['status' => $status]); + } + + /** + * @Post("/{id:[0-9]+}/user/bind", name="api.live.bind_user") + */ + public function bindUserAction($id) + { + $service = new LiveChapterService(); + + $service->bindUser($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/msg/send", name="api.live.send_msg") + */ + public function sendMessageAction($id) + { + $service = new LiveChapterService(); + + $message = $service->sendMessage($id); + + return $this->jsonSuccess(['message' => $message]); + } + +} diff --git a/app/Http/Api/Controllers/OrderController.php b/app/Http/Api/Controllers/OrderController.php new file mode 100644 index 00000000..5aeb68fe --- /dev/null +++ b/app/Http/Api/Controllers/OrderController.php @@ -0,0 +1,76 @@ +request->getQuery('sn', 'string'); + + $service = new OrderInfoService(); + + $order = $service->handle($sn); + + return $this->jsonSuccess(['order' => $order]); + } + + /** + * @Get("/confirm", name="api.order.confirm") + */ + public function confirmAction() + { + $itemId = $this->request->getQuery('item_id', 'int'); + $itemType = $this->request->getQuery('item_type', 'int'); + + $service = new OrderConfirmService(); + + $confirm = $service->handle($itemId, $itemType); + + return $this->jsonSuccess(['confirm' => $confirm]); + + } + + /** + * @Post("/create", name="api.order.create") + */ + public function createAction() + { + $service = new OrderCreateService(); + + $order = $service->handle(); + + $service = new OrderInfoService(); + + $order = $service->handle($order->sn); + + return $this->jsonSuccess(['order' => $order]); + } + + /** + * @Post("/cancel", name="api.order.cancel") + */ + public function cancelAction() + { + $sn = $this->request->getPost('sn', 'string'); + + $service = new OrderCancelService(); + + $order = $service->handle($sn); + + return $this->jsonSuccess(['order' => $order]); + } + +} diff --git a/app/Http/Api/Controllers/PageController.php b/app/Http/Api/Controllers/PageController.php new file mode 100644 index 00000000..255e82f4 --- /dev/null +++ b/app/Http/Api/Controllers/PageController.php @@ -0,0 +1,25 @@ +handle($id); + + return $this->jsonSuccess(['page' => $page]); + } + +} diff --git a/app/Http/Api/Controllers/PublicController.php b/app/Http/Api/Controllers/PublicController.php index f2f0a85c..31cd3577 100644 --- a/app/Http/Api/Controllers/PublicController.php +++ b/app/Http/Api/Controllers/PublicController.php @@ -2,14 +2,107 @@ namespace App\Http\Api\Controllers; +use App\Services\Logic\Reward\OptionList as RewardOptionList; +use App\Services\Logic\Vip\OptionList as VipOptionList; +use App\Services\Service as AppService; use App\Traits\Response as ResponseTrait; /** * @RoutePrefix("/api") */ -class PublicController extends \Phalcon\Mvc\Controller +class PublicController extends Controller { use ResponseTrait; + /** + * @Options("/{match:(.*)}", name="api.match_options") + */ + public function corsAction() + { + $this->response->setStatusCode(204); + + return $this->response; + } + + /** + * @Get("/now", name="api.public.now") + */ + public function nowAction() + { + return $this->jsonSuccess(['now' => time()]); + } + + /** + * @Get("/socket/info", name="api.public.socket_info") + */ + public function socketInfoAction() + { + $service = new AppService(); + + $websocket = $service->getConfig()->get('websocket'); + + $content = []; + + if ($this->request->isSecure()) { + $content['connect_url'] = sprintf('wss://%s/wss', $this->request->getHttpHost()); + } else { + $content['connect_url'] = sprintf('ws://%s', $websocket->connect_address); + } + + $content['ping_interval'] = $websocket->ping_interval; + + return $this->jsonSuccess(['socket' => $content]); + } + + /** + * @Get("/site/info", name="api.public.site_info") + */ + public function siteInfoAction() + { + $service = new AppService(); + + $site = $service->getSettings('site'); + + return $this->jsonSuccess(['site' => $site]); + } + + /** + * @Get("/captcha/info", name="api.public.captcha_info") + */ + public function captchaInfoAction() + { + $service = new AppService(); + + $captcha = $service->getSettings('captcha'); + + unset($captcha['secret_key']); + + return $this->jsonSuccess(['captcha' => $captcha]); + } + + /** + * @Get("/reward/options", name="api.public.reward_options") + */ + public function rewardOptionsAction() + { + $service = new RewardOptionList(); + + $options = $service->handle(); + + return $this->jsonSuccess(['options' => $options]); + } + + /** + * @Get("/vip/options", name="api.public.vip_options") + */ + public function vipOptionsAction() + { + $service = new VipOptionList(); + + $options = $service->handle(); + + return $this->jsonSuccess(['options' => $options]); + } + } diff --git a/app/Http/Api/Controllers/RefundController.php b/app/Http/Api/Controllers/RefundController.php new file mode 100644 index 00000000..018cf1cf --- /dev/null +++ b/app/Http/Api/Controllers/RefundController.php @@ -0,0 +1,78 @@ +request->getQuery('sn', 'string'); + + $service = new RefundConfirmService(); + + $confirm = $service->handle($sn); + + return $this->jsonSuccess(['confirm' => $confirm]); + } + + /** + * @Get("/info", name="api.refund.info") + */ + public function infoAction() + { + $sn = $this->request->getQuery('sn', 'string'); + + $service = new RefundInfoService(); + + $refund = $service->handle($sn); + + return $this->jsonSuccess(['refund' => $refund]); + } + + /** + * @Post("/create", name="api.refund.create") + */ + public function createAction() + { + $service = new RefundCreateService(); + + $refund = $service->handle(); + + $service = new RefundInfoService(); + + $refund = $service->handle($refund->sn); + + return $this->jsonSuccess(['refund' => $refund]); + } + + /** + * @Post("/cancel", name="api.refund.cancel") + */ + public function cancelAction() + { + $sn = $this->request->getPost('sn', 'string'); + + $service = new RefundCancelService(); + + $service->handle($sn); + + $service = new RefundInfoService(); + + $refund = $service->handle($sn); + + return $this->jsonSuccess(['refund' => $refund]); + } + +} diff --git a/app/Http/Api/Controllers/ReviewController.php b/app/Http/Api/Controllers/ReviewController.php new file mode 100644 index 00000000..7030ccbf --- /dev/null +++ b/app/Http/Api/Controllers/ReviewController.php @@ -0,0 +1,97 @@ +handle($id); + + return $this->jsonSuccess(['review' => $review]); + } + + /** + * @Post("/create", name="api.order.create") + */ + public function createAction() + { + $service = new ReviewCreateService(); + + $review = $service->handle(); + + $service = new ReviewInfoService(); + + $review = $service->handle($review->id); + + return $this->jsonSuccess(['review' => $review]); + } + + /** + * @Post("/{id:[0-9]+}/update", name="api.review.update") + */ + public function updateAction($id) + { + $service = new ReviewUpdateService(); + + $service->handle($id); + + $service = new ReviewInfoService(); + + $review = $service->handle($id); + + return $this->jsonSuccess(['review' => $review]); + } + + /** + * @Post("/{id:[0-9]+}/delete", name="api.review.delete") + */ + public function deleteAction($id) + { + $service = new ReviewDeleteService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/like", name="api.review.like") + */ + public function likeAction($id) + { + $service = new ReviewLikeService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + + /** + * @Post("/{id:[0-9]+}/unlike", name="api.review.unlike") + */ + public function unlikeAction($id) + { + $service = new ReviewLikeService(); + + $service->handle($id); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/SearchController.php b/app/Http/Api/Controllers/SearchController.php new file mode 100644 index 00000000..3f25c42a --- /dev/null +++ b/app/Http/Api/Controllers/SearchController.php @@ -0,0 +1,61 @@ +request->get('query', ['trim', 'string']); + $type = $this->request->get('type', ['trim', 'string'], 'course'); + + $pager = [ + 'total_pages' => 0, + 'total_items' => 0, + 'items' => [], + ]; + + if (empty($query)) { + return $this->jsonSuccess(['pager' => $pager]); + } + + $service = $this->getSearchService($type); + + $pager = $service->search(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @param string $type + * @return CourseSearchService|GroupSearchService|UserSearchService + */ + protected function getSearchService($type) + { + switch ($type) { + case 'group': + $service = new GroupSearchService(); + break; + case 'user': + $service = new UserSearchService(); + break; + default: + $service = new CourseSearchService(); + break; + } + + return $service; + } + +} diff --git a/app/Http/Api/Controllers/TeacherController.php b/app/Http/Api/Controllers/TeacherController.php new file mode 100644 index 00000000..f9c000a7 --- /dev/null +++ b/app/Http/Api/Controllers/TeacherController.php @@ -0,0 +1,51 @@ +handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/info", name="api.teacher.info") + */ + public function infoAction($id) + { + $service = new TeacherInfoService(); + + $teacher = $service->handle($id); + + return $this->jsonSuccess(['teacher' => $teacher]); + } + + /** + * @Get("/{id:[0-9]+}/courses", name="api.teacher.courses") + */ + public function coursesAction($id) + { + $service = new CourseListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + +} diff --git a/app/Http/Api/Controllers/TradeController.php b/app/Http/Api/Controllers/TradeController.php new file mode 100644 index 00000000..f9252452 --- /dev/null +++ b/app/Http/Api/Controllers/TradeController.php @@ -0,0 +1,88 @@ +request->getQuery('sn', 'string'); + + $service = new TradeInfoService(); + + $trade = $service->handle($sn); + + return $this->jsonSuccess(['trade' => $trade]); + } + + /** + * @Get("/h5/pay", name="api.trade.h5_pay") + */ + public function h5PayAction() + { + $sn = $this->request->getQuery('sn', 'string'); + + $service = new TradeService(); + + $response = $service->h5Pay($sn); + + if (!$response) { + echo "H5支付跳转失败,请回退重试"; + } + + $response->send(); + + exit(); + } + + /** + * @Post("/h5/create", name="api.trade.h5_create") + */ + public function createH5TradeAction() + { + $service = new TradeService(); + + $trade = $service->createH5Trade(); + + $service = new TradeInfoService(); + + $trade = $service->handle($trade->sn); + + return $this->jsonSuccess(['trade' => $trade]); + } + + /** + * @Post("/mp/create", name="api.trade.mp_create") + */ + public function createMpTradeAction() + { + $service = new TradeService(); + + $content = $service->createMpTrade(); + + return $this->jsonSuccess($content); + } + + /** + * @Post("/app/create", name="api.trade.app_create") + */ + public function createAppTradeAction() + { + $service = new TradeService(); + + $content = $service->createMpTrade(); + + return $this->jsonSuccess($content); + } + +} \ No newline at end of file diff --git a/app/Http/Api/Controllers/UploadController.php b/app/Http/Api/Controllers/UploadController.php new file mode 100644 index 00000000..40cf7a61 --- /dev/null +++ b/app/Http/Api/Controllers/UploadController.php @@ -0,0 +1,50 @@ +uploadAvatarImage(); + + if (!$file) { + return $this->jsonError(['msg' => '上传文件失败']); + } + + $data = [ + 'src' => $service->getImageUrl($file->path), + 'title' => $file->name, + ]; + + return $this->jsonSuccess(['data' => $data]); + } + + /** + * @Post("/im/img", name="api.upload.im_img") + */ + public function uploadImImageAction() + { + } + + /** + * @Post("/im/file", name="api.upload.im_file") + */ + public function uploadImFileAction() + { + + } + +} \ No newline at end of file diff --git a/app/Http/Api/Controllers/UserConsoleController.php b/app/Http/Api/Controllers/UserConsoleController.php new file mode 100644 index 00000000..671ff955 --- /dev/null +++ b/app/Http/Api/Controllers/UserConsoleController.php @@ -0,0 +1,155 @@ +handle(); + + return $this->jsonSuccess(['profile' => $profile]); + } + + /** + * @Get("/account", name="api.uc.account") + */ + public function accountAction() + { + $service = new AccountInfoService(); + + $account = $service->handle(); + + return $this->jsonSuccess(['account' => $account]); + } + + /** + * @Get("/courses", name="api.uc.courses") + */ + public function coursesAction() + { + $service = new CourseListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/favorites", name="api.uc.favorites") + */ + public function favoritesAction() + { + $service = new FavoriteListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/consults", name="api.uc.consults") + */ + public function consultsAction() + { + $service = new ConsultListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/reviews", name="api.uc.reviews") + */ + public function reviewsAction() + { + $service = new ReviewListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/orders", name="api.uc.orders") + */ + public function ordersAction() + { + $service = new OrderListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/refunds", name="api.uc.refunds") + */ + public function refundsAction() + { + $service = new RefundListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/friends", name="api.uc.friends") + */ + public function friendsAction() + { + $service = new FriendListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/groups", name="api.uc.groups") + */ + public function groupsAction() + { + $service = new GroupListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Post("/profile/update", name="api.uc.update_profile") + */ + public function updateProfileAction() + { + $service = new ProfileUpdateService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/UserController.php b/app/Http/Api/Controllers/UserController.php new file mode 100644 index 00000000..8bd37126 --- /dev/null +++ b/app/Http/Api/Controllers/UserController.php @@ -0,0 +1,77 @@ +handle($id); + + return $this->jsonSuccess(['user' => $user]); + } + + /** + * @Get("/{id:[0-9]+}/courses", name="api.user.courses") + */ + public function coursesAction($id) + { + $service = new UserCourseListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/favorites", name="api.user.favorites") + */ + public function favoritesAction($id) + { + $service = new UserFavoriteListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/friends", name="api.user.friends") + */ + public function friendsAction($id) + { + $service = new UserFriendListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/{id:[0-9]+}/groups", name="api.user.groups") + */ + public function groupsAction($id) + { + $service = new UserGroupListService(); + + $pager = $service->handle($id); + + return $this->jsonSuccess(['pager' => $pager]); + } + +} diff --git a/app/Http/Api/Controllers/VerifyController.php b/app/Http/Api/Controllers/VerifyController.php new file mode 100644 index 00000000..5594e7ab --- /dev/null +++ b/app/Http/Api/Controllers/VerifyController.php @@ -0,0 +1,38 @@ +handle(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/email/code", name="api.verify.email_code") + */ + public function emailCodeAction() + { + $service = new EmailCodeService(); + + $service->handle(); + + return $this->jsonSuccess(); + } + +} diff --git a/app/Http/Api/Controllers/VipController.php b/app/Http/Api/Controllers/VipController.php new file mode 100644 index 00000000..a9854b11 --- /dev/null +++ b/app/Http/Api/Controllers/VipController.php @@ -0,0 +1,40 @@ +request->getQuery('type', 'string', 'discount'); + + $service = new VipCourseListService(); + + $pager = $service->handle($type); + + return $this->jsonSuccess(['pager' => $pager]); + } + + /** + * @Get("/users", name="api.vip.users") + */ + public function usersAction() + { + $service = new VipUserListService(); + + $pager = $service->handle(); + + return $this->jsonSuccess(['pager' => $pager]); + } + +} diff --git a/app/Http/Api/Module.php b/app/Http/Api/Module.php index 3ea77f24..684e10e6 100644 --- a/app/Http/Api/Module.php +++ b/app/Http/Api/Module.php @@ -2,7 +2,7 @@ namespace App\Http\Api; -use App\Services\Auth\Api as ApiAuth; +use App\Services\Auth\Api as AppAuth; use Phalcon\DiInterface; use Phalcon\Mvc\ModuleDefinitionInterface; use Phalcon\Mvc\View; @@ -24,7 +24,7 @@ class Module implements ModuleDefinitionInterface }); $di->setShared('auth', function () { - return new ApiAuth(); + return new AppAuth(); }); } diff --git a/app/Http/Api/Services/Account.php b/app/Http/Api/Services/Account.php new file mode 100644 index 00000000..baf537f8 --- /dev/null +++ b/app/Http/Api/Services/Account.php @@ -0,0 +1,81 @@ +auth = $this->getDI()->get('auth'); + } + + public function register() + { + $service = new RegisterService(); + + $account = $service->handle(); + + $userRepo = new UserRepo(); + + $user = $userRepo->findById($account->id); + + return $this->auth->saveAuthInfo($user); + } + + public function loginByPassword() + { + $post = $this->request->getPost(); + + /** + * 使用[account|phone|email]做账户名字段兼容 + */ + if (isset($post['phone'])) { + $post['account'] = $post['phone']; + } elseif (isset($post['email'])) { + $post['account'] = $post['email']; + } + + $validator = new AccountValidator(); + + $user = $validator->checkUserLogin($post['account'], $post['password']); + + return $this->auth->saveAuthInfo($user); + } + + public function loginByVerify() + { + $post = $this->request->getPost(); + + /** + * 使用[account|phone|email]做账户名字段兼容 + */ + if (isset($post['phone'])) { + $post['account'] = $post['phone']; + } elseif (isset($post['email'])) { + $post['account'] = $post['email']; + } + + $validator = new AccountValidator(); + + $user = $validator->checkVerifyLogin($post['account'], $post['verify_code']); + + return $this->auth->saveAuthInfo($user); + } + + public function logout() + { + $this->auth->clearAuthInfo(); + } + +} diff --git a/app/Http/Api/Services/Login.php b/app/Http/Api/Services/Login.php deleted file mode 100644 index 7ffc50fe..00000000 --- a/app/Http/Api/Services/Login.php +++ /dev/null @@ -1,33 +0,0 @@ -checkUserLogin($name, $password); - - $auth = new ApiAuth(); - - return $auth->saveAuthInfo($user); - } - - public function loginByVerify($name, $code) - { - $validator = new AccountValidator(); - - $user = $validator->checkVerifyLogin($name, $code); - - $auth = new ApiAuth(); - - return $auth->saveAuthInfo($user); - } - -} diff --git a/app/Http/Api/Services/Logout.php b/app/Http/Api/Services/Logout.php deleted file mode 100644 index 76877ce8..00000000 --- a/app/Http/Api/Services/Logout.php +++ /dev/null @@ -1,17 +0,0 @@ -clearAuthInfo(); - } - -} diff --git a/app/Http/Api/Services/Trade.php b/app/Http/Api/Services/Trade.php new file mode 100644 index 00000000..74b3f7ae --- /dev/null +++ b/app/Http/Api/Services/Trade.php @@ -0,0 +1,125 @@ +checkTradeBySn($sn); + + $response = null; + + if ($trade->channel == TradeModel::CHANNEL_ALIPAY) { + $alipay = new Alipay(); + $response = $alipay->wap($trade); + } elseif ($trade->channel == TradeModel::CHANNEL_WXPAY) { + $wxpay = new Wxpay(); + $response = $wxpay->wap($trade); + } + + return $response; + } + + public function createH5Trade() + { + $post = $this->request->getPost(); + + $validator = new ClientValidator(); + + $platform = $this->getPlatform(); + + $validator->checkH5Platform($platform); + + $order = $this->checkOrderBySn($post['order_sn']); + + $user = $this->getLoginUser(); + + $validator = new TradeValidator(); + + $channel = $validator->checkChannel($post['channel']); + + $trade = new TradeModel(); + + $trade->subject = $order->subject; + $trade->amount = $order->amount; + $trade->channel = $channel; + $trade->order_id = $order->id; + $trade->owner_id = $user->id; + + $trade->create(); + + return $trade; + } + + public function createMpTrade() + { + $post = $this->request->getPost(); + + $validator = new ClientValidator(); + + $platform = $this->getPlatform(); + + $platform = $validator->checkMpPlatform($platform); + + $order = $this->checkOrderBySn($post['order_sn']); + + $user = $this->getLoginUser(); + + $channel = TradeModel::CHANNEL_WXPAY; + + if ($platform == ClientModel::TYPE_MP_ALIPAY) { + $channel = TradeModel::CHANNEL_ALIPAY; + } elseif ($platform == ClientModel::TYPE_MP_WEIXIN) { + $channel = TradeModel::CHANNEL_WXPAY; + } + + $trade = new TradeModel(); + + $trade->subject = $order->subject; + $trade->amount = $order->amount; + $trade->channel = $channel; + $trade->order_id = $order->id; + $trade->owner_id = $user->id; + + $trade->create(); + + $response = null; + + if ($post['channel'] == TradeModel::CHANNEL_ALIPAY) { + $alipay = new Alipay(); + $buyerId = ''; + $response = $alipay->mini($trade, $buyerId); + } elseif ($post['channel'] == TradeModel::CHANNEL_WXPAY) { + $wxpay = new Wxpay(); + $openId = ''; + $response = $wxpay->mini($trade, $openId); + } + + return $response; + } + + public function createAppTrade() + { + + } + + protected function getPlatform() + { + return $this->request->getHeader('X-Platform'); + } + +} diff --git a/app/Http/Home/Controllers/AccountController.php b/app/Http/Home/Controllers/AccountController.php index 4e2fc3d0..8dc2d285 100644 --- a/app/Http/Home/Controllers/AccountController.php +++ b/app/Http/Home/Controllers/AccountController.php @@ -81,9 +81,7 @@ class AccountController extends Controller $location = $returnUrl ?: $this->url->get(['for' => 'home.index']); - $content = ['location' => $location]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['location' => $location]); } /** @@ -99,9 +97,7 @@ class AccountController extends Controller $location = $returnUrl ?: $this->url->get(['for' => 'home.index']); - $content = ['location' => $location]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['location' => $location]); } /** diff --git a/app/Http/Home/Controllers/ChapterController.php b/app/Http/Home/Controllers/ChapterController.php index dace273d..4cc0cc3c 100644 --- a/app/Http/Home/Controllers/ChapterController.php +++ b/app/Http/Home/Controllers/ChapterController.php @@ -29,6 +29,18 @@ class ChapterController extends Controller $this->view->setVar('items', $items); } + /** + * @Get("/{id:[0-9]+}/danmus", name="home.chapter.danmus") + */ + public function danmusAction($id) + { + $service = new ChapterDanmuListService(); + + $items = $service->handle($id); + + return $this->jsonSuccess(['items' => $items]); + } + /** * @Get("/{id:[0-9]+}", name="home.chapter.show") */ @@ -75,18 +87,6 @@ class ChapterController extends Controller $this->view->setVar('catalog', $catalog); } - /** - * @Get("/{id:[0-9]+}/danmu", name="home.chapter.danmu") - */ - public function danmuAction($id) - { - $service = new ChapterDanmuListService(); - - $items = $service->handle($id); - - return $this->jsonSuccess(['items' => $items]); - } - /** * @Post("/{id:[0-9]+}/like", name="home.chapter.like") */ @@ -98,9 +98,7 @@ class ChapterController extends Controller $msg = $like->deleted == 0 ? '点赞成功' : '取消点赞成功'; - $content = ['msg' => $msg]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => $msg]); } /** diff --git a/app/Http/Home/Controllers/ConsultController.php b/app/Http/Home/Controllers/ConsultController.php index e31c1f32..93779f46 100644 --- a/app/Http/Home/Controllers/ConsultController.php +++ b/app/Http/Home/Controllers/ConsultController.php @@ -58,9 +58,12 @@ class ConsultController extends Controller $service = new ConsultInfoService(); - $service->handle($consult->id); + $consult = $service->handle($consult->id); - $content = ['msg' => '提交咨询成功']; + $content = [ + 'consult' => $consult, + 'msg' => '提交咨询成功', + ]; return $this->jsonSuccess($content); } @@ -72,9 +75,16 @@ class ConsultController extends Controller { $service = new ConsultUpdateService(); - $service->handle($id); + $consult = $service->handle($id); - $content = ['msg' => '更新咨询成功']; + $service = new ConsultInfoService(); + + $consult = $service->handle($consult->id); + + $content = [ + 'consult' => $consult, + 'msg' => '更新咨询成功', + ]; return $this->jsonSuccess($content); } @@ -88,9 +98,7 @@ class ConsultController extends Controller $service->handle($id); - $content = ['msg' => '删除咨询成功']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '删除咨询成功']); } /** @@ -102,9 +110,16 @@ class ConsultController extends Controller $service = new ConsultReplyService(); - $service->handle($id); + $consult = $service->handle($id); - $content = ['msg' => '回复咨询成功']; + $service = new ConsultInfoService(); + + $consult = $service->handle($consult->id); + + $content = [ + 'consult' => $consult, + 'msg' => '回复咨询成功', + ]; return $this->jsonSuccess($content); @@ -129,9 +144,7 @@ class ConsultController extends Controller $msg = $like->deleted == 0 ? '点赞成功' : '取消点赞成功'; - $content = ['msg' => $msg]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => $msg]); } } diff --git a/app/Http/Home/Controllers/Controller.php b/app/Http/Home/Controllers/Controller.php index 30819779..df84d9d2 100644 --- a/app/Http/Home/Controllers/Controller.php +++ b/app/Http/Home/Controllers/Controller.php @@ -58,6 +58,7 @@ class Controller extends \Phalcon\Mvc\Controller 'controller' => 'error', 'action' => 'maintain', ]); + return false; } if ($this->isNotSafeRequest()) { diff --git a/app/Http/Home/Controllers/ImController.php b/app/Http/Home/Controllers/ImController.php index f768edb4..7461363e 100644 --- a/app/Http/Home/Controllers/ImController.php +++ b/app/Http/Home/Controllers/ImController.php @@ -3,7 +3,6 @@ namespace App\Http\Home\Controllers; use App\Http\Home\Services\Im as ImService; -use App\Traits\Response as ResponseTrait; use Phalcon\Mvc\View; /** @@ -12,8 +11,6 @@ use Phalcon\Mvc\View; class ImController extends Controller { - use ResponseTrait; - public function initialize() { parent::initialize(); @@ -265,9 +262,7 @@ class ImController extends Controller $service->applyFriend(); - $content = ['msg' => '发送申请成功,请等待对方通过']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '发送申请成功']); } /** @@ -303,9 +298,7 @@ class ImController extends Controller $service->applyGroup(); - $content = ['msg' => '发送申请成功,请等待管理员通过']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '发送申请成功']); } /** @@ -341,9 +334,7 @@ class ImController extends Controller $service->quitFriend($id); - $content = ['msg' => '解除好友成功']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '解除好友成功']); } /** @@ -355,9 +346,7 @@ class ImController extends Controller $service->quitGroup($id); - $content = ['msg' => '退出群组成功']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '退出群组成功']); } } diff --git a/app/Http/Home/Controllers/ImGroupManageController.php b/app/Http/Home/Controllers/ImGroupManageController.php index 3b76dcfc..f62bf1b1 100644 --- a/app/Http/Home/Controllers/ImGroupManageController.php +++ b/app/Http/Home/Controllers/ImGroupManageController.php @@ -48,9 +48,7 @@ class ImGroupManageController extends Controller $service->updateGroup($id); - $content = ['msg' => '更新群组成功']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '更新群组成功']); } /** @@ -62,8 +60,10 @@ class ImGroupManageController extends Controller $service->deleteGroupUser($gid, $uid); + $location = $this->request->getHTTPReferer(); + $content = [ - 'location' => $this->request->getHTTPReferer(), + 'location' => $location, 'msg' => '移除用户成功', ]; diff --git a/app/Http/Home/Controllers/IndexController.php b/app/Http/Home/Controllers/IndexController.php index bdee64b7..ea099b71 100644 --- a/app/Http/Home/Controllers/IndexController.php +++ b/app/Http/Home/Controllers/IndexController.php @@ -3,10 +3,26 @@ namespace App\Http\Home\Controllers; use App\Http\Home\Services\Index as IndexService; +use App\Traits\Client as ClientTrait; +use Phalcon\Mvc\Dispatcher; class IndexController extends Controller { + use ClientTrait; + + public function beforeExecuteRoute(Dispatcher $dispatcher) + { + if ($this->isMobileBrowser()) { + + $this->response->redirect('/h5', true); + + return false; + } + + return parent::beforeExecuteRoute($dispatcher); + } + /** * @Get("/", name="home.index") */ diff --git a/app/Http/Home/Controllers/ChapterLiveController.php b/app/Http/Home/Controllers/LiveController.php similarity index 76% rename from app/Http/Home/Controllers/ChapterLiveController.php rename to app/Http/Home/Controllers/LiveController.php index 9261f92b..b3388255 100644 --- a/app/Http/Home/Controllers/ChapterLiveController.php +++ b/app/Http/Home/Controllers/LiveController.php @@ -2,24 +2,21 @@ namespace App\Http\Home\Controllers; -use App\Http\Home\Services\ChapterLive as ChapterLiveService; -use App\Traits\Response as ResponseTrait; +use App\Services\Logic\Live\LiveChapter as LiveChapterService; use Phalcon\Mvc\View; /** * @RoutePrefix("/live") */ -class ChapterLiveController extends Controller +class LiveController extends Controller { - use ResponseTrait; - /** * @Get("/{id:[0-9]+}/chats", name="home.live.chats") */ public function chatsAction($id) { - $service = new ChapterLiveService(); + $service = new LiveChapterService(); $chats = $service->getRecentChats($id); @@ -33,7 +30,7 @@ class ChapterLiveController extends Controller */ public function statsAction($id) { - $service = new ChapterLiveService(); + $service = new LiveChapterService(); $stats = $service->getStats($id); @@ -45,7 +42,7 @@ class ChapterLiveController extends Controller */ public function statusAction($id) { - $service = new ChapterLiveService(); + $service = new LiveChapterService(); $status = $service->getStatus($id); @@ -57,7 +54,7 @@ class ChapterLiveController extends Controller */ public function bindUserAction($id) { - $service = new ChapterLiveService(); + $service = new LiveChapterService(); $service->bindUser($id); @@ -69,7 +66,7 @@ class ChapterLiveController extends Controller */ public function sendMessageAction($id) { - $service = new ChapterLiveService(); + $service = new LiveChapterService(); $response = $service->sendMessage($id); diff --git a/app/Http/Home/Controllers/OrderController.php b/app/Http/Home/Controllers/OrderController.php index 591c8187..acf797a8 100644 --- a/app/Http/Home/Controllers/OrderController.php +++ b/app/Http/Home/Controllers/OrderController.php @@ -48,8 +48,8 @@ class OrderController extends Controller */ public function confirmAction() { - $itemId = $this->request->getQuery('item_id', 'int'); - $itemType = $this->request->getQuery('item_type', 'int'); + $itemId = $this->request->getQuery('item_id', 'string'); + $itemType = $this->request->getQuery('item_type', 'string'); $service = new OrderConfirmService(); @@ -87,7 +87,7 @@ class OrderController extends Controller $order = $service->handle($sn); if ($order['status'] != OrderModel::STATUS_PENDING) { - $this->response->redirect(['for' => 'home.my.orders']); + $this->response->redirect(['for' => 'home.uc.orders']); } $this->view->setVar('order', $order); diff --git a/app/Http/Home/Controllers/PublicController.php b/app/Http/Home/Controllers/PublicController.php index 63eb1e37..21e28b1e 100644 --- a/app/Http/Home/Controllers/PublicController.php +++ b/app/Http/Home/Controllers/PublicController.php @@ -10,7 +10,6 @@ use App\Services\Pay\Wxpay as WxpayService; use App\Services\Storage as StorageService; use App\Traits\Response as ResponseTrait; use App\Traits\Security as SecurityTrait; -use Phalcon\Text; use PHPQRCode\QRcode; class PublicController extends \Phalcon\Mvc\Controller @@ -44,31 +43,6 @@ class PublicController extends \Phalcon\Mvc\Controller } } - /** - * @Get("/img/{id:[0-9]+}", name="home.img") - */ - public function imageAction($id) - { - $repo = new UploadRepo(); - - $file = $repo->findById($id); - - if ($file && Text::startsWith($file->mime, 'image')) { - - $service = new StorageService(); - - $location = $service->getImageUrl($file->path); - - $this->response->redirect($location); - - } else { - - $this->response->setStatusCode(404); - - return $this->response; - } - } - /** * @Get("/qrcode", name="home.qrcode") */ diff --git a/app/Http/Home/Controllers/RefundController.php b/app/Http/Home/Controllers/RefundController.php index 327cc361..1aaf813a 100644 --- a/app/Http/Home/Controllers/RefundController.php +++ b/app/Http/Home/Controllers/RefundController.php @@ -44,12 +44,7 @@ class RefundController extends Controller $service->handle(); - $content = [ - 'location' => $this->url->get(['for' => 'home.my.refunds']), - 'msg' => '申请退款成功', - ]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '申请退款成功']); } /** @@ -78,12 +73,7 @@ class RefundController extends Controller $service->handle($sn); - $content = [ - 'location' => $this->url->get(['for' => 'home.my.refunds']), - 'msg' => '取消退款成功', - ]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '取消退款成功']); } } diff --git a/app/Http/Home/Controllers/ReviewController.php b/app/Http/Home/Controllers/ReviewController.php index 48b09a67..e353bf9d 100644 --- a/app/Http/Home/Controllers/ReviewController.php +++ b/app/Http/Home/Controllers/ReviewController.php @@ -99,9 +99,7 @@ class ReviewController extends Controller $service->handle($id); - $content = ['msg' => '删除评价成功']; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => '删除评价成功']); } /** @@ -115,9 +113,7 @@ class ReviewController extends Controller $msg = $like->deleted == 0 ? '点赞成功' : '取消点赞成功'; - $content = ['msg' => $msg]; - - return $this->jsonSuccess($content); + return $this->jsonSuccess(['msg' => $msg]); } } diff --git a/app/Http/Home/Controllers/SearchController.php b/app/Http/Home/Controllers/SearchController.php index 66c249fa..279300c3 100644 --- a/app/Http/Home/Controllers/SearchController.php +++ b/app/Http/Home/Controllers/SearchController.php @@ -5,7 +5,6 @@ namespace App\Http\Home\Controllers; use App\Services\Logic\Search\Course as CourseSearchService; use App\Services\Logic\Search\Group as GroupSearchService; use App\Services\Logic\Search\User as UserSearchService; -use App\Traits\Response as ResponseTrait; /** * @RoutePrefix("/search") @@ -13,8 +12,6 @@ use App\Traits\Response as ResponseTrait; class SearchController extends Controller { - use ResponseTrait; - /** * @Get("/", name="home.search.index") */ @@ -42,14 +39,6 @@ class SearchController extends Controller $this->view->setVar('pager', $pager); } - /** - * @Get("/form", name="home.search.form") - */ - public function formAction() - { - - } - /** * @param string $type * @return CourseSearchService|GroupSearchService|UserSearchService @@ -58,7 +47,7 @@ class SearchController extends Controller { switch ($type) { case 'group': - $service = new GroupSearchService; + $service = new GroupSearchService(); break; case 'user': $service = new UserSearchService(); diff --git a/app/Http/Home/Controllers/UploadController.php b/app/Http/Home/Controllers/UploadController.php index 73da70f8..351f25cb 100644 --- a/app/Http/Home/Controllers/UploadController.php +++ b/app/Http/Home/Controllers/UploadController.php @@ -1,9 +1,9 @@ getAuthUser(); + + $validator = new AppValidator(); + + $validator->checkAuthUser($authUser->id); + } + /** * @Post("/avatar/img", name="home.upload.avatar_img") */ @@ -20,16 +29,16 @@ class UploadController extends Controller $file = $service->uploadAvatarImage(); - if ($file) { - return $this->jsonSuccess([ - 'data' => [ - 'src' => $service->getImageUrl($file->path), - 'title' => $file->name, - ] - ]); - } else { + if (!$file) { return $this->jsonError(['msg' => '上传文件失败']); } + + $data = [ + 'src' => $service->getImageUrl($file->path), + 'title' => $file->name, + ]; + + return $this->jsonSuccess(['data' => $data]); } /** diff --git a/app/Http/Home/Controllers/VerifyController.php b/app/Http/Home/Controllers/VerifyController.php index d89245bb..1e1666a5 100644 --- a/app/Http/Home/Controllers/VerifyController.php +++ b/app/Http/Home/Controllers/VerifyController.php @@ -4,7 +4,6 @@ namespace App\Http\Home\Controllers; use App\Services\Logic\Verify\EmailCode as EmailCodeService; use App\Services\Logic\Verify\SmsCode as SmsCodeService; -use App\Services\Logic\Verify\VerifyCode as VerifyCodeService; use App\Traits\Response as ResponseTrait; /** @@ -15,18 +14,6 @@ class VerifyController extends \Phalcon\Mvc\Controller use ResponseTrait; - /** - * @Post("/code", name="verify.code") - */ - public function verifyCodeAction() - { - $service = new VerifyCodeService(); - - $service->handle(); - - return $this->jsonSuccess(); - } - /** * @Post("/sms/code", name="verify.sms_code") */ diff --git a/app/Http/Home/Services/Account.php b/app/Http/Home/Services/Account.php index 4858213d..38efb3b2 100644 --- a/app/Http/Home/Services/Account.php +++ b/app/Http/Home/Services/Account.php @@ -3,7 +3,7 @@ namespace App\Http\Home\Services; use App\Repos\User as UserRepo; -use App\Services\Auth as AuthService; +use App\Services\Auth\Home as AuthService; use App\Services\Logic\Account\Register as RegisterService; use App\Validators\Account as AccountValidator; use App\Validators\Captcha as CaptchaValidator; @@ -40,13 +40,13 @@ class Account extends Service { $post = $this->request->getPost(); - $accountValidator = new AccountValidator(); + $validator = new AccountValidator(); - $user = $accountValidator->checkUserLogin($post['account'], $post['password']); + $user = $validator->checkUserLogin($post['account'], $post['password']); - $captchaValidator = new CaptchaValidator(); + $validator = new CaptchaValidator(); - $captchaValidator->checkCode($post['ticket'], $post['rand']); + $validator->checkCode($post['ticket'], $post['rand']); $this->auth->saveAuthInfo($user); } @@ -55,9 +55,9 @@ class Account extends Service { $post = $this->request->getPost(); - $accountValidator = new AccountValidator(); + $validator = new AccountValidator(); - $user = $accountValidator->checkVerifyLogin($post['account'], $post['verify_code']); + $user = $validator->checkVerifyLogin($post['account'], $post['verify_code']); $this->auth->saveAuthInfo($user); } diff --git a/app/Http/Home/Views/chapter/catalog.volt b/app/Http/Home/Views/chapter/catalog.volt index 71105da9..9625d784 100644 --- a/app/Http/Home/Views/chapter/catalog.volt +++ b/app/Http/Home/Views/chapter/catalog.volt @@ -7,11 +7,10 @@