1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-28 21:31:37 +08:00

整理登录注册代码

This commit is contained in:
xiaochong0302 2020-05-25 20:32:12 +08:00
parent c0e405a51f
commit 2450d70fdc
28 changed files with 360 additions and 290 deletions

View File

@ -65,7 +65,7 @@ class CourseRecommendedList extends Cache
public function findCourses($limit = 5) public function findCourses($limit = 5)
{ {
return CourseModel::query() return CourseModel::query()
->where('published = 1 AND deleted = 0') ->where('published = 1 AND deleted = 0 AND market_price > 0')
->orderBy('RAND()') ->orderBy('RAND()')
->limit($limit) ->limit($limit)
->execute(); ->execute();

View File

@ -395,7 +395,7 @@ class Course extends Service
$cache = new CourseTeacherListCache(); $cache = new CourseTeacherListCache();
$cache->rebuild(); $cache->rebuild($course->id);
} }
protected function saveCategories(CourseModel $course, $categoryIds) protected function saveCategories(CourseModel $course, $categoryIds)

View File

@ -23,7 +23,7 @@
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span> <span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide kg-verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div> </div>
</div> </div>
{% endif %} {% endif %}
@ -62,7 +62,7 @@
$('input[name=rand]').val(res.randstr); $('input[name=rand]').val(res.randstr);
$('#captcha-btn').remove(); $('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled'); $('#submit-btn').removeAttr('disabled');
$('#verify-tips').removeClass('layui-hide'); $('#verify-btn').removeClass('layui-hide');
} }
} }
); );

View File

@ -37,8 +37,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-inline" style="width:200px;"> <div class="layui-input-inline" style="width:200px;">
<span id="front-verify-btn" class="layui-btn layui-btn-primary layui-btn-fluid" app-id="{{ captcha.app_id }}">前台验证</span> <span id="front-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">前台验证</span>
<span id="front-verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>前台验证成功</span> <span id="front-verify-tips" class="kg-verify-btn layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>前台验证成功</span>
</div> </div>
</div> </div>
@ -46,7 +46,7 @@
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-inline" style="width:200px;"> <div class="layui-input-inline" style="width:200px;">
<span id="back-verify-btn" class="layui-btn layui-btn-primary layui-btn-fluid" disabled="true" lay-submit="true" lay-filter="back-verify">后台验证</span> <span id="back-verify-btn" class="layui-btn layui-btn-primary layui-btn-fluid" disabled="true" lay-submit="true" lay-filter="back-verify">后台验证</span>
<span id="back-verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>后台验证成功</span> <span id="back-verify-tips" class="kg-verify-btn layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>后台验证成功</span>
<input type="hidden" name="ticket"> <input type="hidden" name="ticket">
<input type="hidden" name="rand"> <input type="hidden" name="rand">
</div> </div>
@ -65,13 +65,13 @@
var layer = layui.layer; var layer = layui.layer;
var captcha = new TencentCaptcha( var captcha = new TencentCaptcha(
$('#front-verify-btn')[0], $('#front-captcha-btn')[0],
$('#front-verify-btn').attr('app-id'), $('#front-captcha-btn').attr('data-app-id'),
function (res) { function (res) {
if (res.ret === 0) { if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket); $('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr); $('input[name=rand]').val(res.randstr);
$('#front-verify-btn').remove(); $('#front-captcha-btn').remove();
$('#back-verify-btn').removeAttr('disabled'); $('#back-verify-btn').removeAttr('disabled');
$('#front-verify-tips').removeClass('layui-hide'); $('#front-verify-tips').removeClass('layui-hide');
} }

View File

@ -88,22 +88,22 @@ class AccountController extends Controller
} }
/** /**
* @Get("/password/reset", name="web.account.reset_pwd") * @Get("/password/forget", name="web.account.forget_pwd")
*/ */
public function resetPasswordAction() public function forgetPasswordAction()
{ {
$service = new AccountService(); $service = new AccountService();
$captcha = $service->getSectionSettings('captcha'); $captcha = $service->getSectionSettings('captcha');
$this->view->pick('account/reset_password'); $this->view->pick('account/forget_password');
$this->view->setVar('captcha', $captcha); $this->view->setVar('captcha', $captcha);
} }
/** /**
* @Post("/password/reset", name="web.account.do_reset_pwd") * @Post("/password/reset", name="web.account.reset_pwd")
*/ */
public function doResetPasswordAction() public function resetPasswordAction()
{ {
} }

View File

@ -0,0 +1,51 @@
{% extends 'templates/base.volt' %}
{% block content %}
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>重置密码</cite></a>
</div>
<div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.reset_pwd'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="password" name="new_password" autocomplete="off" placeholder="新密码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="cv-verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即重置</button>
</div>
</div>
</form>
</div>
{% endblock %}
{% block include_js %}
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
{{ js_include('web/js/captcha.verify.js') }}
{% endblock %}

View File

@ -2,6 +2,11 @@
{% block content %} {% block content %}
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>登录</cite></a>
</div>
<div class="layui-tab layui-tab-brief login-tab"> <div class="layui-tab layui-tab-brief login-tab">
<ul class="layui-tab-title kg-tab-title"> <ul class="layui-tab-title kg-tab-title">
<li class="layui-this">密码登录</li> <li class="layui-this">密码登录</li>
@ -18,3 +23,11 @@
</div> </div>
{% endblock %} {% endblock %}
{% block include_js %}
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
{{ js_include('web/js/captcha.login.js') }}
{{ js_include('web/js/captcha.verify.js') }}
{% endblock %}

View File

@ -1,8 +1,8 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'web.account.pwd_login'}) }}"> <form class="layui-form" method="POST" action="{{ url({'for':'web.account.pwd_login'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="邮箱" lay-verify="required"> <input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -11,22 +11,16 @@
<input class="layui-input" type="password" name="password" autocomplete="off" placeholder="密码" lay-verify="required"> <input class="layui-input" type="password" name="password" autocomplete="off" placeholder="密码" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span> <span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即登录</button> <button id="submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button>
<input type="hidden" name="return_url" value="{{ return_url }}"> <input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket"> <input type="hidden" name="ticket">
<input type="hidden" name="rand"> <input type="hidden" name="rand">

View File

@ -1,8 +1,8 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'web.account.verify_login'}) }}"> <form class="layui-form" method="POST" action="{{ url({'for':'web.account.verify_login'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required"> <input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -14,16 +14,14 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<span id="phone-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span> <span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="phone-verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="cv-verify-btn" class="verify-btn layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即登录</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button>
<input type="hidden" name="return_url" value="{{ return_url }}"> <input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>

View File

@ -2,6 +2,11 @@
{% block content %} {% block content %}
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>注册</cite></a>
</div>
<div class="register-container"> <div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_register'}) }}"> <form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_register'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
@ -30,52 +35,18 @@
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即注册</button> <button id="submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即注册</button>
<input type="hidden" name="return_url" value="{{ return_url }}"> <input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>
</div> </div>
{% endblock %}
{% endblock %}
{% block inline_js %}
{% block include_js %}
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
<script> {{ js_include('web/js/captcha.js') }}
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr);
$.ajax({
type: 'POST',
url: '/verify/code',
data: {
account: $('input[name=account]').val(),
ticket: $('input[name=ticket]').val(),
rand: $('input[name=rand]').val()
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
},
});
$('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-tips').removeClass('layui-hide');
}
}
);
</script>
{% endblock %} {% endblock %}

View File

@ -1,80 +0,0 @@
{% extends 'templates/base.volt' %}
{% block content %}
<div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_reset_pwd'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="password" name="new_password" autocomplete="off" placeholder="新密码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即重置</button>
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div>
</div>
</form>
</div>
{% endblock %}
{% block inline_js %}
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
<script>
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr);
$.ajax({
type: 'POST',
url: '/verify/code',
data: {
account: $('input[name=account]').val(),
ticket: $('input[name=ticket]').val(),
rand: $('input[name=rand]').val()
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
},
});
$('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-tips').removeClass('layui-hide');
}
}
);
</script>
{% endblock %}

View File

@ -1,10 +1,14 @@
{%- macro lesson_info(lesson) %} {%- macro lesson_info(lesson) %}
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
{% set free_badge = lesson.free ? '<span class="layui-badge">免费</span>' : '' %}
{% if lesson.attrs.model == 'vod' %} {% if lesson.attrs.model == 'vod' %}
<li>{{ lesson.title }}</li> <a href="{{ url }}"><i class="layui-icon layui-icon-play"></i> {{ lesson.title }} {{ free_badge }}</a>
{% elseif lesson.attrs.model == 'live' %} {% elseif lesson.attrs.model == 'live' %}
<li>{{ lesson.title }}</li> <a href="{{ url }}"><i class="layui-icon layui-icon-video"></i> {{ lesson.title }} {{ free_badge }}</a>
{% elseif lesson.attrs.model == 'read' %} {% elseif lesson.attrs.model == 'read' %}
<li>{{ lesson.title }}</li> <a href="{{ url }}"><i class="layui-icon layui-icon-note"></i> {{ lesson.title }} {{ free_badge }}</a>
{% endif %} {% endif %}
{%- endmacro %} {%- endmacro %}
@ -15,7 +19,7 @@
<div class="layui-colla-content layui-show"> <div class="layui-colla-content layui-show">
<ul class="lesson-list"> <ul class="lesson-list">
{% for lesson in chapter.children %} {% for lesson in chapter.children %}
{{ lesson_info(lesson) }} <li>{{ lesson_info(lesson) }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>

View File

@ -12,14 +12,13 @@
</span> </span>
</div> </div>
<div class="course-meta"> <div class="layout-main clearfix">
<div class="left"></div> <div class="layout-content">
<div class="right"></div> <div class="course-meta">
</div> <div class="left"></div>
<div class="right"></div>
<div class="course-body layui-clear"> </div>
<div class="content"> <div class="layui-tab layui-tab-brief course-info-tab">
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title"> <ul class="layui-tab-title">
<li class="layui-this">详情</li> <li class="layui-this">详情</li>
<li>目录</li> <li>目录</li>
@ -36,21 +35,21 @@
</div> </div>
</div> </div>
</div> </div>
<div class="sidebar"> <div class="layout-sidebar">
{% if teachers %} {% if teachers %}
{{ partial('course/widget_teacher', {'teachers':teachers}) }} {{ partial('course/sidebar_teachers') }}
{% endif %} {% endif %}
{% if topics %} {% if topics %}
{{ partial('course/widget_topic', {'topics':topics}) }} {{ partial('course/sidebar_topics') }}
{% endif %} {% endif %}
{% if recommended_courses %} {% if recommended_courses %}
{{ partial('course/widget_recommended', {'courses':recommended_courses}) }} {{ partial('course/sidebar_recommended') }}
{% endif %} {% endif %}
{% if related_courses %} {% if related_courses %}
{{ partial('course/widget_related', {'courses':related_courses}) }} {{ partial('course/sidebar_related') }}
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -0,0 +1,23 @@
<div class="course-widget layui-card">
<div class="layui-card-header">推荐课程</div>
<div class="layui-card-body">
{% for course in recommended_courses %}
{% set url = url({'for':'web.course.show','id':course.id}) %}
<div class="sidebar-course-card clearfix">
<div class="cover">
<img src="{{ course.cover }}!cover_270" alt="{{ course.title }}">
</div>
<div class="info">
<div class="title">
<a href="{{ url }}" title="{{ course.title }}">{{ substr(course.title,0,15) }}</a>
</div>
<div class="meta">
<span class="price">¥{{ course.market_price }}</span>
<span class="level">中级</span>
<span class="user">{{ course.user_count }}</span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,23 @@
<div class="layui-card">
<div class="layui-card-header">相关课程</div>
<div class="layui-card-body">
{% for course in related_courses %}
{% set url = url({'for':'web.course.show','id':course.id}) %}
<div class="sidebar-course-card clearfix">
<div class="cover">
<img src="{{ course.cover }}!cover_270" alt="{{ course.title }}">
</div>
<div class="info">
<div class="title">
<a href="{{ url }}" title="{{ course.title }}">{{ substr(course.title,0,15) }}</a>
</div>
<div class="meta">
<span class="price">¥{{ course.market_price }}</span>
<span class="level">中级</span>
<span class="user">{{ course.user_count }}</span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,18 @@
<div class="layui-card">
<div class="layui-card-header">授课教师</div>
<div class="layui-card-body">
{% for teacher in teachers %}
<div class="sidebar-teacher-card clearfix">
<div class="avatar">
<img src="{{ teacher.avatar }}" alt="{{ teacher.about }}">
</div>
<div class="info">
<div class="name">
<a href="{{ url({'for':'web.user.show','id':teacher.id}) }}">{{ teacher.name }}</a>
</div>
<div class="title">{{ teacher.title }}</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,8 @@
<div class="layui-card">
<div class="layui-card-header">热门专题</div>
<div class="layui-card-body">
{% for topic in topics %}
<a class="layui-badge-rim topic-badge" href="{{ url({'for':'web.topic.show','id':topic.id}) }}">{{ topic.title }}</a>
{% endfor %}
</div>
</div>

View File

@ -1,18 +0,0 @@
<div class="course-widget layui-card">
<div class="layui-card-header">推荐课程</div>
<div class="layui-card-body">
{% for course in courses %}
<div class="course">
<div class="cover"></div>
<div class="info">
<div class="title">{{ course.title }}</div>
<div class="meta">
<span class="price"></span>
<span class="level"></span>
<span class="user"></span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -1,18 +0,0 @@
<div class="course-widget layui-card">
<div class="layui-card-header">相关课程</div>
<div class="layui-card-body">
{% for course in courses %}
<div class="course">
<div class="cover"></div>
<div class="info">
<div class="title">{{ course.title }}</div>
<div class="meta">
<span class="price"></span>
<span class="level"></span>
<span class="user"></span>
</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -1,14 +0,0 @@
<div class="teacher-widget layui-card">
<div class="layui-card-header">授课教师</div>
<div class="layui-card-body">
{% for teacher in teachers %}
<div class="teacher" title="{{ teacher.about }}">
<div class="avatar"></div>
<div class="info">
<div class="name">{{ teacher.name }}</div>
<div class="title">{{ teacher.title }}</div>
</div>
</div>
{% endfor %}
</div>
</div>

View File

@ -1,8 +0,0 @@
<div class="topic-widget layui-card">
<div class="layui-card-header">热门专题</div>
<div class="layui-card-body">
{% for topic in topics %}
<a class="layui-badge" href="{{ url({'for':'web.topic.show','id':topic.id}) }}">{{ topic.title }}</a>
{% endfor %}
</div>
</div>

View File

@ -23,7 +23,7 @@
<div class="search"> <div class="search">
<form class="layui-form" action="{{ url({'for':'web.search.list'}) }}"> <form class="layui-form" action="{{ url({'for':'web.search.list'}) }}">
<input class="layui-input" type="text" name="query" value="{{ request.get('query','trim','') }}" autocomplete="off" placeholder="请输入课程关键字..."> <input class="layui-input" type="text" name="query" value="{{ request.get('query')|striptags }}" autocomplete="off" placeholder="请输入课程关键字...">
</form> </form>
</div> </div>

View File

@ -9,8 +9,9 @@
<div class="layui-breadcrumb breadcrumb"> <div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a> <a href="/">首页</a>
<a href="#">搜索</a> <a href="#">搜索</a>
<a><cite>{{ request.get('query') }}</cite></a> <a><cite>{{ request.get('query')|striptags }}</cite></a>
</div> </div>
<div class="layout-main clearfix"> <div class="layout-main clearfix">
<div class="layout-content"> <div class="layout-content">
{% if type == 'course' %} {% if type == 'course' %}

View File

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="{{ site_seo.getKeywords() }}"> <meta name="keywords" content="{{ site_seo.getKeywords() }}">
<meta name="description" content="{{ site_seo.getDescription() }}"> <meta name="description" content="{{ site_seo.getDescription() }}">
<meta name="csrf-token" content="{{ csrfToken.getToken() }}">
<title>{{ site_seo.getTitle() }}</title> <title>{{ site_seo.getTitle() }}</title>
{{ icon_link('favicon.ico') }} {{ icon_link('favicon.ico') }}
{{ css_link('lib/layui/css/layui.css') }} {{ css_link('lib/layui/css/layui.css') }}

View File

@ -74,26 +74,6 @@ function kg_array_column($rows, $columnKey, $indexKey = null)
return array_unique($result); return array_unique($result);
} }
/**
* 依据白名单取数据
*
* @param array $params
* @param array $whitelist
* @return array
*/
function kg_array_whitelist($params, $whitelist)
{
$result = [];
foreach ($params as $key => $value) {
if (in_array($key, $whitelist)) {
$result[$key] = $value;
}
}
return $result;
}
/** /**
* 数组转对象 * 数组转对象
* *

View File

@ -1,5 +1,9 @@
.layui-badge, .layui-badge-rim { body {
padding-bottom: 1px; background-color: #f2f2f2;
}
.clearfix {
zoom: 1
} }
.clearfix:after { .clearfix:after {
@ -7,15 +11,7 @@
clear: both; clear: both;
content: ""; content: "";
visibility: hidden; visibility: hidden;
height: 0 height: 0;
}
body {
background-color: #f2f2f2;
}
.clearfix {
zoom: 1
} }
.fl { .fl {
@ -35,6 +31,19 @@ body {
background-color: #393D49; background-color: #393D49;
} }
#main {
margin-top: 80px;
margin-bottom: 40px;
min-height: 550px;
}
#footer {
padding: 30px 0;
text-align: center;
font-size: 12px;
background: #474443;
}
.logo { .logo {
} }
@ -58,19 +67,6 @@ body {
background-color: rgba(255, 255, 255, 0.05); background-color: rgba(255, 255, 255, 0.05);
} }
#main {
margin-top: 80px;
margin-bottom: 40px;
min-height: 550px;
}
#footer {
padding: 30px 0;
text-align: center;
font-size: 12px;
background: #474443;
}
#footer span, #footer a { #footer span, #footer a {
color: #999; color: #999;
} }
@ -98,7 +94,9 @@ body {
.layout-content { .layout-content {
float: left; float: left;
width: 800px; width: 730px;
padding: 30px;
background-color: #fff;
} }
.layout-sidebar { .layout-sidebar {
@ -124,10 +122,6 @@ body {
line-height: 30px; line-height: 30px;
} }
.index-module .content {
}
.index-carousel { .index-carousel {
margin-bottom: 30px; margin-bottom: 30px;
text-align: center; text-align: center;
@ -206,10 +200,6 @@ body {
overflow: hidden; overflow: hidden;
} }
.search-course-card .meta {
}
.search-course-card .meta span { .search-course-card .meta span {
margin-right: 10px; margin-right: 10px;
} }
@ -294,6 +284,11 @@ body {
margin-bottom: 20px; margin-bottom: 20px;
} }
.course-meta {
border: 1px dashed #ccc;
margin-bottom: 30px;
}
.course-meta .left { .course-meta .left {
float: left; float: left;
} }
@ -302,25 +297,111 @@ body {
float: right; float: right;
} }
.course-body { .course-info-tab .layui-tab-content {
padding-top: 30px;
} }
.course-body .content { ul.lesson-list {
}
.lesson-list li {
padding-left: 10px;
line-height: 40px;
}
.lesson-list li a {
display: block;
}
.lesson-list li:hover {
background-color: #f2f2f2;
}
.sidebar-teacher-card {
margin-bottom: 15px;
}
.sidebar-teacher-card .avatar {
float: left; float: left;
width: 780px; width: 60px;
height: 60px;
margin-right: 10px;
} }
.course-body .sidebar { .sidebar-teacher-card .avatar img {
width: 100%;
height: 100%;
border-radius: 60px;
}
.sidebar-teacher-card .info {
float: left; float: left;
width: 320px; padding: 5px 0;
} }
.btn-verify { .sidebar-teacher-card .info .name {
}
.sidebar-teacher-card .info .title {
color: #999;
font-size: 12px;
}
.topic-badge {
padding: 5px;
margin-right: 10px;
margin-bottom: 10px;
}
.sidebar-course-card {
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px dashed #ccc;
}
.sidebar-course-card:last-child {
border-bottom: none;
}
.sidebar-course-card .cover {
float: left;
width: 90px;
height: 50px;
margin-right: 5px;
}
.sidebar-course-card .cover img {
width: 100%;
height: 100%;
}
.sidebar-course-card .info {
float: left;
width: 190px;
color: #999;
overflow: hidden;
}
.sidebar-course-card .title {
font-size: 12px;
white-space: nowrap;
}
.sidebar-course-card .meta {
font-size: 10px;
}
.sidebar-course-card .meta span {
margin-right: 10px;
}
.verify-tips-btn {
color: green; color: green;
} }
.register-container { .register-container {
padding: 50px 30px; padding: 40px 30px;
background-color: #fff; background-color: #fff;
} }
@ -329,7 +410,7 @@ body {
} }
.login-tab { .login-tab {
padding: 30px; padding: 20px 30px;
background-color: #fff; background-color: #fff;
} }

View File

@ -0,0 +1,15 @@
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr);
$('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-btn').removeClass('layui-hide');
}
}
);

View File

@ -0,0 +1,28 @@
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#cv-captcha-btn')[0],
$('#cv-captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$.ajax({
type: 'POST',
url: '/verify/code',
data: {
account: $('#cv-account').val(),
ticket: res.ticket,
rand: res.randstr
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
}
});
$('#cv-captcha-btn').remove();
$('#cv-submit-btn').removeAttr('disabled');
$('#cv-verify-btn').removeClass('layui-hide');
}
}
);