mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-26 12:23:06 +08:00
Merge branch 'koogua/v1.4.3' into demo
This commit is contained in:
commit
ffda2b41aa
12
CHANGELOG.md
12
CHANGELOG.md
@ -1,3 +1,15 @@
|
||||
### [v1.4.3](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.3)(2021-08-23)
|
||||
|
||||
- 优化邮件验证码
|
||||
- 优化logo和favicon上传
|
||||
- 优化api验证码中使用的ticket和rand
|
||||
- 优化点播和直播地址获取
|
||||
- 修复部分清晰度外链播放地址为空时切换卡死问题
|
||||
- 增加QQ,微信,微博,邮件,电话等联系配置
|
||||
- 用户控制台文章和提问列表增加删除过滤
|
||||
- 去除layim在线客服
|
||||
- 提高视频转码分辨率
|
||||
|
||||
### [v1.4.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.4.2)(2021-08-13)
|
||||
|
||||
- 后台增加转码码率配置选项
|
||||
|
@ -409,4 +409,29 @@ class SettingController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/contact", name="admin.setting.contact")
|
||||
*/
|
||||
public function contactAction()
|
||||
{
|
||||
$section = 'contact';
|
||||
|
||||
$settingService = new SettingService();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$data = $this->request->getPost();
|
||||
|
||||
$settingService->updateSettings($section, $data);
|
||||
|
||||
return $this->jsonSuccess(['msg' => '更新配置成功']);
|
||||
|
||||
} else {
|
||||
|
||||
$contact = $settingService->getSettings($section);
|
||||
|
||||
$this->view->setVar('contact', $contact);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -16,48 +16,6 @@ use App\Services\Vod as VodService;
|
||||
class UploadController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Post("/site/logo", name="admin.upload.site_logo")
|
||||
*/
|
||||
public function uploadSiteLogoAction()
|
||||
{
|
||||
$service = new StorageService();
|
||||
|
||||
$file = $service->uploadSiteLogo();
|
||||
|
||||
if (!$file) {
|
||||
return $this->jsonError(['msg' => '上传文件失败']);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'src' => $service->getImageUrl($file->path),
|
||||
'title' => $file->name,
|
||||
];
|
||||
|
||||
return $this->jsonSuccess(['data' => $data]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/site/favicon", name="admin.upload.site_favicon")
|
||||
*/
|
||||
public function uploadSiteFaviconAction()
|
||||
{
|
||||
$service = new StorageService();
|
||||
|
||||
$file = $service->uploadSiteFavicon();
|
||||
|
||||
if (!$file) {
|
||||
return $this->jsonError(['msg' => '上传文件失败']);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'src' => $service->getImageUrl($file->path),
|
||||
'title' => $file->name,
|
||||
];
|
||||
|
||||
return $this->jsonSuccess(['data' => $data]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/icon/img", name="admin.upload.icon_img")
|
||||
*/
|
||||
|
@ -1221,6 +1221,12 @@ class AuthNode extends Service
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.setting.dingtalk_robot',
|
||||
],
|
||||
[
|
||||
'id' => '5-1-16',
|
||||
'title' => '联系方式',
|
||||
'type' => 'menu',
|
||||
'route' => 'admin.setting.contact',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
@ -56,11 +56,11 @@
|
||||
$.each(formats, function (i, format) {
|
||||
$.each(rates, function (k, rate) {
|
||||
if (playUrls.hasOwnProperty(format) && playUrls[format].hasOwnProperty(rate.name)) {
|
||||
quality[k] = {
|
||||
quality.push({
|
||||
name: rate.label,
|
||||
url: playUrls[format][rate.name],
|
||||
type: 'flv',
|
||||
};
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
119
app/Http/Admin/Views/setting/contact.volt
Normal file
119
app/Http/Admin/Views/setting/contact.volt
Normal file
@ -0,0 +1,119 @@
|
||||
{% extends 'templates/main.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.contact'}) }}">
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>联系方式</legend>
|
||||
</fieldset>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">微信二维码</label>
|
||||
<div class="layui-inline" style="width:40%;">
|
||||
<input class="layui-input" type="text" name="wechat" placeholder="请确保存储已正确配置" value="{{ contact.wechat }}">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" type="button" id="upload-wechat">上传文件</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">头条二维码</label>
|
||||
<div class="layui-inline" style="width:40%;">
|
||||
<input class="layui-input" type="text" name="toutiao" placeholder="请确保存储已正确配置" value="{{ contact.toutiao }}">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" type="button" id="upload-toutiao">上传文件</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">客服QQ</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="qq" value="{{ contact.qq }}" placeholder="请前往 https://shang.qq.com/v3/widget.html 开通服务">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">微博帐号</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="weibo" value="{{ contact.weibo }}" placeholder="https://weibo.com/u/{账号}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">知乎帐号</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="zhihu" value="{{ contact.zhihu }}" placeholder="https://www.zhihu.com/people/{帐号}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">联系电话</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="phone" value="{{ contact.phone }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">联系邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="email" value="{{ contact.email }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">联系地址</label>
|
||||
<div class="layui-input-block">
|
||||
<input class="layui-input" type="text" name="address" value="{{ contact.address }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit="true" lay-filter="go">提交</button>
|
||||
<button type="button" class="kg-back layui-btn layui-btn-primary">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
layui.use(['jquery', 'layer', 'upload'], function () {
|
||||
|
||||
var $ = layui.jquery;
|
||||
var upload = layui.upload;
|
||||
|
||||
upload.render({
|
||||
elem: '#upload-wechat',
|
||||
url: '/admin/upload/icon/img',
|
||||
exts: 'gif|jpg|png',
|
||||
before: function () {
|
||||
layer.load();
|
||||
},
|
||||
done: function (res, index, upload) {
|
||||
$('input[name=wechat]').val(res.data.src);
|
||||
layer.closeAll('loading');
|
||||
},
|
||||
error: function (index, upload) {
|
||||
layer.msg('上传文件失败', {icon: 2});
|
||||
}
|
||||
});
|
||||
|
||||
upload.render({
|
||||
elem: '#upload-toutiao',
|
||||
url: '/admin/upload/icon/img',
|
||||
exts: 'gif|jpg|png',
|
||||
before: function () {
|
||||
layer.load();
|
||||
},
|
||||
done: function (res, index, upload) {
|
||||
$('input[name=toutiao]').val(res.data.src);
|
||||
layer.closeAll('loading');
|
||||
},
|
||||
error: function (index, upload) {
|
||||
layer.msg('上传文件失败', {icon: 2});
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
@ -5,15 +5,11 @@
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">微聊设置</li>
|
||||
<li>在线客服</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
{{ partial('setting/im_main') }}
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
{{ partial('setting/im_cs') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -163,7 +163,7 @@
|
||||
|
||||
upload.render({
|
||||
elem: '#upload-logo',
|
||||
url: '/admin/upload/site/logo',
|
||||
url: '/admin/upload/icon/img',
|
||||
exts: 'gif|jpg|png',
|
||||
before: function () {
|
||||
layer.load();
|
||||
@ -179,7 +179,7 @@
|
||||
|
||||
upload.render({
|
||||
elem: '#upload-favicon',
|
||||
url: '/admin/upload/site/favicon',
|
||||
url: '/admin/upload/icon/img',
|
||||
exts: 'gif|jpg|png|ico',
|
||||
before: function () {
|
||||
layer.load();
|
||||
|
@ -16,7 +16,7 @@ class PageController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/info", name="api.page.info")
|
||||
* @Get("/{id}/info", name="api.page.info")
|
||||
*/
|
||||
public function infoAction($id)
|
||||
{
|
||||
|
@ -7,8 +7,9 @@
|
||||
|
||||
namespace App\Http\Api\Controllers;
|
||||
|
||||
use App\Services\Logic\Verify\EmailCode as EmailCodeService;
|
||||
use App\Services\Logic\Verify\MailCode as MailCodeService;
|
||||
use App\Services\Logic\Verify\SmsCode as SmsCodeService;
|
||||
use App\Services\Logic\Verify\Ticket as TicketService;
|
||||
|
||||
/**
|
||||
* @RoutePrefix("/api/verify")
|
||||
@ -16,6 +17,18 @@ use App\Services\Logic\Verify\SmsCode as SmsCodeService;
|
||||
class VerifyController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Post("/ticket", name="api.verify.ticket")
|
||||
*/
|
||||
public function ticketAction()
|
||||
{
|
||||
$service = new TicketService();
|
||||
|
||||
$ticket = $service->handle();
|
||||
|
||||
return $this->jsonSuccess(['ticket' => $ticket]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/sms/code", name="api.verify.sms_code")
|
||||
*/
|
||||
@ -29,11 +42,11 @@ class VerifyController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/email/code", name="api.verify.email_code")
|
||||
* @Post("/mail/code", name="api.verify.mail_code")
|
||||
*/
|
||||
public function emailCodeAction()
|
||||
public function mailCodeAction()
|
||||
{
|
||||
$service = new EmailCodeService();
|
||||
$service = new MailCodeService();
|
||||
|
||||
$service->handle();
|
||||
|
||||
|
@ -40,6 +40,11 @@ class Controller extends \Phalcon\Mvc\Controller
|
||||
*/
|
||||
protected $siteInfo;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $contactInfo;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
@ -83,6 +88,7 @@ class Controller extends \Phalcon\Mvc\Controller
|
||||
$this->seo = $this->getSeo();
|
||||
$this->navs = $this->getNavs();
|
||||
$this->appInfo = $this->getAppInfo();
|
||||
$this->contactInfo = $this->getContactInfo();
|
||||
$this->imInfo = $this->getImInfo();
|
||||
|
||||
$this->seo->setTitle($this->siteInfo['title']);
|
||||
@ -92,6 +98,7 @@ class Controller extends \Phalcon\Mvc\Controller
|
||||
$this->view->setVar('auth_user', $this->authUser);
|
||||
$this->view->setVar('app_info', $this->appInfo);
|
||||
$this->view->setVar('site_info', $this->siteInfo);
|
||||
$this->view->setVar('contact_info', $this->contactInfo);
|
||||
$this->view->setVar('im_info', $this->imInfo);
|
||||
}
|
||||
|
||||
@ -122,6 +129,11 @@ class Controller extends \Phalcon\Mvc\Controller
|
||||
return $this->getSettings('site');
|
||||
}
|
||||
|
||||
protected function getContactInfo()
|
||||
{
|
||||
return $this->getSettings('contact');
|
||||
}
|
||||
|
||||
protected function getAppInfo()
|
||||
{
|
||||
return new AppInfo();
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
namespace App\Http\Home\Controllers;
|
||||
|
||||
use App\Services\Logic\Verify\EmailCode as EmailCodeService;
|
||||
use App\Services\Logic\Verify\MailCode as MailCodeService;
|
||||
use App\Services\Logic\Verify\SmsCode as SmsCodeService;
|
||||
use App\Traits\Response as ResponseTrait;
|
||||
|
||||
@ -32,11 +32,11 @@ class VerifyController extends \Phalcon\Mvc\Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @Post("/email/code", name="home.verify.email_code")
|
||||
* @Post("/mail/code", name="home.verify.mail_code")
|
||||
*/
|
||||
public function emailCodeAction()
|
||||
public function mailCodeAction()
|
||||
{
|
||||
$service = new EmailCodeService();
|
||||
$service = new MailCodeService();
|
||||
|
||||
$service->handle();
|
||||
|
||||
|
@ -31,12 +31,9 @@ class Index extends Service
|
||||
*/
|
||||
$slides = $cache->get();
|
||||
|
||||
if (empty($slides)) {
|
||||
return [];
|
||||
}
|
||||
if (empty($slides)) return [];
|
||||
|
||||
foreach ($slides as $key => $slide) {
|
||||
|
||||
switch ($slide['target']) {
|
||||
case SlideModel::TARGET_COURSE:
|
||||
$slides[$key]['url'] = $this->url->get([
|
||||
@ -53,8 +50,6 @@ class Index extends Service
|
||||
case SlideModel::TARGET_LINK:
|
||||
$slides[$key]['url'] = $slide['content'];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,9 +34,10 @@
|
||||
<div class="layui-card-header">客户服务</div>
|
||||
<div class="layui-card-body">
|
||||
<p>没解决你的疑问?试试联系客服吧!</p>
|
||||
{% if im_info.cs.enabled == 1 %}
|
||||
{% if contact_info.qq %}
|
||||
{% set link_url = 'https://wpa.qq.com/msgrd?v=3&uin=%s&site=qq&menu=yes'|format(contact_info.qq) %}
|
||||
<p class="center">
|
||||
<button class="layui-btn layui-btn-sm btn-cs">联系客服</button>
|
||||
<a href="{{ link_url }}" class="layui-btn layui-btn-sm">联系客服</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -1,22 +1,50 @@
|
||||
<div class="layui-main">
|
||||
<div class="left">
|
||||
<div class="bottom-nav">
|
||||
{% for nav in navs.bottom %}
|
||||
<a href="{{ nav.url }}" target="{{ nav.target }}">{{ nav.name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="copyright">
|
||||
{% if site_info.copyright %}
|
||||
<span>© {{ site_info.copyright }}</span>
|
||||
{% endif %}
|
||||
<a href="{{ app_info.link }}" title="{{ app_info.name }}" target="_blank">Powered by {{ app_info.alias }} {{ app_info.version }}</a>
|
||||
{% if site_info.icp_sn %}
|
||||
<a href="{{ site_info.icp_link }}" target="_blank">{{ site_info.icp_sn }}</a>
|
||||
{% endif %}
|
||||
{% if site_info.police_sn %}
|
||||
<a href="{{ site_info.police_link }}" target="_blank">{{ site_info.police_sn }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="row nav">
|
||||
{% for nav in navs.bottom %}
|
||||
<a href="{{ nav.url }}" target="{{ nav.target }}">{{ nav.name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="row copyright">
|
||||
{% if site_info.copyright %}
|
||||
<span>© {{ site_info.copyright }}</span>
|
||||
{% endif %}
|
||||
<a href="{{ app_info.link }}" title="{{ app_info.name }}" target="_blank">Powered by {{ app_info.alias }} {{ app_info.version }}</a>
|
||||
{% if site_info.icp_sn %}
|
||||
<a href="{{ site_info.icp_link }}" target="_blank">{{ site_info.icp_sn }}</a>
|
||||
{% endif %}
|
||||
{% if site_info.police_sn %}
|
||||
<a href="{{ site_info.police_link }}" target="_blank">{{ site_info.police_sn }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="row contact">
|
||||
{% if contact_info.qq %}
|
||||
{% set link_url = 'https://wpa.qq.com/msgrd?v=3&uin=%s&site=qq&menu=yes'|format(contact_info.qq) %}
|
||||
<a class="qq" href="{{ link_url }}" title="客服QQ:{{ contact_info.qq }}"><span class="iconfont icon-qq"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.wechat %}
|
||||
<a class="wechat" href="javascript:" title="微信公众号"><span class="iconfont icon-wechat"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.toutiao %}
|
||||
<a class="toutiao" href="javascript:" title="头条号"><span class="iconfont icon-toutiao"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.weibo %}
|
||||
{% set link_url = 'https://weibo.com/u/%s'|format(contact_info.weibo) %}
|
||||
<a class="weibo" href="{{ link_url }}" title="微博主页"><span class="iconfont icon-weibo"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.zhihu %}
|
||||
{% set link_url = 'https://www.zhihu.com/people/%s'|format(contact_info.zhihu) %}
|
||||
<a class="zhihu" href="{{ link_url }}" title="知乎主页"><span class="iconfont icon-zhihu"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.email %}
|
||||
{% set link_url = 'mailto:%s'|format(contact_info.email) %}
|
||||
<a class="mail" href="{{ link_url }}" title="联系邮箱:{{ contact_info.email }}"><span class="iconfont icon-mail"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.phone %}
|
||||
<a class="phone" href="javascript:" title="联系电话:{{ contact_info.phone }}"><span class="iconfont icon-phone"></span></a>
|
||||
{% endif %}
|
||||
{% if contact_info.address %}
|
||||
{% set link_url = 'https://map.baidu.com/search/%s?querytype=s&wd=%s'|format(contact_info.address,contact_info.address) %}
|
||||
<a class="location" href="{{ link_url }}" title="联系地址:{{ contact_info.address }}"><span class="iconfont icon-location"></span></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
@ -8,6 +8,17 @@
|
||||
vip: '{{ auth_user.vip }}'
|
||||
};
|
||||
|
||||
window.contact = {
|
||||
qq: '{{ contact_info.qq }}',
|
||||
wechat: '{{ contact_info.wechat }}',
|
||||
toutiao: '{{ contact_info.toutiao }}',
|
||||
weibo: '{{ contact_info.weibo }}',
|
||||
zhihu: '{{ contact_info.zhihu }}',
|
||||
phone: '{{ contact_info.phone }}',
|
||||
email: '{{ contact_info.email }}',
|
||||
address: '{{ contact_info.address }}'
|
||||
};
|
||||
|
||||
window.im = {
|
||||
main: {
|
||||
title: '{{ im_info.main.title }}',
|
||||
|
@ -13,6 +13,8 @@
|
||||
{% else %}
|
||||
{{ icon_link('favicon.ico') }}
|
||||
{% endif %}
|
||||
<link rel="preload" href="//at.alicdn.com/t/font_2760791_c83l29k7bz.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="//at.alicdn.com/t/font_2760791_c83l29k7bz.css">
|
||||
{{ css_link('lib/layui/css/layui.css') }}
|
||||
{{ css_link('home/css/common.css') }}
|
||||
{% block link_css %}{% endblock %}
|
||||
|
@ -16,7 +16,7 @@ class AppInfo
|
||||
|
||||
protected $link = 'https://koogua.com';
|
||||
|
||||
protected $version = '1.4.2';
|
||||
protected $version = '1.4.3';
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
|
@ -30,6 +30,10 @@ class ArticleFavorite extends Repository
|
||||
$builder->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]);
|
||||
}
|
||||
|
||||
if (isset($where['deleted'])) {
|
||||
$builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
default:
|
||||
$orderBy = 'id DESC';
|
||||
|
@ -30,6 +30,10 @@ class QuestionFavorite extends Repository
|
||||
$builder->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]);
|
||||
}
|
||||
|
||||
if (isset($where['deleted'])) {
|
||||
$builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
|
||||
}
|
||||
|
||||
switch ($sort) {
|
||||
default:
|
||||
$orderBy = 'id DESC';
|
||||
|
@ -92,9 +92,9 @@ class ChapterVod extends Service
|
||||
protected function getVodTemplates()
|
||||
{
|
||||
return [
|
||||
'hd' => ['height' => 720, 'rate' => 1800],
|
||||
'sd' => ['height' => 540, 'rate' => 1000],
|
||||
'fd' => ['height' => 360, 'rate' => 400],
|
||||
'hd' => ['height' => 1080, 'rate' => 2500],
|
||||
'sd' => ['height' => 720, 'rate' => 1800],
|
||||
'fd' => ['height' => 540, 'rate' => 1000],
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -70,6 +70,13 @@ class BasicInfo extends LogicService
|
||||
|
||||
$playUrls = $chapterVodService->getPlayUrls($chapter->id);
|
||||
|
||||
/**
|
||||
*过滤播放地址为空的条目
|
||||
*/
|
||||
foreach ($playUrls as $key => $value) {
|
||||
if (empty($value['url'])) unset($playUrls[$key]);
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $chapter->id,
|
||||
'title' => $chapter->title,
|
||||
|
@ -7,12 +7,12 @@
|
||||
|
||||
namespace App\Services\Logic\Verify;
|
||||
|
||||
use App\Services\Logic\Notice\Mail\Verify as VerifyMailService;
|
||||
use App\Services\Logic\Notice\Mail\Verify as MailVerifyService;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Validators\Captcha as CaptchaValidator;
|
||||
use App\Validators\Verify as VerifyValidator;
|
||||
|
||||
class EmailCode extends LogicService
|
||||
class MailCode extends LogicService
|
||||
{
|
||||
|
||||
public function handle()
|
||||
@ -27,7 +27,7 @@ class EmailCode extends LogicService
|
||||
|
||||
$validator->checkCode($post['ticket'], $post['rand']);
|
||||
|
||||
$service = new VerifyMailService();
|
||||
$service = new MailVerifyService();
|
||||
|
||||
$service->handle($post['email']);
|
||||
}
|
27
app/Services/Logic/Verify/Ticket.php
Normal file
27
app/Services/Logic/Verify/Ticket.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
|
||||
* @license https://opensource.org/licenses/GPL-2.0
|
||||
* @link https://www.koogua.com
|
||||
*/
|
||||
|
||||
namespace App\Services\Logic\Verify;
|
||||
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Validators\Verify as VerifyValidator;
|
||||
|
||||
class Ticket extends LogicService
|
||||
{
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$rand = $this->request->getPost('rand', ['trim', 'string']);
|
||||
|
||||
$validator = new VerifyValidator();
|
||||
|
||||
$rand = $validator->checkRand($rand);
|
||||
|
||||
return $this->crypt->encryptBase64($rand);
|
||||
}
|
||||
|
||||
}
|
@ -119,26 +119,6 @@ class MyStorage extends Storage
|
||||
return $this->putFile($key, $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传站点LOGO
|
||||
*
|
||||
* @return UploadModel|bool
|
||||
*/
|
||||
public function uploadSiteLogo()
|
||||
{
|
||||
return $this->upload('/img/icon/', self::MIME_IMAGE, UploadModel::TYPE_DEFAULT_IMG);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传站点ICON
|
||||
*
|
||||
* @return UploadModel|bool
|
||||
*/
|
||||
public function uploadSiteFavicon()
|
||||
{
|
||||
return $this->upload('/img/icon/', self::MIME_IMAGE, UploadModel::TYPE_DEFAULT_IMG);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传封面图片
|
||||
*
|
||||
|
@ -633,15 +633,15 @@ class Vod extends Service
|
||||
public function getVideoTransTemplates()
|
||||
{
|
||||
$hlsTemplates = [
|
||||
100210 => ['quality' => 'fd', 'height' => 360, 'bit_rate' => 400, 'frame_rate' => 25],
|
||||
100220 => ['quality' => 'sd', 'height' => 540, 'bit_rate' => 1000, 'frame_rate' => 25],
|
||||
100230 => ['quality' => 'hd', 'height' => 720, 'bit_rate' => 1800, 'frame_rate' => 25],
|
||||
100220 => ['quality' => 'fd', 'height' => 540, 'bit_rate' => 1000, 'frame_rate' => 25],
|
||||
100230 => ['quality' => 'sd', 'height' => 720, 'bit_rate' => 1800, 'frame_rate' => 25],
|
||||
100240 => ['quality' => 'hd', 'height' => 1080, 'bit_rate' => 2500, 'frame_rate' => 25],
|
||||
];
|
||||
|
||||
$mp4Templates = [
|
||||
100010 => ['quality' => 'fd', 'height' => 360, 'bit_rate' => 400, 'frame_rate' => 25],
|
||||
100020 => ['quality' => 'sd', 'height' => 540, 'bit_rate' => 1000, 'frame_rate' => 25],
|
||||
100030 => ['quality' => 'hd', 'height' => 720, 'bit_rate' => 1800, 'frame_rate' => 25],
|
||||
100020 => ['quality' => 'fd', 'height' => 540, 'bit_rate' => 1000, 'frame_rate' => 25],
|
||||
100030 => ['quality' => 'sd', 'height' => 720, 'bit_rate' => 1800, 'frame_rate' => 25],
|
||||
100040 => ['quality' => 'hd', 'height' => 360, 'bit_rate' => 2500, 'frame_rate' => 25],
|
||||
];
|
||||
|
||||
$format = $this->settings['video_format'] ?: 'hls';
|
||||
|
@ -65,4 +65,28 @@ class Verify extends Validator
|
||||
}
|
||||
}
|
||||
|
||||
public function checkRand($rand)
|
||||
{
|
||||
list($time, $number) = explode('-', $rand);
|
||||
|
||||
if (abs($time - time()) > 300) {
|
||||
throw new BadRequestException('verify.invalid_rand');
|
||||
}
|
||||
|
||||
if ($number < 1000 || $number > 9999) {
|
||||
throw new BadRequestException('verify.invalid_rand');
|
||||
}
|
||||
|
||||
return $rand;
|
||||
}
|
||||
|
||||
public function checkTicket($ticket, $rand)
|
||||
{
|
||||
$ticket = $this->crypt->decrypt($ticket);
|
||||
|
||||
if ($ticket != $rand) {
|
||||
throw new BadRequestException('verify.invalid_ticket');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
66
db/migrations/20210820064755.php
Normal file
66
db/migrations/20210820064755.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
|
||||
* @license https://opensource.org/licenses/GPL-2.0
|
||||
* @link https://www.koogua.com
|
||||
*/
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class V20210820064755 extends AbstractMigration
|
||||
{
|
||||
|
||||
public function up()
|
||||
{
|
||||
$this->handleContactSetting();
|
||||
}
|
||||
|
||||
protected function handleContactSetting()
|
||||
{
|
||||
$rows = [
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'qq',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'wechat',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'toutiao',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'weibo',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'zhihu',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'email',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'phone',
|
||||
'item_value' => '',
|
||||
],
|
||||
[
|
||||
'section' => 'contact',
|
||||
'item_key' => 'address',
|
||||
'item_value' => '',
|
||||
],
|
||||
];
|
||||
|
||||
$this->table('kg_setting')->insert($rows)->save();
|
||||
}
|
||||
|
||||
}
|
@ -233,27 +233,39 @@
|
||||
background: none;
|
||||
}
|
||||
|
||||
#footer .row {
|
||||
line-height: 18px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
#footer .row:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#footer .contact {
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
#footer span, #footer a {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
#footer a:hover {
|
||||
#footer a:hover,
|
||||
#footer .iconfont:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.bottom-nav {
|
||||
margin-bottom: 10px;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.bottom-nav a, .copyright span, .copyright a {
|
||||
#footer .nav a,
|
||||
#footer .copyright span,
|
||||
#footer .copyright a,
|
||||
#footer .contact a {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
#footer .iconfont {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.layout-sidebar .loading {
|
||||
padding: 15px;
|
||||
text-align: center;
|
||||
|
@ -25,7 +25,7 @@ layui.use(['jquery', 'util'], function () {
|
||||
postUrl = '/verify/sms/code';
|
||||
} else if (isEmail($account.val())) {
|
||||
postData.email = $account.val();
|
||||
postUrl = '/verify/email/code';
|
||||
postUrl = '/verify/mail/code';
|
||||
}
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
|
@ -25,11 +25,11 @@ layui.use(['jquery', 'helper'], function () {
|
||||
$.each(formats, function (i, format) {
|
||||
$.each(rates, function (k, rate) {
|
||||
if (playUrls.hasOwnProperty(format) && playUrls[format].hasOwnProperty(rate.name)) {
|
||||
quality[k] = {
|
||||
quality.push({
|
||||
name: rate.label,
|
||||
url: playUrls[format][rate.name],
|
||||
type: 'flv',
|
||||
};
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -22,13 +22,15 @@ layui.use(['jquery', 'helper'], function () {
|
||||
|
||||
$.each(rates, function (k, rate) {
|
||||
if (playUrls.hasOwnProperty(rate.name)) {
|
||||
quality[k] = {
|
||||
quality.push({
|
||||
name: rate.label,
|
||||
url: playUrls[rate.name]['url'],
|
||||
};
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
console.log(quality)
|
||||
|
||||
var player = new DPlayer({
|
||||
container: document.getElementById('player'),
|
||||
video: {
|
||||
|
@ -1,16 +1,50 @@
|
||||
layui.use(['helper', 'util'], function () {
|
||||
layui.use(['jquery', 'helper', 'util'], function () {
|
||||
|
||||
var helper = layui.helper;
|
||||
var $ = layui.jquery;
|
||||
var util = layui.util;
|
||||
|
||||
var showQQDialog = function () {
|
||||
window.open('https://wpa.qq.com/msgrd?v=3&uin=' + window.contact.qq + '&site=qq&menu=yes');
|
||||
}
|
||||
|
||||
var showWechatCode = function () {
|
||||
var content = '<div class="qrcode"><img src="' + window.contact.wechat + '" alt="扫码关注"></div>';
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: false,
|
||||
closeBtn: 0,
|
||||
shadeClose: true,
|
||||
content: content
|
||||
});
|
||||
}
|
||||
|
||||
var showTouTiaoCode = function () {
|
||||
var content = '<div class="qrcode"><img src="' + window.contact.toutiao + '" alt="扫码关注"></div>';
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: false,
|
||||
closeBtn: 0,
|
||||
shadeClose: true,
|
||||
content: content
|
||||
});
|
||||
}
|
||||
|
||||
$('.icon-wechat').on('click', function () {
|
||||
showWechatCode();
|
||||
});
|
||||
|
||||
$('.icon-toutiao').on('click', function () {
|
||||
showTouTiaoCode();
|
||||
});
|
||||
|
||||
util.fixbar({
|
||||
bar1: window.im.cs.enabled === '1' ? '' : false,
|
||||
bar2: true,
|
||||
bar1: window.contact.qq ? '' : false,
|
||||
bar2: window.contact.wechat ? '' : false,
|
||||
click: function (type) {
|
||||
if (type === 'bar1') {
|
||||
helper.cs();
|
||||
showQQDialog();
|
||||
} else if (type === 'bar2') {
|
||||
window.open('/help', 'help');
|
||||
showWechatCode();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user