1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-03 07:26:49 +08:00

Merge branch 'koogua/v1.5.1'

This commit is contained in:
koogua 2022-03-22 19:39:14 +08:00
commit f7c835b5ca
53 changed files with 334 additions and 294 deletions

View File

@ -1,3 +1,17 @@
### [v1.5.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.1)(2022-03-17)
- 推荐课程等列表补充属性
- 修正后台评价列表中的搜索链接
- 修正后台点播设置视频码率后500错误问题
- 修正多码率远程播放地址部分为空播放问题
- 修正更新套餐课程缓存传参数据类型问题
- 修正第三方登录解除绑定失败问题
- 使用ServiceTrait归纳获取服务代码
- 优化anonymous隐藏部分字符函数
- 调整积分兑换相关定义命名
- 去除js_vars中关于IM客服的配置
- 增加验证码开关
### [v1.5.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.0)(2022-02-17) ### [v1.5.0](https://gitee.com/koogua/course-tencent-cloud/releases/v1.5.0)(2022-02-17)
- 调整对内部人员通知任务类型的前缀 - 调整对内部人员通知任务类型的前缀

View File

@ -57,12 +57,15 @@ class CourseRecommendedList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -58,12 +58,15 @@ class CourseRelatedList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -76,12 +76,15 @@ class IndexFeaturedCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -76,12 +76,15 @@ class IndexFreeCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -76,12 +76,15 @@ class IndexNewCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -53,12 +53,15 @@ class IndexSimpleFeaturedCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -53,12 +53,15 @@ class IndexSimpleFreeCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -53,12 +53,15 @@ class IndexSimpleNewCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -53,12 +53,15 @@ class IndexSimpleVipCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -76,12 +76,15 @@ class IndexVipCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -58,13 +58,15 @@ class PackageCourseList extends Cache
'id' => $course->id, 'id' => $course->id,
'title' => $course->title, 'title' => $course->title,
'cover' => $course->cover, 'cover' => $course->cover,
'origin_price' => $course->origin_price,
'market_price' => $course->market_price,
'vip_price' => $course->vip_price,
'model' => $course->model, 'model' => $course->model,
'level' => $course->level, 'level' => $course->level,
'rating' => round($course->rating, 1),
'market_price' => (float)$course->market_price,
'vip_price' => (float)$course->vip_price,
'user_count' => $userCount, 'user_count' => $userCount,
'lesson_count' => $course->lesson_count, 'lesson_count' => $course->lesson_count,
'review_count' => $course->review_count,
'favorite_count' => $course->favorite_count,
]; ];
} }

View File

@ -19,7 +19,7 @@ use App\Repos\ImGroupUser as ImGroupUserRepo;
use App\Repos\PointGift as PointGiftRepo; use App\Repos\PointGift as PointGiftRepo;
use App\Repos\PointGiftRedeem as PointGiftRedeemRepo; use App\Repos\PointGiftRedeem as PointGiftRedeemRepo;
use App\Services\Logic\Notice\DingTalk\PointGiftRedeem as PointGiftRedeemNotice; use App\Services\Logic\Notice\DingTalk\PointGiftRedeem as PointGiftRedeemNotice;
use App\Services\Logic\Point\History\PointRefund as PointRefundPointHistory; use App\Services\Logic\Point\History\PointGiftRefund as PointGiftRefundPointHistory;
use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface; use Phalcon\Mvc\Model\ResultsetInterface;
@ -44,12 +44,6 @@ class PointGiftDeliverTask extends Task
$redeem = $redeemRepo->findById($task->item_id); $redeem = $redeemRepo->findById($task->item_id);
if (!$redeem) {
$task->status = TaskModel::STATUS_FAILED;
$task->update();
break;
}
try { try {
$this->db->begin(); $this->db->begin();
@ -177,7 +171,7 @@ class PointGiftDeliverTask extends Task
protected function handlePointRefund(PointGiftRedeemModel $redeem) protected function handlePointRefund(PointGiftRedeemModel $redeem)
{ {
$service = new PointRefundPointHistory(); $service = new PointGiftRefundPointHistory();
$service->handle($redeem); $service->handle($redeem);
} }

View File

@ -7,46 +7,9 @@
namespace App\Console\Tasks; namespace App\Console\Tasks;
use App\Services\Service as AppService; use App\Traits\Service as ServiceTrait;
class Task extends \Phalcon\Cli\Task class Task extends \Phalcon\Cli\Task
{ {
use ServiceTrait;
public function getConfig()
{
$appService = new AppService();
return $appService->getConfig();
}
public function getCache()
{
$appService = new AppService();
return $appService->getCache();
}
public function getRedis()
{
$appService = new AppService();
return $appService->getRedis();
}
public function getLogger($channel = 'console')
{
$appService = new AppService();
return $appService->getLogger($channel);
}
public function getSettings($section)
{
$appService = new AppService();
return $appService->getSettings($section);
}
} }

View File

@ -106,7 +106,7 @@ class Package extends Service
$package->create($data); $package->create($data);
$this->rebuildPackageCache($package); $this->rebuildPackageCache($package->id);
return $package; return $package;
} }
@ -151,9 +151,9 @@ class Package extends Service
$package->update($data); $package->update($data);
$this->handlePackagedCourses($package); $this->handlePackagedCourses($package->id);
$this->updatePackageCourseCount($package); $this->updatePackageCourseCount($package->id);
$this->rebuildPackageCache($package); $this->rebuildPackageCache($package->id);
return $package; return $package;
} }
@ -166,8 +166,8 @@ class Package extends Service
$package->update(); $package->update();
$this->handlePackagedCourses($package); $this->handlePackagedCourses($package->id);
$this->rebuildPackageCache($package); $this->rebuildPackageCache($package->id);
return $package; return $package;
} }
@ -180,8 +180,8 @@ class Package extends Service
$package->update(); $package->update();
$this->handlePackagedCourses($package); $this->handlePackagedCourses($package->id);
$this->rebuildPackageCache($package); $this->rebuildPackageCache($package->id);
return $package; return $package;
} }
@ -228,25 +228,27 @@ class Package extends Service
} }
} }
protected function handlePackagedCourses(PackageModel $package) protected function handlePackagedCourses($packageId)
{ {
$packageRepo = new PackageRepo(); $packageRepo = new PackageRepo();
$courses = $packageRepo->findCourses($package->id); $courses = $packageRepo->findCourses($packageId);
if ($courses->count() == 0) return; if ($courses->count() == 0) return;
foreach ($courses as $course) { foreach ($courses as $course) {
$this->rebuildCoursePackageCache($course); $this->rebuildCoursePackageCache($course->id);
$this->recountCoursePackages($course); $this->recountCoursePackages($course->id);
} }
} }
protected function updatePackageCourseCount(PackageModel $package) protected function updatePackageCourseCount($packageId)
{ {
$packageRepo = new PackageRepo(); $packageRepo = new PackageRepo();
$courseCount = $packageRepo->countCourses($package->id); $package = $packageRepo->findById($packageId);
$courseCount = $packageRepo->countCourses($packageId);
$package->course_count = $courseCount; $package->course_count = $courseCount;
@ -266,29 +268,31 @@ class Package extends Service
$course->update(); $course->update();
} }
protected function rebuildPackageCache(PackageModel $package) protected function rebuildPackageCache($packageId)
{ {
$cache = new PackageCache(); $cache = new PackageCache();
$cache->rebuild($package->id); $cache->rebuild($packageId);
$cache = new PackageCourseListCache(); $cache = new PackageCourseListCache();
$cache->rebuild($package->id); $cache->rebuild($packageId);
} }
protected function rebuildCoursePackageCache(CourseModel $course) protected function rebuildCoursePackageCache($courseId)
{ {
$cache = new CoursePackageListCache(); $cache = new CoursePackageListCache();
$cache->rebuild($course->id); $cache->rebuild($courseId);
} }
protected function recountCoursePackages(CourseModel $course) protected function recountCoursePackages($courseId)
{ {
$courseRepo = new CourseRepo(); $courseRepo = new CourseRepo();
$course->package_count = $courseRepo->countPackages($course->id); $course = $courseRepo->findById($courseId);
$course->package_count = $courseRepo->countPackages($courseId);
$course->update(); $course->update();
} }

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
{% set search_url = url({'for':'admin.consult.search'}) %} {% set search_url = url({'for':'admin.review.search'}) %}
<div class="kg-nav"> <div class="kg-nav">
<div class="kg-nav-left"> <div class="kg-nav-left">
@ -59,4 +59,4 @@
{{ partial('partials/pager') }} {{ partial('partials/pager') }}
{% endblock %} {% endblock %}

View File

@ -4,7 +4,7 @@
{{ partial('macros/review') }} {{ partial('macros/review') }}
{% set search_url = url({'for':'admin.consult.search'}) %} {% set search_url = url({'for':'admin.review.search'}) %}
<div class="kg-nav"> <div class="kg-nav">
<div class="kg-nav-left"> <div class="kg-nav-left">

View File

@ -2,20 +2,31 @@
{% block content %} {% block content %}
{% set captcha_display = captcha.enabled == 1 ? 'display:block' : 'display:none' %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.captcha'}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.captcha'}) }}">
<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"> <div class="layui-form-item">
<label class="layui-form-label">App Id</label> <label class="layui-form-label">开启服务</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="app_id" value="{{ captcha.app_id }}" lay-verify="required"> <input type="radio" name="enabled" value="1" title="是" lay-filter="captcha_enabled" {% if captcha.enabled == 1 %}checked="checked"{% endif %}>
<input type="radio" name="enabled" value="0" title="否" lay-filter="captcha_enabled" {% if captcha.enabled == 0 %}checked="checked"{% endif %}>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div id="captcha-block" style="{{ captcha_display }}">
<label class="layui-form-label">Secret Key</label> <div class="layui-form-item">
<div class="layui-input-block"> <label class="layui-form-label">App Id</label>
<input class="layui-input" type="text" name="secret_key" value="{{ captcha.secret_key }}" lay-verify="required"> <div class="layui-input-block">
<input class="layui-input" type="text" name="app_id" value="{{ captcha.app_id }}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Secret Key</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="secret_key" value="{{ captcha.secret_key }}">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -77,6 +88,15 @@
} }
); );
form.on('radio(captcha_enabled)', function (data) {
var block = $('#captcha-block');
if (data.value === '1') {
block.show();
} else {
block.hide();
}
});
form.on('submit(back_verify)', function (data) { form.on('submit(back_verify)', function (data) {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',

View File

@ -28,13 +28,13 @@
<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">
<input class="layui-input" type="text" name="ts_mobiles" placeholder="值班技术人员手机号,多个号码逗号分隔" value="{{ robot.ts_mobiles }}" lay-verify="required"> <input class="layui-input" type="text" name="ts_mobiles" placeholder="值班技术人员手机号,多个号码逗号分隔" value="{{ robot.ts_mobiles }}">
</div> </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">
<input class="layui-input" type="text" name="cs_mobiles" placeholder="值班客服人员手机号,多个号码逗号分隔" value="{{ robot.ts_mobiles }}" lay-verify="required"> <input class="layui-input" type="text" name="cs_mobiles" placeholder="值班客服人员手机号,多个号码逗号分隔" value="{{ robot.cs_mobiles }}">
</div> </div>
</div> </div>
<div class="layui-form-item" style="margin-top:20px;"> <div class="layui-form-item" style="margin-top:20px;">

View File

@ -1,35 +0,0 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.im'}) }}">
<div class="layui-form-item">
<label class="layui-form-label">开启服务</label>
<div class="layui-input-block">
<input type="radio" name="enabled" value="1" title="是" {% if cs.enabled == 1 %}checked="checked"{% endif %}>
<input type="radio" name="enabled" value="0" title="否" {% if cs.enabled == 0 %}checked="checked"{% endif %}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服1用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="user1_id" value="{{ cs.user1_id }}" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服2用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="user2_id" value="{{ cs.user2_id }}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服3用户编号</label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="user3_id" value="{{ cs.user3_id }}">
</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>
<input type="hidden" name="section" value="im.cs">
</div>
</div>
</form>

View File

@ -9,13 +9,13 @@
<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">
<input class="layui-input" type="text" name="title" value="{{ main.title }}"> <input class="layui-input" type="text" name="title" value="{{ main.title }}" lay-verify="required">
</div> </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">
<input class="layui-input" type="text" name="msg_max_length" value="{{ main.msg_max_length }}"> <input class="layui-input" type="text" name="msg_max_length" value="{{ main.msg_max_length }}" lay-verify="number">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">

View File

@ -9,25 +9,25 @@
<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">
<input class="layui-input" type="text" name="smtp_from_email" value="{{ mail.smtp_from_email }}"> <input class="layui-input" type="text" name="smtp_from_email" value="{{ mail.smtp_from_email }}" lay-verify="email">
</div> </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">
<input class="layui-input" type="text" name="smtp_from_name" value="{{ mail.smtp_from_name }}"> <input class="layui-input" type="text" name="smtp_from_name" value="{{ mail.smtp_from_name }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">SMTP服务器</label> <label class="layui-form-label">SMTP服务器</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="smtp_host" value="{{ mail.smtp_host }}"> <input class="layui-input" type="text" name="smtp_host" value="{{ mail.smtp_host }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">SMTP端口号</label> <label class="layui-form-label">SMTP端口号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="smtp_port" value="{{ mail.smtp_port }}"> <input class="layui-input" type="text" name="smtp_port" value="{{ mail.smtp_port }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -49,13 +49,13 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">SMTP帐号</label> <label class="layui-form-label">SMTP帐号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="smtp_username" value="{{ mail.smtp_username }}"> <input class="layui-input" type="text" name="smtp_username" value="{{ mail.smtp_username }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">SMTP密码</label> <label class="layui-form-label">SMTP密码</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="smtp_password" value="{{ mail.smtp_password }}"> <input class="layui-input" type="text" name="smtp_password" value="{{ mail.smtp_password }}" lay-verify="required">
</div> </div>
</div> </div>
</div> </div>

View File

@ -52,13 +52,13 @@
<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">
<input class="layui-input" type="text" name="title" value="{{ site.title }}"> <input class="layui-input" type="text" name="title" value="{{ site.title }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">网站URL</label> <label class="layui-form-label">网站URL</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="url" value="{{ site.url }}"> <input class="layui-input" type="text" name="url" value="{{ site.url }}" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">

View File

@ -5,7 +5,7 @@
{% set storage_region_display = vod.storage_type == 'fixed' ? 'display:block' : 'display:none' %} {% set storage_region_display = vod.storage_type == 'fixed' ? 'display:block' : 'display:none' %}
{% set wmk_tpl_display = vod.wmk_enabled == 1 ? 'display:block' : 'display:none' %} {% set wmk_tpl_display = vod.wmk_enabled == 1 ? 'display:block' : 'display:none' %}
{% set key_anti_display = vod.key_anti_enabled == 1 ? 'display:block': 'display:none' %} {% set key_anti_display = vod.key_anti_enabled == 1 ? 'display:block': 'display:none' %}
{% set video_quality = vod.video_quality|json_decode %} {% set video_quality = vod.video_quality|json_decode(true) %}
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.vod'}) }}"> <form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.setting.vod'}) }}">
<fieldset class="layui-elem-field layui-field-title"> <fieldset class="layui-elem-field layui-field-title">
@ -96,13 +96,13 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">防盗链Key</label> <label class="layui-form-label">防盗链Key</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="key_anti_key" value="{{ vod.key_anti_key }}" lay-verify="required"> <input class="layui-input" type="text" name="key_anti_key" value="{{ vod.key_anti_key }}">
</div> </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">
<input class="layui-input" type="text" name="key_anti_expiry" value="{{ vod.key_anti_expiry }}" lay-verify="required"> <input class="layui-input" type="text" name="key_anti_expiry" value="{{ vod.key_anti_expiry }}">
</div> </div>
</div> </div>
</div> </div>

View File

@ -23,12 +23,13 @@
<input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</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="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button>
<input id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}"> <input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">

View File

@ -1,3 +1,6 @@
{% set disabled_submit = captcha.enabled == 1 ? 'disabled="disabled"' : '' %}
{% set disabled_class = captcha.enabled == 1 ? 'layui-btn-disabled' : '' %}
<form class="layui-form account-form" method="POST" action="{{ url({'for':'home.account.pwd_login'}) }}"> <form class="layui-form account-form" method="POST" action="{{ url({'for':'home.account.pwd_login'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-icon layui-icon-username"></label> <label class="layui-icon layui-icon-username"></label>
@ -7,14 +10,16 @@
<label class="layui-icon layui-icon-password"></label> <label class="layui-icon layui-icon-password"></label>
<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 id="captcha-block" class="layui-form-item"> {% if captcha.enabled == 1 %}
<div class="layui-input-block"> <div id="captcha-block" class="layui-form-item">
<button id="captcha-btn" class="layui-btn layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button> <div class="layui-input-block">
<button id="captcha-btn" class="layui-btn layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button>
</div>
</div> </div>
</div> {% endif %}
<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 layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button> <button id="submit-btn" class="layui-btn layui-btn-fluid {{ disabled_class }}" {{ disabled_submit }} 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 id="ticket" type="hidden" name="ticket"> <input id="ticket" type="hidden" name="ticket">
<input id="rand" type="hidden" name="rand"> <input id="rand" type="hidden" name="rand">

View File

@ -9,14 +9,15 @@
<input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</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="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" 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 id="cv-app-id" type="hidden" name="captcha_app_id" value="{{ captcha.app_id }}"> <input id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">
</div> </div>

View File

@ -38,13 +38,14 @@
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</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="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">注册帐号</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" 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 id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}"> <input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">

View File

@ -14,7 +14,7 @@
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -24,6 +24,7 @@
<input type="hidden" name="code" value="{{ request.get('code') }}"> <input type="hidden" name="code" value="{{ request.get('code') }}">
<input type="hidden" name="state" value="{{ request.get('state') }}"> <input type="hidden" name="state" value="{{ request.get('state') }}">
<input type="hidden" name="open_user" value='{{ open_user|json_encode }}'> <input type="hidden" name="open_user" value='{{ open_user|json_encode }}'>
<input id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}"> <input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">

View File

@ -70,7 +70,6 @@
</div> </div>
</div> </div>
{% set show_sidebar_teachers = 1 %}
{% set show_sidebar_topics = 1 %} {% set show_sidebar_topics = 1 %}
{% set show_sidebar_recommended = 1 %} {% set show_sidebar_recommended = 1 %}
{% set show_sidebar_related = 1 %} {% set show_sidebar_related = 1 %}

View File

@ -13,8 +13,6 @@
<div class="info"> <div class="info">
<p><a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p> <p><a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
<p> <p>
<span class="key">原始价格</span>
<span class="value origin-price">{{ '¥%0.2f'|format(course.origin_price) }}</span>
<span class="key">优惠价格</span> <span class="key">优惠价格</span>
<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span> <span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>
<span class="key">会员价格</span> <span class="key">会员价格</span>

View File

@ -29,9 +29,6 @@
tool_video_enabled: '{{ im_info.main.tool_video_enabled }}', tool_video_enabled: '{{ im_info.main.tool_video_enabled }}',
msg_max_length: '{{ im_info.main.msg_max_length }}', msg_max_length: '{{ im_info.main.msg_max_length }}',
}, },
cs: {
enabled: '{{ im_info.cs.enabled }}'
},
ws: { ws: {
connect_url: '{{ im_info.ws.connect_url }}', connect_url: '{{ im_info.ws.connect_url }}',
ping_interval: '{{ im_info.ws.ping_interval }}' ping_interval: '{{ im_info.ws.ping_interval }}'

View File

@ -28,12 +28,13 @@
<input class="layui-input" type="text" name="verify_code" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</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="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}"> <input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">

View File

@ -28,12 +28,13 @@
<input class="layui-input" type="text" name="verify_code" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" lay-verify="required">
</div> </div>
<div class="layui-input-inline verify-btn-inline"> <div class="layui-input-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button> <button id="cv-emit-btn" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</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="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button> <button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}"> <input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket"> <input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand"> <input id="cv-rand" type="hidden" name="rand">

View File

@ -16,7 +16,7 @@ class AppInfo
protected $link = 'https://koogua.com'; protected $link = 'https://koogua.com';
protected $version = '1.5.0'; protected $version = '1.5.';
public function __get($name) public function __get($name)
{ {

View File

@ -499,8 +499,8 @@ function kg_anonymous($str)
$start = 3; $start = 3;
$end = $length - 4; $end = $length - 4;
} else { } else {
$start = 1; $start = ceil($length / 4);
$end = $length - 2; $end = $length - $start - 1;
} }
$list = []; $list = [];

View File

@ -14,8 +14,8 @@ class PointHistory extends Model
* 事件类型 * 事件类型
*/ */
const EVENT_ORDER_CONSUME = 1; // 订单消费 const EVENT_ORDER_CONSUME = 1; // 订单消费
const EVENT_POINT_REDEEM = 2; // 积分兑换 const EVENT_POINT_GIFT_REDEEM = 2; // 积分礼品兑换
const EVENT_POINT_REFUND = 3; // 积分退款 const EVENT_POINT_GIFT_REFUND = 3; // 积分礼品退款
const EVENT_ACCOUNT_REGISTER = 4; // 帐号注册 const EVENT_ACCOUNT_REGISTER = 4; // 帐号注册
const EVENT_SITE_VISIT = 5; // 站点访问 const EVENT_SITE_VISIT = 5; // 站点访问
const EVENT_CHAPTER_STUDY = 6; // 课时学习 const EVENT_CHAPTER_STUDY = 6; // 课时学习
@ -126,8 +126,8 @@ class PointHistory extends Model
{ {
return [ return [
self::EVENT_ORDER_CONSUME => '订单消费', self::EVENT_ORDER_CONSUME => '订单消费',
self::EVENT_POINT_REDEEM => '积分兑换', self::EVENT_POINT_GIFT_REDEEM => '积分礼品兑换',
self::EVENT_POINT_REFUND => '积分退款', self::EVENT_POINT_GIFT_REFUND => '积分礼品退款',
self::EVENT_ACCOUNT_REGISTER => '用户注册', self::EVENT_ACCOUNT_REGISTER => '用户注册',
self::EVENT_SITE_VISIT => '用户登录', self::EVENT_SITE_VISIT => '用户登录',
self::EVENT_CHAPTER_STUDY => '课时学习', self::EVENT_CHAPTER_STUDY => '课时学习',

View File

@ -25,14 +25,18 @@ class Connect extends Repository
$query->where('1 = 1'); $query->where('1 = 1');
if (isset($where['user_id'])) { if (!empty($where['user_id'])) {
$query->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]); $query->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]);
} }
if (isset($where['provider'])) { if (!empty($where['provider'])) {
$query->andWhere('provider = :provider:', ['provider' => $where['provider']]); $query->andWhere('provider = :provider:', ['provider' => $where['provider']]);
} }
if (isset($where['deleted'])) {
$query->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
}
$query->orderBy('id DESC'); $query->orderBy('id DESC');
return $query->execute(); return $query->execute();

View File

@ -23,12 +23,19 @@ class ChapterVod extends Service
* 腾讯云点播优先 * 腾讯云点播优先
*/ */
if ($vod->file_id) { if ($vod->file_id) {
$result = $this->getCosPlayUrls($chapterId); $playUrls = $this->getCosPlayUrls($chapterId);
} else { } else {
$result = $this->getRemotePlayUrls($chapterId); $playUrls = $this->getRemotePlayUrls($chapterId);
} }
return $result; /**
*过滤播放地址为空的条目
*/
foreach ($playUrls as $key => $value) {
if (empty($value['url'])) unset($playUrls[$key]);
}
return $playUrls;
} }
public function getCosPlayUrls($chapterId) public function getCosPlayUrls($chapterId)

View File

@ -46,9 +46,9 @@ class BasicInfo extends LogicService
'summary' => $course->summary, 'summary' => $course->summary,
'details' => $details, 'details' => $details,
'keywords' => $course->keywords, 'keywords' => $course->keywords,
'origin_price' => $course->origin_price, 'origin_price' => (float)$course->origin_price,
'market_price' => $course->market_price, 'market_price' => (float)$course->market_price,
'vip_price' => $course->vip_price, 'vip_price' => (float)$course->vip_price,
'study_expiry' => $course->study_expiry, 'study_expiry' => $course->study_expiry,
'refund_expiry' => $course->refund_expiry, 'refund_expiry' => $course->refund_expiry,
'teachers' => $teachers, 'teachers' => $teachers,

View File

@ -82,11 +82,11 @@ class CourseList extends LogicService
'id' => $course['id'], 'id' => $course['id'],
'title' => $course['title'], 'title' => $course['title'],
'cover' => $course['cover'], 'cover' => $course['cover'],
'market_price' => (float)$course['market_price'],
'vip_price' => (float)$course['vip_price'],
'rating' => round($course['rating'], 1),
'model' => $course['model'], 'model' => $course['model'],
'level' => $course['level'], 'level' => $course['level'],
'rating' => round($course['rating'], 1),
'market_price' => (float)$course['market_price'],
'vip_price' => (float)$course['vip_price'],
'user_count' => $course['user_count'], 'user_count' => $course['user_count'],
'lesson_count' => $course['lesson_count'], 'lesson_count' => $course['lesson_count'],
'review_count' => $course['review_count'], 'review_count' => $course['review_count'],

View File

@ -43,7 +43,7 @@ class PackageList extends LogicService
if ($courses) { if ($courses) {
foreach ($courses as $course) { foreach ($courses as $course) {
$package['origin_price'] += $course['origin_price']; $package['origin_price'] += $course['market_price'];
} }
$package['courses'] = $this->sortCourses($courses, $firstCourseId); $package['courses'] = $this->sortCourses($courses, $firstCourseId);
} }

View File

@ -38,7 +38,7 @@ class OrderConfirm extends LogicService
$result['item_info']['course'] = $this->handleCourseInfo($course); $result['item_info']['course'] = $this->handleCourseInfo($course);
$result['total_amount'] = $course->origin_price; $result['total_amount'] = $course->market_price;
$result['pay_amount'] = $user->vip ? $course->vip_price : $course->market_price; $result['pay_amount'] = $user->vip ? $course->vip_price : $course->market_price;
$result['discount_amount'] = $result['total_amount'] - $result['pay_amount']; $result['discount_amount'] = $result['total_amount'] - $result['pay_amount'];
@ -51,7 +51,7 @@ class OrderConfirm extends LogicService
$result['total_amount'] = 0; $result['total_amount'] = 0;
foreach ($result['item_info']['package']['courses'] as $course) { foreach ($result['item_info']['package']['courses'] as $course) {
$result['total_amount'] += $course['origin_price']; $result['total_amount'] += $course['market_price'];
} }
$result['pay_amount'] = $user->vip ? $package->vip_price : $package->market_price; $result['pay_amount'] = $user->vip ? $package->vip_price : $package->market_price;

View File

@ -25,7 +25,7 @@ class PointGiftRedeem extends PointHistory
if ($pointEnabled == 0) return; if ($pointEnabled == 0) return;
$eventId = $redeem->id; $eventId = $redeem->id;
$eventType = PointHistoryModel::EVENT_POINT_REDEEM; $eventType = PointHistoryModel::EVENT_POINT_GIFT_REDEEM;
$eventPoint = 0 - $redeem->gift_point; $eventPoint = 0 - $redeem->gift_point;
$historyRepo = new PointHistoryRepo(); $historyRepo = new PointHistoryRepo();

View File

@ -13,13 +13,13 @@ use App\Repos\PointHistory as PointHistoryRepo;
use App\Repos\User as UserRepo; use App\Repos\User as UserRepo;
use App\Services\Logic\Point\PointHistory; use App\Services\Logic\Point\PointHistory;
class PointRefund extends PointHistory class PointGiftRefund extends PointHistory
{ {
public function handle(PointGiftRedeemModel $redeem) public function handle(PointGiftRedeemModel $redeem)
{ {
$eventId = $redeem->id; $eventId = $redeem->id;
$eventType = PointHistoryModel::EVENT_POINT_REFUND; $eventType = PointHistoryModel::EVENT_POINT_GIFT_REFUND;
$eventPoint = $redeem->gift_point; $eventPoint = $redeem->gift_point;
$historyRepo = new PointHistoryRepo(); $historyRepo = new PointHistoryRepo();

View File

@ -23,7 +23,9 @@ class ConnectDelete extends LogicService
$validator->checkOwner($user->id, $connect->user_id); $validator->checkOwner($user->id, $connect->user_id);
$connect->delete(); $connect->deleted = 1;
$connect->update();
} }
} }

View File

@ -88,19 +88,20 @@ class Online extends LogicService
$cache = $this->getCache(); $cache = $this->getCache();
$content = $cache->get($keyName); if ($cache->exists($keyName)) return;
if ($content) return;
$service = new SiteVisitPointHistory();
$service->handle($user);
/**
* 先写入缓存,再处理访问积分,防止重复插入记录
*/
$tomorrow = strtotime($todayDate) + 86400; $tomorrow = strtotime($todayDate) + 86400;
$lifetime = $tomorrow - time(); $lifetime = $tomorrow - time();
$cache->save($keyName, 1, $lifetime); $cache->save($keyName, 1, $lifetime);
$service = new SiteVisitPointHistory();
$service->handle($user);
} }
} }

View File

@ -48,6 +48,8 @@ class UserInfo extends LogicService
'comment_count' => $user->comment_count, 'comment_count' => $user->comment_count,
'friend_count' => $imUser->friend_count, 'friend_count' => $imUser->friend_count,
'group_count' => $imUser->group_count, 'group_count' => $imUser->group_count,
'vip_expiry_time' => $user->vip_expiry_time,
'lock_expiry_time' => $user->lock_expiry_time,
'active_time' => $user->active_time, 'active_time' => $user->active_time,
'create_time' => $user->create_time, 'create_time' => $user->create_time,
'update_time' => $user->update_time, 'update_time' => $user->update_time,

View File

@ -7,69 +7,12 @@
namespace App\Services; namespace App\Services;
use App\Caches\Setting as SettingCache;
use App\Library\Cache\Backend\Redis as RedisCache;
use App\Library\Logger as AppLogger;
use App\Traits\Auth as AuthTrait; use App\Traits\Auth as AuthTrait;
use Phalcon\Config as PhConfig; use App\Traits\Service as ServiceTrait;
use Phalcon\Logger\Adapter\File as PhLogger;
use Phalcon\Mvc\User\Component; use Phalcon\Mvc\User\Component;
class Service extends Component class Service extends Component
{ {
use AuthTrait; use AuthTrait;
use ServiceTrait;
/**
* @return PhConfig
*/
public function getConfig()
{
return $this->getDI()->getShared('config');
}
/**
* @return RedisCache
*/
public function getCache()
{
return $this->getDI()->getShared('cache');
}
/**
* @return \Redis
*/
public function getRedis()
{
return $this->getCache()->getRedis();
}
/**
* 获取Logger
*
* @param string $channel
* @return PhLogger
*/
public function getLogger($channel = null)
{
$logger = new AppLogger();
$channel = $channel ?: 'common';
return $logger->getInstance($channel);
}
/**
* 获取某组配置项
*
* @param string $section
* @return array
*/
public function getSettings($section)
{
$cache = new SettingCache();
return $cache->get($section);
}
} }

72
app/Traits/Service.php Normal file
View File

@ -0,0 +1,72 @@
<?php
/**
* @copyright Copyright (c) 2021 深圳市酷瓜软件有限公司
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.koogua.com
*/
namespace App\Traits;
use App\Caches\Setting as SettingCache;
use App\Library\Cache\Backend\Redis as RedisCache;
use App\Library\Logger as AppLogger;
use Phalcon\Config as PhConfig;
use Phalcon\Di as Di;
use Phalcon\Logger\Adapter\File as PhLogger;
trait Service
{
/**
* @return PhConfig
*/
public function getConfig()
{
return Di::getDefault()->getShared('config');
}
/**
* @return RedisCache
*/
public function getCache()
{
return Di::getDefault()->getShared('cache');
}
/**
* @return \Redis
*/
public function getRedis()
{
return $this->getCache()->getRedis();
}
/**
* 获取Logger
*
* @param string $channel
* @return PhLogger
*/
public function getLogger($channel = null)
{
$logger = new AppLogger();
$channel = $channel ?: 'common';
return $logger->getInstance($channel);
}
/**
* 获取某组配置项
*
* @param string $section
* @return array
*/
public function getSettings($section)
{
$cache = new SettingCache();
return $cache->get($section);
}
}

View File

@ -821,7 +821,7 @@ final class V20210403184518 extends AbstractMigration
[ [
'section' => 'vod', 'section' => 'vod',
'item_key' => 'key_anti_ip_limit', 'item_key' => 'key_anti_ip_limit',
'item_value' => '', 'item_value' => '3',
], ],
[ [
'section' => 'dingtalk.robot', 'section' => 'dingtalk.robot',

View File

@ -1505,6 +1505,7 @@
} }
.cart-course-card .price { .cart-course-card .price {
margin-right: 5px;
color: red; color: red;
} }

View File

@ -5,40 +5,26 @@ layui.use(['jquery', 'util'], function () {
var timeCounting = false; var timeCounting = false;
var $account = $('#cv-account'); var $account = $('#cv-account');
var $emit = $('#cv-verify-emit'); var $emit = $('#cv-emit-btn');
var $submit = $('#cv-submit-btn');
var captcha = new TencentCaptcha( if ($('#cv-enabled').val() === '1') {
$emit[0], var captcha = new TencentCaptcha(
$('#cv-app-id').val(), $emit[0],
function (res) { $('#cv-app-id').val(),
if (res.ret === 0) { function (res) {
$('#cv-ticket').val(res.ticket); if (res.ret === 0) {
$('#cv-rand').val(res.randstr); $('#cv-ticket').val(res.ticket);
if (isEmail($account.val()) || isPhone($account.val())) { $('#cv-rand').val(res.randstr);
var postUrl; sendVerifyCode();
var postData = {
ticket: $('#cv-ticket').val(),
rand: $('#cv-rand').val(),
};
if (isPhone($account.val())) {
postData.phone = $account.val();
postUrl = '/verify/sms/code';
} else if (isEmail($account.val())) {
postData.email = $account.val();
postUrl = '/verify/mail/code';
}
$.ajax({
type: 'POST',
url: postUrl,
data: postData
});
$('#cv-submit-btn').removeClass('layui-btn-disabled').removeAttr('disabled');
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
showCountDown($emit);
} }
} }
} );
); } else {
$emit.on('click', function () {
sendVerifyCode();
});
}
$account.on('keyup', function () { $account.on('keyup', function () {
var accountOk; var accountOk;
@ -58,14 +44,39 @@ layui.use(['jquery', 'util'], function () {
} }
}); });
function showCountDown(obj) { function sendVerifyCode() {
if (isEmail($account.val()) || isPhone($account.val())) {
var postUrl;
var postData = {
ticket: $('#cv-ticket').val(),
rand: $('#cv-rand').val(),
};
if (isPhone($account.val())) {
postData.phone = $account.val();
postUrl = '/verify/sms/code';
} else if (isEmail($account.val())) {
postData.email = $account.val();
postUrl = '/verify/mail/code';
}
$.ajax({
type: 'POST',
url: postUrl,
data: postData,
});
$submit.removeClass('layui-btn-disabled').removeAttr('disabled');
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
showCountDown($emit);
}
}
function showCountDown() {
var serverTime = new Date().getTime(); var serverTime = new Date().getTime();
var endTime = serverTime + 60 * 1000; var endTime = serverTime + 60 * 1000;
util.countdown(endTime, serverTime, function (date, serverTime, timer) { util.countdown(endTime, serverTime, function (date, serverTime, timer) {
var left = date[0] * 86400 + date[1] * 3600 + date[2] * 60 + date[3]; var left = date[0] * 86400 + date[1] * 3600 + date[2] * 60 + date[3];
obj.text(left + '秒'); $emit.text(left + '秒');
if (left === 0) { if (left === 0) {
obj.removeClass('layui-btn-disabled').removeAttr('disabled').text('重新发送'); $emit.removeClass('layui-btn-disabled').removeAttr('disabled').text('重新发送');
clearInterval(timer); clearInterval(timer);
timeCounting = false; timeCounting = false;
} }