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.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 }}
标题:{{ item.title }} {{ model_info(item.model) }}
+标题:{{ item.title }} {{ model_info(item.model) }}
{{ category_info(item.category) }} {{ teacher_info(item.teacher) }} {{ level_info(item.level) }}
市场:{{ '¥%0.2f'|format(item.market_price) }}
会员:{{ '¥%0.2f'|format(item.vip_price) }}
-商品:{{ item.subject }} {{ item_type(item.item_type) }}
@@ -51,7 +54,7 @@商品:{{ item.order.subject }}
@@ -51,7 +54,7 @@评价:{{ substr(item.content,0,30) }}
时间:{{ date('Y-m-d H:i:s',item.create_time) }}
逻辑清晰:{{ item.rating3 }}
编号:{{ item.owner.id }}