From 343c8d49d40a89c8b04680c8d90ea1e2bb1dde4a Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Tue, 11 Aug 2020 21:50:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4category=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8F=98=E5=8C=96=E5=B8=A6=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Builders/CategoryTreeList.php | 31 +++- app/Builders/CourseList.php | 3 +- app/Builders/HelpList.php | 42 +++++ app/Caches/CategoryList.php | 11 +- app/Caches/CategoryTreeList.php | 8 +- app/Caches/HelpList.php | 89 +++++++++ app/Caches/IndexFreeCourseList.php | 3 +- app/Caches/IndexNewCourseList.php | 3 +- app/Caches/IndexVipCourseList.php | 3 +- .../Admin/Controllers/CategoryController.php | 26 ++- app/Http/Admin/Controllers/Controller.php | 2 +- .../Admin/Controllers/CourseController.php | 13 ++ app/Http/Admin/Controllers/HelpController.php | 20 ++ app/Http/Admin/Controllers/TestController.php | 26 +-- .../Admin/Controllers/UploadController.php | 8 +- app/Http/Admin/Services/AuthMenu.php | 5 +- app/Http/Admin/Services/AuthNode.php | 14 ++ app/Http/Admin/Services/Category.php | 12 +- app/Http/Admin/Services/Help.php | 76 ++++++-- app/Http/Admin/Services/Role.php | 13 ++ app/Http/Admin/Views/audit/list.volt | 3 +- app/Http/Admin/Views/carousel/list.volt | 11 +- app/Http/Admin/Views/category/add.volt | 7 +- app/Http/Admin/Views/category/list.volt | 31 +++- app/Http/Admin/Views/chapter/lessons.volt | 10 +- app/Http/Admin/Views/consult/list.volt | 15 +- app/Http/Admin/Views/course/list.volt | 36 ++-- app/Http/Admin/Views/group/list.volt | 9 +- app/Http/Admin/Views/help/add.volt | 11 ++ app/Http/Admin/Views/help/edit.volt | 11 ++ app/Http/Admin/Views/help/list.volt | 25 +-- app/Http/Admin/Views/nav/list.volt | 24 ++- app/Http/Admin/Views/order/list.volt | 7 +- app/Http/Admin/Views/package/list.volt | 15 +- app/Http/Admin/Views/page/list.volt | 16 +- app/Http/Admin/Views/refund/list.volt | 7 +- app/Http/Admin/Views/review/list.volt | 22 ++- app/Http/Admin/Views/role/list.volt | 13 +- .../Admin/Views/setting/pay_alipay_test.volt | 6 +- .../Admin/Views/setting/pay_wxpay_test.volt | 6 +- app/Http/Web/Controllers/Controller.php | 26 +-- app/Http/Web/Controllers/ImController.php | 47 ++--- .../Web/Controllers/ImSummaryController.php | 54 ++++++ app/Http/Web/Controllers/IndexController.php | 2 +- app/Http/Web/Controllers/UploadController.php | 19 +- app/Http/Web/Services/CourseQuery.php | 8 +- app/Http/Web/Services/Im.php | 55 +++--- app/Http/Web/Services/ImSummary.php | 77 ++++++++ app/Http/Web/Services/Trade.php | 26 +-- app/Http/Web/Views/help/index.volt | 34 +++- .../im/{sys_messages.volt => sys_msg.volt} | 4 +- app/Library/Helper.php | 19 ++ app/Models/Category.php | 15 +- app/Models/Help.php | 13 +- app/Models/HelpCategory.php | 46 ----- app/Models/ImGroupMessage.php | 86 --------- .../{ImFriendMessage.php => ImMessage.php} | 18 +- .../{ImSystemMessage.php => ImNotice.php} | 6 +- app/Models/Page.php | 14 -- app/Providers/Volt.php | 4 + app/Repos/Category.php | 27 +-- app/Repos/Help.php | 6 +- app/Repos/ImGroup.php | 8 +- app/Repos/ImGroupMessage.php | 76 -------- .../{ImFriendMessage.php => ImMessage.php} | 18 +- .../{ImSystemMessage.php => ImNotice.php} | 14 +- app/Repos/ImUser.php | 37 ++-- app/Services/Category.php | 11 +- app/Services/Frontend/Help/HelpInfo.php | 2 +- app/Services/Frontend/Help/HelpList.php | 36 +--- app/Services/MyStorage.php | 171 ++++++++++++++++++ app/Services/Storage.php | 165 +---------------- app/Validators/Category.php | 11 ++ app/Validators/Course.php | 8 +- app/Validators/Help.php | 7 + config/errors.php | 1 + public/static/admin/js/avatar.upload.js | 2 +- public/static/admin/js/cover.upload.js | 2 +- public/static/web/js/im.js | 18 +- public/static/web/js/im.msgbox.js | 15 +- public/static/web/js/order.pay.js | 10 +- public/static/web/js/upload.avatar.js | 2 +- 82 files changed, 1138 insertions(+), 775 deletions(-) create mode 100644 app/Builders/HelpList.php create mode 100644 app/Caches/HelpList.php create mode 100644 app/Http/Web/Controllers/ImSummaryController.php create mode 100644 app/Http/Web/Services/ImSummary.php rename app/Http/Web/Views/im/{sys_messages.volt => sys_msg.volt} (98%) delete mode 100644 app/Models/HelpCategory.php delete mode 100644 app/Models/ImGroupMessage.php rename app/Models/{ImFriendMessage.php => ImMessage.php} (79%) rename app/Models/{ImSystemMessage.php => ImNotice.php} (96%) delete mode 100644 app/Repos/ImGroupMessage.php rename app/Repos/{ImFriendMessage.php => ImMessage.php} (78%) rename app/Repos/{ImSystemMessage.php => ImNotice.php} (81%) create mode 100644 app/Services/MyStorage.php diff --git a/app/Builders/CategoryTreeList.php b/app/Builders/CategoryTreeList.php index dfb524d1..dbc32de9 100644 --- a/app/Builders/CategoryTreeList.php +++ b/app/Builders/CategoryTreeList.php @@ -9,9 +9,9 @@ use Phalcon\Mvc\Model\ResultsetInterface; class CategoryTreeList extends Builder { - public function handle() + public function handle($type) { - $topCategories = $this->findChildCategories(0); + $topCategories = $this->findChildCategories($type, 0); if ($topCategories->count() == 0) { return []; @@ -32,7 +32,7 @@ class CategoryTreeList extends Builder protected function handleChildren(CategoryModel $category) { - $subCategories = $this->findChildCategories($category->id); + $subCategories = $this->findChildCategories($category->type, $category->id); if ($subCategories->count() == 0) { return []; @@ -51,16 +51,27 @@ class CategoryTreeList extends Builder } /** - * @param int $categoryId + * @param string $type + * @param int $parentId * @return ResultsetInterface|Resultset|CategoryModel[] */ - protected function findChildCategories($categoryId = 0) + protected function findChildCategories($type = 'course', $parentId = 0) { - return CategoryModel::query() - ->where('parent_id = :parent_id:', ['parent_id' => $categoryId]) - ->andWhere('published = 1') - ->orderBy('priority ASC') - ->execute(); + $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->orderBy('priority ASC'); + + return $query->execute(); } } diff --git a/app/Builders/CourseList.php b/app/Builders/CourseList.php index 0dd1580d..17659789 100644 --- a/app/Builders/CourseList.php +++ b/app/Builders/CourseList.php @@ -3,6 +3,7 @@ namespace App\Builders; use App\Caches\CategoryList as CategoryListCache; +use App\Models\Category as CategoryModel; use App\Repos\User as UserRepo; class CourseList extends Builder @@ -34,7 +35,7 @@ class CourseList extends Builder { $cache = new CategoryListCache(); - $items = $cache->get(); + $items = $cache->get(CategoryModel::TYPE_COURSE); if (empty($items)) { return []; diff --git a/app/Builders/HelpList.php b/app/Builders/HelpList.php new file mode 100644 index 00000000..cb9bcfec --- /dev/null +++ b/app/Builders/HelpList.php @@ -0,0 +1,42 @@ +getCategories(); + + foreach ($helps as $key => $help) { + $helps[$key]['category'] = $categories[$help['category_id']] ?? new \stdClass(); + } + + return $helps; + } + + public function getCategories() + { + $cache = new CategoryListCache(); + + $items = $cache->get(CategoryModel::TYPE_HELP); + + if (!$items) return []; + + $result = []; + + foreach ($items as $item) { + $result[$item['id']] = [ + 'id' => $item['id'], + 'name' => $item['name'], + ]; + } + + return $result; + } + +} diff --git a/app/Caches/CategoryList.php b/app/Caches/CategoryList.php index e73ad4cf..dd60f101 100644 --- a/app/Caches/CategoryList.php +++ b/app/Caches/CategoryList.php @@ -15,23 +15,24 @@ class CategoryList extends Cache return $this->lifetime; } - public function getKey($id = null) + public function getKey($type = null) { - return 'category_list'; + return "category_list:{$type}"; } /** - * @param null $id + * @param null $type * @return array */ - public function getContent($id = null) + public function getContent($type = null) { /** * @var Resultset $categories */ $categories = CategoryModel::query() ->columns(['id', 'parent_id', 'name', 'priority', 'level', 'path']) - ->where('published = 1') + ->where('type = :type:', ['type' => $type]) + ->andWhere('published = 1') ->execute(); if ($categories->count() == 0) { diff --git a/app/Caches/CategoryTreeList.php b/app/Caches/CategoryTreeList.php index 32ca33bc..917928b4 100644 --- a/app/Caches/CategoryTreeList.php +++ b/app/Caches/CategoryTreeList.php @@ -14,16 +14,16 @@ class CategoryTreeList extends Cache return $this->lifetime; } - public function getKey($id = null) + public function getKey($type = null) { - return 'category_tree_list'; + return "category_tree_list:{$type}"; } - public function getContent($id = null) + public function getContent($type = null) { $builder = new CategoryTreeListBuilder(); - $list = $builder->handle(); + $list = $builder->handle($type); return $list ?: []; } diff --git a/app/Caches/HelpList.php b/app/Caches/HelpList.php new file mode 100644 index 00000000..2b4c8ce2 --- /dev/null +++ b/app/Caches/HelpList.php @@ -0,0 +1,89 @@ +lifetime; + } + + public function getKey($id = null) + { + return 'help_list'; + } + + public function getContent($id = null) + { + + $categories = $this->findCategories(); + + if ($categories->count() == 0) { + return []; + } + + $result = []; + + foreach ($categories as $category) { + + $item = []; + + $item['category'] = [ + 'id' => $category->id, + 'name' => $category->name, + ]; + + $item['list'] = []; + + $helps = $this->findHelps($category->id); + + if ($helps->count() > 0) { + foreach ($helps as $help) { + $item['list'][] = [ + 'id' => $help->id, + 'title' => $help->title, + ]; + } + } + + $result[] = $item; + } + + return $result; + } + + /** + * @return ResultsetInterface|Resultset|CategoryModel[] + */ + protected function findCategories() + { + return CategoryModel::query() + ->where('type = :type:', ['type' => CategoryModel::TYPE_HELP]) + ->andWhere('level = 1 AND published = 1') + ->orderBy('priority ASC') + ->execute(); + } + + /** + * @param int $categoryId + * @return ResultsetInterface|Resultset|CategoryModel[] + */ + protected function findHelps($categoryId) + { + return HelpModel::query() + ->where('category_id = :category_id:', ['category_id' => $categoryId]) + ->andWhere('published = 1') + ->orderBy('priority ASC') + ->execute(); + } + +} diff --git a/app/Caches/IndexFreeCourseList.php b/app/Caches/IndexFreeCourseList.php index e8efacff..0f4dcc47 100644 --- a/app/Caches/IndexFreeCourseList.php +++ b/app/Caches/IndexFreeCourseList.php @@ -84,7 +84,8 @@ class IndexFreeCourseList extends Cache protected function findCategories($limit = 5) { return CategoryModel::query() - ->where('level = 1 AND published = 1') + ->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE]) + ->andWhere('level = 1 AND published = 1') ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Caches/IndexNewCourseList.php b/app/Caches/IndexNewCourseList.php index 728e55a1..76582509 100644 --- a/app/Caches/IndexNewCourseList.php +++ b/app/Caches/IndexNewCourseList.php @@ -84,7 +84,8 @@ class IndexNewCourseList extends Cache protected function findCategories($limit = 5) { return CategoryModel::query() - ->where('level = 1 AND published = 1') + ->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE]) + ->andWhere('level = 1 AND published = 1') ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Caches/IndexVipCourseList.php b/app/Caches/IndexVipCourseList.php index f283c50f..e97d1879 100644 --- a/app/Caches/IndexVipCourseList.php +++ b/app/Caches/IndexVipCourseList.php @@ -84,7 +84,8 @@ class IndexVipCourseList extends Cache protected function findCategories($limit = 5) { return CategoryModel::query() - ->where('level = 1 AND published = 1') + ->where('type = :type:', ['type' => CategoryModel::TYPE_COURSE]) + ->andWhere('level = 1 AND published = 1') ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Http/Admin/Controllers/CategoryController.php b/app/Http/Admin/Controllers/CategoryController.php index fe5f6b9f..97270fcd 100644 --- a/app/Http/Admin/Controllers/CategoryController.php +++ b/app/Http/Admin/Controllers/CategoryController.php @@ -16,12 +16,20 @@ class CategoryController extends Controller public function listAction() { $parentId = $this->request->get('parent_id', 'int', 0); + $type = $this->request->get('type', 'string', 'course'); $categoryService = new CategoryService(); $parent = $categoryService->getParentCategory($parentId); - $categories = $categoryService->getChildCategories($parentId); + if ($parent->id > 0) { + $type = $parent->type; + $categories = $categoryService->getChildCategories($parentId); + } else { + $categories = $categoryService->getTopCategories($type); + } + + $this->view->setVar('type', $type); $this->view->setVar('parent', $parent); $this->view->setVar('categories', $categories); } @@ -32,12 +40,20 @@ class CategoryController extends Controller public function addAction() { $parentId = $this->request->get('parent_id', 'int', 0); + $type = $this->request->get('type', 'string', 'course'); $categoryService = new CategoryService(); - $topCategories = $categoryService->getTopCategories(); + $parent = $categoryService->getParentCategory($parentId); - $this->view->setVar('parent_id', $parentId); + if ($parent->id > 0) { + $type = $parent->type; + } + + $topCategories = $categoryService->getTopCategories($type); + + $this->view->setVar('type', $type); + $this->view->setVar('parent', $parent); $this->view->setVar('top_categories', $topCategories); } @@ -52,7 +68,7 @@ class CategoryController extends Controller $location = $this->url->get( ['for' => 'admin.category.list'], - ['parent_id' => $category->parent_id] + ['type' => $category->type, 'parent_id' => $category->parent_id], ); $content = [ @@ -88,7 +104,7 @@ class CategoryController extends Controller $location = $this->url->get( ['for' => 'admin.category.list'], - ['parent_id' => $category->parent_id] + ['type' => $category->type, 'parent_id' => $category->parent_id], ); $content = [ diff --git a/app/Http/Admin/Controllers/Controller.php b/app/Http/Admin/Controllers/Controller.php index 4a940f6d..2704f7b3 100644 --- a/app/Http/Admin/Controllers/Controller.php +++ b/app/Http/Admin/Controllers/Controller.php @@ -53,7 +53,7 @@ class Controller extends \Phalcon\Mvc\Controller * 特例白名单 */ $whitelist = [ - 'controllers' => ['public', 'index', 'storage', 'vod', 'test', 'xm_course'], + 'controllers' => ['public', 'index', 'vod', 'test', 'xm_course'], 'routes' => ['admin.package.guiding'], ]; diff --git a/app/Http/Admin/Controllers/CourseController.php b/app/Http/Admin/Controllers/CourseController.php index 6818a763..9bb19235 100644 --- a/app/Http/Admin/Controllers/CourseController.php +++ b/app/Http/Admin/Controllers/CourseController.php @@ -10,6 +10,19 @@ use App\Http\Admin\Services\Course as CourseService; class CourseController extends Controller { + /** + * @Get("/category", name="admin.course.category") + */ + public function categoryAction() + { + $location = $this->url->get( + ['for' => 'admin.category.list'], + ['type' => 'course'], + ); + + return $this->response->redirect($location); + } + /** * @Get("/search", name="admin.course.search") */ diff --git a/app/Http/Admin/Controllers/HelpController.php b/app/Http/Admin/Controllers/HelpController.php index 42ced0e3..a9431ced 100644 --- a/app/Http/Admin/Controllers/HelpController.php +++ b/app/Http/Admin/Controllers/HelpController.php @@ -10,6 +10,19 @@ use App\Http\Admin\Services\Help as HelpService; class HelpController extends Controller { + /** + * @Get("/category", name="admin.help.category") + */ + public function categoryAction() + { + $location = $this->url->get( + ['for' => 'admin.category.list'], + ['type' => 'help'], + ); + + return $this->response->redirect($location); + } + /** * @Get("/list", name="admin.help.list") */ @@ -27,7 +40,11 @@ class HelpController extends Controller */ public function addAction() { + $helpService = new HelpService(); + $categories = $helpService->getCategories(); + + $this->view->setVar('categories', $categories); } /** @@ -56,8 +73,11 @@ class HelpController extends Controller { $helpService = new HelpService; + $categories = $helpService->getCategories(); + $help = $helpService->getHelp($id); + $this->view->setVar('categories', $categories); $this->view->setVar('help', $help); } diff --git a/app/Http/Admin/Controllers/TestController.php b/app/Http/Admin/Controllers/TestController.php index 414c85d5..5a8ede2e 100644 --- a/app/Http/Admin/Controllers/TestController.php +++ b/app/Http/Admin/Controllers/TestController.php @@ -8,8 +8,8 @@ use App\Http\Admin\Services\WxpayTest as WxpayTestService; use App\Services\Captcha as CaptchaService; use App\Services\Live as LiveService; use App\Services\Mailer\Test as TestMailerService; +use App\Services\MyStorage as StorageService; use App\Services\Smser\Test as TestSmserService; -use App\Services\Storage as StorageService; use App\Services\Vod as VodService; use Phalcon\Mvc\View; @@ -29,16 +29,8 @@ class TestController extends Controller $result = []; $result['hello'] = $storageService->uploadTestFile(); - - $avatarPath = public_path('static/admin/img/default_avatar.png'); - $avatarKey = '/img/avatar/default.png'; - - $result['avatar'] = $storageService->putFile($avatarKey, $avatarPath); - - $coverPath = public_path('static/admin/img/default_cover.png'); - $coverKey = '/img/cover/default.png'; - - $result['cover'] = $storageService->putFile($coverKey, $coverPath); + $result['avatar'] = $storageService->uploadDefaultAvatarImage(); + $result['cover'] = $storageService->uploadDefaultCoverImage(); if ($result['hello'] && $result['avatar'] && $result['cover']) { return $this->jsonSuccess(['msg' => '上传文件成功,请到控制台确认']); @@ -176,9 +168,9 @@ class TestController extends Controller $order = $alipayTestService->createOrder(); $trade = $alipayTestService->createTrade($order); - $qrcodeUrl = $alipayTestService->scan($trade); + $qrcode = $alipayTestService->scan($trade); - if ($order && $trade && $qrcodeUrl) { + if ($order && $trade && $qrcode) { $this->db->commit(); } else { $this->db->rollback(); @@ -186,7 +178,7 @@ class TestController extends Controller $this->view->pick('setting/pay_alipay_test'); $this->view->setVar('sn', $trade->sn); - $this->view->setVar('qrcode_url', $qrcodeUrl); + $this->view->setVar('qrcode', $qrcode); } /** @@ -228,9 +220,9 @@ class TestController extends Controller $order = $wxpayTestService->createOrder(); $trade = $wxpayTestService->createTrade($order); - $qrcodeUrl = $wxpayTestService->scan($trade); + $qrcode = $wxpayTestService->scan($trade); - if ($order && $trade && $qrcodeUrl) { + if ($order && $trade && $qrcode) { $this->db->commit(); } else { $this->db->rollback(); @@ -238,7 +230,7 @@ class TestController extends Controller $this->view->pick('setting/pay_wxpay_test'); $this->view->setVar('sn', $trade->sn); - $this->view->setVar('qrcode_url', $qrcodeUrl); + $this->view->setVar('qrcode', $qrcode); } /** diff --git a/app/Http/Admin/Controllers/UploadController.php b/app/Http/Admin/Controllers/UploadController.php index 6cc30b93..f7ab899f 100644 --- a/app/Http/Admin/Controllers/UploadController.php +++ b/app/Http/Admin/Controllers/UploadController.php @@ -2,7 +2,7 @@ namespace App\Http\Admin\Controllers; -use App\Services\Storage as StorageService; +use App\Services\MyStorage as StorageService; /** * @RoutePrefix("/admin/upload") @@ -11,7 +11,7 @@ class UploadController extends Controller { /** - * @Post("/img/cover", name="admin.upload.cover_img") + * @Post("/cover/img", name="admin.upload.cover_img") */ public function uploadCoverImageAction() { @@ -32,7 +32,7 @@ class UploadController extends Controller } /** - * @Post("/img/avatar", name="admin.upload.avatar_img") + * @Post("/avatar/img", name="admin.upload.avatar_img") */ public function uploadAvatarImageAction() { @@ -53,7 +53,7 @@ class UploadController extends Controller } /** - * @Post("/img/editor", name="admin.upload.editor_img") + * @Post("/editor/img", name="admin.upload.editor_img") */ public function uploadEditorImageAction() { diff --git a/app/Http/Admin/Services/AuthMenu.php b/app/Http/Admin/Services/AuthMenu.php index e6d4dc72..fdee1e61 100644 --- a/app/Http/Admin/Services/AuthMenu.php +++ b/app/Http/Admin/Services/AuthMenu.php @@ -18,7 +18,9 @@ class AuthMenu extends Component public function __construct() { $this->authUser = $this->getAuthInfo(); + $this->authNodes = $this->getAuthNodes(); + $this->setOwnedLevelIds(); } @@ -46,6 +48,7 @@ class AuthMenu extends Component foreach ($level['children'] as $key2 => $level2) { foreach ($level2['children'] as $key3 => $level3) { $allowed = ($this->authUser['root'] == 1) || in_array($level3['id'], $this->owned3rdLevelIds); + $params = $level3['params'] ?? []; if ($level3['type'] == 'menu' && $allowed) { $menus[$key]['id'] = $level['id']; $menus[$key]['title'] = $level['title']; @@ -54,7 +57,7 @@ class AuthMenu extends Component $menus[$key]['children'][$key2]['children'][$key3] = [ 'id' => $level3['id'], 'title' => $level3['title'], - 'url' => $this->url->get(['for' => $level3['route']]), + 'url' => $this->url->get(['for' => $level3['route']], $params), ]; } } diff --git a/app/Http/Admin/Services/AuthNode.php b/app/Http/Admin/Services/AuthNode.php index ba6e952c..3a270a6b 100644 --- a/app/Http/Admin/Services/AuthNode.php +++ b/app/Http/Admin/Services/AuthNode.php @@ -29,6 +29,12 @@ class AuthNode extends Service 'title' => '课程管理', 'type' => 'menu', 'children' => [ + [ + 'id' => '1-1-0', + 'title' => '课程分类', + 'type' => 'menu', + 'route' => 'admin.course.category', + ], [ 'id' => '1-1-1', 'title' => '课程列表', @@ -71,12 +77,14 @@ class AuthNode extends Service 'title' => '分类列表', 'type' => 'menu', 'route' => 'admin.category.list', + 'params' => ['type' => 'course'], ], [ 'id' => '1-2-2', 'title' => '添加分类', 'type' => 'menu', 'route' => 'admin.category.add', + 'params' => ['type' => 'course'], ], [ 'id' => '1-2-3', @@ -196,6 +204,12 @@ class AuthNode extends Service 'title' => '帮助管理', 'type' => 'menu', 'children' => [ + [ + 'id' => '1-6-0', + 'title' => '帮助分类', + 'type' => 'menu', + 'route' => 'admin.help.category', + ], [ 'id' => '1-6-1', 'title' => '帮助列表', diff --git a/app/Http/Admin/Services/Category.php b/app/Http/Admin/Services/Category.php index 1cb123fa..7819da30 100644 --- a/app/Http/Admin/Services/Category.php +++ b/app/Http/Admin/Services/Category.php @@ -30,19 +30,20 @@ class Category extends Service return $parent; } - public function getTopCategories() + public function getTopCategories($type) { $categoryRepo = new CategoryRepo(); return $categoryRepo->findAll([ 'parent_id' => 0, - 'published' => 1, + 'deleted' => 0, + 'type' => $type, ]); } public function getChildCategories($parentId) { - $deleted = $this->request->getQuery('deleted', 'int', 0); + $deleted = $this->request->getQuery('deleted', ['int'], 0); $categoryRepo = new CategoryRepo(); @@ -70,6 +71,7 @@ class Category extends Service $data['parent_id'] = $parent->id; } + $data['type'] = $validator->checkType($post['type']); $data['name'] = $validator->checkName($post['name']); $data['priority'] = $validator->checkPriority($post['priority']); $data['published'] = $validator->checkPublishStatus($post['published']); @@ -190,11 +192,11 @@ class Category extends Service $cache = new CategoryListCache(); - $cache->rebuild(); + $cache->rebuild($category->type); $cache = new CategoryTreeListCache(); - $cache->rebuild(); + $cache->rebuild($category->type); } protected function enableChildCategories($parentId) diff --git a/app/Http/Admin/Services/Help.php b/app/Http/Admin/Services/Help.php index 6202c567..b29d8722 100644 --- a/app/Http/Admin/Services/Help.php +++ b/app/Http/Admin/Services/Help.php @@ -2,23 +2,48 @@ namespace App\Http\Admin\Services; -use App\Caches\Help as HelpCache; +use App\Builders\HelpList as HelpListBuilder; +use App\Caches\HelpList as HelpListCache; +use App\Models\Category as CategoryModel; use App\Models\Help as HelpModel; +use App\Repos\Category as CategoryRepo; use App\Repos\Help as HelpRepo; use App\Validators\Help as HelpValidator; +use Phalcon\Mvc\Model\Resultset; class Help extends Service { + public function getCategories() + { + $categoryRepo = new CategoryRepo(); + + return $categoryRepo->findTopCategories(CategoryModel::TYPE_HELP); + } + public function getHelps() { - $deleted = $this->request->getQuery('deleted', 'int', 0); + $query = $this->request->getQuery(); + + $params = []; + + $params['deleted'] = $query['deleted'] ?? 0; + + if (isset($query['category_id'])) { + $params['category_id'] = $query['category_id']; + } $helpRepo = new HelpRepo(); - return $helpRepo->findAll([ - 'deleted' => $deleted, - ]); + $helps = $helpRepo->findAll($params); + + $result = []; + + if ($helps->count() > 0) { + $result = $this->handleHelps($helps); + } + + return $result; } public function getHelp($id) @@ -34,16 +59,19 @@ class Help extends Service $data = []; + $category = $validator->checkCategory($post['category_id']); + $data['title'] = $validator->checkTitle($post['title']); $data['content'] = $validator->checkContent($post['content']); $data['priority'] = $validator->checkPriority($post['priority']); $data['published'] = $validator->checkPublishStatus($post['published']); + $data['category_id'] = $category->id; $help = new HelpModel(); $help->create($data); - $this->rebuildHelpCache($help); + $this->rebuildHelpListCache(); return $help; } @@ -58,6 +86,11 @@ class Help extends Service $data = []; + if (isset($post['category_id'])) { + $category = $validator->checkCategory($post['category_id']); + $data['category_id'] = $category->id; + } + if (isset($post['title'])) { $data['title'] = $validator->checkTitle($post['title']); } @@ -76,7 +109,7 @@ class Help extends Service $help->update($data); - $this->rebuildHelpCache($help); + $this->rebuildHelpListCache(); return $help; } @@ -89,7 +122,7 @@ class Help extends Service $help->update(); - $this->rebuildHelpCache($help); + $this->rebuildHelpListCache(); return $help; } @@ -102,16 +135,16 @@ class Help extends Service $help->update(); - $this->rebuildHelpCache($help); + $this->rebuildHelpListCache(); return $help; } - protected function rebuildHelpCache(HelpModel $help) + protected function rebuildHelpListCache() { - $cache = new HelpCache(); + $cache = new HelpListCache(); - $cache->rebuild($help->id); + $cache->rebuild(); } protected function findOrFail($id) @@ -121,4 +154,23 @@ class Help extends Service return $validator->checkHelp($id); } + /** + * @param Resultset $helps + * @return array|object + */ + protected function handleHelps($helps) + { + if ($helps->count() == 0) { + return []; + } + + $builder = new HelpListBuilder(); + + $items = $helps->toArray(); + + $items = $builder->handleCategories($items); + + return $builder->objects($items); + } + } diff --git a/app/Http/Admin/Services/Role.php b/app/Http/Admin/Services/Role.php index 89df2ce2..09c1accc 100644 --- a/app/Http/Admin/Services/Role.php +++ b/app/Http/Admin/Services/Role.php @@ -151,6 +151,19 @@ class Role extends Service $list[] = 'admin.chapter.restore'; } + if (in_array('admin.category.list', $routes)) { + $list[] = 'admin.course.category'; + $list[] = 'admin.help.category'; + } + + if (in_array('admin.course.category', $routes)) { + $list[] = 'admin.category.list'; + } + + if (in_array('admin.help.category', $routes)) { + $list[] = 'admin.category.list'; + } + $list = array_unique($list); return array_values($list); diff --git a/app/Http/Admin/Views/audit/list.volt b/app/Http/Admin/Views/audit/list.volt index 330e7d0a..14c36f5b 100644 --- a/app/Http/Admin/Views/audit/list.volt +++ b/app/Http/Admin/Views/audit/list.volt @@ -38,6 +38,7 @@ {% for item in pager.items %} + {% set show_url = url({'for':'admin.audit.show','id':item.id}) %} {{ item.user_id }} {{ item.user_name }} @@ -46,7 +47,7 @@ {{ item.req_path }} {{ date('Y-m-d H:i:s',item.create_time) }} - + {% endfor %} diff --git a/app/Http/Admin/Views/carousel/list.volt b/app/Http/Admin/Views/carousel/list.volt index eb298074..47adaa8c 100644 --- a/app/Http/Admin/Views/carousel/list.volt +++ b/app/Http/Admin/Views/carousel/list.volt @@ -46,18 +46,21 @@ {% for item in pager.items %} + {% set edit_url = url({'for':'admin.carousel.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.carousel.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.carousel.delete','id':item.id}) %} {{ item.id }} {{ item.title }} {{ target_info(item.target) }} - - + +
diff --git a/app/Http/Admin/Views/category/add.volt b/app/Http/Admin/Views/category/add.volt index 75fc43a9..f9dcb718 100644 --- a/app/Http/Admin/Views/category/add.volt +++ b/app/Http/Admin/Views/category/add.volt @@ -6,14 +6,14 @@
添加分类
- {% if parent_id > 0 %} + {% if parent.id > 0 %}
@@ -43,7 +43,8 @@
- + +
diff --git a/app/Http/Admin/Views/category/list.volt b/app/Http/Admin/Views/category/list.volt index a2dbdf29..bd750b69 100644 --- a/app/Http/Admin/Views/category/list.volt +++ b/app/Http/Admin/Views/category/list.volt @@ -2,6 +2,9 @@ {% block content %} + {% set add_category_url = url({'for':'admin.category.add'},{'type':type,'parent_id':parent.id}) %} + {% set allow_add_category = (type == 'course' and parent.level < 2) or (type == 'help' and parent.level < 1) %} +
@@ -15,9 +18,11 @@
- - 添加分类 - + {% if allow_add_category %} + + 添加分类 + + {% endif %}
@@ -44,26 +49,32 @@ {% for item in categories %} + {% set show_child_url = item.type == 'course' and item.level < 2 %} + {% set child_url = url({'for':'admin.category.list'},{'type':item.type,'parent_id':item.id}) %} + {% set edit_url = url({'for':'admin.category.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.category.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.category.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.category.restore','id':item.id}) %} {{ item.id }} - {% if item.level < 2 %} - {{ item.name }} + {% if show_child_url %} + {{ item.name }} {% else %} {{ item.name }} {% endif %} {{ item.level }} {{ item.child_count }} - - + +
diff --git a/app/Http/Admin/Views/chapter/lessons.volt b/app/Http/Admin/Views/chapter/lessons.volt index 1db88a47..d3573caf 100644 --- a/app/Http/Admin/Views/chapter/lessons.volt +++ b/app/Http/Admin/Views/chapter/lessons.volt @@ -2,10 +2,14 @@ {% block content %} + {% set back_url = url({'for':'admin.course.chapters','id':course.id}) %} + {% set add_chapter_url = url({'for':'admin.chapter.add'},{'type':'chapter','course_id':course.id}) %} + {% set add_lesson_url = url({'for':'admin.chapter.add'},{'type':'lesson','course_id':course.id,'parent_id':chapter.id}) %} +
- + 返回 {{ course.title }} @@ -14,10 +18,10 @@
diff --git a/app/Http/Admin/Views/consult/list.volt b/app/Http/Admin/Views/consult/list.volt index b6e41890..ba6f2e7f 100644 --- a/app/Http/Admin/Views/consult/list.volt +++ b/app/Http/Admin/Views/consult/list.volt @@ -44,9 +44,14 @@ {% for item in pager.items %} + {% set list_url = url({'for':'admin.consult.list'},{'course_id':item.course.id}) %} + {% set edit_url = url({'for':'admin.consult.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.consult.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.consult.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.consult.restore','id':item.id}) %} -

课程:{{ item.course.title }}{{ private_info(item.private) }}

+

课程:{{ item.course.title }}{{ private_info(item.private) }}

提问:{{ substr(item.question,0,30) }}

{% if item.answer %}

回复:{{ substr(item.answer,0,30) }}

@@ -57,17 +62,17 @@

编号:{{ item.owner.id }}

{{ date('Y-m-d H:i:s',item.create_time) }} - +
diff --git a/app/Http/Admin/Views/course/list.volt b/app/Http/Admin/Views/course/list.volt index facfacc4..05abeb61 100644 --- a/app/Http/Admin/Views/course/list.volt +++ b/app/Http/Admin/Views/course/list.volt @@ -28,13 +28,15 @@ {%- macro category_info(category) %} {% if category %} - 分类:{{ category.name }} + {% set url = url({'for':'admin.course.list'},{'category_id':category.id}) %} + 分类:{{ category.name }} {% endif %} {%- endmacro %} {%- macro teacher_info(teacher) %} {% if teacher %} - 讲师:{{ teacher.name }} + {% set url = url({'for':'admin.course.list'},{'teacher_id':teacher.id}) %} + 讲师:{{ teacher.name }} {% endif %} {%- endmacro %} @@ -75,18 +77,26 @@ {% for item in pager.items %} + {% set edit_url = url({'for':'admin.course.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.course.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.course.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.course.restore','id':item.id}) %} + {% set catalog_url = url({'for':'admin.course.chapters','id':item.id}) %} + {% set student_url = url({'for':'admin.student.list'},{'course_id':item.id}) %} + {% set review_url = url({'for':'admin.review.list'},{'course_id':item.id}) %} + {% set consult_url = url({'for':'admin.consult.list'},{'course_id':item.id}) %} -

标题:{{ item.title }} {{ model_info(item.model) }}

+

标题:{{ item.title }} {{ model_info(item.model) }}

{{ category_info(item.category) }}  {{ teacher_info(item.teacher) }}  {{ level_info(item.level) }}

- + {{ item.lesson_count }} - + {{ item.user_count }} @@ -94,23 +104,23 @@

市场:{{ '¥%0.2f'|format(item.market_price) }}

会员:{{ '¥%0.2f'|format(item.vip_price) }}

- + diff --git a/app/Http/Admin/Views/group/list.volt b/app/Http/Admin/Views/group/list.volt index 92834c3c..74d14f62 100644 --- a/app/Http/Admin/Views/group/list.volt +++ b/app/Http/Admin/Views/group/list.volt @@ -52,18 +52,21 @@ {% for item in pager.items %} + {% set edit_url = url({'for':'admin.group.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.group.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.group.delete','id':item.id}) %} {{ item.id }} {{ item.name }} {{ type_info(item.type) }} {{ owner_info(item.owner) }} {{ item.user_count }} - +
diff --git a/app/Http/Admin/Views/help/add.volt b/app/Http/Admin/Views/help/add.volt index 75f74c39..bd4ce5e2 100644 --- a/app/Http/Admin/Views/help/add.volt +++ b/app/Http/Admin/Views/help/add.volt @@ -6,6 +6,17 @@
添加帮助
+
+ +
+ +
+
diff --git a/app/Http/Admin/Views/help/edit.volt b/app/Http/Admin/Views/help/edit.volt index 6bba66bd..4d9ab1d4 100644 --- a/app/Http/Admin/Views/help/edit.volt +++ b/app/Http/Admin/Views/help/edit.volt @@ -6,6 +6,17 @@
编辑帮助
+
+ +
+ +
+
diff --git a/app/Http/Admin/Views/help/list.volt b/app/Http/Admin/Views/help/list.volt index 525df9e9..60f78ebc 100644 --- a/app/Http/Admin/Views/help/list.volt +++ b/app/Http/Admin/Views/help/list.volt @@ -20,17 +20,15 @@ - - - + + 编号 标题 - 创建时间 - 更新时间 + 分类 排序 发布 操作 @@ -38,20 +36,23 @@ {% for item in helps %} + {% set list_url = url({'for':'admin.help.list'},{'category_id':item.category.id}) %} + {% set edit_url = url({'for':'admin.help.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.help.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.help.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.help.restore','id':item.id}) %} {{ item.id }} {{ item.title }} - {{ date('Y-m-d H:i',item.create_time) }} - {{ date('Y-m-d H:i',item.update_time) }} - - - + {{ item.category.name }} + +
diff --git a/app/Http/Admin/Views/nav/list.volt b/app/Http/Admin/Views/nav/list.volt index fb70ed0d..da35253b 100644 --- a/app/Http/Admin/Views/nav/list.volt +++ b/app/Http/Admin/Views/nav/list.volt @@ -18,11 +18,14 @@ {% endif %} {%- endmacro %} + {% set back_url = url({'for':'admin.nav.list'}) %} + {% set add_nav_url = url({'for':'admin.nav.add'},{'parent_id':parent.id}) %} +
{% if parent.id > 0 %} - + 返回 {{ parent.name }} @@ -31,7 +34,7 @@
@@ -64,10 +67,15 @@ {% for item in navs %} + {% set child_url = url({'for':'admin.nav.list'},{'parent_id':item.id}) %} + {% set edit_url = url({'for':'admin.nav.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.nav.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.nav.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.nav.restore','id':item.id}) %} {{ item.id }} {% if item.position == 'top' and item.level < 2 %} - {{ item.name }} + {{ item.name }} {% else %} {{ item.name }} {% endif %} @@ -75,17 +83,17 @@ {{ item.child_count }} {{ position_info(item.position) }} {{ target_info(item.target) }} - - + +
diff --git a/app/Http/Admin/Views/order/list.volt b/app/Http/Admin/Views/order/list.volt index e006c258..ea5b73be 100644 --- a/app/Http/Admin/Views/order/list.volt +++ b/app/Http/Admin/Views/order/list.volt @@ -4,6 +4,8 @@ {{ partial('order/macro') }} + {% set search_url = url({'for':'admin.order.search'}) %} +
@@ -11,7 +13,7 @@
@@ -38,6 +40,7 @@ {% for item in pager.items %} + {% set show_url = url({'for':'admin.order.show','id':item.id}) %}

商品:{{ item.subject }} {{ item_type(item.item_type) }}

@@ -51,7 +54,7 @@ {{ order_status(item.status) }} {{ date('Y-m-d H:i:s',item.create_time) }} - 详情 + 详情 {% endfor %} diff --git a/app/Http/Admin/Views/package/list.volt b/app/Http/Admin/Views/package/list.volt index 58691302..873b9585 100644 --- a/app/Http/Admin/Views/package/list.volt +++ b/app/Http/Admin/Views/package/list.volt @@ -2,6 +2,8 @@ {% block content %} + {% set add_pkg_url = url({'for':'admin.package.add'}) %} +
@@ -9,7 +11,7 @@
@@ -38,19 +40,22 @@ {% for item in pager.items %} + {% set edit_url = url({'for':'admin.package.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.package.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.package.delete','id':item.id}) %} {{ item.id }} - {{ item.title }} + {{ item.title }} {{ item.course_count }} {{ '¥%0.2f'|format(item.market_price) }} {{ '¥%0.2f'|format(item.vip_price) }} - +
diff --git a/app/Http/Admin/Views/page/list.volt b/app/Http/Admin/Views/page/list.volt index 1d630df4..2548ba57 100644 --- a/app/Http/Admin/Views/page/list.volt +++ b/app/Http/Admin/Views/page/list.volt @@ -2,6 +2,8 @@ {% block content %} + {% set add_page_url = url({'for':'admin.page.add'}) %} +
@@ -9,7 +11,7 @@
@@ -36,19 +38,23 @@ {% for item in pager.items %} + {% set show_url = url({'for':'web.page.show','id':item.id}) %} + {% set edit_url = url({'for':'admin.page.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.page.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.page.delete','id':item.id}) %} {{ item.id }} - {{ item.title }} + {{ item.title }} {{ date('Y-m-d H:i',item.create_time) }} {{ date('Y-m-d H:i',item.update_time) }} - +
diff --git a/app/Http/Admin/Views/refund/list.volt b/app/Http/Admin/Views/refund/list.volt index b76ab4d6..9ca9bd0b 100644 --- a/app/Http/Admin/Views/refund/list.volt +++ b/app/Http/Admin/Views/refund/list.volt @@ -4,6 +4,8 @@ {{ partial('refund/macro') }} + {% set search_refund_url = url({'for':'admin.refund.search'}) %} +
@@ -11,7 +13,7 @@
@@ -38,6 +40,7 @@ {% for item in pager.items %} + {% set show_url = url({'for':'admin.refund.show','id':item.id}) %}

商品:{{ item.order.subject }}

@@ -51,7 +54,7 @@ {{ refund_status(item.status) }} {{ date('Y-m-d H:i:s',item.create_time) }} - 详情 + 详情 {% endfor %} diff --git a/app/Http/Admin/Views/review/list.volt b/app/Http/Admin/Views/review/list.volt index 21890044..4c5378b8 100644 --- a/app/Http/Admin/Views/review/list.volt +++ b/app/Http/Admin/Views/review/list.volt @@ -2,6 +2,8 @@ {% block content %} + {% set search_review_url = url({'for':'admin.review.search'}) %} +
@@ -13,7 +15,7 @@
@@ -38,9 +40,15 @@ {% for item in pager.items %} + {% set list_by_course_url = url({'for':'admin.review.list'},{'course_id':item.course.id}) %} + {% set list_by_owner_url = url({'for':'admin.review.list'},{'owner_id':item.owner.id}) %} + {% set edit_url = url({'for':'admin.review.edit','id':item.id}) %} + {% set update_url = url({'for':'admin.review.update','id':item.id}) %} + {% set delete_url = url({'for':'admin.review.delete','id':item.id}) %} + {% set restore_url = url({'for':'admin.review.restore','id':item.id}) %} -

课程:{{ item.course.title }}

+

课程:{{ item.course.title }}

评价:{{ substr(item.content,0,30) }}

时间:{{ date('Y-m-d H:i:s',item.create_time) }}

@@ -50,19 +58,19 @@

逻辑清晰:{{ item.rating3 }}

-

昵称:{{ item.owner.name }}

+

昵称:{{ item.owner.name }}

编号:{{ item.owner.id }}

- +
diff --git a/app/Http/Admin/Views/role/list.volt b/app/Http/Admin/Views/role/list.volt index 56d6f736..dd1ac1f1 100644 --- a/app/Http/Admin/Views/role/list.volt +++ b/app/Http/Admin/Views/role/list.volt @@ -10,6 +10,8 @@ {% endif %} {%- endmacro %} + {% set add_role_url = url({'for':'admin.role.add'}) %} +
@@ -17,7 +19,7 @@
@@ -42,12 +44,15 @@ {% for item in roles %} + {% set user_list_url = url({'for':'admin.user.list'},{'admin_role':item.id}) %} + {% set edit_url = url({'for':'admin.role.edit','id':item.id}) %} + {% set delete_url = url({'for':'admin.role.delete','id':item.id}) %} {{ item.id }} {{ item.name }} {{ type_info(item.type) }} - + {{ item.user_count }} @@ -55,8 +60,8 @@
diff --git a/app/Http/Admin/Views/setting/pay_alipay_test.volt b/app/Http/Admin/Views/setting/pay_alipay_test.volt index a6932027..48be53ee 100644 --- a/app/Http/Admin/Views/setting/pay_alipay_test.volt +++ b/app/Http/Admin/Views/setting/pay_alipay_test.volt @@ -4,9 +4,9 @@
- {% if qrcode_url %} + {% if qrcode %}
- 二维码图片 + 二维码图片
@@ -27,7 +27,7 @@ {% block inline_js %} - {% if qrcode_url %} + {% if Code %}