mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-25 20:17:23 +08:00
搜索页面换成tab形式
This commit is contained in:
parent
fddaa3573e
commit
9f5b48c307
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Caches;
|
namespace App\Caches;
|
||||||
|
|
||||||
use App\Models\ImGroupMessage as ImGroupMessageModel;
|
use App\Models\ImMessage as ImMessageModel;
|
||||||
use App\Models\User as UserModel;
|
use App\Models\User as UserModel;
|
||||||
use App\Repos\User as UserRepo;
|
use App\Repos\User as UserRepo;
|
||||||
use Phalcon\Mvc\Model\Resultset;
|
use Phalcon\Mvc\Model\Resultset;
|
||||||
@ -58,11 +58,12 @@ class ImGroupActiveUserList extends Cache
|
|||||||
$startTime = strtotime("-{$days} days");
|
$startTime = strtotime("-{$days} days");
|
||||||
$endTime = time();
|
$endTime = time();
|
||||||
|
|
||||||
$rows = ImGroupMessageModel::query()
|
$rows = ImMessageModel::query()
|
||||||
->columns(['sender_id', 'total_count' => 'count(sender_id)'])
|
->columns(['sender_id', 'total_count' => 'count(sender_id)'])
|
||||||
->groupBy('sender_id')
|
->groupBy('sender_id')
|
||||||
->orderBy('total_count DESC')
|
->orderBy('total_count DESC')
|
||||||
->where('group_id = :group_id:', ['group_id' => $groupId])
|
->where('receiver_id = :group_id:', ['group_id' => $groupId])
|
||||||
|
->andWhere('receiver_type = :type:', ['type' => ImMessageModel::TYPE_GROUP])
|
||||||
->betweenWhere('create_time', $startTime, $endTime)
|
->betweenWhere('create_time', $startTime, $endTime)
|
||||||
->limit($limit)
|
->limit($limit)
|
||||||
->execute();
|
->execute();
|
||||||
|
@ -34,7 +34,7 @@ class SyncCourseIndexTask extends Task
|
|||||||
{
|
{
|
||||||
$key = $this->getSyncKey();
|
$key = $this->getSyncKey();
|
||||||
|
|
||||||
$courseIds = $this->redis->sRandMember($key, 100);
|
$courseIds = $this->redis->sRandMember($key, 1000);
|
||||||
|
|
||||||
if (!$courseIds) return;
|
if (!$courseIds) return;
|
||||||
|
|
||||||
|
80
app/Console/Tasks/SyncGroupIndexTask.php
Normal file
80
app/Console/Tasks/SyncGroupIndexTask.php
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Tasks;
|
||||||
|
|
||||||
|
use App\Library\Cache\Backend\Redis as RedisCache;
|
||||||
|
use App\Repos\ImGroup as GroupRepo;
|
||||||
|
use App\Services\Search\GroupDocument;
|
||||||
|
use App\Services\Search\GroupSearcher;
|
||||||
|
use App\Services\Syncer\GroupIndex as GroupIndexSyncer;
|
||||||
|
|
||||||
|
class SyncGroupIndexTask extends Task
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var RedisCache
|
||||||
|
*/
|
||||||
|
protected $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Redis
|
||||||
|
*/
|
||||||
|
protected $redis;
|
||||||
|
|
||||||
|
public function mainAction()
|
||||||
|
{
|
||||||
|
$this->cache = $this->getDI()->get('cache');
|
||||||
|
|
||||||
|
$this->redis = $this->cache->getRedis();
|
||||||
|
|
||||||
|
$this->rebuild();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function rebuild()
|
||||||
|
{
|
||||||
|
$key = $this->getSyncKey();
|
||||||
|
|
||||||
|
$groupIds = $this->redis->sRandMember($key, 1000);
|
||||||
|
|
||||||
|
if (!$groupIds) return;
|
||||||
|
|
||||||
|
$groupRepo = new GroupRepo();
|
||||||
|
|
||||||
|
$groups = $groupRepo->findByIds($groupIds);
|
||||||
|
|
||||||
|
if ($groups->count() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$document = new GroupDocument();
|
||||||
|
|
||||||
|
$handler = new GroupSearcher();
|
||||||
|
|
||||||
|
$index = $handler->getXS()->getIndex();
|
||||||
|
|
||||||
|
$index->openBuffer();
|
||||||
|
|
||||||
|
foreach ($groups as $group) {
|
||||||
|
|
||||||
|
$doc = $document->setDocument($group);
|
||||||
|
|
||||||
|
if ($group->published == 1) {
|
||||||
|
$index->update($doc);
|
||||||
|
} else {
|
||||||
|
$index->del($group->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$index->closeBuffer();
|
||||||
|
|
||||||
|
$this->redis->sRem($key, ...$groupIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getSyncKey()
|
||||||
|
{
|
||||||
|
$syncer = new GroupIndexSyncer();
|
||||||
|
|
||||||
|
return $syncer->getSyncKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
80
app/Console/Tasks/SyncUserIndexTask.php
Normal file
80
app/Console/Tasks/SyncUserIndexTask.php
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Tasks;
|
||||||
|
|
||||||
|
use App\Library\Cache\Backend\Redis as RedisCache;
|
||||||
|
use App\Repos\User as UserRepo;
|
||||||
|
use App\Services\Search\UserDocument;
|
||||||
|
use App\Services\Search\UserSearcher;
|
||||||
|
use App\Services\Syncer\UserIndex as UserIndexSyncer;
|
||||||
|
|
||||||
|
class SyncUserIndexTask extends Task
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var RedisCache
|
||||||
|
*/
|
||||||
|
protected $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Redis
|
||||||
|
*/
|
||||||
|
protected $redis;
|
||||||
|
|
||||||
|
public function mainAction()
|
||||||
|
{
|
||||||
|
$this->cache = $this->getDI()->get('cache');
|
||||||
|
|
||||||
|
$this->redis = $this->cache->getRedis();
|
||||||
|
|
||||||
|
$this->rebuild();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function rebuild()
|
||||||
|
{
|
||||||
|
$key = $this->getSyncKey();
|
||||||
|
|
||||||
|
$userIds = $this->redis->sRandMember($key, 1000);
|
||||||
|
|
||||||
|
if (!$userIds) return;
|
||||||
|
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$users = $userRepo->findByIds($userIds);
|
||||||
|
|
||||||
|
if ($users->count() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$document = new UserDocument();
|
||||||
|
|
||||||
|
$handler = new UserSearcher();
|
||||||
|
|
||||||
|
$index = $handler->getXS()->getIndex();
|
||||||
|
|
||||||
|
$index->openBuffer();
|
||||||
|
|
||||||
|
foreach ($users as $user) {
|
||||||
|
|
||||||
|
$doc = $document->setDocument($user);
|
||||||
|
|
||||||
|
if ($user->deleted == 0) {
|
||||||
|
$index->update($doc);
|
||||||
|
} else {
|
||||||
|
$index->del($user->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$index->closeBuffer();
|
||||||
|
|
||||||
|
$this->redis->sRem($key, ...$userIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getSyncKey()
|
||||||
|
{
|
||||||
|
$syncer = new UserIndexSyncer();
|
||||||
|
|
||||||
|
return $syncer->getSyncKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,10 +2,27 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
{% set closed_tips_display = site.status == 'normal' ? 'style="display:none;"' : '' %}
|
||||||
|
|
||||||
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.site'}) }}">
|
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.site'}) }}">
|
||||||
<fieldset class="layui-elem-field layui-field-title">
|
<fieldset class="layui-elem-field layui-field-title">
|
||||||
<legend>站点配置</legend>
|
<legend>站点配置</legend>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">站点状态</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="radio" name="status" value="normal" title="正常" lay-filter="status" {% if site.status == "normal" %}checked{% endif %}>
|
||||||
|
<input type="radio" name="status" value="closed" title="关闭" lay-filter="status" {% if site.status == "closed" %}checked{% endif %}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="closed-tips-block" {{ closed_tips_display }}>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">关闭原因</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<textarea name="closed_tips" class="layui-textarea">{{ site.closed_tips }}</textarea>
|
||||||
|
</div>
|
||||||
|
</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">
|
||||||
@ -80,3 +97,28 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block inline_js %}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
layui.use(['jquery', 'form', 'layer'], function () {
|
||||||
|
|
||||||
|
var $ = layui.jquery;
|
||||||
|
var form = layui.form;
|
||||||
|
|
||||||
|
form.on('radio(status)', function (data) {
|
||||||
|
var block = $('#closed-tips-block');
|
||||||
|
if (data.value === 'closed') {
|
||||||
|
block.show();
|
||||||
|
} else {
|
||||||
|
block.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -45,6 +45,10 @@ class Controller extends \Phalcon\Mvc\Controller
|
|||||||
|
|
||||||
public function beforeExecuteRoute(Dispatcher $dispatcher)
|
public function beforeExecuteRoute(Dispatcher $dispatcher)
|
||||||
{
|
{
|
||||||
|
$this->site = $this->getSiteSettings();
|
||||||
|
|
||||||
|
$this->checkSiteStatus();
|
||||||
|
|
||||||
if ($this->isNotSafeRequest()) {
|
if ($this->isNotSafeRequest()) {
|
||||||
$this->checkHttpReferer();
|
$this->checkHttpReferer();
|
||||||
$this->checkCsrfToken();
|
$this->checkCsrfToken();
|
||||||
@ -57,16 +61,15 @@ class Controller extends \Phalcon\Mvc\Controller
|
|||||||
|
|
||||||
public function initialize()
|
public function initialize()
|
||||||
{
|
{
|
||||||
$this->navs = $this->getNavs();
|
|
||||||
$this->seo = $this->getSeo();
|
$this->seo = $this->getSeo();
|
||||||
$this->site = $this->getSiteSettings();
|
$this->navs = $this->getNavs();
|
||||||
$this->appInfo = $this->getAppInfo();
|
$this->appInfo = $this->getAppInfo();
|
||||||
$this->authUser = $this->getAuthUser();
|
$this->authUser = $this->getAuthUser();
|
||||||
|
|
||||||
$this->seo->setTitle($this->site['title']);
|
$this->seo->setTitle($this->site['title']);
|
||||||
|
|
||||||
$this->view->setVar('seo', $this->seo);
|
|
||||||
$this->view->setVar('site', $this->site);
|
$this->view->setVar('site', $this->site);
|
||||||
|
$this->view->setVar('seo', $this->seo);
|
||||||
$this->view->setVar('navs', $this->navs);
|
$this->view->setVar('navs', $this->navs);
|
||||||
$this->view->setVar('app_info', $this->appInfo);
|
$this->view->setVar('app_info', $this->appInfo);
|
||||||
$this->view->setVar('auth_user', $this->authUser);
|
$this->view->setVar('auth_user', $this->authUser);
|
||||||
@ -114,4 +117,15 @@ class Controller extends \Phalcon\Mvc\Controller
|
|||||||
return $config->websocket->url;
|
return $config->websocket->url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function checkSiteStatus()
|
||||||
|
{
|
||||||
|
if ($this->site['status'] == 'closed') {
|
||||||
|
$this->dispatcher->forward([
|
||||||
|
'controller' => 'error',
|
||||||
|
'action' => 'shutdown',
|
||||||
|
'params' => ['message' => $this->site['closed_tips']],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -67,4 +67,16 @@ class ErrorController extends \Phalcon\Mvc\Controller
|
|||||||
$this->response->setStatusCode(503);
|
$this->response->setStatusCode(503);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/shutdown", name="web.error.shutdown")
|
||||||
|
*/
|
||||||
|
public function shutdownAction()
|
||||||
|
{
|
||||||
|
$message = $this->dispatcher->getParam('message');
|
||||||
|
|
||||||
|
$this->response->setStatusCode(503);
|
||||||
|
|
||||||
|
$this->view->setVar('message', $message);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,14 +14,6 @@ class ImController extends LayerController
|
|||||||
|
|
||||||
use ResponseTrait;
|
use ResponseTrait;
|
||||||
|
|
||||||
/**
|
|
||||||
* @Get("/", name="web.im.index")
|
|
||||||
*/
|
|
||||||
public function indexAction()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Get("/init", name="web.im.init")
|
* @Get("/init", name="web.im.init")
|
||||||
*/
|
*/
|
||||||
|
@ -32,4 +32,11 @@ class IndexController extends Controller
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getSocketUrl()
|
||||||
|
{
|
||||||
|
$config = $this->getDI()->get('config');
|
||||||
|
|
||||||
|
return $config->websocket->url;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,14 @@ class SearchController extends Controller
|
|||||||
$this->view->setVar('pager', $pager);
|
$this->view->setVar('pager', $pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/form", name="web.search.form")
|
||||||
|
*/
|
||||||
|
public function formAction()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @return CourseSearchService|GroupSearchService|UserSearchService
|
* @return CourseSearchService|GroupSearchService|UserSearchService
|
||||||
|
@ -34,7 +34,7 @@ class Live extends Service
|
|||||||
|
|
||||||
public function getStats($id)
|
public function getStats($id)
|
||||||
{
|
{
|
||||||
$chapter = $this->checkChapterCache($id);
|
$chapter = $this->checkChapter($id);
|
||||||
|
|
||||||
Gateway::$registerAddress = $this->getRegisterAddress();
|
Gateway::$registerAddress = $this->getRegisterAddress();
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ class Live extends Service
|
|||||||
{
|
{
|
||||||
$clientId = $this->request->getPost('client_id');
|
$clientId = $this->request->getPost('client_id');
|
||||||
|
|
||||||
$chapter = $this->checkChapterCache($id);
|
$chapter = $this->checkChapter($id);
|
||||||
|
|
||||||
$user = $this->getCurrentUser();
|
$user = $this->getCurrentUser();
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
<div class="message">{{ flashSession.output() }}</div>
|
|
||||||
<div class="layui-text">
|
<div class="layui-text">
|
||||||
<h1>
|
<h1>
|
||||||
<span class="layui-anim layui-anim-loop">4</span>
|
<span class="layui-anim layui-anim-loop">4</span>
|
||||||
@ -14,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
@ -13,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
@ -13,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
@ -13,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
@ -13,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'templates/error.volt' %}
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="layui-fluid">
|
<div class="layui-fluid">
|
||||||
<div class="kg-tips">
|
<div class="kg-tips">
|
||||||
<i class="layui-icon layui-icon-face-surprised"></i>
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
@ -13,4 +14,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
17
app/Http/Web/Views/error/shutdown.volt
Normal file
17
app/Http/Web/Views/error/shutdown.volt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{% extends 'templates/error.volt' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="layui-fluid">
|
||||||
|
<div class="kg-tips">
|
||||||
|
<i class="layui-icon layui-icon-face-surprised"></i>
|
||||||
|
<div class="message">{{ message }}</div>
|
||||||
|
<div class="layui-text">
|
||||||
|
<h1>
|
||||||
|
<span class="layui-anim layui-anim-loop">5</span>
|
||||||
|
<span class="layui-anim layui-anim-loop layui-anim-rotate">0</span>
|
||||||
|
<span class="layui-anim layui-anim-loop">3</span>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -17,16 +17,17 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% set query = request.get('query',['trim','striptags'],'') %}
|
{% set s_type = request.get('type',['trim','string'],'course') %}
|
||||||
{% set type = request.get('type',['trim','string'],'course') %}
|
{% set s_query = request.get('query',['trim','striptags'],'') %}
|
||||||
|
{% set s_url = url({'for':'web.search.index'}) %}
|
||||||
|
|
||||||
<div class="user layui-layout-right">
|
<div class="user layui-layout-right">
|
||||||
<ul class="layui-nav">
|
<ul class="layui-nav">
|
||||||
<li class="layui-nav-item">
|
<li class="layui-nav-item">
|
||||||
<a href="javascript:" class="kg-search" data-type="{{ type }}" data-query="{{ query }}"><i class="layui-icon layui-icon-search"></i> 搜索</a>
|
<a href="javascript:" class="kg-search" data-type="{{ s_type }}" data-query="{{ s_query }}" data-url="{{ s_url }}"><i class="layui-icon layui-icon-search"></i> 搜索</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="layui-nav-item">
|
<li class="layui-nav-item">
|
||||||
<a href="{{ url({'for':'web.im'}) }}" target="im">微聊<span class="layui-badge-dot"></span></a>
|
<a href="{{ url({'for':'web.im.index'}) }}" target="im">微聊<span class="layui-badge-dot"></span></a>
|
||||||
</li>
|
</li>
|
||||||
{% if auth_user.id > 0 %}
|
{% if auth_user.id > 0 %}
|
||||||
<li class="layui-nav-item">
|
<li class="layui-nav-item">
|
||||||
|
@ -8,7 +8,9 @@
|
|||||||
locked: '{{ auth_user.locked }}',
|
locked: '{{ auth_user.locked }}',
|
||||||
vip: '{{ auth_user.vip }}'
|
vip: '{{ auth_user.vip }}'
|
||||||
},
|
},
|
||||||
socketUrl: '{{ socket_url }}'
|
im: {
|
||||||
|
socket_url: '{{ im.socket_url }}'
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
</script>
|
</script>
|
@ -1,10 +1,11 @@
|
|||||||
<div class="search-course-list">
|
<div class="search-course-list">
|
||||||
{% for item in pager.items %}
|
{% for item in pager.items %}
|
||||||
{% set course_url = url({'for':'web.course.show','id':item.id}) %}
|
{% set course_url = url({'for':'web.course.show','id':item.id}) %}
|
||||||
|
{% set teacher_url = url({'for':'web.teacher.show','id':item.teacher.id}) %}
|
||||||
<div class="search-course-card clearfix">
|
<div class="search-course-card clearfix">
|
||||||
<div class="cover">
|
<div class="cover">
|
||||||
<a href="{{ course_url }}">
|
<a href="{{ course_url }}">
|
||||||
<img src="{{ item.cover }}!cover_270" alt="{{ item.title|e }}">
|
<img src="{{ item.cover }}!cover_270" alt="{{ item.title }}">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
@ -13,8 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="summary">{{ item.summary }}</div>
|
<div class="summary">{{ item.summary }}</div>
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<span>分类:{{ item.category.name }}</span>
|
<span>讲师:<a href="{{ teacher_url }}">{{ item.teacher.name }}</a></span>
|
||||||
<span>讲师:{{ item.teacher.name }}</span>
|
|
||||||
<span>难度:{{ level_info(item.level) }}</span>
|
<span>难度:{{ level_info(item.level) }}</span>
|
||||||
<span>课时:{{ item.lesson_count }}</span>
|
<span>课时:{{ item.lesson_count }}</span>
|
||||||
<span>学员:{{ item.user_count }}</span>
|
<span>学员:{{ item.user_count }}</span>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<div class="search-group-list">
|
<div class="search-group-list">
|
||||||
{% for item in pager.items %}
|
{% for item in pager.items %}
|
||||||
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
||||||
|
{% set owner_url = url({'for':'web.user.show','id':item.onwer.id}) %}
|
||||||
{% set item.about = item.about ? item.about : '这个家伙真懒,什么也没有留下!' %}
|
{% set item.about = item.about ? item.about : '这个家伙真懒,什么也没有留下!' %}
|
||||||
<div class="search-group-card clearfix">
|
<div class="search-group-card clearfix">
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
@ -14,8 +15,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="about layui-elip">{{ item.about }}</div>
|
<div class="about layui-elip">{{ item.about }}</div>
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<span>组长:{{ item.owner.name }}</span>
|
<span>组长:<a href="{{ owner_url }}">{{ item.owner.name }}</a></span>
|
||||||
<span>组员:{{ item.user_count }}</span>
|
<span>成员:{{ item.user_count }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -14,25 +14,36 @@
|
|||||||
<a><cite>{{ query }}</cite></a>
|
<a><cite>{{ query }}</cite></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% set tab_show = type %}
|
||||||
<div class="layout-main clearfix">
|
<div class="layout-main clearfix">
|
||||||
<div class="layout-content">
|
<div class="layout-content">
|
||||||
<div class="search-tab wrap">
|
<div class="search-tab-wrap wrap">
|
||||||
{% for key,value in types %}
|
<div class="layui-tab layui-tab-brief search-tab">
|
||||||
{% set class = (type == key) ? 'layui-btn layui-btn-xs' : 'none' %}
|
<ul class="layui-tab-title">
|
||||||
{% set url = url({'for':'web.search.index'},{'type':key,'query':query}) %}
|
{% for key,value in types %}
|
||||||
<a class="{{ class }}" href="{{ url }}">{{ value }}</a>
|
{% set class = (type == key) ? 'layui-this' : 'none' %}
|
||||||
{% endfor %}
|
{% set url = url({'for':'web.search.index'},{'type':key,'query':query}) %}
|
||||||
|
<li class="{{ class }}"><a href="{{ url }}">{{ value }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<div class="layui-tab-content">
|
||||||
|
{% if type == 'course' %}
|
||||||
|
<div class="layui-tab-item layui-show">
|
||||||
|
{{ partial('search/course') }}
|
||||||
|
</div>
|
||||||
|
{% elseif type == 'group' %}
|
||||||
|
<div class="layui-tab-item layui-show">
|
||||||
|
{{ partial('search/group') }}
|
||||||
|
</div>
|
||||||
|
{% elseif type == 'user' %}
|
||||||
|
<div class="layui-tab-item layui-show">
|
||||||
|
{{ partial('search/user') }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if pager.total_pages > 0 %}
|
{% if pager.total_pages > 0 %}
|
||||||
<div class="wrap">
|
|
||||||
{% if type == 'course' %}
|
|
||||||
{{ partial('search/course') }}
|
|
||||||
{% elseif type == 'group' %}
|
|
||||||
{{ partial('search/group') }}
|
|
||||||
{% elseif type == 'user' %}
|
|
||||||
{{ partial('search/user') }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{{ partial('partials/pager') }}
|
{{ partial('partials/pager') }}
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="search-empty wrap">
|
<div class="search-empty wrap">
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
<div class="search-other-list">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="pager">
|
|
||||||
{{ partial('partials/pager') }}
|
|
||||||
</div>
|
|
@ -3,7 +3,8 @@
|
|||||||
<div class="layui-card-header">热门搜索</div>
|
<div class="layui-card-header">热门搜索</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
{% for query in hot_queries %}
|
{% for query in hot_queries %}
|
||||||
<a class="layui-badge-rim query-badge" href="{{ url({'for':'web.search.index'},{'query':query}) }}">{{ query }}</a>
|
{% set url = url({'for':'web.search.index'},{'type':type,'query':query}) %}
|
||||||
|
<a class="layui-badge-rim query-badge" href="{{ url }}">{{ query }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -14,7 +15,8 @@
|
|||||||
<div class="layui-card-header">相关搜索</div>
|
<div class="layui-card-header">相关搜索</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
{% for query in related_queries %}
|
{% for query in related_queries %}
|
||||||
<a class="layui-badge-rim query-badge" href="{{ url({'for':'web.search.index'},{'query':query}) }}">{{ query }}</a>
|
{% set url = url({'for':'web.search.index'},{'type':type,'query':query}) %}
|
||||||
|
<a class="layui-badge-rim query-badge" href="{{ url }}">{{ query }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -22,7 +22,6 @@ type = body
|
|||||||
[location]
|
[location]
|
||||||
type = string
|
type = string
|
||||||
index = self
|
index = self
|
||||||
tokenizer = full
|
|
||||||
|
|
||||||
[gender]
|
[gender]
|
||||||
type = string
|
type = string
|
||||||
|
@ -22,7 +22,6 @@ type = body
|
|||||||
[location]
|
[location]
|
||||||
type = string
|
type = string
|
||||||
index = self
|
index = self
|
||||||
tokenizer = full
|
|
||||||
|
|
||||||
[gender]
|
[gender]
|
||||||
type = string
|
type = string
|
||||||
|
@ -129,27 +129,14 @@ body {
|
|||||||
margin-left: 100px;
|
margin-left: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-nav .im {
|
.layer-search input {
|
||||||
|
height: 75px;
|
||||||
}
|
line-height: 75px;
|
||||||
|
width: 500px;
|
||||||
.im .layui-icon-chat {
|
padding: 0 15px;
|
||||||
|
font-size: 18px;
|
||||||
}
|
border: none 0;
|
||||||
|
background: none;
|
||||||
.search {
|
|
||||||
position: absolute;
|
|
||||||
top: 15px;
|
|
||||||
right: 240px;
|
|
||||||
width: 250px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search .layui-input {
|
|
||||||
border: none;
|
|
||||||
height: 30px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: rgba(255, 255, 255, 0.5);
|
|
||||||
background-color: rgba(255, 255, 255, 0.05);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#footer span, #footer a {
|
#footer span, #footer a {
|
||||||
@ -246,12 +233,15 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.search-tab {
|
.search-tab {
|
||||||
padding: 10px 20px;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-tab a {
|
.search-tab .layui-tab-title {
|
||||||
min-width: 50px;
|
margin-bottom: 10px;
|
||||||
margin-right: 30px;
|
}
|
||||||
|
|
||||||
|
.search-tab .layui-tab-content {
|
||||||
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-empty {
|
.search-empty {
|
||||||
@ -302,7 +292,7 @@ body {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-course-card .info, .search-group-card .info {
|
.search-course-card .info {
|
||||||
float: left;
|
float: left;
|
||||||
width: 500px;
|
width: 500px;
|
||||||
}
|
}
|
||||||
@ -346,6 +336,11 @@ body {
|
|||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-group-card .info {
|
||||||
|
float: left;
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
.search-group-card .about {
|
.search-group-card .about {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
@ -1248,12 +1243,13 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.user-tab .layui-tab-title {
|
.user-tab .layui-tab-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-tab .layui-tab-content {
|
.user-tab .layui-tab-content {
|
||||||
padding: 20px 0 0 0;
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-tab .loading {
|
.user-tab .loading {
|
||||||
|
@ -1,16 +1,23 @@
|
|||||||
|
html {
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
.kg-tips {
|
.kg-tips {
|
||||||
margin-top: 30px;
|
width: 500px;
|
||||||
|
margin: 0 auto;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kg-tips .layui-icon-face-surprised {
|
.kg-tips .layui-icon-face-surprised {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
margin-top: 20px;
|
||||||
font-size: 200px;
|
font-size: 200px;
|
||||||
color: #393D49;
|
color: #393D49;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kg-tips .message {
|
.kg-tips .message {
|
||||||
margin-top: 30px;
|
margin-top: 20px;
|
||||||
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kg-tips .layui-text {
|
.kg-tips .layui-text {
|
||||||
|
@ -105,6 +105,33 @@ layui.use(['jquery', 'form', 'element', 'layer', 'helper'], function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('.kg-search').on('click', function () {
|
||||||
|
var content = '<form action="' + $(this).data('url') + '">';
|
||||||
|
content += '<input type="text" name="query" autocomplete="off" placeholder="搜索内容,回车跳转">';
|
||||||
|
content += '<input type="hidden" name="type" value="' + $(this).data('type') + '">';
|
||||||
|
content += '</form>';
|
||||||
|
layer.open({
|
||||||
|
type: 1,
|
||||||
|
title: false,
|
||||||
|
closeBtn: false,
|
||||||
|
shadeClose: true,
|
||||||
|
offset: '120px',
|
||||||
|
maxWidth: 10000,
|
||||||
|
skin: 'layer-search',
|
||||||
|
content: content,
|
||||||
|
success: function (dom) {
|
||||||
|
var form = dom.find('form');
|
||||||
|
var query = dom.find('input[name=query]');
|
||||||
|
query.focus();
|
||||||
|
$(form).submit(function () {
|
||||||
|
if (query.val().replace(/\s/g, '') === '') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$('.kg-back').on('click', function () {
|
$('.kg-back').on('click', function () {
|
||||||
window.history.back();
|
window.history.back();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user