1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-29 22:01:38 +08:00

枚举类型由字符->整型

This commit is contained in:
xiaochong0302 2020-08-24 20:52:06 +08:00
parent 335adbb050
commit 4168f184e9
62 changed files with 432 additions and 402 deletions

2
.gitignore vendored
View File

@ -2,6 +2,8 @@
/vendor
/config/config.php
/config/xs.course.ini
/config/xs.group.ini
/config/xs.user.ini
/public/robots.txt
/public/sitemap.xml
*KgTest*

View File

@ -46,24 +46,24 @@ class LiveNoticeConsumerTask extends Task
$now = time();
$removeList = [];
foreach ($members as $member) {
list($chapterId, $userId, $startTime) = explode(':', $member);
$remove = false;
if ($now - $startTime < 3600) {
$smser->handle($chapterId, $userId, $startTime);
$remove = true;
$removeList[] = $member;
}
if ($now > $startTime) {
$remove = true;
$removeList[] = $member;
}
}
if ($remove) {
$this->redis->sRem($cacheKey, $member);
}
if (count($removeList) > 0) {
$this->redis->sRem($cacheKey, ...$removeList);
}
}

View File

@ -54,17 +54,14 @@ class OrderTask extends Task
case OrderModel::ITEM_VIP:
$this->handleVipOrder($order);
break;
case OrderModel::ITEM_REWARD:
$this->handleRewardOrder($order);
break;
}
$this->finishOrder($order);
$task->status = TaskModel::STATUS_FINISHED;
$task->update();
$this->handleOrderNotice($order);
} catch (\Exception $e) {
$task->try_count += 1;
@ -76,7 +73,7 @@ class OrderTask extends Task
$task->update();
$logger->info('Order Task Exception ' . kg_json_encode([
$logger->info('Order Process Exception ' . kg_json_encode([
'line' => $e->getLine(),
'code' => $e->getCode(),
'message' => $e->getMessage(),
@ -84,15 +81,23 @@ class OrderTask extends Task
]));
}
/**
* 任务失败,申请退款
*/
if ($task->status == TaskModel::STATUS_FAILED) {
if ($task->status == TaskModel::STATUS_FINISHED) {
$this->handleOrderNotice($order);
} elseif ($task->status == TaskModel::STATUS_FAILED) {
$this->handleOrderRefund($order);
}
}
}
protected function finishOrder(OrderModel $order)
{
$order->status = OrderModel::STATUS_FINISHED;
if ($order->update() === false) {
throw new \RuntimeException('Finish Order Failed');
}
}
protected function handleCourseOrder(OrderModel $order)
{
/**
@ -101,7 +106,7 @@ class OrderTask extends Task
$itemInfo = $order->item_info;
$data = [
'user_id' => $order->user_id,
'user_id' => $order->owner_id,
'course_id' => $order->item_id,
'expiry_time' => $itemInfo['course']['study_expiry_time'],
'role_type' => CourseUserModel::ROLE_STUDENT,
@ -111,7 +116,7 @@ class OrderTask extends Task
$courseUser = new CourseUserModel();
if ($courseUser->create($data) === false) {
throw new \RuntimeException('Create CourseQuery User Failed');
throw new \RuntimeException('Create Course User Failed');
}
}
@ -125,7 +130,7 @@ class OrderTask extends Task
foreach ($itemInfo['courses'] as $course) {
$data = [
'user_id' => $order->user_id,
'user_id' => $order->owner_id,
'course_id' => $course['id'],
'expiry_time' => $course['study_expiry_time'],
'role_type' => CourseUserModel::ROLE_STUDENT,
@ -144,7 +149,7 @@ class OrderTask extends Task
{
$userRepo = new UserRepo();
$user = $userRepo->findById($order->user_id);
$user = $userRepo->findById($order->owner_id);
/**
* @var array $itemInfo
@ -158,11 +163,6 @@ class OrderTask extends Task
}
}
protected function handleRewardOrder(OrderModel $order)
{
}
protected function handleOrderNotice(OrderModel $order)
{
$smser = new OrderSmser();
@ -180,11 +180,11 @@ class OrderTask extends Task
$refund->subject = $order->subject;
$refund->amount = $order->amount;
$refund->apply_note = '开通服务失败,自动退款';
$refund->review_note = '自动操作';
$refund->user_id = $order->user_id;
$refund->order_id = $order->id;
$refund->trade_id = $trade->id;
$refund->apply_note = '开通服务失败,自动退款';
$refund->review_note = '自动操作';
$refund->create();
}

View File

@ -3,11 +3,11 @@
{% block content %}
{%- macro content_title(model) %}
{% if model == 'vod' %}
{% if model == '1' %}
点播信息
{% elseif model == 'live' %}
{% elseif model == '2' %}
直播信息
{% elseif model == 'read' %}
{% elseif model == '3' %}
图文信息
{% endif %}
{%- endmacro %}
@ -26,11 +26,11 @@
{{ partial('chapter/edit_lesson_basic') }}
</div>
<div class="layui-tab-item">
{% if course.model == 'vod' %}
{% if course.model == '1' %}
{{ partial('chapter/edit_lesson_vod') }}
{% elseif course.model == 'live' %}
{% elseif course.model == '2' %}
{{ partial('chapter/edit_lesson_live') }}
{% elseif course.model == 'read' %}
{% elseif course.model == '3' %}
{{ partial('chapter/edit_lesson_read') }}
{% endif %}
</div>
@ -41,7 +41,7 @@
{% block link_css %}
{% if chapter.model == 'read' %}
{% if chapter.model == '3' %}
{{ css_link('https://cdn.jsdelivr.net/npm/vditor/dist/index.css', false) }}
{% endif %}
@ -49,12 +49,12 @@
{% block include_js %}
{% if chapter.model == 'read' %}
{% if chapter.model == '3' %}
{{ js_include('https://cdn.jsdelivr.net/npm/vditor/dist/index.min.js', false) }}
{{ js_include('admin/js/vditor.js') }}
{% elseif chapter.model == 'vod' %}
{% elseif chapter.model == '1' %}
{{ js_include('lib/vod-js-sdk-v6.min.js') }}
{{ js_include('lib/clipboard.min.js') }}

View File

@ -21,11 +21,11 @@
</div>
</div>
{% if course.model == 'vod' %}
{% if course.model == '1' %}
{{ partial('chapter/lessons_vod') }}
{% elseif course.model == 'live' %}
{% elseif course.model == '2' %}
{{ partial('chapter/lessons_live') }}
{% elseif course.model == 'read' %}
{% elseif course.model == '3' %}
{{ partial('chapter/lessons_read') }}
{% endif %}

View File

@ -9,9 +9,9 @@
<div class="layui-form-item">
<label class="layui-form-label">类型</label>
<div class="layui-input-block">
<input type="radio" name="model" value="vod" title="点播" lay-filter="model" checked="checked">
<input type="radio" name="model" value="live" title="直播" lay-filter="model">
<input type="radio" name="model" value="read" title="图文" lay-filter="model">
<input type="radio" name="model" value="1" title="点播" lay-filter="model" checked="checked">
<input type="radio" name="model" value="2" title="直播" lay-filter="model">
<input type="radio" name="model" value="3" title="图文" lay-filter="model">
</div>
</div>
<div class="layui-form-item">
@ -47,9 +47,9 @@
var form = layui.form;
var modelTips = {
vod: '通过音视频呈现课程内容,内容可视化,有图像有声音,适合大部分场景',
live: '通过直播呈现课程内容,交互性强,适合需要交互反馈、情绪表达的场景',
read: '通过图文呈现课程内容,简单直接,适合撰写文档、书籍、教程的场景'
'1': '通过音视频呈现课程内容,内容可视化,有图像有声音,适合大部分场景',
'2': '通过直播呈现课程内容,交互性强,适合需要交互反馈、情绪表达的场景',
'3': '通过图文呈现课程内容,简单直接,适合撰写文档、书籍、教程的场景'
};
var modelTipsBlock = $('#model-tips');
@ -58,8 +58,7 @@
modelTipsBlock.html(modelTips[data.value]);
});
modelTipsBlock.html(modelTips.vod);
modelTipsBlock.html(modelTips['1']);
});
</script>

View File

@ -30,10 +30,10 @@
<div class="layui-form-item">
<label class="layui-form-label">难度</label>
<div class="layui-input-block">
<input type="radio" name="level" value="entry" title="入门" {% if course.level == 'entry' %}checked{% endif %}>
<input type="radio" name="level" value="junior" title="初级" {% if course.level == 'junior' %}checked{% endif %}>
<input type="radio" name="level" value="medium" title="中级" {% if course.level == 'medium' %}checked{% endif %}>
<input type="radio" name="level" value="senior" title="高级" {% if course.level == 'senior' %}checked{% endif %}>
<input type="radio" name="level" value="1" title="入门" {% if course.level == '1' %}checked{% endif %}>
<input type="radio" name="level" value="2" title="初级" {% if course.level == '2' %}checked{% endif %}>
<input type="radio" name="level" value="3" title="中级" {% if course.level == '3' %}checked{% endif %}>
<input type="radio" name="level" value="4" title="高级" {% if course.level == '4' %}checked{% endif %}>
</div>
</div>
<div class="layui-form-item">

View File

@ -3,24 +3,24 @@
{% block content %}
{%- macro model_info(value) %}
{% if value == 'vod' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-green">点播</span>
{% elseif value == 'live' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-blue">直播</span>
{% elseif value == 'read' %}
{% elseif value == 3 %}
<span class="layui-badge layui-bg-black">图文</span>
{% endif %}
{%- endmacro %}
{%- macro level_info(value) %}
难度:<span class="layui-badge layui-bg-gray">
{% if value == 'entry' %}
{% if value == 1 %}
入门
{% elseif value == 'junior' %}
{% elseif value == 2 %}
初级
{% elseif value == 'medium' %}
{% elseif value == 3 %}
中级
{% elseif value == 'senior' %}
{% elseif value == 4 %}
高级
{% endif %}
</span>

View File

@ -33,18 +33,18 @@
<div class="layui-form-item">
<label class="layui-form-label">模型</label>
<div class="layui-input-block">
<input type="radio" name="model" value="vod" title="点播">
<input type="radio" name="model" value="live" title="直播">
<input type="radio" name="model" value="read" title="图文">
<input type="radio" name="model" value="1" title="点播">
<input type="radio" name="model" value="2" title="直播">
<input type="radio" name="model" value="3" title="图文">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">难度</label>
<div class="layui-input-block">
<input type="radio" name="level" value="entry" title="入门">
<input type="radio" name="level" value="junior" title="初级">
<input type="radio" name="level" value="medium" title="中级">
<input type="radio" name="level" value="senior" title="高级">
<input type="radio" name="level" value="1" title="入门">
<input type="radio" name="level" value="2" title="初级">
<input type="radio" name="level" value="3" title="中级">
<input type="radio" name="level" value="4" title="高级">
</div>
</div>
<div class="layui-form-item">

View File

@ -21,9 +21,9 @@
<div class="layui-form-item">
<label class="layui-form-label">类型</label>
<div class="layui-input-block">
<input type="radio" name="type" value="course" title="课程" disabled="disabled">
<input type="radio" name="type" value="chat" title="聊天" checked="checked">
<input type="radio" name="type" value="staff" title="员工">
<input type="radio" name="type" value="1" title="课程" disabled="disabled">
<input type="radio" name="type" value="2" title="聊天" checked="checked">
<input type="radio" name="type" value="3" title="员工">
</div>
</div>
<div class="layui-form-item">

View File

@ -3,10 +3,12 @@
{% block content %}
{%- macro type_info(value) %}
{% if value == 'course' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-green">课</span>
{% elseif value == 'chat' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-blue">聊</span>
{% elseif value == 3 %}
<span class="layui-badge layui-bg-cyan">职</span>
{% endif %}
{%- endmacro %}

View File

@ -33,8 +33,9 @@
<div class="layui-form-item">
<label class="layui-form-label">类型</label>
<div class="layui-input-block">
<input type="radio" name="type" value="course" title="课程">
<input type="radio" name="type" value="chat" title="聊天">
<input type="radio" name="type" value="1" title="课程">
<input type="radio" name="type" value="2" title="聊天">
<input type="radio" name="type" value="3" title="职工">
</div>
</div>
<div class="layui-form-item">

View File

@ -1,12 +1,12 @@
{%- macro item_info(order) %}
{% if order.item_type == 'course' %}
{% if order.item_type == '1' %}
{% set course = order.item_info['course'] %}
<div class="kg-order-item">
<p>课程名称:{{ course['title'] }}</p>
<p>市场价格:{{ '¥%0.2f'|format(course['market_price']) }},会员价格:{{ '¥%0.2f'|format(course['vip_price']) }}</p>
<p>学习期限:{{ date('Y-m-d H:i:s',course['study_expiry_time']) }},退款期限:{{ date('Y-m-d H:i:s',course['refund_expiry_time']) }}</p>
</div>
{% elseif order.item_type == 'package' %}
{% elseif order.item_type == '2' %}
{% set courses = order.item_info['courses'] %}
{% for course in courses %}
<div class="kg-order-item">
@ -15,20 +15,20 @@
<p>学习期限:{{ date('Y-m-d H:i:s',course['study_expiry_time']) }},退款期限:{{ date('Y-m-d H:i:s',course['refund_expiry_time']) }}</p>
</div>
{% endfor %}
{% elseif order.item_type == 'vip' %}
{% set vip = order.item_info['vip'] %}
<div class="kg-order-item">
<p>商品名称:{{ order.subject }}</p>
<p>商品价格:{{ '¥%0.2f'|format(order.amount) }}</p>
</div>
{% elseif order.item_type == 'reward' %}
{% elseif order.item_type == '3' %}
{% set course = order.item_info['course'] %}
{% set reward = order.item_info['reward'] %}
<div class="kg-order-item">
<p>商品名称:{{ order.subject }}</p>
<p>商品价格:{{ '¥%0.2f'|format(order.amount) }}</p>
</div>
{% elseif order.item_type == 'test' %}
{% elseif order.item_type == '4' %}
{% set vip = order.item_info['vip'] %}
<div class="kg-order-item">
<p>商品名称:{{ order.subject }}</p>
<p>商品价格:{{ '¥%0.2f'|format(order.amount) }}</p>
</div>
{% elseif order.item_type == '99' %}
<div class="kg-order-item">
<p>商品名称:{{ order.subject }}</p>
<p>商品价格:{{ '¥%0.2f'|format(order.amount) }}</p>
@ -37,27 +37,29 @@
{%- endmacro %}
{%- macro item_type(value) %}
{% if value == 'course' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-green">课程</span>
{% elseif value == 'package' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-blue">套餐</span>
{% elseif value == 'vip' %}
<span class="layui-badge layui-bg-orange">会员</span>
{% elseif value == 'reward' %}
{% elseif value == 3 %}
<span class="layui-badge layui-bg-red">赞赏</span>
{% elseif value == 'test' %}
{% elseif value == 4 %}
<span class="layui-badge layui-bg-orange">会员</span>
{% elseif value == 99 %}
<span class="layui-badge layui-bg-black">测试</span>
{% endif %}
{%- endmacro %}
{%- macro order_status(value) %}
{% if value == 'pending' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-blue">待支付</span>
{% elseif value == 'finished' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-gray">发货中</span>
{% elseif value == 3 %}
<span class="layui-badge layui-bg-green">已完成</span>
{% elseif value == 'closed' %}
{% elseif value == 4 %}
<span class="layui-badge layui-bg-cyan">已关闭</span>
{% elseif value == 'refunded' %}
{% elseif value == 5 %}
<span class="layui-badge layui-bg-red">已退款</span>
{% endif %}
{%- endmacro %}

View File

@ -21,20 +21,21 @@
<div class="layui-form-item">
<label class="layui-form-label">订单类型</label>
<div class="layui-input-block">
<input type="radio" name="item_type" value="course" title="课程">
<input type="radio" name="item_type" value="package" title="套餐">
<input type="radio" name="item_type" value="reward" title="赞赏">
<input type="radio" name="item_type" value="vip" title="会员">
<input type="radio" name="item_type" value="test" title="测试">
<input type="radio" name="item_type" value="1" title="课程">
<input type="radio" name="item_type" value="2" title="套餐">
<input type="radio" name="item_type" value="3" title="赞赏">
<input type="radio" name="item_type" value="4" title="会员">
<input type="radio" name="item_type" value="99" title="测试">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">订单状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="pending" title="待支付">
<input type="radio" name="status" value="finished" title="已完成">
<input type="radio" name="status" value="closed" title="已关闭">
<input type="radio" name="status" value="refunded" title="已退款">
<input type="radio" name="status" value="1" title="待支付">
<input type="radio" name="status" value="2" title="发货中">
<input type="radio" name="status" value="3" title="已完成">
<input type="radio" name="status" value="4" title="已关闭">
<input type="radio" name="status" value="5" title="已退款">
</div>
</div>
<div class="layui-form-item">

View File

@ -1,32 +1,32 @@
{%- macro refund_status(value) %}
{% if value == 'pending' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-blue">待处理</span>
{% elseif value == 'canceled' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-gray">已取消</span>
{% elseif value == 'approved' %}
{% elseif value == 3 %}
<span class="layui-badge layui-bg-orange">已审核</span>
{% elseif value == 'refused' %}
{% elseif value == 4 %}
<span class="layui-badge layui-bg-red">已拒绝</span>
{% elseif value == 'finished' %}
{% elseif value == 5 %}
<span class="layui-badge layui-bg-green">已完成</span>
{% elseif value == 'failed' %}
{% elseif value == 6 %}
<span class="layui-badge layui-bg-cyan">已失败</span>
{% endif %}
{%- endmacro %}
{%- macro refund_status_history(items) %}
{% for item in items %}
{% if item.status == 'pending' %}
{% if item.status == 1 %}
<p>创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'canceled' %}
{% elseif item.status == 2 %}
<p>取消时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'approved' %}
{% elseif item.status == 3 %}
<p>过审时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'refused' %}
{% elseif item.status == 4 %}
<p>拒绝时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'finished' %}
{% elseif item.status == 5 %}
<p>完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'failed' %}
{% elseif item.status == 6 %}
<p>失败时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% endif %}
{% endfor %}

View File

@ -21,11 +21,11 @@
<div class="layui-form-item">
<label class="layui-form-label">退款状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="pending" title="待处理">
<input type="radio" name="status" value="canceled" title="已取消">
<input type="radio" name="status" value="approved" title="已审核">
<input type="radio" name="status" value="refused" title="已拒绝">
<input type="radio" name="status" value="finished" title="已完成">
<input type="radio" name="status" value="1" title="待处理">
<input type="radio" name="status" value="2" title="已取消">
<input type="radio" name="status" value="3" title="已审核">
<input type="radio" name="status" value="4" title="已拒绝">
<input type="radio" name="status" value="5" title="已完成">
</div>
</div>
<div class="layui-form-item">

View File

@ -47,8 +47,8 @@
<div class="layui-form-item">
<label class="layui-form-label">审核结果</label>
<div class="layui-input-block">
<input type="radio" name="review_status" value="approved" title="同意">
<input type="radio" name="review_status" value="refused" title="拒绝">
<input type="radio" name="review_status" value="3" title="同意">
<input type="radio" name="review_status" value="4" title="拒绝">
</div>
</div>
<div class="layui-form-item">

View File

@ -1,32 +1,32 @@
{%- macro channel_type(value) %}
{% if value == 'alipay' %}
{% if value == '1' %}
<span class="layui-badge layui-bg-blue">支付宝</span>
{% elseif value == 'wxpay' %}
{% elseif value == '2' %}
<span class="layui-badge layui-bg-green">微信</span>
{% endif %}
{%- endmacro %}
{%- macro trade_status(value) %}
{% if value == 'pending' %}
{% if value == 1 %}
<span class="layui-badge layui-bg-blue">待支付</span>
{% elseif value == 'finished' %}
{% elseif value == 2 %}
<span class="layui-badge layui-bg-green">已完成</span>
{% elseif value == 'closed' %}
{% elseif value == 3 %}
<span class="layui-badge layui-bg-cyan">已关闭</span>
{% elseif value == 'refunded' %}
{% elseif value == 4 %}
<span class="layui-badge layui-bg-red">已退款</span>
{% endif %}
{%- endmacro %}
{%- macro trade_status_history(items) %}
{% for item in items %}
{% if item.status == 'pending' %}
{% if item.status == 1 %}
<p>创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'finished' %}
{% elseif item.status == 2 %}
<p>完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'closed' %}
{% elseif item.status == 3 %}
<p>关闭时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'refunded' %}
{% elseif item.status == 4 %}
<p>退款时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% endif %}
{% endfor %}

View File

@ -21,17 +21,17 @@
<div class="layui-form-item">
<label class="layui-form-label">交易平台</label>
<div class="layui-input-block">
<input type="radio" name="channel" value="alipay" title="支付宝">
<input type="radio" name="channel" value="wxpay" title="微信">
<input type="radio" name="channel" value="1" title="支付宝">
<input type="radio" name="channel" value="2" title="微信">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">交易状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="pending" title="待支付">
<input type="radio" name="status" value="finished" title="已完成">
<input type="radio" name="status" value="closed" title="已关闭">
<input type="radio" name="status" value="refunded" title="已退款">
<input type="radio" name="status" value="1" title="待支付">
<input type="radio" name="status" value="2" title="已完成">
<input type="radio" name="status" value="3" title="已关闭">
<input type="radio" name="status" value="4" title="已退款">
</div>
</div>
<div class="layui-form-item">

View File

@ -70,8 +70,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}
@ -84,8 +82,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}
@ -98,8 +94,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}
@ -112,8 +106,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}
@ -126,8 +118,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}
@ -140,8 +130,6 @@ class MyController extends Controller
$pager = $service->handle();
$pager->items = kg_array_object($pager->items);
$this->view->setVar('pager', $pager);
}

View File

@ -1,6 +1,6 @@
<div class="package-list">
{% for package in packages %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':package.id,'item_type':'package'}) %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':package.id,'item_type':2}) %}
<div class="package-item clearfix">
<div class="package-info">
<div class="title">{{ package.title }}</div>

View File

@ -53,11 +53,11 @@
<div class="layui-colla-content layui-show">
<ul class="lesson-list">
{% for lesson in chapter.children %}
{% if lesson.model == 'vod' %}
{% if lesson.model == '1' %}
<li class="lesson-item clearfix">{{ vod_lesson_info(lesson) }}</li>
{% elseif lesson.model == 'live' %}
{% elseif lesson.model == '2' %}
<li class="lesson-item clearfix">{{ live_lesson_info(lesson) }}</li>
{% elseif lesson.model == 'read' %}
{% elseif lesson.model == '3' %}
<li class="lesson-item clearfix">{{ read_lesson_info(lesson) }}</li>
{% endif %}
{% endfor %}

View File

@ -3,11 +3,11 @@
<img src="{{ course.cover }}" alt="{{ course.title|e }}">
</div>
<div class="info">
{% if course.model == 'vod' %}
{% if course.model == '1' %}
<p class="item">
<span class="key">课程时长</span><span class="value">{{ course.attrs.duration|duration }}</span>
</p>
{% elseif course.model == 'live' %}
{% elseif course.model == '2' %}
<p class="item">
<span class="key">直播时间</span><span>{{ course.attrs.start_date }} ~ {{ course.attrs.end_date }}</span>
</p>

View File

@ -1,5 +1,5 @@
{% if course.me.owned == 0 and course.market_price > 0 %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':course.id,'item_type':'course'}) %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':course.id,'item_type':1}) %}
<div class="sidebar wrap">
<button class="layui-btn layui-btn-fluid layui-bg-red btn-buy" data-url="{{ order_url }}">立即购买</button>
</div>
@ -13,7 +13,7 @@
<div class="sidebar-order">
{% for reward in rewards %}
{% set item_id = [course.id,reward.id]|join('-') %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':item_id,'item_type':'reward'}) %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':item_id,'item_type':3}) %}
<button class="layui-btn layui-btn-xs btn-reward" data-url="{{ order_url }}">{{ reward.title }}</button>
{% endfor %}
</div>

View File

@ -5,6 +5,7 @@
<div class="layui-fluid">
<div class="kg-tips">
<i class="layui-icon layui-icon-face-surprised"></i>
<div class="message">{{ flashSession.output() }}</div>
<div class="layui-text">
<h1>
<span class="layui-anim layui-anim-loop">4</span>

View File

@ -1,6 +1,7 @@
{% extends 'templates/error.volt' %}
{% block content %}
<div class="layui-fluid">
<div class="kg-tips">
<i class="layui-icon layui-icon-face-surprised"></i>
@ -14,4 +15,5 @@
</div>
</div>
</div>
{% endblock %}

View File

@ -1,21 +1,21 @@
{%- macro model_info(value) %}
{% if value == 'vod' %}
{% if value == '1' %}
<span class="layui-badge layui-bg-green">点播</span>
{% elseif value == 'live' %}
{% elseif value == '2' %}
<span class="layui-badge layui-bg-blue">直播</span>
{% elseif value == 'read' %}
{% elseif value == '3' %}
<span class="layui-badge layui-bg-black">图文</span>
{% endif %}
{%- endmacro %}
{%- macro level_info(value) %}
{% if value == 'entry' %}
{% if value == '1' %}
入门
{% elseif value == 'junior' %}
{% elseif value == '2' %}
初级
{% elseif value == 'medium' %}
{% elseif value == '3' %}
中级
{% elseif value == 'senior' %}
{% elseif value == '4' %}
高级
{% endif %}
{%- endmacro %}

View File

@ -1,9 +1,9 @@
{%- macro type_info(value) %}
{% if value == 'course' %}
{% if value == '1' %}
<span class="layui-badge layui-bg-green type" title="课程交流">课</span>
{% elseif value == 'chat' %}
{% elseif value == '2' %}
<span class="layui-badge layui-bg-blue type" title="课外畅聊">聊</span>
{% elseif value == 'staff' %}
{% elseif value == '3' %}
<span class="layui-badge layui-bg-cyan type" title="职工交流">职</span>
{% endif %}
{%- endmacro %}

View File

@ -1,12 +1,12 @@
{%- macro item_info(order) %}
{% if order.item_type == 'course' %}
{% if order.item_type == '1' %}
{% set course = order.item_info.course %}
<div class="order-item">
<p>课程名称:<span>{{ course.title }}</span></p>
<p>市场价格:<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>会员价格:<span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span></p>
<p>学习期限:<span>{{ date('Y-m-d',course.study_expiry_time) }}</span>退款期限:<span>{{ date('Y-m-d',course.refund_expiry_time) }}</span></p>
</div>
{% elseif order.item_type == 'package' %}
{% elseif order.item_type == '2' %}
{% set courses = order.item_info.courses %}
{% for course in courses %}
<div class="order-item">
@ -15,20 +15,20 @@
<p>学习期限:<span>{{ date('Y-m-d',course.study_expiry_time) }}</span>退款期限:<span>{{ date('Y-m-d',course.refund_expiry_time) }}</span></p>
</div>
{% endfor %}
{% elseif order.item_type == 'vip' %}
{% set vip = order.item_info.vip %}
<div class="order-item">
<p>商品名称:<span>{{ order.subject }}</span></p>
<p>商品价格:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></p>
</div>
{% elseif order.item_type == 'reward' %}
{% elseif order.item_type == '3' %}
{% set course = order.item_info.course %}
{% set reward = order.item_info.reward %}
<div class="order-item">
<p>课程名称:<span>{{ course.title }}</span></p>
<p>赞赏金额:<span class="price">{{ '¥%0.2f'|format(reward.price) }}</span></p>
</div>
{% elseif order.item_type == 'test' %}
{% elseif order.item_type == '4' %}
{% set vip = order.item_info.vip %}
<div class="order-item">
<p>商品名称:<span>{{ order.subject }}</span></p>
<p>商品价格:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></p>
</div>
{% elseif order.item_type == '99' %}
<div class="order-item">
<p>商品名称:<span>{{ order.subject }}</span></p>
<p>商品价格:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></p>
@ -38,26 +38,30 @@
{%- macro status_history(items) %}
{% for item in items %}
{% if item.status == 'pending' %}
{% if item.status == '1' %}
<p>创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'finished' %}
{% elseif item.status == '2' %}
<p>支付时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == '3' %}
<p>完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'closed' %}
{% elseif item.status == '4' %}
<p>关闭时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'refunded' %}
{% elseif item.status == '5' %}
<p>退款时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% endif %}
{% endfor %}
{%- endmacro %}
{%- macro order_status(value) %}
{% if value == 'pending' %}
{% if value == '1' %}
待支付
{% elseif value == 'finished' %}
{% elseif value == '2' %}
发货中
{% elseif value == '3' %}
已完成
{% elseif value == 'closed' %}
{% elseif value == '4' %}
已关闭
{% elseif value == 'refunded' %}
{% elseif value == '5' %}
已退款
{% endif %}
{%- endmacro %}

View File

@ -1,33 +1,33 @@
{%- macro status_history(items) %}
{% for item in items %}
{% if item.status == 'pending' %}
{% if item.status == 1 %}
<p>创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'canceled' %}
{% elseif item.status == 2 %}
<p>取消时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'approved' %}
{% elseif item.status == 3 %}
<p>审核时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'refused' %}
{% elseif item.status == 4 %}
<p>拒绝时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'finished' %}
{% elseif item.status == 5 %}
<p>完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% elseif item.status == 'failed' %}
{% elseif item.status == 6 %}
<p>失败时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
{% endif %}
{% endfor %}
{%- endmacro %}
{%- macro refund_status(value) %}
{% if value == 'pending' %}
{% if value == 1 %}
待处理
{% elseif value == 'canceled' %}
{% elseif value == 2 %}
已取消
{% elseif value == 'approved' %}
{% elseif value == 3 %}
退款中
{% elseif value == 'refused' %}
{% elseif value == 4 %}
已拒绝
{% elseif value == 'finished' %}
{% elseif value == 5 %}
已完成
{% elseif value == 'failed' %}
{% elseif value == 6 %}
已失败
{% endif %}
{%- endmacro %}

View File

@ -4,8 +4,8 @@
{{ partial('macros/order') }}
{% set status_types = {'all':'全部','pending':'待支付','finished':'已完成','closed':'已关闭','refunded':'已退款'} %}
{% set status = request.get('status','trim','all') %}
{% set status_types = {'0':'全部','1':'待支付','3':'已完成','4':'已关闭','5':'已退款'} %}
{% set status = request.get('status','trim','0') %}
<div class="layout-main">
<div class="my-sidebar">{{ partial('my/menu') }}</div>
@ -14,7 +14,7 @@
<span class="title">我的订单</span>
{% for key,value in status_types %}
{% set class = (status == key) ? 'layui-btn layui-btn-xs' : 'none' %}
{% set url = (key == 'all') ? url({'for':'desktop.my.orders'}) : url({'for':'desktop.my.orders'},{'status':key}) %}
{% set url = (key == '0') ? url({'for':'desktop.my.orders'}) : url({'for':'desktop.my.orders'},{'status':key}) %}
<a class="{{ class }}" href="{{ url }}">{{ value }}</a>
{% endfor %}
</div>

View File

@ -4,8 +4,8 @@
{{ partial('macros/refund') }}
{% set status_types = {'all':'全部','pending':'待处理','canceled':'已取消','approved':'退款中','finished':'已完成'} %}
{% set status = request.get('status','trim','all') %}
{% set status_types = {'0':'全部','1':'待处理','2':'已取消','3':'退款中','5':'已完成'} %}
{% set status = request.get('status','int','0') %}
<div class="layout-main">
<div class="my-sidebar">{{ partial('my/menu') }}</div>

View File

@ -18,7 +18,7 @@
<div class="vip-option-list">
<div class="layui-row layui-col-space20">
{% for option in vip_options %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':option.id,'item_type':'vip'}) %}
{% set order_url = url({'for':'desktop.order.confirm'},{'item_id':option.id,'item_type':4}) %}
<div class="layui-col-md3">
<div class="vip-option-card">
<div class="title">{{ option.title }}</div>

View File

@ -34,7 +34,7 @@ class Pay extends Listener
$order = $orderRepo->findById($trade->order_id);
$order->status = OrderModel::STATUS_FINISHED;
$order->status = OrderModel::STATUS_SHIPPING;
if ($order->update() === false) {
throw new \RuntimeException('Update Order Status Failed');

View File

@ -188,12 +188,12 @@ class Chapter extends Model
{
$this->create_time = time();
$course = Course::findFirst($this->course_id);
$this->model = $course->model;
if ($this->parent_id > 0) {
$course = Course::findFirst($this->course_id);
$this->model = $course->model;
$attrs = [];
switch ($course->model) {

26
app/Models/Client.php Normal file
View File

@ -0,0 +1,26 @@
<?php
namespace App\Models;
class Client
{
/**
* 类型
*/
const TYPE_DESKTOP = 1; // desktop
const TYPE_MOBILE = 2; // mobile
const TYPE_APP = 3; // app
const TYPE_MINI = 4; // 小程序
public static function types()
{
return [
self::TYPE_DESKTOP => 'desktop',
self::TYPE_MOBILE => 'mobile',
self::TYPE_APP => 'app',
self::TYPE_MINI => 'mini',
];
}
}

View File

@ -13,17 +13,17 @@ class Course extends Model
/**
* 模型
*/
const MODEL_VOD = 'vod'; // 点播
const MODEL_LIVE = 'live'; // 直播
const MODEL_READ = 'read'; // 图文
const MODEL_VOD = 1; // 点播
const MODEL_LIVE = 2; // 直播
const MODEL_READ = 3; // 图文
/**
* 级别
*/
const LEVEL_ENTRY = 'entry'; // 入门
const LEVEL_JUNIOR = 'junior'; // 初级
const LEVEL_MEDIUM = 'medium'; // 中级
const LEVEL_SENIOR = 'senior'; // 高级
const LEVEL_ENTRY = 1; // 入门
const LEVEL_JUNIOR = 2; // 初级
const LEVEL_MEDIUM = 3; // 中级
const LEVEL_SENIOR = 4; // 高级
/**
* @var array

View File

@ -27,13 +27,6 @@ class CourseUser extends Model
*/
public $id;
/**
* 计划编号
*
* @var int
*/
public $plan_id;
/**
* 课程编号
*
@ -48,6 +41,13 @@ class CourseUser extends Model
*/
public $user_id;
/**
* 计划编号
*
* @var int
*/
public $plan_id;
/**
* 角色类型
*
@ -130,8 +130,9 @@ class CourseUser extends Model
public function beforeCreate()
{
$this->plan_id = (int)date('Ymd');
$this->create_time = time();
$this->plan_id = (int)date('Ymd');
}
public function beforeUpdate()

View File

@ -12,9 +12,9 @@ class ImGroup extends Model
/**
* 群组类型
*/
const TYPE_COURSE = 'course'; // 课程
const TYPE_CHAT = 'chat'; // 聊天
const TYPE_STAFF = 'staff'; // 员工
const TYPE_COURSE = 1; // 课程
const TYPE_CHAT = 2; // 聊天
const TYPE_STAFF = 3; // 员工
/**
* 主键编号

View File

@ -122,7 +122,7 @@ class ImMessage extends Model
sort($list);
return implode('_', $list);
return implode('-', $list);
}
}

View File

@ -5,14 +5,6 @@ namespace App\Models;
class Learning extends Model
{
/**
* 客户端类型
*/
const CLIENT_DESKTOP = 'desktop';
const CLIENT_MOBILE = 'mobile';
const CLIENT_APP = 'app';
const CLIENT_MINI = 'mini';
/**
* 主键编号
*
@ -79,7 +71,7 @@ class Learning extends Model
/**
* 客户端类型
*
* @var string
* @var int
*/
public $client_type;

View File

@ -10,27 +10,20 @@ class Order extends Model
/**
* 条目类型
*/
const ITEM_COURSE = 'course'; // 课程
const ITEM_PACKAGE = 'package'; // 套餐
const ITEM_REWARD = 'reward'; // 赞赏
const ITEM_VIP = 'vip'; // 会员
const ITEM_TEST = 'test'; // 测试
/**
* 终端类型
*/
const CLIENT_DESKTOP = 'desktop'; // pc
const CLIENT_MOBILE = 'mobile'; // mobile
const CLIENT_APP = 'app'; // app
const CLIENT_MINI = 'mini'; // 小程序
const ITEM_COURSE = 1; // 课程
const ITEM_PACKAGE = 2; // 套餐
const ITEM_REWARD = 3; // 赞赏
const ITEM_VIP = 4; // 会员
const ITEM_TEST = 99; // 测试
/**
* 状态类型
*/
const STATUS_PENDING = 'pending'; // 待支付
const STATUS_FINISHED = 'finished'; // 已完成
const STATUS_CLOSED = 'closed'; // 已关闭
const STATUS_REFUNDED = 'refunded'; // 已退款
const STATUS_PENDING = 1; // 待支付
const STATUS_SHIPPING = 2; // 发货中
const STATUS_FINISHED = 3; // 已完成
const STATUS_CLOSED = 4; // 已关闭
const STATUS_REFUNDED = 5; // 已退款
/**
* 主键编号
@ -60,6 +53,20 @@ class Order extends Model
*/
public $amount;
/**
* 状态类型
*
* @var string
*/
public $status;
/**
* 删除标识
*
* @var int
*/
public $deleted;
/**
* 用户编号
*
@ -88,17 +95,10 @@ class Order extends Model
*/
public $item_info;
/**
* 优惠信息
*
* @var string|array
*/
public $coupon_info;
/**
* 终端类型
*
* @var string
* @var int
*/
public $client_type;
@ -109,20 +109,6 @@ class Order extends Model
*/
public $client_ip;
/**
* 状态类型
*
* @var string
*/
public $status;
/**
* 删除标识
*
* @var int
*/
public $deleted;
/**
* 创建时间
*
@ -158,11 +144,11 @@ class Order extends Model
public function beforeCreate()
{
$this->create_time = time();
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->status = self::STATUS_PENDING;
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->create_time = time();
if (is_array($this->item_info)) {
$this->item_info = kg_json_encode($this->item_info);
@ -208,16 +194,6 @@ class Order extends Model
];
}
public static function clientTypes()
{
return [
self::CLIENT_DESKTOP => 'desktop',
self::CLIENT_MOBILE => 'mobile',
self::CLIENT_APP => 'app',
self::CLIENT_MINI => 'mini',
];
}
public static function statusTypes()
{
return [

View File

@ -10,12 +10,12 @@ class Refund extends Model
/**
* 状态类型
*/
const STATUS_PENDING = 'pending'; // 待处理
const STATUS_CANCELED = 'canceled'; // 已取消
const STATUS_APPROVED = 'approved'; // 已审核
const STATUS_REFUSED = 'refused'; // 已拒绝
const STATUS_FINISHED = 'finished'; // 已完成
const STATUS_FAILED = 'failed'; // 已失败
const STATUS_PENDING = 1; // 待处理
const STATUS_CANCELED = 2; // 已取消
const STATUS_APPROVED = 3; // 已审核
const STATUS_REFUSED = 4; // 已拒绝
const STATUS_FINISHED = 5; // 已完成
const STATUS_FAILED = 6; // 已失败
/**
* 主键编号
@ -66,20 +66,6 @@ class Refund extends Model
*/
public $amount;
/**
* 申请备注
*
* @var string
*/
public $apply_note;
/**
* 审核备注
*
* @var string
*/
public $review_note;
/**
* 状态类型
*
@ -94,6 +80,20 @@ class Refund extends Model
*/
public $deleted;
/**
* 申请备注
*
* @var string
*/
public $apply_note;
/**
* 审核备注
*
* @var string
*/
public $review_note;
/**
* 创建时间
*
@ -129,16 +129,16 @@ class Refund extends Model
public function beforeCreate()
{
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->create_time = time();
/**
* 退款周期内无条件审批状态为approved
*/
if (!$this->status) {
$this->status = self::STATUS_PENDING;
}
$this->sn = date('YmdHis') . rand(1000, 9999);
$this->create_time = time();
}
public function beforeUpdate()

View File

@ -8,8 +8,8 @@ class Task extends Model
/**
* 任务类型
*/
const TYPE_REFUND = 'refund'; // 退款
const TYPE_ORDER = 'order'; // 下单
const TYPE_ORDER = 1; // 下单
const TYPE_REFUND = 2; // 退款
/**
* 优先级
@ -21,10 +21,10 @@ class Task extends Model
/**
* 状态类型
*/
const STATUS_PENDING = 'pending'; // 待定
const STATUS_FINISHED = 'finished'; // 完成
const STATUS_CANCELED = 'canceled'; // 取消
const STATUS_FAILED = 'failed'; // 失败
const STATUS_PENDING = 1; // 待定
const STATUS_FINISHED = 2; // 完成
const STATUS_CANCELED = 3; // 取消
const STATUS_FAILED = 4; // 失败
/**
* 主键编号

View File

@ -10,16 +10,16 @@ class Trade extends Model
/**
* 平台类型
*/
const CHANNEL_ALIPAY = 'alipay'; // 支付宝
const CHANNEL_WXPAY = 'wxpay'; // 微信
const CHANNEL_ALIPAY = 1; // 支付宝
const CHANNEL_WXPAY = 2; // 微信
/**
* 状态类型
*/
const STATUS_PENDING = 'pending'; // 待支付
const STATUS_FINISHED = 'finished'; // 已完成
const STATUS_CLOSED = 'closed'; // 已关闭
const STATUS_REFUNDED = 'refunded'; // 已退款
const STATUS_PENDING = 1; // 待支付
const STATUS_FINISHED = 2; // 已完成
const STATUS_CLOSED = 3; // 已关闭
const STATUS_REFUNDED = 4; // 已退款
/**
* 主键编号

View File

@ -0,0 +1,25 @@
<?php
namespace App\Providers;
use Phalcon\Flash\Session as PhFlashSession;
class FlashSession extends Provider
{
protected $serviceName = 'flashSession';
public function register()
{
$this->di->setShared($this->serviceName, function () {
return new PhFlashSession([
'error' => 'alert alert-danger',
'success' => 'alert alert-success',
'notice' => 'alert alert-info',
'warning' => 'alert alert-warning',
]);
});
}
}

View File

@ -18,7 +18,6 @@ class Url extends Provider
$url = new UrlResolver();
$url->setBaseUri($config->base_uri);
$url->setStaticBaseUri($config->static_base_uri);
return $url;

View File

@ -26,6 +26,10 @@ class ImGroup extends Repository
$builder->andWhere('id = :id:', ['id' => $where['id']]);
}
if (!empty($where['type'])) {
$builder->andWhere('type = :type:', ['type' => $where['type']]);
}
if (!empty($where['name'])) {
$builder->andWhere('name LIKE :name:', ['name' => "%{$where['name']}%"]);
}

View File

@ -67,7 +67,7 @@ class Register extends FrontendService
$imUser->name = $user->name;
if ($imUser->create() === false) {
throw new \RuntimeException('Create ImUser Failed');
throw new \RuntimeException('Create Im User Failed');
}
$this->db->commit();

View File

@ -7,6 +7,7 @@ use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Order as OrderRepo;
use App\Services\Frontend\Service as FrontendService;
use App\Services\Frontend\UserTrait;
use App\Validators\Order as OrderValidator;
class OrderList extends FrontendService
{
@ -21,6 +22,12 @@ class OrderList extends FrontendService
$params = $pagerQuery->getParams();
$validator = new OrderValidator();
if (!empty($params['status'])) {
$params['status'] = $validator->checkStatus($params['status']);
}
$params['owner_id'] = $user->id;
$params['deleted'] = 0;

View File

@ -7,6 +7,7 @@ use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Refund as RefundRepo;
use App\Services\Frontend\Service as FrontendService;
use App\Services\Frontend\UserTrait;
use App\Validators\Refund as RefundValidator;
class RefundList extends FrontendService
{
@ -21,6 +22,12 @@ class RefundList extends FrontendService
$params = $pagerQuery->getParams();
$validator = new RefundValidator();
if (!empty($params['status'])) {
$params['status'] = $validator->checkStatus($params['status']);
}
$params['owner_id'] = $user->id;
$params['deleted'] = 0;

View File

@ -11,12 +11,15 @@ use App\Models\Vip as VipModel;
use App\Repos\Order as OrderRepo;
use App\Repos\Package as PackageRepo;
use App\Services\Frontend\Service as FrontendService;
use App\Traits\Client as ClientTrait;
use App\Validators\Order as OrderValidator;
use App\Validators\UserLimit as UserLimitValidator;
class OrderCreate extends FrontendService
{
use ClientTrait;
public function handle()
{
$post = $this->request->getPost();
@ -91,6 +94,8 @@ class OrderCreate extends FrontendService
$order->item_id = $course->id;
$order->item_type = OrderModel::ITEM_COURSE;
$order->item_info = $itemInfo;
$order->client_type = $this->getClientType();
$order->client_ip = $this->getClientIp();
$order->amount = $amount;
$order->subject = "课程 - {$course->title}";
@ -127,6 +132,8 @@ class OrderCreate extends FrontendService
$order->item_type = OrderModel::ITEM_PACKAGE;
$order->item_info = $itemInfo;
$order->amount = $amount;
$order->client_type = $this->getClientType();
$order->client_ip = $this->getClientIp();
$order->subject = "套餐 - {$package->title}";
$order->create();
@ -155,6 +162,8 @@ class OrderCreate extends FrontendService
$order->item_id = $vip->id;
$order->item_type = OrderModel::ITEM_VIP;
$order->item_info = $itemInfo;
$order->client_type = $this->getClientType();
$order->client_ip = $this->getClientIp();
$order->amount = $vip->price;
$order->subject = "会员 - 会员服务({$vip->title}";
@ -180,6 +189,8 @@ class OrderCreate extends FrontendService
$order->item_id = "{$course->id}-{$reward->id}";
$order->item_type = OrderModel::ITEM_REWARD;
$order->item_info = $itemInfo;
$order->client_type = $this->getClientType();
$order->client_ip = $this->getClientIp();
$order->amount = $reward->price;
$order->subject = "赞赏 - {$course->title}";

View File

@ -2,6 +2,7 @@
namespace App\Traits;
use App\Models\Client as ClientModel;
use Phalcon\Di;
use Phalcon\Http\Request;
use WhichBrowser\Parser as BrowserParser;
@ -30,10 +31,10 @@ trait Client
$result = new BrowserParser($userAgent);
$clientType = 'desktop';
$clientType = ClientModel::TYPE_DESKTOP;
if ($result->isMobile()) {
$clientType = 'mobile';
$clientType = ClientModel::TYPE_MOBILE;
}
return $clientType;

View File

@ -21,14 +21,14 @@ class Course extends Validator
{
$id = intval($id);
$maxCourseIdCache = new MaxCourseIdCache();
$maxCache = new MaxCourseIdCache();
$maxCourseId = $maxCourseIdCache->get();
$maxId = $maxCache->get();
/**
* 防止缓存穿透
*/
if ($id < 1 || $id > $maxCourseId) {
if ($id < 1 || $id > $maxId) {
throw new BadRequestException('course.not_found');
}
@ -60,7 +60,7 @@ class Course extends Validator
{
$list = CourseModel::modelTypes();
if (!isset($list[$model])) {
if (!array_key_exists($model, $list)) {
throw new BadRequestException('course.invalid_model');
}
@ -71,7 +71,7 @@ class Course extends Validator
{
$list = CourseModel::levelTypes();
if (!isset($list[$level])) {
if (!array_key_exists($level, $list)) {
throw new BadRequestException('course.invalid_level');
}

View File

@ -119,6 +119,17 @@ class Order extends Validator
return $value;
}
public function checkStatus($status)
{
$list = OrderModel::statusTypes();
if (!array_key_exists($status, $list)) {
throw new BadRequestException('order.invalid_status');
}
return $status;
}
public function checkIfAllowCancel(OrderModel $order)
{
if ($order->status != OrderModel::STATUS_PENDING) {

View File

@ -40,6 +40,24 @@ class Refund extends Validator
return $refund;
}
public function checkAmount($orderAmount, $refundAmount)
{
if ($refundAmount > $orderAmount) {
throw new BadRequestException('refund.invalid_amount');
}
}
public function checkStatus($status)
{
$list = RefundModel::statusTypes();
if (!array_key_exists($status, $list)) {
throw new BadRequestException('refund.invalid_status');
}
return $status;
}
public function checkReviewStatus($status)
{
$list = [
@ -48,19 +66,12 @@ class Refund extends Validator
];
if (!in_array($status, $list)) {
throw new BadRequestException('refund.invalid_review_status');
throw new BadRequestException('refund.invalid_status');
}
return $status;
}
public function checkAmount($orderAmount, $refundAmount)
{
if ($refundAmount > $orderAmount) {
throw new BadRequestException('refund.invalid_amount');
}
}
public function checkApplyNote($note)
{
$value = $this->filter->sanitize($note, ['trim', 'string']);

View File

@ -45,13 +45,24 @@ class Trade extends Validator
{
$list = TradeModel::channelTypes();
if (!isset($list[$channel])) {
if (!array_key_exists($channel, $list)) {
throw new BadRequestException('trade.invalid_channel');
}
return $channel;
}
public function checkStatus($status)
{
$list = TradeModel::statusTypes();
if (!array_key_exists($status, $list)) {
throw new BadRequestException('trade.invalid_status');
}
return $status;
}
public function checkIfAllowClose(TradeModel $trade)
{
if ($trade->status != TradeModel::STATUS_PENDING) {

View File

@ -91,6 +91,7 @@ class ConsoleKernel extends Kernel
];
foreach ($providers as $provider) {
/**
* @var AppProvider $service
*/

View File

@ -10,6 +10,7 @@ use App\Providers\Crypt as CryptProvider;
use App\Providers\CsrfToken as CsrfTokenProvider;
use App\Providers\Database as DatabaseProvider;
use App\Providers\EventsManager as EventsManagerProvider;
use App\Providers\FlashSession as FlashSessionProvider;
use App\Providers\Logger as LoggerProvider;
use App\Providers\MetaData as MetaDataProvider;
use App\Providers\Provider as AppProvider;
@ -74,6 +75,7 @@ class HttpKernel extends Kernel
CsrfTokenProvider::class,
DatabaseProvider::class,
EventsManagerProvider::class,
FlashSessionProvider::class,
LoggerProvider::class,
MetaDataProvider::class,
RequestProvider::class,
@ -86,6 +88,7 @@ class HttpKernel extends Kernel
];
foreach ($providers as $provider) {
/**
* @var AppProvider $service
*/

View File

@ -256,6 +256,7 @@ $error['carousel.invalid_publish_status'] = '无效的发布状态';
* 订单相关
*/
$error['order.not_found'] = '订单不存在';
$error['order.invalid_status'] = '无效的状态类型';
$error['order.item_not_found'] = '商品不存在';
$error['order.trade_expired'] = '交易已过期';
$error['order.has_bought_course'] = '已经购买过该课程';
@ -271,6 +272,7 @@ $error['order.refund_apply_existed'] = '退款申请已经存在';
$error['trade.not_found'] = '交易不存在';
$error['trade.create_failed'] = '创建交易失败';
$error['trade.invalid_channel'] = '无效的平台类型';
$error['trade.invalid_status'] = '无效的状态类型';
$error['trade.close_not_allowed'] = '当前不允许关闭交易';
$error['trade.refund_not_allowed'] = '当前不允许交易退款';
$error['trade.refund_apply_existed'] = '退款申请已经存在,请等待处理结果';
@ -285,7 +287,7 @@ $error['refund.review_note_too_short'] = '审核备注太短少于2个字符
$error['refund.review_note_too_long'] = '审核备注太长多于255个字符';
$error['refund.cancel_not_allowed'] = '当前不允许取消退款';
$error['refund.review_not_allowed'] = '当前不允许审核退款';
$error['refund.invalid_review_status'] = '无效的审核状态';
$error['refund.invalid_status'] = '无效的状态类型';
/**
* 角色相关

View File

@ -1,28 +0,0 @@
project.name = group
project.default_charset = UTF-8
server.index = 8383
server.search = 8384
[id]
type = id
[type]
type = string
index = self
tokenizer = full
[name]
type = title
[avatar]
type = string
[about]
type = body
[owner]
type = string
[user_count]
type = string

View File

@ -1,32 +0,0 @@
project.name = user
project.default_charset = UTF-8
server.index = 8383
server.search = 8384
[id]
type = id
[name]
type = title
[avatar]
type = string
[title]
type = string
[about]
type = body
[location]
type = string
index = self
[gender]
type = string
index = self
tokenizer = full
[vip]
type = string