1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-17 05:36: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
{
protected $lifetime = 86400;
protected $lifetime = 1 * 86400;
public function getLifetime()
{

View File

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

View File

@ -9,13 +9,13 @@ use Phalcon\Cli\Task;
use Phalcon\Mvc\Model\Resultset;
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
* @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()
{
@ -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()
{
@ -103,7 +103,7 @@ class ManageCourseIndexTask extends Task
* 搜索课程
*
* @param string $query
* @return array $result
* @return array
* @throws \XSException
*/
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\CourseUser as CourseUserRepo;
use App\Repos\Learning as LearningRepo;
use App\Services\LearningSyncer;
use App\Services\Syncer\Learning as LearningSyncer;
use Phalcon\Cli\Task;
class LearningTask extends Task

View File

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

View File

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

View File

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

View File

@ -5,9 +5,9 @@ namespace App\Console\Tasks;
use App\Caches\CourseCounter as CourseCounterCache;
use App\Library\Cache\Backend\Redis as RedisCache;
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\Searchers\CourseDocument;
use App\Searchers\CourseSearch;
use App\Services\CourseIndexSyncer;
use App\Services\Syncer\CourseIndex as CourseIndexSyncer;
class SyncCourseIndexTask extends Task
{

View File

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

View File

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

View File

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

View File

@ -21,7 +21,6 @@ use App\Repos\CourseUser as CourseUserRepo;
use App\Repos\User as UserRepo;
use App\Services\Syncer\CourseIndex as CourseIndexSyncer;
use App\Validators\Course as CourseValidator;
use Yansongda\Supports\Collection;
class Course extends Service
{
@ -183,16 +182,12 @@ class Course extends Service
public function getStudyExpiryOptions()
{
$options = CourseModel::studyExpiryOptions();
return new Collection($options);
return CourseModel::studyExpiryOptions();
}
public function getRefundExpiryOptions()
{
$options = CourseModel::refundExpiryOptions();
return new Collection($options);
return CourseModel::refundExpiryOptions();
}
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->rebuild();

View File

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

View File

@ -37,12 +37,12 @@
<tr>
<td>{{ item.user_id }}</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_path }}</td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
<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>
</tr>
{% endfor %}
@ -60,8 +60,7 @@
var layer = layui.layer;
$('.kg-view').on('click', function () {
var auditId = $(this).attr('audit-id');
var url = '/admin/audit/' + auditId + '/show';
var url = $(this).attr('data-url');
layer.open({
type: 2,
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.child_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 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 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="published" data-url="{{ url({'for':'admin.category.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<li><a href="{{ url({'for':'admin.category.edit','id':item.id}) }}">编辑</a></li>
{% 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 %}
<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 %}
</ul>
</div>
@ -70,59 +70,4 @@
</tr>
{% endfor %}
</tbody>
</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>
</table>

View File

@ -35,30 +35,13 @@
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});
}
});
});
form.on('switch(switch-free)', function (data) {
var chapterId = $(this).attr('chapter-id');
form.on('switch(free)', function (data) {
var checked = $(this).is(':checked');
var free = checked ? 1 : 0;
var url = $(this).attr('data-url');
$.ajax({
type: 'POST',
url: '/admin/chapter/' + chapterId + '/update',
url: url,
data: {free: free},
success: function (res) {
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>

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">
<colgroup>
<col>
@ -27,24 +36,16 @@
<span>{{ item.title }}</span>
<span class="layui-badge layui-bg-green">课</span>
</td>
<td>
{% if item.attrs['start_time'] > 0 %}
<p>开始:{{ date('Y-m-d H:i',item.attrs['start_time']) }}</p>
<p>结束:{{ date('Y-m-d H:i',item.attrs['end_time']) }}</p>
{% 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>{{ live_time_info(item.attrs) }}</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="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="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>

View File

@ -28,15 +28,15 @@
<span class="layui-badge layui-bg-green">课</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 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><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="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="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>

View File

@ -45,17 +45,15 @@
</td>
<td>{{ file_status(item.attrs['file_status']) }}</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 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><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="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="published" data-url="{{ url({'for':'admin.chapter.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>

View File

@ -50,9 +50,7 @@
<p>编号:{{ item.user.id }}</p>
</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" comment-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.comment.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span>
@ -60,11 +58,9 @@
<ul>
<li><a href="{{ url({'for':'admin.comment.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %}
<li><a href="javascript:" url="{{ url({'for':'admin.comment.delete','id':item.id}) }}"
class="kg-delete">删除</a></li>
<li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.comment.delete','id':item.id}) }}">删除</a></li>
{% else %}
<li><a href="javascript:" url="{{ url({'for':'admin.comment.restore','id':item.id}) }}"
class="kg-delete">还原</a></li>
<li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.comment.restore','id':item.id}) }}">还原</a></li>
{% endif %}
</ul>
</div>
@ -74,41 +70,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

@ -47,9 +47,7 @@
<p>编号:{{ item.user.id }}</p>
</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" consult-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.consult.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span>
@ -57,11 +55,9 @@
<ul>
<li><a href="{{ url({'for':'admin.consult.edit','id':item.id}) }}">编辑</a></li>
{% if item.deleted == 0 %}
<li><a href="javascript:" url="{{ url({'for':'admin.consult.delete','id':item.id}) }}"
class="kg-delete">删除</a></li>
<li><a href="javascript:" class="kg-delete" data-url="{{ url({'for':'admin.consult.delete','id':item.id}) }}">删除</a></li>
{% else %}
<li><a href="javascript:" url="{{ url({'for':'admin.consult.restore','id':item.id}) }}"
class="kg-delete">还原</a></li>
<li><a href="javascript:" class="kg-restore" data-url="{{ url({'for':'admin.consult.restore','id':item.id}) }}">还原</a></li>
{% endif %}
</ul>
</div>
@ -71,41 +67,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

@ -42,48 +42,17 @@
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span>
</a>
</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">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</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>
</table>

View File

@ -70,17 +70,16 @@
<p>市场:¥{{ item.market_price }}</p>
<p>会员:¥{{ item.vip_price }}</p>
</td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="switch-published" course-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.course.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<li><a href="{{ url({'for':'admin.course.edit','id':item.id}) }}">编辑课程</a></li>
{% 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 %}
<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 %}
<hr>
<li><a href="{{ url({'for':'admin.course.chapters','id':item.id}) }}">章节管理</a></li>
@ -95,41 +94,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

@ -39,74 +39,19 @@
<td>{{ item.title }}</td>
<td>{{ date('Y-m-d H:i',item.create_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 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 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="published" data-url="{{ url({'for':'admin.help.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}>
</td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</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>
</table>

View File

@ -22,9 +22,9 @@
<a href="javascript:"><i class="layui-icon layui-icon-spread-left"></i></a>
</div>
<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">
<a href="javascript:">{{ item.label }}</a>
<a href="javascript:">{{ item.title }}</a>
</li>
{% endfor %}
</ul>
@ -45,14 +45,14 @@
<div class="layui-side layui-bg-black">
<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">
{% for key2,level2 in level.child %}
{% for key2,level2 in level.children %}
<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">
{% for level3 in level2.child %}
<dd><a target="content" href="{{ level3.url }}">{{ level3.label }}</a></dd>
{% for level3 in level2.children %}
<dd><a target="content" href="{{ level3.url }}">{{ level3.title }}</a></dd>
{% endfor %}
</dl>
</li>

View File

@ -71,17 +71,17 @@
<td><span class="layui-badge layui-bg-gray">{{ item.child_count }}</span></td>
<td>{{ position_info(item.position) }}</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 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 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="published" data-url="{{ url({'for':'admin.nav.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<li><a href="{{ url({'for':'admin.nav.edit','id':item.id}) }}">编辑</a></li>
{% 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 %}
<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 %}
</ul>
</div>
@ -89,59 +89,4 @@
</tr>
{% endfor %}
</tbody>
</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>
</table>

View File

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

View File

@ -40,13 +40,13 @@
<td><span class="layui-badge layui-bg-gray">{{ item.course_count }}</span></td>
<td>¥{{ item.market_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">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>
@ -55,41 +55,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

@ -37,14 +37,14 @@
<td>{{ item.title }}</td>
<td>{{ date('Y-m-d H:i',item.create_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 align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>

View File

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

View File

@ -45,17 +45,16 @@
<p>编号:{{ item.user.id }}</p>
</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 }}"
{% 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.review.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<li><a href="{{ url({'for':'admin.review.edit','id':item.id}) }}">编辑</a></li>
{% 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 %}
<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 %}
</ul>
</div>
@ -65,50 +64,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

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

View File

@ -52,7 +52,7 @@
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>

View File

@ -46,15 +46,14 @@
<td>{{ item.id }}</td>
<td>{{ item.title }}</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 type="checkbox" name="published" value="1" lay-filter="switch-published" lay-skin="switch" lay-text="是|否" slide-id="{{ item.id }}"
{% if item.published == 1 %}checked{% endif %}></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="是|否" data-url="{{ url({'for':'admin.slide.update','id':item.id}) }}" {% if item.published == 1 %}checked{% endif %}></td>
<td align="center">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>
@ -63,61 +62,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

@ -6,7 +6,7 @@
{% endif %}
{%- endmacro %}
{%- macro last_active(create_time, update_time) %}
{%- macro last_active_time(create_time, update_time) %}
{% if update_time > 0 %}
{{ date('Y-m-d H:i', update_time) }}
{% else %}
@ -40,54 +40,12 @@
</td>
<td>{{ item.duration|play_duration }}</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>{{ last_active(item.create_time, item.update_time) }}</td>
<td><a href="javascript:" class="kg-ip2region" title="查看位置" data-ip="{{ item.client_ip }}">{{ item.client_ip }}</a></td>
<td>{{ last_active_time(item.create_time,item.update_time) }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ partial('partials/pager') }}
{{ 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>
{{ partial('partials/ip2region') }}

View File

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

View File

@ -24,20 +24,11 @@
<label class="layui-form-label">加入方式</label>
<div class="layui-input-block">
<input type="radio" name="source" value="free" title="免费课程">
<input type="radio" name="source" value="paid" title="付费课程">
<input type="radio" name="source" value="vip" title="会员免费">
<input type="radio" name="source" value="charge" title="付费课程">
<input type="radio" name="source" value="import" title="后台导入">
</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">
<label class="layui-form-label"></label>
<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>{{ date('Y-m-d H:i',item.create_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">
<div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <span class="layui-icon layui-icon-triangle-d"></span></button>
<ul>
<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>
</div>
</td>
@ -55,41 +55,4 @@
</tbody>
</table>
{{ 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>
{{ partial('partials/pager') }}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,9 @@
namespace App\Searchers;
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
@ -37,12 +39,34 @@ class CourseDocument extends Component
$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,
@ -52,6 +76,8 @@ class CourseDocument extends Component
'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,

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
index = mixed
[category_id]
type = string
index = self
tokenizer = full
[teacher_id]
type = string
index = self
tokenizer = full
[market_price]
type = string
@ -51,6 +61,12 @@ tokenizer = full
[attrs]
type = string
[category]
type = string
[teacher]
type = string
[user_count]
type = string

View File

@ -48,8 +48,51 @@ layui.use(['jquery', 'form', 'element', 'layer', 'dropdown'], function () {
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 () {
var url = $(this).attr('url');
var url = $(this).attr('data-url');
var tips = $(this).hasClass('kg-delete') ? '确定要删除吗?' : '确定要还原吗?';
layer.confirm(tips, function () {
$.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'])
->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);
$scheduler->run();