1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-18 06:06:13 +08:00

清理后台冗余代码

This commit is contained in:
xiaochong0302 2020-04-24 19:54:04 +08:00
parent 530ec92736
commit 3c6e0c2a3b
53 changed files with 581 additions and 888 deletions

View File

@ -5,7 +5,7 @@ namespace App\Caches;
class UserDailyCounter extends Counter class UserDailyCounter extends Counter
{ {
protected $lifetime = 86400; protected $lifetime = 1 * 86400;
public function getLifetime() public function getLifetime()
{ {

View File

@ -8,7 +8,7 @@ use Phalcon\Cli\Task;
use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface; use Phalcon\Mvc\Model\ResultsetInterface;
class CleanAuthTokenTask extends Task class CleanTokenTask extends Task
{ {
public function mainAction() public function mainAction()

View File

@ -9,13 +9,13 @@ use Phalcon\Cli\Task;
use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface; use Phalcon\Mvc\Model\ResultsetInterface;
class ManageCourseIndexTask extends Task class CourseIndexTask extends Task
{ {
/** /**
* 搜索测试 * 搜索测试
* *
* @command: php console.php manage_course_index search {query} * @command: php console.php course_index search {query}
* @param array $params * @param array $params
* @throws \XSException * @throws \XSException
*/ */
@ -35,7 +35,7 @@ class ManageCourseIndexTask extends Task
/** /**
* 清空索引 * 清空索引
* *
* @command: php console.php manage_course_index clean * @command: php console.php course_index clean
*/ */
public function cleanAction() public function cleanAction()
{ {
@ -45,7 +45,7 @@ class ManageCourseIndexTask extends Task
/** /**
* 重建索引 * 重建索引
* *
* @command: php console.php manage_course_index rebuild * @command: php console.php course_index rebuild
*/ */
public function rebuildAction() public function rebuildAction()
{ {
@ -103,7 +103,7 @@ class ManageCourseIndexTask extends Task
* 搜索课程 * 搜索课程
* *
* @param string $query * @param string $query
* @return array $result * @return array
* @throws \XSException * @throws \XSException
*/ */
protected function searchCourses($query) protected function searchCourses($query)

View File

@ -10,7 +10,7 @@ use App\Repos\ChapterUser as ChapterUserRepo;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Repos\CourseUser as CourseUserRepo; use App\Repos\CourseUser as CourseUserRepo;
use App\Repos\Learning as LearningRepo; use App\Repos\Learning as LearningRepo;
use App\Services\LearningSyncer; use App\Services\Syncer\Learning as LearningSyncer;
use Phalcon\Cli\Task; use Phalcon\Cli\Task;
class LearningTask extends Task class LearningTask extends Task

View File

@ -5,7 +5,7 @@ namespace App\Console\Tasks;
use App\Caches\ChapterCounter as ChapterCounterCache; use App\Caches\ChapterCounter as ChapterCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache; use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Chapter as ChapterRepo; use App\Repos\Chapter as ChapterRepo;
use App\Services\ChapterCounterSyncer; use App\Services\Syncer\ChapterCounter as ChapterCounterSyncer;
class SyncChapterCounterTask extends Task class SyncChapterCounterTask extends Task
{ {

View File

@ -5,7 +5,7 @@ namespace App\Console\Tasks;
use App\Caches\CommentCounter as CommentCounterCache; use App\Caches\CommentCounter as CommentCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache; use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Comment as CommentRepo; use App\Repos\Comment as CommentRepo;
use App\Services\CommentCounterSyncer; use App\Services\Syncer\CommentCounter as CommentCounterSyncer;
class SyncCommentCounterTask extends Task class SyncCommentCounterTask extends Task
{ {

View File

@ -5,7 +5,7 @@ namespace App\Console\Tasks;
use App\Caches\ConsultCounter as ConsultCounterCache; use App\Caches\ConsultCounter as ConsultCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache; use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Consult as ConsultRepo; use App\Repos\Consult as ConsultRepo;
use App\Services\ConsultCounterSyncer; use App\Services\Syncer\ConsultCounter as ConsultCounterSyncer;
class SyncConsultCounterTask extends Task class SyncConsultCounterTask extends Task
{ {

View File

@ -5,9 +5,9 @@ namespace App\Console\Tasks;
use App\Caches\CourseCounter as CourseCounterCache; use App\Caches\CourseCounter as CourseCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache; use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Services\CourseCounterSyncer; use App\Services\Syncer\CourseCounter as CourseCounterSyncer;
class syncCourseCounterTask extends Task class SyncCourseCounterTask extends Task
{ {
/** /**

View File

@ -6,7 +6,7 @@ use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Course as CourseRepo; use App\Repos\Course as CourseRepo;
use App\Searchers\CourseDocument; use App\Searchers\CourseDocument;
use App\Searchers\CourseSearch; use App\Searchers\CourseSearch;
use App\Services\CourseIndexSyncer; use App\Services\Syncer\CourseIndex as CourseIndexSyncer;
class SyncCourseIndexTask extends Task class SyncCourseIndexTask extends Task
{ {

View File

@ -5,7 +5,7 @@ namespace App\Console\Tasks;
use App\Caches\ReviewCounter as ReviewCounterCache; use App\Caches\ReviewCounter as ReviewCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache; use App\Library\Cache\Backend\Redis as RedisCache;
use App\Repos\Review as ReviewRepo; use App\Repos\Review as ReviewRepo;
use App\Services\ReviewCounterSyncer; use App\Services\Syncer\ReviewCounter as ReviewCounterSyncer;
class SyncReviewCounterTask extends Task class SyncReviewCounterTask extends Task
{ {

View File

@ -30,7 +30,7 @@ class AuthMenu extends Component
if ($this->authUser->id || in_array($node['id'], $this->owned1stLevelIds)) { if ($this->authUser->id || in_array($node['id'], $this->owned1stLevelIds)) {
$menus[] = [ $menus[] = [
'id' => $node['id'], 'id' => $node['id'],
'label' => $node['label'], 'title' => $node['title'],
]; ];
} }
} }
@ -43,17 +43,17 @@ class AuthMenu extends Component
$menus = []; $menus = [];
foreach ($this->authNodes as $key => $level) { foreach ($this->authNodes as $key => $level) {
foreach ($level['child'] as $key2 => $level2) { foreach ($level['children'] as $key2 => $level2) {
foreach ($level2['child'] as $key3 => $level3) { foreach ($level2['children'] as $key3 => $level3) {
$hasRight = $this->authUser->root || in_array($level3['id'], $this->owned3rdLevelIds); $hasRight = $this->authUser->root || in_array($level3['id'], $this->owned3rdLevelIds);
if ($level3['type'] == 'menu' && $hasRight) { if ($level3['type'] == 'menu' && $hasRight) {
$menus[$key]['id'] = $level['id']; $menus[$key]['id'] = $level['id'];
$menus[$key]['label'] = $level['label']; $menus[$key]['title'] = $level['title'];
$menus[$key]['child'][$key2]['id'] = $level2['id']; $menus[$key]['children'][$key2]['id'] = $level2['id'];
$menus[$key]['child'][$key2]['label'] = $level2['label']; $menus[$key]['children'][$key2]['title'] = $level2['title'];
$menus[$key]['child'][$key2]['child'][$key3] = [ $menus[$key]['children'][$key2]['children'][$key3] = [
'id' => $level3['id'], 'id' => $level3['id'],
'label' => $level3['label'], 'title' => $level3['title'],
'url' => $this->url->get(['for' => $level3['route']]), 'url' => $this->url->get(['for' => $level3['route']]),
]; ];
} }
@ -93,8 +93,8 @@ class AuthMenu extends Component
$mapping = []; $mapping = [];
foreach ($this->authNodes as $level) { foreach ($this->authNodes as $level) {
foreach ($level['child'] as $level2) { foreach ($level['children'] as $level2) {
foreach ($level2['child'] as $level3) { foreach ($level2['children'] as $level3) {
if ($level3['type'] == 'menu') { if ($level3['type'] == 'menu') {
$mapping[$level3['route']] = $level3['id']; $mapping[$level3['route']] = $level3['id'];
} }

View File

@ -22,40 +22,40 @@ class AuthNode extends Service
{ {
return [ return [
'id' => '1', 'id' => '1',
'label' => '内容管理', 'title' => '内容管理',
'child' => [ 'children' => [
[ [
'id' => '1-1', 'id' => '1-1',
'label' => '课程管理', 'title' => '课程管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-1-1', 'id' => '1-1-1',
'label' => '课程列表', 'title' => '课程列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.course.list', 'route' => 'admin.course.list',
], ],
[ [
'id' => '1-1-2', 'id' => '1-1-2',
'label' => '搜索课程', 'title' => '搜索课程',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.course.search', 'route' => 'admin.course.search',
], ],
[ [
'id' => '1-1-3', 'id' => '1-1-3',
'label' => '添加课程', 'title' => '添加课程',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.course.add', 'route' => 'admin.course.add',
], ],
[ [
'id' => '1-1-4', 'id' => '1-1-4',
'label' => '编辑课程', 'title' => '编辑课程',
'type' => 'button', 'type' => 'button',
'route' => 'admin.course.edit', 'route' => 'admin.course.edit',
], ],
[ [
'id' => '1-1-5', 'id' => '1-1-5',
'label' => '删除课程', 'title' => '删除课程',
'type' => 'button', 'type' => 'button',
'route' => 'admin.course.edit', 'route' => 'admin.course.edit',
], ],
@ -63,30 +63,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '1-2', 'id' => '1-2',
'label' => '分类管理', 'title' => '分类管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-2-1', 'id' => '1-2-1',
'label' => '分类列表', 'title' => '分类列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.category.list', 'route' => 'admin.category.list',
], ],
[ [
'id' => '1-2-2', 'id' => '1-2-2',
'label' => '添加分类', 'title' => '添加分类',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.category.add', 'route' => 'admin.category.add',
], ],
[ [
'id' => '1-2-3', 'id' => '1-2-3',
'label' => '编辑分类', 'title' => '编辑分类',
'type' => 'button', 'type' => 'button',
'route' => 'admin.category.edit', 'route' => 'admin.category.edit',
], ],
[ [
'id' => '1-2-4', 'id' => '1-2-4',
'label' => '删除分类', 'title' => '删除分类',
'type' => 'button', 'type' => 'button',
'route' => 'admin.category.delete', 'route' => 'admin.category.delete',
], ],
@ -94,30 +94,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '1-3', 'id' => '1-3',
'label' => '套餐管理', 'title' => '套餐管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-3-1', 'id' => '1-3-1',
'label' => '套餐列表', 'title' => '套餐列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.package.list', 'route' => 'admin.package.list',
], ],
[ [
'id' => '1-3-2', 'id' => '1-3-2',
'label' => '添加套餐', 'title' => '添加套餐',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.package.add', 'route' => 'admin.package.add',
], ],
[ [
'id' => '1-3-3', 'id' => '1-3-3',
'label' => '编辑套餐', 'title' => '编辑套餐',
'type' => 'button', 'type' => 'button',
'route' => 'admin.package.edit', 'route' => 'admin.package.edit',
], ],
[ [
'id' => '1-3-4', 'id' => '1-3-4',
'label' => '删除套餐', 'title' => '删除套餐',
'type' => 'button', 'type' => 'button',
'route' => 'admin.package.delete', 'route' => 'admin.package.delete',
], ],
@ -125,30 +125,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '1-4', 'id' => '1-4',
'label' => '话题管理', 'title' => '话题管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-4-1', 'id' => '1-4-1',
'label' => '话题列表', 'title' => '话题列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.topic.list', 'route' => 'admin.topic.list',
], ],
[ [
'id' => '1-4-2', 'id' => '1-4-2',
'label' => '添加话题', 'title' => '添加话题',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.topic.add', 'route' => 'admin.topic.add',
], ],
[ [
'id' => '1-4-3', 'id' => '1-4-3',
'label' => '编辑话题', 'title' => '编辑话题',
'type' => 'button', 'type' => 'button',
'route' => 'admin.topic.edit', 'route' => 'admin.topic.edit',
], ],
[ [
'id' => '1-4-4', 'id' => '1-4-4',
'label' => '删除话题', 'title' => '删除话题',
'type' => 'button', 'type' => 'button',
'route' => 'admin.topic.delete', 'route' => 'admin.topic.delete',
], ],
@ -156,30 +156,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '1-5', 'id' => '1-5',
'label' => '单页管理', 'title' => '单页管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-5-1', 'id' => '1-5-1',
'label' => '单页列表', 'title' => '单页列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.page.list', 'route' => 'admin.page.list',
], ],
[ [
'id' => '1-5-2', 'id' => '1-5-2',
'label' => '添加单页', 'title' => '添加单页',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.page.add', 'route' => 'admin.page.add',
], ],
[ [
'id' => '1-5-3', 'id' => '1-5-3',
'label' => '编辑单页', 'title' => '编辑单页',
'type' => 'button', 'type' => 'button',
'route' => 'admin.page.edit', 'route' => 'admin.page.edit',
], ],
[ [
'id' => '1-5-4', 'id' => '1-5-4',
'label' => '删除单页', 'title' => '删除单页',
'type' => 'button', 'type' => 'button',
'route' => 'admin.page.delete', 'route' => 'admin.page.delete',
], ],
@ -187,30 +187,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '1-6', 'id' => '1-6',
'label' => '帮助管理', 'title' => '帮助管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '1-6-1', 'id' => '1-6-1',
'label' => '帮助列表', 'title' => '帮助列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.help.list', 'route' => 'admin.help.list',
], ],
[ [
'id' => '1-6-2', 'id' => '1-6-2',
'label' => '添加帮助', 'title' => '添加帮助',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.help.add', 'route' => 'admin.help.add',
], ],
[ [
'id' => '1-6-3', 'id' => '1-6-3',
'label' => '编辑帮助', 'title' => '编辑帮助',
'type' => 'button', 'type' => 'button',
'route' => 'admin.help.edit', 'route' => 'admin.help.edit',
], ],
[ [
'id' => '1-6-4', 'id' => '1-6-4',
'label' => '删除帮助', 'title' => '删除帮助',
'type' => 'button', 'type' => 'button',
'route' => 'admin.help.delete', 'route' => 'admin.help.delete',
], ],
@ -224,34 +224,34 @@ class AuthNode extends Service
{ {
return [ return [
'id' => '2', 'id' => '2',
'label' => '运营管理', 'title' => '运营管理',
'child' => [ 'children' => [
[ [
'id' => '2-1', 'id' => '2-1',
'label' => '学员管理', 'title' => '学员管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-1-1', 'id' => '2-1-1',
'label' => '学员列表', 'title' => '学员列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.student.list', 'route' => 'admin.student.list',
], ],
[ [
'id' => '2-1-2', 'id' => '2-1-2',
'label' => '搜索学员', 'title' => '搜索学员',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.student.search', 'route' => 'admin.student.search',
], ],
[ [
'id' => '2-1-3', 'id' => '2-1-3',
'label' => '添加学员', 'title' => '添加学员',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.student.add', 'route' => 'admin.student.add',
], ],
[ [
'id' => '2-1-4', 'id' => '2-1-4',
'label' => '编辑学员', 'title' => '编辑学员',
'type' => 'button', 'type' => 'button',
'route' => 'admin.student.edit', 'route' => 'admin.student.edit',
], ],
@ -259,30 +259,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '2-2', 'id' => '2-2',
'label' => '咨询管理', 'title' => '咨询管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-2-1', 'id' => '2-2-1',
'label' => '咨询列表', 'title' => '咨询列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.consult.list', 'route' => 'admin.consult.list',
], ],
[ [
'id' => '2-2-2', 'id' => '2-2-2',
'label' => '搜索咨询', 'title' => '搜索咨询',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.consult.search', 'route' => 'admin.consult.search',
], ],
[ [
'id' => '2-2-3', 'id' => '2-2-3',
'label' => '编辑咨询', 'title' => '编辑咨询',
'type' => 'button', 'type' => 'button',
'route' => 'admin.consult.edit', 'route' => 'admin.consult.edit',
], ],
[ [
'id' => '2-2-4', 'id' => '2-2-4',
'label' => '删除咨询', 'title' => '删除咨询',
'type' => 'button', 'type' => 'button',
'route' => 'admin.consult.delete', 'route' => 'admin.consult.delete',
], ],
@ -290,30 +290,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '2-3', 'id' => '2-3',
'label' => '评价管理', 'title' => '评价管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-3-1', 'id' => '2-3-1',
'label' => '评价列表', 'title' => '评价列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.review.list', 'route' => 'admin.review.list',
], ],
[ [
'id' => '2-3-2', 'id' => '2-3-2',
'label' => '搜索评价', 'title' => '搜索评价',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.review.search', 'route' => 'admin.review.search',
], ],
[ [
'id' => '2-3-3', 'id' => '2-3-3',
'label' => '编辑评价', 'title' => '编辑评价',
'type' => 'button', 'type' => 'button',
'route' => 'admin.review.edit', 'route' => 'admin.review.edit',
], ],
[ [
'id' => '2-3-4', 'id' => '2-3-4',
'label' => '删除评价', 'title' => '删除评价',
'type' => 'button', 'type' => 'button',
'route' => 'admin.review.delete', 'route' => 'admin.review.delete',
], ],
@ -321,30 +321,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '2-4', 'id' => '2-4',
'label' => '评论管理', 'title' => '评论管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-4-1', 'id' => '2-4-1',
'label' => '评论列表', 'title' => '评论列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.comment.list', 'route' => 'admin.comment.list',
], ],
[ [
'id' => '2-4-2', 'id' => '2-4-2',
'label' => '搜索评论', 'title' => '搜索评论',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.comment.search', 'route' => 'admin.comment.search',
], ],
[ [
'id' => '2-4-3', 'id' => '2-4-3',
'label' => '编辑评论', 'title' => '编辑评论',
'type' => 'button', 'type' => 'button',
'route' => 'admin.comment.edit', 'route' => 'admin.comment.edit',
], ],
[ [
'id' => '2-4-4', 'id' => '2-4-4',
'label' => '删除评论', 'title' => '删除评论',
'type' => 'button', 'type' => 'button',
'route' => 'admin.comment.delete', 'route' => 'admin.comment.delete',
], ],
@ -352,30 +352,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '2-5', 'id' => '2-5',
'label' => '轮播管理', 'title' => '轮播管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-5-1', 'id' => '2-5-1',
'label' => '轮播列表', 'title' => '轮播列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.slide.list', 'route' => 'admin.slide.list',
], ],
[ [
'id' => '2-5-2', 'id' => '2-5-2',
'label' => '添加轮播', 'title' => '添加轮播',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.slide.add', 'route' => 'admin.slide.add',
], ],
[ [
'id' => '2-5-3', 'id' => '2-5-3',
'label' => '编辑轮播', 'title' => '编辑轮播',
'type' => 'button', 'type' => 'button',
'route' => 'admin.slide.edit', 'route' => 'admin.slide.edit',
], ],
[ [
'id' => '2-5-4', 'id' => '2-5-4',
'label' => '删除轮播', 'title' => '删除轮播',
'type' => 'button', 'type' => 'button',
'route' => 'admin.slide.delete', 'route' => 'admin.slide.delete',
], ],
@ -383,30 +383,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '2-6', 'id' => '2-6',
'label' => '导航管理', 'title' => '导航管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '2-6-1', 'id' => '2-6-1',
'label' => '导航列表', 'title' => '导航列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.nav.list', 'route' => 'admin.nav.list',
], ],
[ [
'id' => '2-6-2', 'id' => '2-6-2',
'label' => '添加导航', 'title' => '添加导航',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.nav.add', 'route' => 'admin.nav.add',
], ],
[ [
'id' => '2-6-3', 'id' => '2-6-3',
'label' => '编辑导航', 'title' => '编辑导航',
'type' => 'button', 'type' => 'button',
'route' => 'admin.nav.edit', 'route' => 'admin.nav.edit',
], ],
[ [
'id' => '2-6-4', 'id' => '2-6-4',
'label' => '删除导航', 'title' => '删除导航',
'type' => 'button', 'type' => 'button',
'route' => 'admin.nav.delete', 'route' => 'admin.nav.delete',
], ],
@ -420,34 +420,34 @@ class AuthNode extends Service
{ {
return [ return [
'id' => '3', 'id' => '3',
'label' => '财务管理', 'title' => '财务管理',
'child' => [ 'children' => [
[ [
'id' => '3-1', 'id' => '3-1',
'label' => '订单管理', 'title' => '订单管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '3-1-1', 'id' => '3-1-1',
'label' => '订单列表', 'title' => '订单列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.order.list', 'route' => 'admin.order.list',
], ],
[ [
'id' => '3-1-2', 'id' => '3-1-2',
'label' => '搜索订单', 'title' => '搜索订单',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.order.search', 'route' => 'admin.order.search',
], ],
[ [
'id' => '3-1-3', 'id' => '3-1-3',
'label' => '订单详情', 'title' => '订单详情',
'type' => 'button', 'type' => 'button',
'route' => 'admin.order.show', 'route' => 'admin.order.show',
], ],
[ [
'id' => '3-1-4', 'id' => '3-1-4',
'label' => '关闭订单', 'title' => '关闭订单',
'type' => 'button', 'type' => 'button',
'route' => 'admin.order.close', 'route' => 'admin.order.close',
], ],
@ -455,30 +455,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '3-2', 'id' => '3-2',
'label' => '交易管理', 'title' => '交易管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '3-2-1', 'id' => '3-2-1',
'label' => '交易记录', 'title' => '交易记录',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.trade.list', 'route' => 'admin.trade.list',
], ],
[ [
'id' => '3-2-2', 'id' => '3-2-2',
'label' => '搜索交易', 'title' => '搜索交易',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.trade.search', 'route' => 'admin.trade.search',
], ],
[ [
'id' => '3-2-3', 'id' => '3-2-3',
'label' => '关闭交易', 'title' => '关闭交易',
'type' => 'button', 'type' => 'button',
'route' => 'admin.trade.close', 'route' => 'admin.trade.close',
], ],
[ [
'id' => '3-2-4', 'id' => '3-2-4',
'label' => '交易退款', 'title' => '交易退款',
'type' => 'button', 'type' => 'button',
'route' => 'admin.trade.refund', 'route' => 'admin.trade.refund',
], ],
@ -486,30 +486,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '3-3', 'id' => '3-3',
'label' => '退款管理', 'title' => '退款管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '3-3-1', 'id' => '3-3-1',
'label' => '退款列表', 'title' => '退款列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.refund.list', 'route' => 'admin.refund.list',
], ],
[ [
'id' => '3-3-2', 'id' => '3-3-2',
'label' => '搜索退款', 'title' => '搜索退款',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.refund.search', 'route' => 'admin.refund.search',
], ],
[ [
'id' => '3-3-3', 'id' => '3-3-3',
'label' => '退款详情', 'title' => '退款详情',
'type' => 'button', 'type' => 'button',
'route' => 'admin.refund.show', 'route' => 'admin.refund.show',
], ],
[ [
'id' => '3-3-4', 'id' => '3-3-4',
'label' => '审核退款', 'title' => '审核退款',
'type' => 'button', 'type' => 'button',
'route' => 'admin.refund.review', 'route' => 'admin.refund.review',
], ],
@ -523,34 +523,34 @@ class AuthNode extends Service
{ {
return [ return [
'id' => '4', 'id' => '4',
'label' => '用户管理', 'title' => '用户管理',
'child' => [ 'children' => [
[ [
'id' => '4-1', 'id' => '4-1',
'label' => '用户管理', 'title' => '用户管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '4-1-1', 'id' => '4-1-1',
'label' => '用户列表', 'title' => '用户列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.user.list', 'route' => 'admin.user.list',
], ],
[ [
'id' => '4-1-2', 'id' => '4-1-2',
'label' => '搜索用户', 'title' => '搜索用户',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.user.search', 'route' => 'admin.user.search',
], ],
[ [
'id' => '4-1-3', 'id' => '4-1-3',
'label' => '添加用户', 'title' => '添加用户',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.user.add', 'route' => 'admin.user.add',
], ],
[ [
'id' => '4-1-4', 'id' => '4-1-4',
'label' => '编辑用户', 'title' => '编辑用户',
'type' => 'button', 'type' => 'button',
'route' => 'admin.user.edit', 'route' => 'admin.user.edit',
] ]
@ -558,30 +558,30 @@ class AuthNode extends Service
], ],
[ [
'id' => '4-2', 'id' => '4-2',
'label' => '角色管理', 'title' => '角色管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '4-2-1', 'id' => '4-2-1',
'label' => '角色列表', 'title' => '角色列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.role.list', 'route' => 'admin.role.list',
], ],
[ [
'id' => '4-2-2', 'id' => '4-2-2',
'label' => '添加角色', 'title' => '添加角色',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.role.add', 'route' => 'admin.role.add',
], ],
[ [
'id' => '4-2-3', 'id' => '4-2-3',
'label' => '编辑角色', 'title' => '编辑角色',
'type' => 'button', 'type' => 'button',
'route' => 'admin.role.edit', 'route' => 'admin.role.edit',
], ],
[ [
'id' => '4-2-4', 'id' => '4-2-4',
'label' => '删除角色', 'title' => '删除角色',
'type' => 'button', 'type' => 'button',
'route' => 'admin.role.delete', 'route' => 'admin.role.delete',
] ]
@ -589,24 +589,24 @@ class AuthNode extends Service
], ],
[ [
'id' => '4-3', 'id' => '4-3',
'label' => '操作记录', 'title' => '操作记录',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '4-3-1', 'id' => '4-3-1',
'label' => '记录列表', 'title' => '记录列表',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.audit.list', 'route' => 'admin.audit.list',
], ],
[ [
'id' => '4-3-2', 'id' => '4-3-2',
'label' => '搜索记录', 'title' => '搜索记录',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.audit.search', 'route' => 'admin.audit.search',
], ],
[ [
'id' => '4-3-3', 'id' => '4-3-3',
'label' => '浏览记录', 'title' => '浏览记录',
'type' => 'button', 'type' => 'button',
'route' => 'admin.audit.show', 'route' => 'admin.audit.show',
], ],
@ -620,70 +620,70 @@ class AuthNode extends Service
{ {
return [ return [
'id' => '5', 'id' => '5',
'label' => '系统配置', 'title' => '系统配置',
'child' => [ 'children' => [
[ [
'id' => '5-1', 'id' => '5-1',
'label' => '配置管理', 'title' => '配置管理',
'type' => 'menu', 'type' => 'menu',
'child' => [ 'children' => [
[ [
'id' => '5-1-1', 'id' => '5-1-1',
'label' => '网站设置', 'title' => '网站设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.site', 'route' => 'admin.setting.site',
], ],
[ [
'id' => '5-1-2', 'id' => '5-1-2',
'label' => '密钥设置', 'title' => '密钥设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.secret', 'route' => 'admin.setting.secret',
], ],
[ [
'id' => '5-1-3', 'id' => '5-1-3',
'label' => '存储设置', 'title' => '存储设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.storage', 'route' => 'admin.setting.storage',
], ],
[ [
'id' => '5-1-4', 'id' => '5-1-4',
'label' => '点播设置', 'title' => '点播设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.vod', 'route' => 'admin.setting.vod',
], ],
[ [
'id' => '5-1-5', 'id' => '5-1-5',
'label' => '直播设置', 'title' => '直播设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.live', 'route' => 'admin.setting.live',
], ],
[ [
'id' => '5-1-6', 'id' => '5-1-6',
'label' => '短信设置', 'title' => '短信设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.smser', 'route' => 'admin.setting.smser',
], ],
[ [
'id' => '5-1-7', 'id' => '5-1-7',
'label' => '邮件设置', 'title' => '邮件设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.mailer', 'route' => 'admin.setting.mailer',
], ],
[ [
'id' => '5-1-8', 'id' => '5-1-8',
'label' => '验证码设置', 'title' => '验证码设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.captcha', 'route' => 'admin.setting.captcha',
], ],
[ [
'id' => '5-1-9', 'id' => '5-1-9',
'label' => '支付设置', 'title' => '支付设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.pay', 'route' => 'admin.setting.pay',
], ],
[ [
'id' => '5-1-10', 'id' => '5-1-10',
'label' => '会员设置', 'title' => '会员设置',
'type' => 'menu', 'type' => 'menu',
'route' => 'admin.setting.vip', 'route' => 'admin.setting.vip',
] ]

View File

@ -21,7 +21,6 @@ use App\Repos\CourseUser as CourseUserRepo;
use App\Repos\User as UserRepo; use App\Repos\User as UserRepo;
use App\Services\Syncer\CourseIndex as CourseIndexSyncer; use App\Services\Syncer\CourseIndex as CourseIndexSyncer;
use App\Validators\Course as CourseValidator; use App\Validators\Course as CourseValidator;
use Yansongda\Supports\Collection;
class Course extends Service class Course extends Service
{ {
@ -183,16 +182,12 @@ class Course extends Service
public function getStudyExpiryOptions() public function getStudyExpiryOptions()
{ {
$options = CourseModel::studyExpiryOptions(); return CourseModel::studyExpiryOptions();
return new Collection($options);
} }
public function getRefundExpiryOptions() public function getRefundExpiryOptions()
{ {
$options = CourseModel::refundExpiryOptions(); return CourseModel::refundExpiryOptions();
return new Collection($options);
} }
public function getXmCategories($id) public function getXmCategories($id)
@ -385,6 +380,13 @@ class Course extends Service
} }
} }
$teacherId = $newTeacherIds[0] ?? 0;
if ($teacherId) {
$course->teacher_id = $teacherId;
$course->update();
}
$cache = new CourseTeacherListCache(); $cache = new CourseTeacherListCache();
$cache->rebuild(); $cache->rebuild();

View File

@ -9,18 +9,14 @@ class Index extends Service
{ {
$authMenu = new AuthMenu(); $authMenu = new AuthMenu();
$topMenus = $authMenu->getTopMenus(); return $authMenu->getTopMenus();
return kg_array_object($topMenus);
} }
public function getLeftMenus() public function getLeftMenus()
{ {
$authMenu = new AuthMenu(); $authMenu = new AuthMenu();
$leftMenus = $authMenu->getLeftMenus(); return $authMenu->getLeftMenus();
return kg_array_object($leftMenus);
} }
} }

View File

@ -37,12 +37,12 @@
<tr> <tr>
<td>{{ item.user_id }}</td> <td>{{ item.user_id }}</td>
<td>{{ item.user_name }}</td> <td>{{ item.user_name }}</td>
<td><a class="kg-ip2region" href="javascript:;" title="查看位置" ip="{{ item.user_ip }}">{{ item.user_ip }}</a></td> <td><a class="kg-ip2region" href="javascript:" title="查看位置" data-ip="{{ item.user_ip }}">{{ item.user_ip }}</a></td>
<td>{{ item.req_route }}</td> <td>{{ item.req_route }}</td>
<td>{{ item.req_path }}</td> <td>{{ item.req_path }}</td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td> <td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
<td align="center"> <td align="center">
<button class="kg-view layui-btn layui-btn-sm" audit-id="{{ item.id }}">浏览</button> <button class="kg-view layui-btn layui-btn-sm" data-url="{{ url({'for':'admin.audit.show','id':item.id}) }}">浏览</button>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -60,8 +60,7 @@
var layer = layui.layer; var layer = layui.layer;
$('.kg-view').on('click', function () { $('.kg-view').on('click', function () {
var auditId = $(this).attr('audit-id'); var url = $(this).attr('data-url');
var url = '/admin/audit/' + auditId + '/show';
layer.open({ layer.open({
type: 2, type: 2,
title: '请求内容', title: '请求内容',

View File

@ -52,17 +52,17 @@
<td><span class="layui-badge layui-bg-gray">{{ item.level }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.level }}</span></td>
<td><span class="layui-badge layui-bg-gray">{{ item.child_count }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.child_count }}</span></td>
<td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" category-id="{{ item.id }}" title="数值越小排序越靠前"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.category.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" category-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.category.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.category.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.category.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.category.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.category.delete','id':item.id}) }}">删除</a></li>
{% else %} {% else %}
<li><a href="javascript:" class="kg-restore" url="{{ url({'for':'admin.category.restore','id':item.id}) }}">还原</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.category.restore','id':item.id}) }}">还原</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -71,58 +71,3 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script>
layui.use(['jquery', 'form', 'layer'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
$('input[name=priority]').on('change', function () {
var priority = $(this).val();
var categoryId = $(this).attr('category-id');
$.ajax({
type: 'POST',
url: '/admin/category/' + categoryId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
form.on('switch(switch-published)', function (data) {
var categoryId = $(this).attr('category-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布分类?' : '确定要下线分类?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/category/' + categoryId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -35,30 +35,13 @@
var layer = layui.layer; var layer = layui.layer;
var form = layui.form; var form = layui.form;
$('input[name=priority]').on('change', function () { form.on('switch(free)', function (data) {
var priority = $(this).val();
var chapterId = $(this).attr('chapter-id');
$.ajax({
type: 'POST',
url: '/admin/chapter/' + chapterId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
form.on('switch(switch-free)', function (data) {
var chapterId = $(this).attr('chapter-id');
var checked = $(this).is(':checked'); var checked = $(this).is(':checked');
var free = checked ? 1 : 0; var free = checked ? 1 : 0;
var url = $(this).attr('data-url');
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/admin/chapter/' + chapterId + '/update', url: url,
data: {free: free}, data: {free: free},
success: function (res) { success: function (res) {
layer.msg(res.msg, {icon: 1}); layer.msg(res.msg, {icon: 1});
@ -72,26 +55,6 @@
}); });
}); });
form.on('switch(switch-published)', function (data) {
var chapterId = $(this).attr('chapter-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
$.ajax({
type: 'POST',
url: '/admin/chapter/' + chapterId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
});
}); });
</script> </script>

View File

@ -1,3 +1,12 @@
{%- macro live_time_info(attrs) %}
{% if attrs['start_time'] > 0 %}
<p>开始:{{ date('Y-m-d H:i', attrs['start_time']) }}</p>
<p>结束:{{ date('Y-m-d H:i', attrs['end_time']) }}</p>
{% else %}
N/A
{% endif %}
{%- endmacro %}
<table class="kg-table layui-table layui-form"> <table class="kg-table layui-table layui-form">
<colgroup> <colgroup>
<col> <col>
@ -27,24 +36,16 @@
<span>{{ item.title }}</span> <span>{{ item.title }}</span>
<span class="layui-badge layui-bg-green">课</span> <span class="layui-badge layui-bg-green">课</span>
</td> </td>
<td> <td>{{ live_time_info(item.attrs) }}</td>
{% if item.attrs['start_time'] > 0 %} <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}"></td>
<p>开始:{{ date('Y-m-d H:i',item.attrs['start_time']) }}</p> <td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.free == 1 %}checked{% endif %}></td>
<p>结束:{{ date('Y-m-d H:i',item.attrs['end_time']) }}</p> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
{% else %}
N/A
{% endif %}
</td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" chapter-id="{{ item.id }}"></td>
<td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-free" chapter-id="{{ item.id }}" {% if item.free == 1 %}checked{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" chapter-id="{{ item.id }}"
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -28,15 +28,15 @@
<span class="layui-badge layui-bg-green">课</span> <span class="layui-badge layui-bg-green">课</span>
</td> </td>
<td><span class="layui-badge layui-bg-gray">{{ item.attrs['word_count'] }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.attrs['word_count'] }}</span></td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" chapter-id="{{ item.id }}"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-free" chapter-id="{{ item.id }}" {% if item.free == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.free == 1 %}checked{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" chapter-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -45,17 +45,15 @@
</td> </td>
<td>{{ file_status(item.attrs['file_status']) }}</td> <td>{{ file_status(item.attrs['file_status']) }}</td>
<td>{{ item.attrs['duration']|play_duration }}</td> <td>{{ item.attrs['duration']|play_duration }}</td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" chapter-id="{{ item.id }}"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-free" chapter-id="{{ item.id }}" <td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.free == 1 %}checked{% endif %}></td>
{% if item.free == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" chapter-id="{{ item.id }}"
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -50,9 +50,7 @@
<p>编号:{{ item.user.id }}</p> <p>编号:{{ item.user.id }}</p>
</td> </td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.comment.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
lay-filter="switch-published" comment-id="{{ item.id }}"
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span>
@ -60,11 +58,9 @@
<ul> <ul>
<li><a href="{{ url({'for':'admin.comment.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.comment.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" url="{{ url({'for':'admin.comment.delete','id':item.id}) }}" <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.comment.delete','id':item.id}) }}">删除</a></li>
class="kg-delete">删除</a></li>
{% else %} {% else %}
<li><a href="javascript:" url="{{ url({'for':'admin.comment.restore','id':item.id}) }}" <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.comment.restore','id':item.id}) }}">还原</a></li>
class="kg-delete">还原</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -75,40 +71,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-published)', function (data) {
var commentId = $(this).attr('comment-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要上线评论?' : '确定要下线评论?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/comment/' + commentId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -47,9 +47,7 @@
<p>编号:{{ item.user.id }}</p> <p>编号:{{ item.user.id }}</p>
</td> </td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.consult.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
lay-filter="switch-published" consult-id="{{ item.id }}"
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span>
@ -57,11 +55,9 @@
<ul> <ul>
<li><a href="{{ url({'for':'admin.consult.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.consult.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" url="{{ url({'for':'admin.consult.delete','id':item.id}) }}" <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.consult.delete','id':item.id}) }}">删除</a></li>
class="kg-delete">删除</a></li>
{% else %} {% else %}
<li><a href="javascript:" url="{{ url({'for':'admin.consult.restore','id':item.id}) }}" <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.consult.restore','id':item.id}) }}">还原</a></li>
class="kg-delete">还原</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -72,40 +68,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-published)', function (data) {
var consultId = $(this).attr('consult-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要上线咨询?' : '确定要下线咨询?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/consult/' + consultId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -42,13 +42,13 @@
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span> <span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span>
</a> </a>
</td> </td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" chapter-id="{{ item.id }}"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}"></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.chapter.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.chapter.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>
@ -56,34 +56,3 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script>
layui.use(['jquery', 'layer', 'form', 'element'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
$('input[name=priority]').on('change', function () {
var priority = $(this).val();
var chapterId = $(this).attr('chapter-id');
$.ajax({
type: 'POST',
url: '/admin/chapter/' + chapterId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
});
</script>

View File

@ -70,17 +70,16 @@
<p>市场:¥{{ item.market_price }}</p> <p>市场:¥{{ item.market_price }}</p>
<p>会员:¥{{ item.vip_price }}</p> <p>会员:¥{{ item.vip_price }}</p>
</td> </td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" course-id="{{ item.id }}" <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.course.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.course.edit','id':item.id}) }}">编辑课程</a></li> <li><a href="{{ url({'for':'admin.course.edit','id':item.id}) }}">编辑课程</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.course.delete','id':item.id}) }}">删除课程</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.course.delete','id':item.id}) }}">删除课程</a></li>
{% else %} {% else %}
<li><a href="javascript:" class="kg-restore" url="{{ url({'for':'admin.course.restore','id':item.id}) }}">还原课程</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.course.restore','id':item.id}) }}">还原课程</a></li>
{% endif %} {% endif %}
<hr> <hr>
<li><a href="{{ url({'for':'admin.course.chapters','id':item.id}) }}">章节管理</a></li> <li><a href="{{ url({'for':'admin.course.chapters','id':item.id}) }}">章节管理</a></li>
@ -96,40 +95,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-published)', function (data) {
var courseId = $(this).attr('course-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布课程?' : '确定要下架课程?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/course/' + courseId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -39,15 +39,15 @@
<td>{{ item.title }}</td> <td>{{ item.title }}</td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td>{{ date('Y-m-d H:i',item.update_time) }}</td> <td>{{ date('Y-m-d H:i',item.update_time) }}</td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" help-id="{{ item.id }}" title="数值越小排序越靠前"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.help.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" help-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.help.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}>
</td> </td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.page.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.page.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.page.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.page.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>
@ -55,58 +55,3 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script>
layui.use(['jquery', 'form', 'layer'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
$('input[name=priority]').on('change', function () {
var priority = $(this).val();
var helpId = $(this).attr('help-id');
$.ajax({
type: 'POST',
url: '/admin/help/' + helpId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
form.on('switch(switch-published)', function (data) {
var helpId = $(this).attr('help-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布帮助?' : '确定要下架帮助?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/help/' + helpId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -22,9 +22,9 @@
<a href="javascript:"><i class="layui-icon layui-icon-spread-left"></i></a> <a href="javascript:"><i class="layui-icon layui-icon-spread-left"></i></a>
</div> </div>
<ul class="layui-nav layui-layout-left kg-nav-module"> <ul class="layui-nav layui-layout-left kg-nav-module">
{% for item in top_menus %} {% for item in top_menus|array_object %}
<li nav-module="module-{{ item.id }}" class="layui-nav-item"> <li nav-module="module-{{ item.id }}" class="layui-nav-item">
<a href="javascript:">{{ item.label }}</a> <a href="javascript:">{{ item.title }}</a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
@ -45,14 +45,14 @@
<div class="layui-side layui-bg-black"> <div class="layui-side layui-bg-black">
<div class="layui-side-scroll"> <div class="layui-side-scroll">
{% for key,level in left_menus %} {% for key,level in left_menus|array_object %}
<ul class="layui-nav layui-nav-tree {% if key != 0 %}layui-hide{% endif %}" nav-module="module-{{ level.id }}" lay-shrink="all"> <ul class="layui-nav layui-nav-tree {% if key != 0 %}layui-hide{% endif %}" nav-module="module-{{ level.id }}" lay-shrink="all">
{% for key2,level2 in level.child %} {% for key2,level2 in level.children %}
<li class="layui-nav-item {% if key2 == 0 %}layui-nav-itemed{% endif %}"> <li class="layui-nav-item {% if key2 == 0 %}layui-nav-itemed{% endif %}">
<a href="javascript:">{{ level2.label }}</a> <a href="javascript:">{{ level2.title }}</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
{% for level3 in level2.child %} {% for level3 in level2.children %}
<dd><a target="content" href="{{ level3.url }}">{{ level3.label }}</a></dd> <dd><a target="content" href="{{ level3.url }}">{{ level3.title }}</a></dd>
{% endfor %} {% endfor %}
</dl> </dl>
</li> </li>

View File

@ -71,17 +71,17 @@
<td><span class="layui-badge layui-bg-gray">{{ item.child_count }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.child_count }}</span></td>
<td>{{ position_info(item.position) }}</td> <td>{{ position_info(item.position) }}</td>
<td>{{ target_info(item.target) }}</td> <td>{{ target_info(item.target) }}</td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" nav-id="{{ item.id }}" title="数值越小排序越靠前"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.nav.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" nav-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.nav.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.nav.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.nav.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" class="kg-delete" url="{{ url({'for':'admin.nav.delete','id':item.id}) }}">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.nav.delete','id':item.id}) }}">删除</a></li>
{% else %} {% else %}
<li><a href="javascript:" class="kg-restore" url="{{ url({'for':'admin.nav.restore','id':item.id}) }}">还原</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.nav.restore','id':item.id}) }}">还原</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -90,58 +90,3 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script>
layui.use(['jquery', 'form', 'layer'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
$('input[name=priority]').on('change', function () {
var priority = $(this).val();
var navId = $(this).attr('nav-id');
$.ajax({
type: 'POST',
url: '/admin/nav/' + navId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
form.on('switch(switch-published)', function (data) {
var navId = $(this).attr('nav-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布导航?' : '确定要下线导航?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/nav/' + navId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -30,7 +30,7 @@
<div style="text-align: center"> <div style="text-align: center">
{% if order.status == 'pending' %} {% if order.status == 'pending' %}
<button class="kg-close layui-btn layui-bg-green" order-id="{{ order.id }}">关闭订单</button> <button class="kg-close layui-btn layui-bg-green" data-url="{{ url({'for':'admin.order.close','id':item.id}) }}">关闭订单</button>
{% endif %} {% endif %}
<button class="kg-back layui-btn layui-bg-gray">返回上页</button> <button class="kg-back layui-btn layui-bg-gray">返回上页</button>
</div> </div>
@ -113,12 +113,12 @@
var $ = layui.jquery; var $ = layui.jquery;
$('.kg-close').on('click', function () { $('.kg-close').on('click', function () {
var orderId = $(this).attr('order-id'); var url = $(this).attr('data-url');
var tips = '确定要关闭订单吗?'; var tips = '确定要关闭订单吗?';
layer.confirm(tips, function () { layer.confirm(tips, function () {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/admin/order/' + orderId + '/close', url: url,
success: function (res) { success: function (res) {
layer.msg(res.msg, {icon: 1}); layer.msg(res.msg, {icon: 1});
setTimeout(function () { setTimeout(function () {

View File

@ -40,13 +40,13 @@
<td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td>
<td>¥{{ item.market_price }}</td> <td>¥{{ item.market_price }}</td>
<td>¥{{ item.vip_price }}</td> <td>¥{{ item.vip_price }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" package-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.package.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.package.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.package.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.package.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.package.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>
@ -56,40 +56,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-published)', function (data) {
var packageId = $(this).attr('package-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布套餐?' : '确定要下架套餐?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/package/' + packageId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -37,14 +37,14 @@
<td>{{ item.title }}</td> <td>{{ item.title }}</td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td>{{ date('Y-m-d H:i',item.update_time) }}</td> <td>{{ date('Y-m-d H:i',item.update_time) }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" page-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.page.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}>
</td> </td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.page.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.page.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.page.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.page.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -6,7 +6,7 @@
var layer = layui.layer; var layer = layui.layer;
$('.kg-ip2region').on('click', function () { $('.kg-ip2region').on('click', function () {
var ip = $(this).attr('ip'); var ip = $(this).attr('data-ip');
var url = '/admin/ip2region?ip=' + ip; var url = '/admin/ip2region?ip=' + ip;
layer.open({ layer.open({
type: 2, type: 2,

View File

@ -45,17 +45,16 @@
<p>编号:{{ item.user.id }}</p> <p>编号:{{ item.user.id }}</p>
</td> </td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" review-id="{{ item.id }}" <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.review.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.review.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.review.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %} {% if item.deleted == 0 %}
<li><a href="javascript:" url="{{ url({'for':'admin.review.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.review.delete','id':item.id}) }}">删除</a></li>
{% else %} {% else %}
<li><a href="javascript:" url="{{ url({'for':'admin.review.restore','id':item.id}) }}" class="kg-delete">还原</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.review.restore','id':item.id}) }}">还原</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -66,49 +65,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form', 'rate'], function () {
var $ = layui.jquery;
var form = layui.form;
var rate = layui.rate;
form.on('switch(switch-published)', function (data) {
var reviewId = $(this).attr('review-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要上线评价?' : '确定要下线评价?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/review/' + reviewId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
$('.kg-rating').each(function () {
rate.render({
elem: $(this),
value: $(this).text(),
readonly: true
});
});
});
</script>

View File

@ -23,15 +23,15 @@
<div class="layui-input-block"> <div class="layui-input-block">
{% for key,level in auth_nodes %} {% for key,level in auth_nodes %}
<table class="layui-table"> <table class="layui-table">
{% for key2,level2 in level.child %} {% for key2,level2 in level.children %}
<tr> <tr>
{% if key2 == 0 %} {% if key2 == 0 %}
<td width="15%" rowspan="{{ level.child|length }}">{{ level.label }}</td> <td width="15%" rowspan="{{ level.children|length }}">{{ level.title }}</td>
{% endif %} {% endif %}
<td width="15%">{{ level2.label }}</td> <td width="15%">{{ level2.title }}</td>
<td> <td>
{% for level3 in level2.child %} {% for level3 in level2.children %}
<input type="checkbox" name="routes[]" title="{{ level3.label }}" value="{{ level3.route }}" {% if level3.route in role.routes %}checked{% endif %}> <input type="checkbox" name="routes[]" title="{{ level3.title }}" value="{{ level3.route }}" {% if level3.route in role.routes %}checked{% endif %}>
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>

View File

@ -52,7 +52,7 @@
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.role.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.role.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.role.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.role.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -46,15 +46,14 @@
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td>{{ item.title }}</td> <td>{{ item.title }}</td>
<td>{{ target_info(item.target) }}</td> <td>{{ target_info(item.target) }}</td>
<td><input class="layui-input kg-priority-input" type="text" name="priority" value="{{ item.priority }}" slide-id="{{ item.id }}" title="数值越小排序越靠前"></td> <td><input class="layui-input kg-priority-input" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ url({'for':'admin.slide.update','id':item.id}) }}"></td>
<td><input type="checkbox" name="published" value="1" lay-filter="switch-published" lay-skin="switch" lay-text="是|否" slide-id="{{ item.id }}" <td><input type="checkbox" name="published" value="1" lay-filter="switch-published" lay-skin="switch" lay-text="是|否" data-url="{{ url({'for':'admin.slide.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
{% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.slide.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.slide.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.slide.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.slide.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>
@ -64,60 +63,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form', 'layer'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
$('input[name=priority]').on('change', function () {
var priority = $(this).val();
var slideId = $(this).attr('slide-id');
$.ajax({
type: 'POST',
url: '/admin/slide/' + slideId + '/update',
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
form.on('switch(switch-published)', function (data) {
var slideId = $(this).attr('slide-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布轮播?' : '确定要下架轮播?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/slide/' + slideId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -6,7 +6,7 @@
{% endif %} {% endif %}
{%- endmacro %} {%- endmacro %}
{%- macro last_active(create_time, update_time) %} {%- macro last_active_time(create_time, update_time) %}
{% if update_time > 0 %} {% if update_time > 0 %}
{{ date('Y-m-d H:i', update_time) }} {{ date('Y-m-d H:i', update_time) }}
{% else %} {% else %}
@ -40,8 +40,8 @@
</td> </td>
<td>{{ item.duration|play_duration }}</td> <td>{{ item.duration|play_duration }}</td>
<td>{{ client_type(item.client_type) }}</td> <td>{{ client_type(item.client_type) }}</td>
<td><a class="kg-ip2region" href="javascript:;" title="查看位置" ip="{{ item.client_ip }}">{{ item.client_ip }}</a></td> <td><a href="javascript:" class="kg-ip2region" title="查看位置" data-ip="{{ item.client_ip }}">{{ item.client_ip }}</a></td>
<td>{{ last_active(item.create_time, item.update_time) }}</td> <td>{{ last_active_time(item.create_time,item.update_time) }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@ -49,45 +49,3 @@
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
{{ partial('partials/ip2region') }} {{ partial('partials/ip2region') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-locked)', function (data) {
var courseId = $(this).attr('course-id');
var userId = $(this).attr('user-id');
var checked = $(this).is(':checked');
var locked = checked ? 1 : 0;
var tips = locked == 1 ? '确定要锁定用户?' : '确定要解锁用户?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/student/update',
data: {
course_id: courseId,
user_id: userId,
locked: locked
},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -72,8 +72,7 @@
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.student.edit'},{'plan_id':item.id}) }}">编辑学员</a></li> <li><a href="{{ url({'for':'admin.student.edit'},{'plan_id':item.id}) }}">编辑学员</a></li>
<li><a class="kg-learning" href="javascript:" url="{{ url({'for':'admin.student.learning'},{'plan_id':item.id}) }}">学习记录</a> <li><a href="javascript:" class="kg-learning" data-url="{{ url({'for':'admin.student.learning'},{'plan_id':item.id}) }}">学习记录</a></li>
</li>
</ul> </ul>
</div> </div>
</td> </td>
@ -91,7 +90,7 @@
var $ = layui.jquery; var $ = layui.jquery;
$('.kg-learning').on('click', function () { $('.kg-learning').on('click', function () {
var url = $(this).attr('url'); var url = $(this).attr('data-url');
layer.open({ layer.open({
id: 'xm-course', id: 'xm-course',
type: 2, type: 2,

View File

@ -24,20 +24,11 @@
<label class="layui-form-label">加入方式</label> <label class="layui-form-label">加入方式</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="radio" name="source" value="free" title="免费课程"> <input type="radio" name="source" value="free" title="免费课程">
<input type="radio" name="source" value="paid" title="付费课程"> <input type="radio" name="source" value="charge" title="付费课程">
<input type="radio" name="source" value="vip" title="会员免费">
<input type="radio" name="source" value="import" title="后台导入"> <input type="radio" name="source" value="import" title="后台导入">
</div> </div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label">是否锁定</label>
<div class="layui-input-block">
<input type="radio" name="locked" value="1" title="是">
<input type="radio" name="locked" value="0" title="否">
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"></label> <label class="layui-form-label"></label>
<div class="layui-input-block"> <div class="layui-input-block">

View File

@ -40,13 +40,13 @@
<td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td> <td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td>
<td>{{ date('Y-m-d H:i',item.create_time) }}</td> <td>{{ date('Y-m-d H:i',item.create_time) }}</td>
<td>{{ date('Y-m-d H:i',item.update_time) }}</td> <td>{{ date('Y-m-d H:i',item.update_time) }}</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" topic-id="{{ item.id }}" {% if item.published == 1 %}checked{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ url({'for':'admin.topic.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center"> <td align="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button> <button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul> <ul>
<li><a href="{{ url({'for':'admin.topic.edit','id':item.id}) }}">编辑</a></li> <li><a href="{{ url({'for':'admin.topic.edit','id':item.id}) }}">编辑</a></li>
<li><a href="javascript:" url="{{ url({'for':'admin.topic.delete','id':item.id}) }}" class="kg-delete">删除</a></li> <li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.topic.delete','id':item.id}) }}">删除</a></li>
</ul> </ul>
</div> </div>
</td> </td>
@ -56,40 +56,3 @@
</table> </table>
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
<script>
layui.use(['jquery', 'form'], function () {
var $ = layui.jquery;
var form = layui.form;
form.on('switch(switch-published)', function (data) {
var topicId = $(this).attr('topic-id');
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var tips = published === 1 ? '确定要发布话题?' : '确定要下架话题?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: '/admin/topic/' + topicId + '/update',
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
});
</script>

View File

@ -3,9 +3,9 @@
namespace App\Models; namespace App\Models;
use App\Caches\MaxCourseId as MaxCourseIdCache; use App\Caches\MaxCourseId as MaxCourseIdCache;
use App\Services\CourseIndexSyncer;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text; use Phalcon\Text;
use Yansongda\Supports\Collection;
class Course extends Model class Course extends Model
{ {
@ -95,6 +95,13 @@ class Course extends Model
*/ */
public $category_id; public $category_id;
/**
* 主教师编号
*
* @var int
*/
public $teacher_id;
/** /**
* 市场价格 * 市场价格
* *
@ -319,43 +326,43 @@ class Course extends Model
public static function modelTypes() public static function modelTypes()
{ {
return [ return new Collection([
self::MODEL_VOD => '点播', self::MODEL_VOD => '点播',
self::MODEL_LIVE => '直播', self::MODEL_LIVE => '直播',
self::MODEL_READ => '图文', self::MODEL_READ => '图文',
]; ]);
} }
public static function levelTypes() public static function levelTypes()
{ {
return [ return new Collection([
self::LEVEL_ENTRY => '入门', self::LEVEL_ENTRY => '入门',
self::LEVEL_JUNIOR => '初级', self::LEVEL_JUNIOR => '初级',
self::LEVEL_MEDIUM => '中级', self::LEVEL_MEDIUM => '中级',
self::LEVEL_SENIOR => '高级', self::LEVEL_SENIOR => '高级',
]; ]);
} }
public static function studyExpiryOptions() public static function studyExpiryOptions()
{ {
return [ return new Collection([
1 => '1个月', 1 => '1个月',
3 => '3个月', 3 => '3个月',
6 => '6个月', 6 => '6个月',
12 => '12个月', 12 => '12个月',
36 => '36个月', 36 => '36个月',
]; ]);
} }
public static function refundExpiryOptions() public static function refundExpiryOptions()
{ {
return [ return new Collection([
7 => '7天', 7 => '7天',
14 => '14天', 14 => '14天',
30 => '30天', 30 => '30天',
90 => '90天', 90 => '90天',
180 => '180天', 180 => '180天',
]; ]);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Yansongda\Supports\Collection;
class Nav extends Model class Nav extends Model
{ {
@ -146,18 +147,18 @@ class Nav extends Model
public static function positionTypes() public static function positionTypes()
{ {
return [ return new Collection([
self::POSITION_TOP => '顶部', self::POSITION_TOP => '顶部',
self::POSITION_BOTTOM => '底部', self::POSITION_BOTTOM => '底部',
]; ]);
} }
public static function targetTypes() public static function targetTypes()
{ {
return [ return new Collection([
self::TARGET_BLANK => '新窗口', self::TARGET_BLANK => '新窗口',
self::TARGET_SELF => '原窗口', self::TARGET_SELF => '原窗口',
]; ]);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Yansongda\Supports\Collection;
class Order extends Model class Order extends Model
{ {
@ -179,32 +180,32 @@ class Order extends Model
public static function itemTypes() public static function itemTypes()
{ {
return [ return new Collection([
self::ITEM_COURSE => '课程', self::ITEM_COURSE => '课程',
self::ITEM_PACKAGE => '套餐', self::ITEM_PACKAGE => '套餐',
self::ITEM_REWARD => '赞赏', self::ITEM_REWARD => '赞赏',
self::ITEM_VIP => '会员', self::ITEM_VIP => '会员',
self::ITEM_TEST => '测试', self::ITEM_TEST => '测试',
]; ]);
} }
public static function sourceTypes() public static function sourceTypes()
{ {
return [ return new Collection([
self::SOURCE_DESKTOP => 'desktop', self::SOURCE_DESKTOP => 'desktop',
self::SOURCE_ANDROID => 'android', self::SOURCE_ANDROID => 'android',
self::SOURCE_IOS => 'ios', self::SOURCE_IOS => 'ios',
]; ]);
} }
public static function statusTypes() public static function statusTypes()
{ {
return [ return new Collection([
self::STATUS_PENDING => '待支付', self::STATUS_PENDING => '待支付',
self::STATUS_FINISHED => '已完成', self::STATUS_FINISHED => '已完成',
self::STATUS_CLOSED => '已关闭', self::STATUS_CLOSED => '已关闭',
self::STATUS_REFUNDED => '已退款', self::STATUS_REFUNDED => '已退款',
]; ]);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Yansongda\Supports\Collection;
class Refund extends Model class Refund extends Model
{ {
@ -144,14 +145,14 @@ class Refund extends Model
public static function statusTypes() public static function statusTypes()
{ {
return [ return new Collection([
self::STATUS_PENDING => '待处理', self::STATUS_PENDING => '待处理',
self::STATUS_CANCELED => '已取消', self::STATUS_CANCELED => '已取消',
self::STATUS_APPROVED => '已审核', self::STATUS_APPROVED => '已审核',
self::STATUS_REFUSED => '已拒绝', self::STATUS_REFUSED => '已拒绝',
self::STATUS_FINISHED => '已完成', self::STATUS_FINISHED => '已完成',
self::STATUS_FAILED => '已失败', self::STATUS_FAILED => '已失败',
]; ]);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Yansongda\Supports\Collection;
class Role extends Model class Role extends Model
{ {
@ -128,20 +129,20 @@ class Role extends Model
public static function types() public static function types()
{ {
return [ return new Collection([
self::TYPE_SYSTEM => '内置', self::TYPE_SYSTEM => '内置',
self::TYPE_CUSTOM => '自定', self::TYPE_CUSTOM => '自定',
]; ]);
} }
public static function sysRoleTypes() public static function sysRoleTypes()
{ {
return [ return new Collection([
self::ROLE_ROOT => '管理人员', self::ROLE_ROOT => '管理人员',
self::ROLE_OPERATOR => '运营人员', self::ROLE_OPERATOR => '运营人员',
self::ROLE_EDITOR => '编辑人员', self::ROLE_EDITOR => '编辑人员',
self::ROLE_FINANCE => '财务人员', self::ROLE_FINANCE => '财务人员',
]; ]);
} }
} }

View File

@ -4,6 +4,7 @@ namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text; use Phalcon\Text;
use Yansongda\Supports\Collection;
class Slide extends Model class Slide extends Model
{ {
@ -145,11 +146,11 @@ class Slide extends Model
public static function targetTypes() public static function targetTypes()
{ {
return [ return new Collection([
self::TARGET_COURSE => '课程', self::TARGET_COURSE => '课程',
self::TARGET_PAGE => '单页', self::TARGET_PAGE => '单页',
self::TARGET_LINK => '链接', self::TARGET_LINK => '链接',
]; ]);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Yansongda\Supports\Collection;
class Trade extends Model class Trade extends Model
{ {
@ -141,20 +142,20 @@ class Trade extends Model
public static function channelTypes() public static function channelTypes()
{ {
return [ return new Collection([
self::CHANNEL_ALIPAY => '支付宝', self::CHANNEL_ALIPAY => '支付宝',
self::CHANNEL_WXPAY => '微信', self::CHANNEL_WXPAY => '微信',
]; ]);
} }
public static function statusTypes() public static function statusTypes()
{ {
return [ return new Collection([
self::STATUS_PENDING => '待支付', self::STATUS_PENDING => '待支付',
self::STATUS_FINISHED => '已完成', self::STATUS_FINISHED => '已完成',
self::STATUS_CLOSED => '已关闭', self::STATUS_CLOSED => '已关闭',
self::STATUS_REFUNDED => '已退款', self::STATUS_REFUNDED => '已退款',
]; ]);
} }
} }

View File

@ -5,6 +5,7 @@ namespace App\Models;
use App\Caches\MaxUserId as MaxUserIdCache; use App\Caches\MaxUserId as MaxUserIdCache;
use Phalcon\Mvc\Model\Behavior\SoftDelete; use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text; use Phalcon\Text;
use Yansongda\Supports\Collection;
class User extends Model class User extends Model
{ {
@ -208,19 +209,19 @@ class User extends Model
public static function genderTypes() public static function genderTypes()
{ {
return [ return new Collection([
self::GENDER_MALE => '男', self::GENDER_MALE => '男',
self::GENDER_FEMALE => '女', self::GENDER_FEMALE => '女',
self::GENDER_NONE => '保密', self::GENDER_NONE => '保密',
]; ]);
} }
public static function eduRoleTypes() public static function eduRoleTypes()
{ {
return [ return new Collection([
self::EDU_ROLE_STUDENT => '学员', self::EDU_ROLE_STUDENT => '学员',
self::EDU_ROLE_TEACHER => '讲师', self::EDU_ROLE_TEACHER => '讲师',
]; ]);
} }
} }

View File

@ -2,7 +2,9 @@
namespace App\Searchers; namespace App\Searchers;
use App\Models\Category as CategoryModel;
use App\Models\Course as CourseModel; use App\Models\Course as CourseModel;
use App\Models\User as UserModel;
use Phalcon\Mvc\User\Component; use Phalcon\Mvc\User\Component;
class CourseDocument extends Component class CourseDocument extends Component
@ -37,12 +39,34 @@ class CourseDocument extends Component
$course->attrs = kg_json_encode($course->attrs); $course->attrs = kg_json_encode($course->attrs);
} }
$teacher = '';
if ($course->teacher_id > 0) {
$record = UserModel::findFirst($course->teacher_id);
$teacher = kg_json_encode([
'id' => $record->id,
'name' => $record->name,
]);
}
$category = '';
if ($course->category_id > 0) {
$record = CategoryModel::findFirst($course->category_id);
$category = kg_json_encode([
'id' => $record->id,
'name' => $record->name,
]);
}
return [ return [
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'summary' => $course->summary, 'summary' => $course->summary,
'keywords' => $course->keywords, 'keywords' => $course->keywords,
'category_id' => $course->category_id,
'teacher_id' => $course->teacher_id,
'market_price' => $course->market_price, 'market_price' => $course->market_price,
'vip_price' => $course->vip_price, 'vip_price' => $course->vip_price,
'study_expiry' => $course->study_expiry, 'study_expiry' => $course->study_expiry,
@ -52,6 +76,8 @@ class CourseDocument extends Component
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'attrs' => $course->attrs, 'attrs' => $course->attrs,
'category' => $category,
'teacher' => $teacher,
'user_count' => $course->user_count, 'user_count' => $course->user_count,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'comment_count' => $course->comment_count, 'comment_count' => $course->comment_count,

View File

@ -0,0 +1,94 @@
<?php
namespace App\Services\Search;
use App\Models\Category as CategoryModel;
use App\Models\Course as CourseModel;
use App\Models\User as UserModel;
use Phalcon\Mvc\User\Component;
class CourseDocument extends Component
{
/**
* 设置文档
*
* @param CourseModel $course
* @return \XSDocument
*/
public function setDocument(CourseModel $course)
{
$doc = new \XSDocument();
$data = $this->formatDocument($course);
$doc->setFields($data);
return $doc;
}
/**
* 格式化文档
*
* @param CourseModel $course
* @return array
*/
public function formatDocument(CourseModel $course)
{
if (is_array($course->attrs) || is_object($course->attrs)) {
$course->attrs = kg_json_encode($course->attrs);
}
$teacher = '';
if ($course->teacher_id > 0) {
$record = UserModel::findFirst($course->teacher_id);
$teacher = kg_json_encode([
'id' => $record->id,
'name' => $record->name,
]);
}
$category = '';
if ($course->category_id > 0) {
$record = CategoryModel::findFirst($course->category_id);
$category = kg_json_encode([
'id' => $record->id,
'name' => $record->name,
]);
}
return [
'id' => $course->id,
'title' => $course->title,
'cover' => $course->cover,
'summary' => $course->summary,
'keywords' => $course->keywords,
'category_id' => $course->category_id,
'teacher_id' => $course->teacher_id,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'study_expiry' => $course->study_expiry,
'refund_expiry' => $course->refund_expiry,
'rating' => $course->rating,
'score' => $course->score,
'model' => $course->model,
'level' => $course->level,
'attrs' => $course->attrs,
'category' => $category,
'teacher' => $teacher,
'user_count' => $course->user_count,
'lesson_count' => $course->lesson_count,
'comment_count' => $course->comment_count,
'consult_count' => $course->consult_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
];
}
}

View File

@ -0,0 +1,88 @@
<?php
namespace App\Services\Search;
use Phalcon\Mvc\User\Component;
class CourseHandler extends Component
{
/**
* @var \XS
*/
protected $xs;
public function __construct()
{
$fileName = config_path() . '/xs.course.ini';
$this->xs = new \XS($fileName);
}
/**
* 获取XS
*
* @return \XS
*/
public function getXS()
{
return $this->xs;
}
/**
* 搜索课程
*
* @param string $query
* @param int $limit
* @param int $offset
* @return array
* @throws \XSException
*/
public function search($query, $limit = 15, $offset = 0)
{
$search = $this->xs->getSearch();
$docs = $search->setQuery($query)->setLimit($limit, $offset)->search();
$total = $search->getLastCount();
$fields = array_keys($this->xs->getAllFields());
$items = [];
foreach ($docs as $doc) {
$item = [];
foreach ($fields as $field) {
if (in_array($field, ['title', 'summary'])) {
$item[$field] = $search->highlight($doc->{$field});
} else {
$item[$field] = $doc->{$field};
}
}
$items[] = $item;
}
return [
'total' => $total,
'items' => $items,
];
}
/**
* 获取相关搜索
*
* @param string $query
* @param int $limit
* @return array
* @throws \XSException
*/
public function getRelatedQuery($query, $limit = 10)
{
$search = $this->xs->getSearch();
$search->setQuery($query);
return $search->getRelatedQuery($query, $limit);
}
}

View File

@ -20,6 +20,16 @@ type = body
type = string type = string
index = mixed index = mixed
[category_id]
type = string
index = self
tokenizer = full
[teacher_id]
type = string
index = self
tokenizer = full
[market_price] [market_price]
type = string type = string
@ -51,6 +61,12 @@ tokenizer = full
[attrs] [attrs]
type = string type = string
[category]
type = string
[teacher]
type = string
[user_count] [user_count]
type = string type = string

View File

@ -48,8 +48,51 @@ layui.use(['jquery', 'form', 'element', 'layer', 'dropdown'], function () {
return false; return false;
}); });
form.on('switch(published)', function (data) {
var checked = $(this).is(':checked');
var published = checked ? 1 : 0;
var url = $(this).attr('data-url');
var tips = published === 1 ? '确定要上线?' : '确定要下线?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: url,
data: {published: published},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
data.elem.checked = !checked;
form.render();
}
});
}, function () {
data.elem.checked = !checked;
form.render();
});
});
$('.kg-priority-input').on('change', function () {
var priority = $(this).val();
var url = $(this).attr('data-url');
$.ajax({
type: 'POST',
url: url,
data: {priority: priority},
success: function (res) {
layer.msg(res.msg, {icon: 1});
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
$('.kg-delete,.kg-restore').on('click', function () { $('.kg-delete,.kg-restore').on('click', function () {
var url = $(this).attr('url'); var url = $(this).attr('data-url');
var tips = $(this).hasClass('kg-delete') ? '确定要删除吗?' : '确定要还原吗?'; var tips = $(this).hasClass('kg-delete') ? '确定要删除吗?' : '确定要还原吗?';
layer.confirm(tips, function () { layer.confirm(tips, function () {
$.ajax({ $.ajax({

View File

@ -64,7 +64,7 @@ $scheduler->php($script, $bin, ['--task' => 'count_course', '--action' => 'main'
$scheduler->php($script, $bin, ['--task' => 'live_notice_provider', '--action' => 'main']) $scheduler->php($script, $bin, ['--task' => 'live_notice_provider', '--action' => 'main'])
->daily(3, 23); ->daily(3, 23);
$scheduler->php($script, $bin, ['--task' => 'clean_auth_token', '--action' => 'main']) $scheduler->php($script, $bin, ['--task' => 'clean_token', '--action' => 'main'])
->daily(3, 31); ->daily(3, 31);
$scheduler->run(); $scheduler->run();