1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-25 04:07:17 +08:00

Merge branch 'koogua/v1.3.2'

This commit is contained in:
koogua 2021-04-20 21:21:30 +08:00
commit 68b3b652a1
82 changed files with 1907 additions and 487 deletions

View File

@ -1,3 +1,17 @@
### [v1.3.2](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.2)(2021-04-20)
### 更新
- 前台增文章和章节评论功能
- 后台增加评论相关管理功能
- 优化课程,章节,文章等前台界面
- 优化分享链接的生成和跳转方式
- 优化课程章节文章相关js
- 优化后台数据展示
- 修正后台分类二级分类错位问题
- 修正文章命名空间问题
- 修正后台轮播没有保存问题
### [v1.3.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.1)(2021-04-09) ### [v1.3.1](https://gitee.com/koogua/course-tencent-cloud/releases/v1.3.1)(2021-04-09)
### 更新 ### 更新

View File

@ -32,14 +32,16 @@
<col> <col>
<col> <col>
<col> <col>
<col>
<col width="10%"> <col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>文章</th> <th>文章</th>
<th>来源</th> <th>浏览</th>
<th>作者</th> <th>评论</th>
<th>统计</th> <th>点赞</th>
<th>收藏</th>
<th>推荐</th> <th>推荐</th>
<th>评论</th> <th>评论</th>
<th>发布</th> <th>发布</th>
@ -48,6 +50,7 @@
</thead> </thead>
<tbody> <tbody>
{% for item in pager.items %} {% for item in pager.items %}
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
{% set preview_url = url({'for':'home.article.show','id':item.id}) %} {% set preview_url = url({'for':'home.article.show','id':item.id}) %}
{% set edit_url = url({'for':'admin.article.edit','id':item.id}) %} {% set edit_url = url({'for':'admin.article.edit','id':item.id}) %}
{% set update_url = url({'for':'admin.article.update','id':item.id}) %} {% set update_url = url({'for':'admin.article.update','id':item.id}) %}
@ -65,17 +68,16 @@
<span>标签:{{ tags_info(item.tags) }}</span> <span>标签:{{ tags_info(item.tags) }}</span>
{% endif %} {% endif %}
</p> </p>
<p>创建:{{ date('Y-m-d H:i',item.create_time) }},更新:{{ date('Y-m-d H:i',item.update_time) }}</p> <p class="meta">
</td> <span>来源:{{ source_info(item.source_type,item.source_url) }}</span>
<td>{{ source_info(item.source_type,item.source_url) }}</td> <span>作者:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></span>
<td> <span>创建:{{ date('Y-m-d',item.create_time) }}</span>
<p>昵称:{{ item.owner.name }}</p> </p>
<p>编号:{{ item.owner.id }}</p>
</td>
<td>
<p>浏览:{{ item.view_count }},评论:{{ item.comment_count }}</p>
<p>点赞:{{ item.like_count }},收藏:{{ item.favorite_count }}</p>
</td> </td>
<td>{{ item.view_count }}</td>
<td>{{ item.comment_count }}</td>
<td>{{ item.like_count }}</td>
<td>{{ item.favorite_count }}</td>
<td><input type="checkbox" name="featured" value="1" lay-skin="switch" lay-text="是|否" lay-filter="featured" data-url="{{ update_url }}" {% if item.featured == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="featured" value="1" lay-skin="switch" lay-text="是|否" lay-filter="featured" data-url="{{ update_url }}" {% if item.featured == 1 %}checked="checked"{% endif %}></td>
<td><input type="checkbox" name="comment" value="1" lay-skin="switch" lay-text="开|关" lay-filter="comment" data-url="{{ update_url }}" {% if item.allow_comment == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="comment" value="1" lay-skin="switch" lay-text="开|关" lay-filter="comment" data-url="{{ update_url }}" {% if item.allow_comment == 1 %}checked="checked"{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td>

View File

@ -22,7 +22,7 @@
<ul class="layui-tab-title kg-tab-title"> <ul class="layui-tab-title kg-tab-title">
<li class="layui-this">基本信息</li> <li class="layui-this">基本信息</li>
<li>{{ content_title(course.model) }}</li> <li>{{ content_title(course.model) }}</li>
<li>学习资料</li> <li>课件资料</li>
</ul> </ul>
<div class="layui-tab-content"> <div class="layui-tab-content">
<div class="layui-tab-item layui-show"> <div class="layui-tab-item layui-show">

View File

@ -12,7 +12,6 @@
<form class="layui-form kg-form" id="res-form"> <form class="layui-form kg-form" id="res-form">
<div class="layui-form-item" id="res-upload-block"> <div class="layui-form-item" id="res-upload-block">
<label class="layui-form-label">资源文件</label>
<div class="layui-input-block"> <div class="layui-input-block">
<span class="layui-btn" id="res-upload-btn">选择文件</span> <span class="layui-btn" id="res-upload-btn">选择文件</span>
<input class="layui-hide" type="file" name="res_file" accept="*/*"> <input class="layui-hide" type="file" name="res_file" accept="*/*">

View File

@ -63,6 +63,16 @@
}); });
}); });
$('.kg-comment').on('click', function () {
var url = $(this).data('url');
layer.open({
type: 2,
title: '评论管理',
area: ['1000px', '600px'],
content: url
});
});
}); });
</script> </script>

View File

@ -26,14 +26,20 @@
<col> <col>
<col> <col>
<col> <col>
<col width="12%"> <col>
<col>
<col>
<col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>编号</th> <th>编号</th>
<th>名称</th> <th>名称</th>
<th>课件</th>
<th>点赞</th>
<th>评论</th>
<th>直播时间</th> <th>直播时间</th>
<th>推流状态</th> <th>推流</th>
<th>排序</th> <th>排序</th>
<th>免费</th> <th>免费</th>
<th>发布</th> <th>发布</th>
@ -50,9 +56,12 @@
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td> <td>
<span><a href="{{ edit_url }}">{{ item.title }}</a></span> <a href="{{ edit_url }}">{{ item.title }}</a>
<span class="layui-badge layui-bg-green">课</span> <span class="layui-badge layui-bg-green">课</span>
</td> </td>
<td>{{ item.resource_count }}</td>
<td>{{ item.like_count }}</td>
<td>{{ item.comment_count }}</td>
<td>{{ live_time_info(item.attrs) }}</td> <td>{{ live_time_info(item.attrs) }}</td>
<td>{{ live_status_info(item.attrs['stream']['status']) }}</td> <td>{{ live_status_info(item.attrs['stream']['status']) }}</td>
<td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td> <td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td>

View File

@ -6,13 +6,17 @@
<col> <col>
<col> <col>
<col> <col>
<col width="12%"> <col>
<col>
<col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>编号</th> <th>编号</th>
<th>名称</th> <th>名称</th>
<th>字数</th> <th>课件</th>
<th>点赞</th>
<th>评论</th>
<th>排序</th> <th>排序</th>
<th>免费</th> <th>免费</th>
<th>发布</th> <th>发布</th>
@ -26,13 +30,18 @@
{% set update_url = url({'for':'admin.chapter.update','id':item.id}) %} {% set update_url = url({'for':'admin.chapter.update','id':item.id}) %}
{% set delete_url = url({'for':'admin.chapter.delete','id':item.id}) %} {% set delete_url = url({'for':'admin.chapter.delete','id':item.id}) %}
{% set restore_url = url({'for':'admin.chapter.restore','id':item.id}) %} {% set restore_url = url({'for':'admin.chapter.restore','id':item.id}) %}
{% set comment_url = url({'for':'admin.comment.list'},{'item_id':item.id,'item_type':1}) %}
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td> <td>
<span><a href="{{ edit_url }}">{{ item.title }}</a></span> <p>
<span class="layui-badge layui-bg-green">课</span> <a href="{{ edit_url }}">{{ item.title }}</a>
<span class="layui-badge layui-bg-green">课</span>
</p>
</td> </td>
<td><span class="layui-badge layui-bg-gray">{{ item.attrs['word_count'] }}</span></td> <td>{{ item.resource_count }}</td>
<td>{{ item.like_count }}</td>
<td>{{ item.comment_count }}</td>
<td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td> <td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td>
<td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ update_url }}" {% if item.free == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ update_url }}" {% if item.free == 1 %}checked="checked"{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td>
@ -47,6 +56,8 @@
{% else %} {% else %}
<li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li>
{% endif %} {% endif %}
<hr>
<li><a href="javascript:" class="kg-comment" data-url="{{ comment_url }}">评论管理</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -1,14 +1,14 @@
{%- macro file_status(value) %} {%- macro file_status(value) %}
{% if value == 'pending' %} {% if value == 'pending' %}
<span class="layui-badge layui-bg-gray">待上传</span> 待上传
{% elseif value == 'uploaded' %} {% elseif value == 'uploaded' %}
<span class="layui-badge layui-bg-black">已上传</span> 已上传
{% elseif value == 'translating' %} {% elseif value == 'translating' %}
<span class="layui-badge layui-bg-blue">转码中</span> 转码中
{% elseif value == 'translated' %} {% elseif value == 'translated' %}
<span class="layui-badge layui-bg-green">已转码</span> 已转码
{% elseif value == 'failed' %} {% elseif value == 'failed' %}
<span class="layui-badge layui-bg-red">已失败</span> 已失败
{% endif %} {% endif %}
{%- endmacro %} {%- endmacro %}
@ -21,14 +21,19 @@
<col> <col>
<col> <col>
<col> <col>
<col>
<col>
<col>
<col width="10%"> <col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>编号</th> <th>编号</th>
<th>名称</th> <th>名称</th>
<th>状态</th> <th>课件</th>
<th>时长</th> <th>学员</th>
<th>点赞</th>
<th>评论</th>
<th>排序</th> <th>排序</th>
<th>免费</th> <th>免费</th>
<th>发布</th> <th>发布</th>
@ -42,14 +47,23 @@
{% set update_url = url({'for':'admin.chapter.update','id':item.id}) %} {% set update_url = url({'for':'admin.chapter.update','id':item.id}) %}
{% set delete_url = url({'for':'admin.chapter.delete','id':item.id}) %} {% set delete_url = url({'for':'admin.chapter.delete','id':item.id}) %}
{% set restore_url = url({'for':'admin.chapter.restore','id':item.id}) %} {% set restore_url = url({'for':'admin.chapter.restore','id':item.id}) %}
{% set comment_url = url({'for':'admin.comment.list'},{'item_id':item.id,'item_type':1}) %}
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td> <td>
<span><a href="{{ edit_url }}">{{ item.title }}</a></span> <p>
<span class="layui-badge layui-bg-green">课</span> <a href="{{ edit_url }}">{{ item.title }}</a>
<span class="layui-badge layui-bg-green">课</span>
</p>
<p class="meta">
<span>状态:{{ file_status(item.attrs['file']['status']) }}</span>
<span>时长:{{ item.attrs['duration']|duration }}</span>
</p>
</td> </td>
<td>{{ file_status(item.attrs['file']['status']) }}</td> <td>{{ item.resource_count }}</td>
<td>{{ item.attrs['duration']|duration }}</td> <td>{{ item.user_count }}</td>
<td>{{ item.like_count }}</td>
<td>{{ item.comment_count }}</td>
<td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td> <td><input class="layui-input kg-priority" type="text" name="priority" title="数值越小排序越靠前" value="{{ item.priority }}" data-url="{{ update_url }}"></td>
<td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ update_url }}" {% if item.free == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="free" value="1" lay-skin="switch" lay-text="是|否" lay-filter="free" data-url="{{ update_url }}" {% if item.free == 1 %}checked="checked"{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td>
@ -64,6 +78,8 @@
{% else %} {% else %}
<li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li> <li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li>
{% endif %} {% endif %}
<hr>
<li><a href="javascript:" class="kg-comment" data-url="{{ comment_url }}">评论管理</a></li>
</ul> </ul>
</div> </div>
</td> </td>

View File

@ -26,13 +26,21 @@
<col> <col>
<col> <col>
<col> <col>
<col width="12%"> <col>
<col>
<col>
<col>
<col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>编号</th> <th>编号</th>
<th>名称</th> <th>名称</th>
<th>课时数</th> <th>课时</th>
<th>课件</th>
<th>学员</th>
<th>点赞</th>
<th>评论</th>
<th>排序</th> <th>排序</th>
<th>操作</th> <th>操作</th>
</tr> </tr>
@ -50,11 +58,11 @@
<a href="{{ child_url }}">{{ item.title }}</a> <a href="{{ child_url }}">{{ item.title }}</a>
<span class="layui-badge layui-bg-green">章</span> <span class="layui-badge layui-bg-green">章</span>
</td> </td>
<td> <td>{{ item.lesson_count }}</td>
<a href="{{ child_url }}"> <td>{{ item.resource_count }}</td>
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span> <td>{{ item.user_count }}</td>
</a> <td>{{ item.like_count }}</td>
</td> <td>{{ item.comment_count }}</td>
<td><input class="layui-input kg-priority" type="text" name="priority" value="{{ item.priority }}" data-url="{{ update_url }}"></td> <td><input class="layui-input kg-priority" type="text" name="priority" value="{{ item.priority }}" data-url="{{ update_url }}"></td>
<td class="center"> <td class="center">
<div class="layui-dropdown"> <div class="layui-dropdown">

View File

@ -32,14 +32,20 @@
<col> <col>
<col> <col>
<col> <col>
<col>
<col>
<col>
<col width="10%"> <col width="10%">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th>课程</th> <th>课程</th>
<th>类型</th> <th>课时</th>
<th>课时数</th> <th>课件</th>
<th>用户数</th> <th>学员</th>
<th>收藏</th>
<th>咨询</th>
<th>评价</th>
<th>价格</th> <th>价格</th>
<th>推荐</th> <th>推荐</th>
<th>发布</th> <th>发布</th>
@ -69,22 +75,22 @@
{% endif %} {% endif %}
<span>难度:{{ level_info(item.level) }}</span> <span>难度:{{ level_info(item.level) }}</span>
</p> </p>
<p class="meta">
<span>类型:{{ model_info(item.model) }}</span>
<span>评分:{{ item.rating }}</span>
<span>创建:{{ date('Y-m-d',item.create_time) }}</span>
</p>
</td> </td>
<td>{{ model_info(item.model) }}</td> <td>{{ item.lesson_count }}</td>
<td>{{ item.resource_count }}</td>
<td>{{ item.user_count }}</td>
<td>{{ item.favorite_count }}</td>
<td>{{ item.consult_count }}</td>
<td>{{ item.review_count }}</td>
<td> <td>
<a href="{{ catalog_url }}"> <p>原始:{{ '¥%0.2f'|format(item.origin_price) }}</p>
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span> <p>市场:{{ '¥%0.2f'|format(item.market_price) }}</p>
</a> <p>会员:{{ '¥%0.2f'|format(item.vip_price) }}</p>
</td>
<td>
<a href="{{ student_url }}">
<span class="layui-badge layui-bg-green">{{ item.user_count }}</span>
</a>
</td>
<td>
<p>原始价:{{ '¥%0.2f'|format(item.origin_price) }}</p>
<p>市场价:{{ '¥%0.2f'|format(item.market_price) }}</p>
<p>会员价:{{ '¥%0.2f'|format(item.vip_price) }}</p>
</td> </td>
<td><input type="checkbox" name="featured" value="1" lay-skin="switch" lay-text="是|否" lay-filter="featured" data-url="{{ update_url }}" {% if item.featured == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="featured" value="1" lay-skin="switch" lay-text="是|否" lay-filter="featured" data-url="{{ update_url }}" {% if item.featured == 1 %}checked="checked"{% endif %}></td>
<td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-skin="switch" lay-text="是|否" lay-filter="published" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td>

View File

@ -25,7 +25,6 @@
<table class="kg-table layui-table layui-form"> <table class="kg-table layui-table layui-form">
<colgroup> <colgroup>
<col width="10%">
<col> <col>
<col> <col>
<col> <col>
@ -38,7 +37,6 @@
<th>头像</th> <th>头像</th>
<th>名称</th> <th>名称</th>
<th>群主</th> <th>群主</th>
<th>类型</th>
<th>成员</th> <th>成员</th>
<th>发布</th> <th>发布</th>
<th>操作</th> <th>操作</th>
@ -56,15 +54,23 @@
<td class="center"> <td class="center">
<img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}"> <img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}">
</td> </td>
<td><a href="{{ preview_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>{{ item.id }}</td> <td>
<p>
名称:<a href="{{ preview_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>{{ item.id }}
</p>
<p class="meta">
<span>类型:{{ type_info(item.type) }}</span>
<span>创建:{{ date('Y-m-d',item.create_time) }}</span>
</p>
</td>
<td> <td>
{% if item.owner.id is defined %} {% if item.owner.id is defined %}
<a href="{{ url({'for':'home.user.show','id':item.owner.id}) }}" target="_blank">{{ item.owner.name }}</a>{{ item.owner.id }} <p>昵称:<a href="{{ url({'for':'home.user.show','id':item.owner.id}) }}" target="_blank">{{ item.owner.name }}</a></p>
<p>编号:{{ item.owner.id }}</p>
{% else %} {% else %}
N/A N/A
{% endif %} {% endif %}
</td> </td>
<td> {{ type_info(item.type) }}</td>
<td><a href="{{ users_url }}" class="layui-badge layui-bg-green">{{ item.user_count }}</a></td> <td><a href="{{ users_url }}" class="layui-badge layui-bg-green">{{ item.user_count }}</a></td>
<td><input type="checkbox" name="published" value="1" lay-filter="published" lay-skin="switch" lay-text="是|否" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td> <td><input type="checkbox" name="published" value="1" lay-filter="published" lay-skin="switch" lay-text="是|否" data-url="{{ update_url }}" {% if item.published == 1 %}checked="checked"{% endif %}></td>
<td class="center"> <td class="center">

View File

@ -1,12 +1,12 @@
{%- macro source_info(type,url) %} {%- macro source_info(type,url) %}
{% if type == 1 %} {% if type == 1 %}
<span>原创</span> 原创
{% elseif type == 2 %} {% elseif type == 2 %}
<a href="{{ url }}" target="_blank">转载</a> <a href="{{ url }}" target="_blank">转载</a>
{% elseif type == 3 %} {% elseif type == 3 %}
<span>翻译</span> 翻译
{% else %} {% else %}
<span>N/A</span> N/A
{% endif %} {% endif %}
{%- endmacro %} {%- endmacro %}

View File

@ -25,7 +25,8 @@
<table class="layui-table kg-table"> <table class="layui-table kg-table">
<colgroup> <colgroup>
<col width="10%"> <col>
<col>
<col> <col>
<col> <col>
<col> <col>
@ -38,9 +39,10 @@
<tr> <tr>
<th>用户头像</th> <th>用户头像</th>
<th>用户昵称</th> <th>用户昵称</th>
<th>所在地区</th>
<th>用户性别</th>
<th>用户角色</th> <th>用户角色</th>
<th>课程</th>
<th>文章</th>
<th>收藏</th>
<th>活跃时间</th> <th>活跃时间</th>
<th>注册时间</th> <th>注册时间</th>
<th>操作</th> <th>操作</th>
@ -54,15 +56,24 @@
<td class="center"> <td class="center">
<img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}"> <img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}">
</td> </td>
<td><a href="{{ preview_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>{{ item.id }}{{ status_info(item) }}</td> <td>
<td>{{ item.area }}</td> <p>
<td>{{ gender_info(item.gender) }}</td> <a href="{{ preview_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>{{ item.id }}{{ status_info(item) }}
</p>
<p class="meta">
<span>性别:{{ gender_info(item.gender) }}</span>
<span>地区:{{ item.area|default('N/A') }}</span>
</p>
</td>
<td> <td>
<p>教学:{{ edu_role_info(item.edu_role) }}</p> <p>教学:{{ edu_role_info(item.edu_role) }}</p>
<p>后台:{{ admin_role_info(item.admin_role) }}</p> <p>后台:{{ admin_role_info(item.admin_role) }}</p>
</td> </td>
<td>{{ date('Y-m-d H:i:s',item.active_time) }}</td> <td>{{ item.course_count }}</td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td> <td>{{ item.article_count }}</td>
<td>{{ item.favorite_count }}</td>
<td>{{ date('Y-m-d',item.active_time) }}</td>
<td>{{ date('Y-m-d',item.create_time) }}</td>
<td class="center"> <td class="center">
<div class="layui-dropdown"> <div class="layui-dropdown">
<button class="layui-btn layui-btn-sm">操作 <i class="layui-icon layui-icon-triangle-d"></i></button> <button class="layui-btn layui-btn-sm">操作 <i class="layui-icon layui-icon-triangle-d"></i></button>

View File

@ -0,0 +1,144 @@
<?php
namespace App\Http\Home\Controllers;
use App\Services\Logic\Comment\CommentCreate as CommentCreateService;
use App\Services\Logic\Comment\CommentDelete as CommentDeleteService;
use App\Services\Logic\Comment\CommentInfo as CommentInfoService;
use App\Services\Logic\Comment\CommentLike as CommentLikeService;
use App\Services\Logic\Comment\CommentList as CommentListService;
use App\Services\Logic\Comment\CommentReply as CommentReplyService;
use App\Services\Logic\Comment\ReplyList as ReplyListService;
use Phalcon\Mvc\View;
/**
* @RoutePrefix("/comment")
*/
class CommentController extends Controller
{
/**
* @Get("/list", name="home.comment.list")
*/
public function listAction()
{
$service = new CommentListService();
$pager = $service->handle();
$pager->target = 'comment-list';
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->setVar('pager', $pager);
}
/**
* @Get("/{id:[0-9]+}/replies", name="home.comment.replies")
*/
public function repliesAction($id)
{
$service = new ReplyListService();
$pager = $service->handle($id);
$pager->target = "reply-list-{$id}";
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->setVar('pager', $pager);
}
/**
* @Get("/{id:[0-9]+}/info", name="home.comment.info")
*/
public function infoAction($id)
{
$service = new CommentInfoService();
$comment = $service->handle($id);
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->setVar('comment', $comment);
}
/**
* @Get("/add", name="home.comment.add")
*/
public function addAction()
{
}
/**
* @Get("/{id:[0-9]+}/reply", name="home.comment.reply")
*/
public function replyAction($id)
{
$service = new CommentInfoService();
$comment = $service->handle($id);
$this->view->setVar('comment', $comment);
}
/**
* @Post("/create", name="home.comment.create")
*/
public function createAction()
{
$service = new CommentCreateService();
$comment = $service->handle();
$service = new CommentInfoService();
$comment = $service->handle($comment->id);
return $this->jsonSuccess(['comment' => $comment]);
}
/**
* @Post("/{id:[0-9]+}/reply", name="home.comment.create_reply")
*/
public function createReplyAction($id)
{
$service = new CommentReplyService();
$comment = $service->handle($id);
$service = new CommentInfoService();
$comment = $service->handle($comment->id);
return $this->jsonSuccess(['comment' => $comment]);
}
/**
* @Post("/{id:[0-9]+}/like", name="home.comment.like")
*/
public function likeAction($id)
{
$service = new CommentLikeService();
$data = $service->handle($id);
$msg = $data['action'] == 'do' ? '点赞成功' : '取消点赞成功';
return $this->jsonSuccess(['data' => $data, 'msg' => $msg]);
}
/**
* @Post("/{id:[0-9]+}/delete", name="home.comment.delete")
*/
public function deleteAction($id)
{
$service = new CommentDeleteService();
$service->handle($id);
return $this->jsonSuccess(['msg' => '删除评论成功']);
}
}

View File

@ -12,6 +12,20 @@ use Phalcon\Mvc\View;
class PackageController extends Controller class PackageController extends Controller
{ {
/**
* @Get("/{id:[0-9]+}", name="home.package.show")
*/
public function showAction($id)
{
$service = new PackageInfoService();
$package = $service->handle($id);
$this->seo->prependTitle(['套餐', $package['title']]);
$this->view->setVar('package', $package);
}
/** /**
* @Get("/{id:[0-9]+}/info", name="home.package.info") * @Get("/{id:[0-9]+}/info", name="home.package.info")
*/ */

View File

@ -2,6 +2,7 @@
namespace App\Http\Home\Controllers; namespace App\Http\Home\Controllers;
use App\Http\Home\Services\ShareUrl as ShareUrlService;
use App\Library\CsrfToken as CsrfTokenService; use App\Library\CsrfToken as CsrfTokenService;
use App\Repos\Upload as UploadRepo; use App\Repos\Upload as UploadRepo;
use App\Services\LiveNotify as LiveNotifyService; use App\Services\LiveNotify as LiveNotifyService;
@ -43,6 +44,22 @@ class PublicController extends \Phalcon\Mvc\Controller
} }
} }
/**
* @Get("/share", name="home.share")
*/
public function shareAction()
{
$id = $this->request->getQuery('id', 'int', 0);
$type = $this->request->getQuery('type', 'string', 'course');
$referer = $this->request->getQuery('referer', 'int', 0);
$service = new ShareUrlService();
$location = $service->handle($id, $type, $referer);
return $this->response->redirect($location, true);
}
/** /**
* @Get("/qrcode", name="home.qrcode") * @Get("/qrcode", name="home.qrcode")
*/ */

View File

@ -0,0 +1,159 @@
<?php
namespace App\Http\Home\Services;
class ShareUrl extends Service
{
/**
* WEB站点URL
*
* @var string
*/
protected $webBaseUrl;
/**
* H5站点URL
*
* @var string
*/
protected $h5BaseUrl;
public function __construct()
{
$this->webBaseUrl = $this->getWebBaseUrl();
$this->h5BaseUrl = $this->getH5BaseUrl();
}
public function handle($id, $type, $referer = 0)
{
if ($type == 'article') {
$result = $this->getArticleUrl($id, $referer);
} elseif ($type == 'course') {
$result = $this->getCourseUrl($id, $referer);
} elseif ($type == 'chapter') {
$result = $this->getChapterUrl($id, $referer);
} elseif ($type == 'package') {
$result = $this->getPackageUrl($id, $referer);
} elseif ($type == 'vip') {
$result = $this->getVipUrl($id, $referer);
} elseif ($type == 'user') {
$result = $this->getUserUrl($id, $referer);
} else {
$result = $this->getHomeUrl($referer);
}
return $this->h5Enabled() ? $result['h5'] : $result['web'];
}
public function getHomeUrl($referer = 0)
{
$webUrl = sprintf('%s?referer=%s', $this->webBaseUrl, $referer);
$h5Url = sprintf('%s?referer=%s', $this->h5BaseUrl, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getArticleUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.article.show', 'id' => $id],
['referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/article/info?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getCourseUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.course.show', 'id' => $id],
['referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/course/info?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getChapterUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.chapter.show', 'id' => $id],
['referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/chapter/info?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getPackageUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.package.show', 'id' => $id],
['referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/package/info?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getUserUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.user.show', 'id' => $id],
['referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/user/index?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
public function getVipUrl($id, $referer = 0)
{
$route = $this->url->get(
['for' => 'home.vip.index'],
['id' => $id, 'referer' => $referer]
);
$webUrl = $this->webBaseUrl . $route;
$h5Url = sprintf('%s/vip/index?id=%s&referer=%s', $this->h5BaseUrl, $id, $referer);
return ['web' => $webUrl, 'h5' => $h5Url];
}
protected function h5Enabled()
{
$file = public_path('h5/index.html');
return file_exists($file);
}
protected function getWebBaseUrl()
{
return kg_site_url();
}
protected function getH5BaseUrl()
{
return sprintf('%s/h5/#/pages', kg_site_url());
}
}

View File

@ -0,0 +1,21 @@
{% set item_type = 2 %}
{% set comment_list_url = url({'for':'home.comment.list'},{'item_id':article.id,'item_type':item_type}) %}
{% set comment_create_url = url({'for':'home.comment.create'}) %}
{% set submit_class = auth_user.id > 0 ? 'layui-btn layui-btn-sm' : 'layui-btn layui-btn-sm layui-btn-disabled' %}
<div class="comment-form" id="comment-form">
<form class="layui-form" method="post" action="{{ comment_create_url }}">
<textarea class="layui-textarea" id="comment-content" name="content" placeholder="撰写评论..." lay-verify="required"></textarea>
<div class="footer" id="comment-footer" style="display:none;">
<div class="toolbar"></div>
<div class="action">
<button class="{{ submit_class }}" lay-submit="true" lay-filter="addComment">发布</button>
<button class="layui-btn layui-btn-sm layui-bg-gray" id="btn-cancel-comment" type="button">取消</button>
</div>
</div>
<input type="hidden" name="item_id" value="{{ article.id }}">
<input type="hidden" name="item_type" value="{{ item_type }}">
</form>
</div>
<div class="comment-list" id="comment-list" data-url="{{ comment_list_url }}"></div>

View File

@ -4,52 +4,27 @@
{{ partial('macros/article') }} {{ partial('macros/article') }}
{% set list_url = url({'for':'home.article.list'}) %} {% set article_list_url = url({'for':'home.article.list'}) %}
{% set category_url = url({'for':'home.article.list'},{'category_id':article.category.id}) %} {% set related_article_url = url({'for':'home.article.related','id':article.id}) %}
{% set owner_url = url({'for':'home.user.show','id':article.owner.id}) %} {% set owner_url = url({'for':'home.user.show','id':article.owner.id}) %}
{% set favorite_url = url({'for':'home.article.favorite','id':article.id}) %}
{% set like_url = url({'for':'home.article.like','id':article.id}) %}
{% set favorited_class = article.me.favorited ? 'layui-icon-star-fill' : 'layui-icon-star' %}
{% set liked_class = article.me.liked ? 'active' : '' %}
{% set article.owner.title = article.owner.title ? article.owner.title : '默默无名' %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
<a href="/">首页</a> <a href="/">首页</a>
<a href="{{ list_url }}">专栏</a> <a href="{{ article_list_url }}">专栏</a>
<a href="{{ category_url }}">{{ article.category.name }}</a>
<a><cite>文章详情</cite></a> <a><cite>文章详情</cite></a>
</span> </span>
<span class="share"> <span class="share">
<a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a> <a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a>
<a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a> <a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
<a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
</span> </span>
</div> </div>
<div class="layout-main clearfix"> <div class="layout-main clearfix">
<div class="layout-sticky">
<div class="action-sticky"> {{ partial('article/sticky') }}
<div class="item">
<div class="icon" data-url="{{ like_url }}">
<i class="layui-icon layui-icon-praise icon-praise {{ liked_class }}"></i>
</div>
<div class="text">{{ article.like_count }}</div>
</div>
<div class="item">
<div class="icon icon-reply">
<i class="layui-icon layui-icon-reply-fill"></i>
</div>
<div class="text">{{ article.comment_count }}</div>
</div>
<div class="item">
<div class="icon" data-url="{{ favorite_url }}">
<i class="layui-icon layui-icon-star icon-star {{ favorited_class }}"></i>
</div>
<div class="text">{{ article.favorite_count }}</div>
</div>
</div> </div>
<div class="layout-content"> <div class="layout-content">
<div class="article-info wrap"> <div class="article-info wrap">
<div class="title">{{ article.title }}</div> <div class="title">{{ article.title }}</div>
@ -60,7 +35,7 @@
</span> </span>
<span class="view">{{ article.view_count }} 阅读</span> <span class="view">{{ article.view_count }} 阅读</span>
<span class="word">{{ article.word_count }} 字数</span> <span class="word">{{ article.word_count }} 字数</span>
<span class="time">{{ article.create_time|time_ago }}</span> <span class="time" title="{{ date('Y-m-d H:i:s',article.create_time) }}">{{ article.create_time|time_ago }}</span>
</div> </div>
<div class="content markdown-body">{{ article.content }}</div> <div class="content markdown-body">{{ article.content }}</div>
{% if article.tags %} {% if article.tags %}
@ -79,18 +54,15 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="comment-wrap" id="comment-wrap"> <div id="comment-anchor"></div>
<div class="comment-form"> {% if article.allow_comment == 1 %}
<div class="article-comment wrap">
{{ partial('article/comment') }}
</div> </div>
<div class="comment-list"> {% else %}
<div class="wrap center gray">评论已关闭</div>
</div> {% endif %}
</div>
</div> </div>
{% set related_article_url = url({'for':'home.article.related','id':article.id}) %}
<div class="layout-sidebar"> <div class="layout-sidebar">
<div class="sidebar"> <div class="sidebar">
<div class="layui-card"> <div class="layui-card">
@ -104,7 +76,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ owner_url }}" title="{{ article.owner.about }}">{{ article.owner.name }}</a> <a href="{{ owner_url }}" title="{{ article.owner.about }}">{{ article.owner.name }}</a>
</div> </div>
<div class="title layui-elip">{{ article.owner.title }}</div> <div class="title layui-elip">{{ article.owner.title|default('初出江湖') }}</div>
</div> </div>
</div> </div>
</div> </div>
@ -112,10 +84,9 @@
</div> </div>
<div class="sidebar" id="related-article-list" data-url="{{ related_article_url }}"></div> <div class="sidebar" id="related-article-list" data-url="{{ related_article_url }}"></div>
</div> </div>
</div> </div>
{% set share_url = full_url({'for':'home.article.show','id':article.id}) %} {% set share_url = full_url({'for':'home.share'},{'id':article.id,'type':'article','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %} {% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
@ -137,5 +108,6 @@
{{ js_include('home/js/article.show.js') }} {{ js_include('home/js/article.show.js') }}
{{ js_include('home/js/article.share.js') }} {{ js_include('home/js/article.share.js') }}
{{ js_include('home/js/comment.js') }}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,27 @@
{% set favorite_url = url({'for':'home.article.favorite','id':article.id}) %}
{% set like_url = url({'for':'home.article.like','id':article.id}) %}
{% set favorite_title = article.me.favorited == 1 ? '取消收藏' : '收藏文章' %}
{% set like_title = article.me.liked == 1 ? '取消点赞' : '点赞支持' %}
{% set favorite_class = article.me.favorited == 1 ? 'layui-icon-star-fill' : 'layui-icon-star' %}
{% set like_class = article.me.liked == 1 ? 'active' : '' %}
<div class="toolbar-sticky">
<div class="item" id="toolbar-like">
<div class="icon" title="{{ like_title }}" data-url="{{ like_url }}">
<i class="layui-icon layui-icon-praise icon-praise {{ like_class }}"></i>
</div>
<div class="text" data-count="{{ article.like_count }}">{{ article.like_count }}</div>
</div>
<div class="item" id="toolbar-comment">
<div class="icon" title="评论交流">
<i class="layui-icon layui-icon-reply-fill icon-reply"></i>
</div>
<div class="text" data-count="{{ article.comment_count }}">{{ article.comment_count }}</div>
</div>
<div class="item" id="toolbar-favorite">
<div class="icon" title="{{ favorite_title }}" data-url="{{ favorite_url }}">
<i class="layui-icon layui-icon-star icon-star {{ favorite_class }}"></i>
</div>
<div class="text" data-count="{{ article.favorite_count }}">{{ article.favorite_count }}</div>
</div>
</div>

View File

@ -0,0 +1,20 @@
{% set item_type = 1 %}
{% set comment_list_url = url({'for':'home.comment.list'},{'item_id':chapter.id,'item_type':item_type}) %}
{% set comment_create_url = url({'for':'home.comment.create'}) %}
<div class="comment-form" id="comment-form">
<form class="layui-form" method="post" action="{{ comment_create_url }}">
<textarea class="layui-textarea" id="comment-content" name="content" placeholder="撰写评论..." lay-verify="required"></textarea>
<div class="footer" id="comment-footer" style="display:none;">
<div class="toolbar"></div>
<div class="action">
<button class="layui-btn layui-btn-sm" lay-submit="true" lay-filter="addComment">发布</button>
<button class="layui-btn layui-btn-sm layui-bg-gray" id="btn-cancel-comment" type="button">取消</button>
</div>
</div>
<input type="hidden" name="item_id" value="{{ chapter.id }}">
<input type="hidden" name="item_type" value="{{ item_type }}">
</form>
</div>
<div class="comment-list" id="comment-list" data-url="{{ comment_list_url }}"></div>

View File

@ -2,16 +2,12 @@
{% block content %} {% block content %}
{% set full_chapter_url = full_url({'for':'home.chapter.show','id':chapter.id}) %}
{% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %} {% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %}
{% set resources_url = url({'for':'home.chapter.resources','id':chapter.id}) %}
{% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %} {% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %}
{% set live_chats_url = url({'for':'home.live.chats','id':chapter.id}) %} {% set live_chats_url = url({'for':'home.live.chats','id':chapter.id}) %}
{% set live_stats_url = url({'for':'home.live.stats','id':chapter.id}) %} {% set live_stats_url = url({'for':'home.live.stats','id':chapter.id}) %}
{% set send_msg_url = url({'for':'home.live.send_msg','id':chapter.id}) %} {% set send_msg_url = url({'for':'home.live.send_msg','id':chapter.id}) %}
{% set bind_user_url = url({'for':'home.live.bind_user','id':chapter.id}) %} {% set bind_user_url = url({'for':'home.live.bind_user','id':chapter.id}) %}
{% set like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_chapter_url}) %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
@ -19,18 +15,16 @@
<a><cite>{{ chapter.title }}</cite></a> <a><cite>{{ chapter.title }}</cite></a>
</span> </span>
<span class="share"> <span class="share">
<a href="javascript:" title="我要点赞" data-url="{{ like_url }}"><i class="layui-icon layui-icon-praise icon-praise"></i><em class="like-count">{{ chapter.like_count }}</em></a> <a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="在线人数"><i class="layui-icon layui-icon-user"></i><em>0</em></a>
{% if chapter.resource_count > 0 and chapter.me.owned == 1 %}
<a href="javascript:" title="资料下载" data-url="{{ resources_url }}"><i class="layui-icon layui-icon-download-circle icon-resource"></i></a>
{% endif %}
<a href="javascript:" title="分享到微信" data-url=""><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a> <a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a>
<a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a> <a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
</span> </span>
</div> </div>
<div class="layout-main"> <div class="layout-main">
<div class="layout-sticky">
{{ partial('chapter/live/sticky') }}
</div>
<div class="layout-content"> <div class="layout-content">
<div class="player-wrap wrap"> <div class="player-wrap wrap">
<div id="player"></div> <div id="player"></div>
@ -63,10 +57,13 @@
<input type="hidden" name="bind_user_url" value='{{ bind_user_url }}'> <input type="hidden" name="bind_user_url" value='{{ bind_user_url }}'>
</div> </div>
{% set share_url = full_url({'for':'home.share'},{'id':chapter.id,'type':'chapter','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
<input type="hidden" name="share.title" value="{{ chapter.course.title }}"> <input type="hidden" name="share.title" value="{{ chapter.course.title }}">
<input type="hidden" name="share.pic" value="{{ chapter.course.cover }}"> <input type="hidden" name="share.pic" value="{{ chapter.course.cover }}">
<input type="hidden" name="share.url" value="{{ full_chapter_url }}"> <input type="hidden" name="share.url" value="{{ share_url }}">
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}"> <input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
</div> </div>
@ -77,7 +74,7 @@
{{ js_include('https://imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.3.3.js', false) }} {{ js_include('https://imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.3.3.js', false) }}
{{ js_include('home/js/chapter.live.player.js') }} {{ js_include('home/js/chapter.live.player.js') }}
{{ js_include('home/js/chapter.live.chat.js') }} {{ js_include('home/js/chapter.live.chat.js') }}
{{ js_include('home/js/chapter.action.js') }} {{ js_include('home/js/chapter.show.js') }}
{{ js_include('home/js/course.share.js') }} {{ js_include('home/js/course.share.js') }}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,27 @@
{% set download_url = url({'for':'home.chapter.resources','id':chapter.id}) %}
{% set like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
{% set like_title = chapter.me.liked == 1 ? '取消点赞' : '点赞支持' %}
{% set like_class = chapter.me.liked == 1 ? 'active' : '' %}
<div class="toolbar-sticky">
<div class="item">
<div class="icon" title="{{ like_title }}" data-url="{{ like_url }}">
<i class="layui-icon layui-icon-praise icon-praise {{ like_class }}"></i>
</div>
<div class="text">{{ chapter.like_count }}</div>
</div>
<div class="item" id="toolbar-online">
<div class="icon" title="在线人数">
<i class="layui-icon layui-icon-user"></i>
</div>
<div class="text">0</div>
</div>
{% if chapter.resource_count > 0 %}
<div class="item">
<div class="icon" title="学习资料" data-url="{{ download_url }}">
<i class="layui-icon layui-icon-download-circle icon-download"></i>
</div>
<div class="text">资料</div>
</div>
{% endif %}
</div>

View File

@ -2,13 +2,8 @@
{% block content %} {% block content %}
{% set full_chapter_url = full_url({'for':'home.chapter.show','id':chapter.id}) %}
{% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %} {% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %}
{% set resources_url = url({'for':'home.chapter.resources','id':chapter.id}) %}
{% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %} {% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %}
{% set like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
{% set consult_url = url({'for':'home.consult.add'},{'chapter_id':chapter.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_chapter_url}) %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
@ -16,23 +11,22 @@
<a><cite>{{ chapter.title }}</cite></a> <a><cite>{{ chapter.title }}</cite></a>
</span> </span>
<span class="share"> <span class="share">
<a href="javascript:" title="我要点赞" data-url="{{ like_url }}"><i class="layui-icon layui-icon-praise icon-praise"></i><em class="like-count">{{ chapter.like_count }}</em></a> <a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="学习人次"><i class="layui-icon layui-icon-user"></i><em>{{ chapter.user_count }}</em></a>
{% if course.market_price > 0 %}
<a href="javascript:" title="我要提问" data-url="{{ consult_url }}"><i class="layui-icon layui-icon-help icon-help"></i></a>
{% endif %}
{% if chapter.resource_count > 0 and chapter.me.owned == 1 %}
<a href="javascript:" title="资料下载" data-url="{{ resources_url }}"><i class="layui-icon layui-icon-download-circle icon-resource"></i></a>
{% endif %}
<a href="javascript:" title="分享到微信" data-url=""><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a> <a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a>
<a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a> <a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
</span> </span>
</div> </div>
<div class="layout-main clearfix"> <div class="layout-main clearfix">
<div class="layout-sticky">
{{ partial('chapter/sticky') }}
</div>
<div class="layout-content"> <div class="layout-content">
<div class="read-info wrap" id="preview">{{ chapter.content }}</div> <div class="read-info wrap" id="preview">{{ chapter.content }}</div>
<div id="comment-anchor"></div>
<div class="read-comment wrap">
{{ partial('chapter/comment') }}
</div>
</div> </div>
<div class="layout-sidebar"> <div class="layout-sidebar">
{{ partial('chapter/catalog') }} {{ partial('chapter/catalog') }}
@ -45,10 +39,13 @@
<input type="hidden" name="chapter.learning_url" value="{{ learning_url }}"> <input type="hidden" name="chapter.learning_url" value="{{ learning_url }}">
</div> </div>
{% set share_url = full_url({'for':'home.share'},{'id':chapter.id,'type':'chapter','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
<input type="hidden" name="share.title" value="{{ chapter.course.title }}"> <input type="hidden" name="share.title" value="{{ chapter.course.title }}">
<input type="hidden" name="share.pic" value="{{ chapter.course.cover }}"> <input type="hidden" name="share.pic" value="{{ chapter.course.cover }}">
<input type="hidden" name="share.url" value="{{ full_chapter_url }}"> <input type="hidden" name="share.url" value="{{ share_url }}">
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}"> <input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
</div> </div>
@ -66,6 +63,7 @@
{{ js_include('home/js/markdown.preview.js') }} {{ js_include('home/js/markdown.preview.js') }}
{{ js_include('home/js/course.share.js') }} {{ js_include('home/js/course.share.js') }}
{{ js_include('home/js/chapter.read.js') }} {{ js_include('home/js/chapter.read.js') }}
{{ js_include('home/js/chapter.action.js') }} {{ js_include('home/js/chapter.show.js') }}
{{ js_include('home/js/comment.js') }}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,42 @@
{% set download_url = url({'for':'home.chapter.resources','id':chapter.id}) %}
{% set consult_url = url({'for':'home.consult.add'},{'chapter_id':chapter.id}) %}
{% set like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
{% set like_title = chapter.me.liked == 1 ? '取消点赞' : '点赞支持' %}
{% set like_class = chapter.me.liked == 1 ? 'active' : '' %}
<div class="toolbar-sticky">
<div class="item" id="toolbar-like">
<div class="icon" title="{{ like_title }}" data-url="{{ like_url }}">
<i class="layui-icon layui-icon-praise icon-praise {{ like_class }}"></i>
</div>
<div class="text" data-count="{{ chapter.like_count }}">{{ chapter.like_count }}</div>
</div>
<div class="item">
<div class="icon" title="学习人次">
<i class="layui-icon layui-icon-user"></i>
</div>
<div class="text">{{ chapter.user_count }}</div>
</div>
<div class="item" id="toolbar-comment">
<div class="icon" title="评论交流">
<i class="layui-icon layui-icon-reply-fill icon-reply"></i>
</div>
<div class="text" data-count="{{ chapter.comment_count }}">{{ chapter.comment_count }}</div>
</div>
{% if chapter.resource_count > 0 %}
<div class="item">
<div class="icon" title="学习资料" data-url="{{ download_url }}">
<i class="layui-icon layui-icon-download-circle icon-download"></i>
</div>
<div class="text">资料</div>
</div>
{% endif %}
{% if course.market_price > 0 %}
<div class="item">
<div class="icon" title="课程咨询" data-url="{{ consult_url }}">
<i class="layui-icon layui-icon-help icon-help"></i>
</div>
<div class="text">咨询</div>
</div>
{% endif %}
</div>

View File

@ -2,14 +2,8 @@
{% block content %} {% block content %}
{% set full_chapter_url = full_url({'for':'home.chapter.show','id':chapter.id}) %}
{% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %} {% set course_url = url({'for':'home.course.show','id':chapter.course.id}) %}
{% set resources_url = url({'for':'home.chapter.resources','id':chapter.id}) %}
{% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %} {% set learning_url = url({'for':'home.chapter.learning','id':chapter.id}) %}
{% set like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_chapter_url}) %}
{% set consult_url = url({'for':'home.consult.add'},{'chapter_id':chapter.id}) %}
{% set liked_class = chapter.me.liked ? 'active' : '' %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
@ -17,14 +11,6 @@
<a><cite>{{ chapter.title }}</cite></a> <a><cite>{{ chapter.title }}</cite></a>
</span> </span>
<span class="share"> <span class="share">
<a href="javascript:" title="我要点赞" data-url="{{ like_url }}"><i class="layui-icon layui-icon-praise icon-praise {{ liked_class }}"></i><em class="like-count">{{ chapter.like_count }}</em></a>
<a href="javascript:" title="学习人次"><i class="layui-icon layui-icon-user"></i><em>{{ chapter.user_count }}</em></a>
{% if course.market_price > 0 %}
<a href="javascript:" title="我要提问" data-url="{{ consult_url }}"><i class="layui-icon layui-icon-help icon-help"></i></a>
{% endif %}
{% if chapter.resource_count > 0 and chapter.me.owned == 1 %}
<a href="javascript:" title="资料下载" data-url="{{ resources_url }}"><i class="layui-icon layui-icon-download-circle icon-resource"></i></a>
{% endif %}
<a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a> <a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a> <a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a>
<a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a> <a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
@ -32,10 +18,17 @@
</div> </div>
<div class="layout-main clearfix"> <div class="layout-main clearfix">
<div class="layout-sticky">
{{ partial('chapter/sticky') }}
</div>
<div class="layout-content"> <div class="layout-content">
<div class="player-wrap wrap"> <div class="player-wrap wrap">
<div id="player"></div> <div id="player"></div>
</div> </div>
<div id="comment-anchor"></div>
<div class="vod-comment wrap">
{{ partial('chapter/comment') }}
</div>
</div> </div>
<div class="layout-sidebar"> <div class="layout-sidebar">
{{ partial('chapter/catalog') }} {{ partial('chapter/catalog') }}
@ -50,10 +43,13 @@
<input type="hidden" name="chapter.play_urls" value='{{ chapter.play_urls|json_encode }}'> <input type="hidden" name="chapter.play_urls" value='{{ chapter.play_urls|json_encode }}'>
</div> </div>
{% set share_url = full_url({'for':'home.share'},{'id':chapter.id,'type':'chapter','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
<input type="hidden" name="share.title" value="{{ chapter.course.title }}"> <input type="hidden" name="share.title" value="{{ chapter.course.title }}">
<input type="hidden" name="share.pic" value="{{ chapter.course.cover }}"> <input type="hidden" name="share.pic" value="{{ chapter.course.cover }}">
<input type="hidden" name="share.url" value="{{ full_chapter_url }}"> <input type="hidden" name="share.url" value="{{ share_url }}">
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}"> <input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
</div> </div>
@ -63,7 +59,8 @@
{{ js_include('https://imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.3.3.js', false) }} {{ js_include('https://imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.3.3.js', false) }}
{{ js_include('home/js/course.share.js') }} {{ js_include('home/js/course.share.js') }}
{{ js_include('home/js/chapter.action.js') }} {{ js_include('home/js/chapter.show.js') }}
{{ js_include('home/js/chapter.vod.player.js') }} {{ js_include('home/js/chapter.vod.player.js') }}
{{ js_include('home/js/comment.js') }}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,63 @@
{% set owner_url = url({'for':'home.user.show','id':comment.owner.id}) %}
{% set delete_url = url({'for':'home.comment.delete','id':comment.id}) %}
{% if comment.parent_id == 0 %}
<div class="comment-box" id="comment-{{ comment.id }}">
<div class="comment-card clearfix">
<div class="avatar">
<a href="{{ owner_url }}" title="{{ comment.owner.name }}" target="_blank">
<img src="{{ comment.owner.avatar }}!avatar_160" alt="{{ comment.owner.name }}">
</a>
</div>
<div class="info">
<div class="user">
<a href="{{ owner_url }}" target="_blank">{{ comment.owner.name }}</a>
</div>
<div class="content">{{ comment.content }}</div>
<div class="footer">
<div class="left">
<div class="column">
<span class="time" title="{{ date('Y-m-d H:i:s',comment.create_time) }}">{{ comment.create_time|time_ago }}</span>
</div>
</div>
<div class="right">
<div class="column">
<span class="action action-delete" data-id="{{ comment.id }}" data-url="{{ delete_url }}">删除</span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endif %}
{% if comment.parent_id > 0 %}
<div class="comment-card clearfix">
<div class="avatar">
<a href="{{ owner_url }}" title="{{ comment.owner.name }}" target="_blank">
<img src="{{ comment.owner.avatar }}!avatar_160" alt="{{ comment.owner.name }}">
</a>
</div>
<div class="info">
<div class="user">
<a href="{{ owner_url }}" target="_blank">{{ comment.owner.name }}</a>
{% if comment.to_user.id is defined %}
{% set to_user_url = url({'for':'home.user.show','id':comment.to_user.id}) %}
<span class="separator">回复</span>
<a class="{{ to_user_url }}" target="_blank">{{ comment.to_user.name }}</a>
{% endif %}
</div>
<div class="content">{{ comment.content }}</div>
<div class="footer">
<div class="left">
<span class="column" title="{{ date('Y-m-d H:i:s',comment.create_time) }}">{{ comment.create_time|time_ago }}</span>
</div>
<div class="right">
<span class="column">
<span class="action action-delete" data-id="{{ item.id }}" data-url="{{ delete_url }}">删除</span>
</span>
</div>
</div>
</div>
</div>
{% endif %}

View File

@ -0,0 +1,70 @@
{% if pager.total_pages > 0 %}
{% for item in pager.items %}
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
{% set like_url = url({'for':'home.comment.like','id':item.id}) %}
{% set delete_url = url({'for':'home.comment.delete','id':item.id}) %}
{% set reply_create_url = url({'for':'home.comment.create_reply','id':item.id}) %}
{% set reply_list_url = url({'for':'home.comment.replies','id':item.id},{'limit':5}) %}
<div class="comment-box" id="comment-{{ item.id }}">
<div class="comment-card clearfix">
<div class="avatar">
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
</a>
</div>
<div class="info">
<div class="user">
<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a>
</div>
<div class="content">{{ item.content }}</div>
<div class="footer">
<div class="left">
<div class="column">
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
</div>
<div class="column">
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
{% if item.me.liked == 1 %}
<span class="action action-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
{% else %}
<span class="action action-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
{% endif %}
</div>
<div class="column">
<span class="reply-count" data-count="{{ item.reply_count }}">{{ item.reply_count }}</span>
<span class="action action-toggle" title="展开回应" data-id="{{ item.id }}" data-url="{{ reply_list_url }}">回应</span>
</div>
</div>
<div class="right">
<div class="column">
<span class="action action-reply" data-id="{{ item.id }}">回复</span>
</div>
<div class="column">
<span class="action action-report" data-id="{{ item.id }}">举报</span>
</div>
{% if item.owner.id == auth_user.id %}
<div class="column">
<span class="action action-delete" data-id="{{ item.id }}" data-url="{{ delete_url }}">删除</span>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="comment-form" id="comment-form-{{ item.id }}" style="display:none;">
<form class="layui-form" method="post" action="{{ reply_create_url }}">
<textarea class="layui-textarea" name="content" placeholder="撰写评论..." lay-verify="required"></textarea>
<div class="footer">
<div class="toolbar"></div>
<div class="action">
<button class="layui-btn layui-btn-sm" lay-submit="true" lay-filter="replyComment" data-comment-id="{{ item.id }}" data-parent-id="{{ item.parent_id }}">发布</button>
<button class="layui-btn layui-btn-sm layui-bg-gray btn-cancel-reply" type="button" data-id="{{ item.id }}">取消</button>
</div>
</div>
</form>
</div>
<div class="reply-list" id="reply-list-{{ item.id }}" style="display:none"></div>
</div>
{% endfor %}
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -0,0 +1,69 @@
{% if pager.total_pages > 0 %}
{% for item in pager.items %}
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
{% set like_url = url({'for':'home.comment.like','id':item.id}) %}
{% set delete_url = url({'for':'home.comment.delete','id':item.id}) %}
{% set reply_create_url = url({'for':'home.comment.create_reply','id':item.id}) %}
<div class="comment-box" id="comment-{{ item.id }}">
<div class="comment-card clearfix">
<div class="avatar">
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
</a>
</div>
<div class="info">
<div class="user">
<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a>
{% if item.to_user.id is defined %}
{% set to_user_url = url({'for':'home.user.show','id':item.to_user.id}) %}
<span class="separator">回复</span>
<a class="{{ to_user_url }}" target="_blank">{{ item.to_user.name }}</a>
{% endif %}
</div>
<div class="content">{{ item.content }}</div>
<div class="footer">
<div class="left">
<div class="column">
<span class="time" title="{{ date('Y-m-d H:i',item.create_time) }}">{{ item.create_time|time_ago }}</span>
</div>
<div class="column">
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
{% if item.me.liked == 1 %}
<span class="action action-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
{% else %}
<span class="action action-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
{% endif %}
</div>
</div>
<div class="right">
<div class="column">
<span class="action action-reply" data-id="{{ item.id }}">回复</span>
</div>
<div class="column">
<span class="action action-report" data-id="{{ item.id }}">举报</span>
</div>
{% if item.owner.id == auth_user.id %}
<div class="column">
<span class="action action-delete" data-id="{{ item.id }}" data-parent-id="{{ item.parent_id }}" data-url="{{ delete_url }}">删除</span>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="comment-form" id="comment-form-{{ item.id }}" style="display:none;">
<form class="layui-form" method="post" action="{{ reply_create_url }}">
<textarea class="layui-textarea" name="content" placeholder="撰写评论..." lay-verify="required"></textarea>
<div class="footer">
<div class="toolbar"></div>
<div class="action">
<button class="layui-btn layui-btn-sm" lay-submit="true" lay-filter="replyComment" data-comment-id="{{ item.id }}" data-parent-id="{{ item.parent_id }}">发布</button>
<button class="layui-btn layui-btn-sm layui-bg-gray btn-cancel-reply" type="button" data-id="{{ item.id }}">取消</button>
</div>
</div>
</form>
</div>
</div>
{% endfor %}
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -0,0 +1,19 @@
{% extends 'templates/layer.volt' %}
{% block content %}
<form class="layui-form" method="post" action="{{ url({'for':'home.comment.create_reply','id':comment.id}) }}">
<div class="layui-form-item">
<textarea class="layui-textarea" name="content" placeholder="@{{ comment.owner.name }}" lay-verify="required"></textarea>
</div>
<div class="layui-form-item center">
<button class="layui-btn" lay-submit="true" lay-filter="replyComment">提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{% endblock %}
{% block include_js %}
{{ js_include('home/js/comment.js') }}
{% endblock %}

View File

@ -5,7 +5,7 @@
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %} {% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
{% set consult_url = url({'for':'home.consult.show','id':item.id}) %} {% set consult_url = url({'for':'home.consult.show','id':item.id}) %}
{% set like_url = url({'for':'home.consult.like','id':item.id}) %} {% set like_url = url({'for':'home.consult.like','id':item.id}) %}
<div class="review-card clearfix"> <div class="comment-card review-card clearfix">
<div class="avatar"> <div class="avatar">
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank"> <a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}"> <img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
@ -20,11 +20,19 @@
<div class="title layui-elip">{{ item.question }}</div> <div class="title layui-elip">{{ item.question }}</div>
<div class="content">{{ item.answer }}</div> <div class="content">{{ item.answer }}</div>
<div class="footer"> <div class="footer">
<span class="time">{{ item.create_time|time_ago }}</span> <div class="left">
<a class="like" href="javascript:" title="点赞" data-url="{{ like_url }}"> <div class="column">
<i class="layui-icon layui-icon-praise icon-praise"></i> <span class="time" title="{{ date('Y-m-d H:i:s',item.create_time) }}">{{ item.create_time|time_ago }}</span>
<em class="like-count">{{ item.like_count }}</em> </div>
</a> <div class="column">
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
{% if item.me.liked == 1 %}
<span class="action action-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
{% else %}
<span class="action action-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
{% endif %}
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
{% for item in pager.items %} {% for item in pager.items %}
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %} {% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
{% set like_url = url({'for':'home.review.like','id':item.id}) %} {% set like_url = url({'for':'home.review.like','id':item.id}) %}
<div class="review-card clearfix"> <div class="comment-card review-card clearfix">
<div class="avatar"> <div class="avatar">
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank"> <a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}"> <img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
@ -18,11 +18,19 @@
</div> </div>
<div class="content">{{ item.content }}</div> <div class="content">{{ item.content }}</div>
<div class="footer"> <div class="footer">
<span class="time">{{ date('Y-m-d',item.create_time) }}</span> <div class="left">
<a href="javascript:" class="like" title="点赞" data-url="{{ like_url }}"> <div class="column">
<i class="layui-icon layui-icon-praise icon-praise"></i> <span class="time" title="{{ date('Y-m-d H:i:s',item.create_time) }}">{{ item.create_time|time_ago }}</span>
<em class="like-count">{{ item.like_count }}</em> </div>
</a> <div class="column">
<span class="like-count" data-count="{{ item.like_count }}">{{ item.like_count }}</span>
{% if item.me.liked == 1 %}
<span class="action action-like liked" title="取消点赞" data-url="{{ like_url }}">已赞</span>
{% else %}
<span class="action action-like" title="点赞支持" data-url="{{ like_url }}">点赞</span>
{% endif %}
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -4,13 +4,6 @@
{{ partial('macros/course') }} {{ partial('macros/course') }}
{% set favorite_title = course.me.favorited ? '取消收藏' : '收藏课程' %}
{% set favorite_star = course.me.favorited ? 'layui-icon-star-fill' : 'layui-icon-star' %}
{% set full_course_url = full_url({'for':'home.course.show','id':course.id}) %}
{% set favorite_url = url({'for':'home.course.favorite','id':course.id}) %}
{% set consult_url = url({'for':'home.consult.add'},{'course_id':course.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_course_url}) %}
<div class="breadcrumb"> <div class="breadcrumb">
<span class="layui-breadcrumb"> <span class="layui-breadcrumb">
<a href="/">首页</a> <a href="/">首页</a>
@ -18,11 +11,7 @@
<a><cite>{{ course.title }}</cite></a> <a><cite>{{ course.title }}</cite></a>
</span> </span>
<span class="share"> <span class="share">
<a href="javascript:" title="{{ favorite_title }}" data-url="{{ favorite_url }}"><i class="layui-icon {{ favorite_star }} icon-star"></i></a> <a href="javascript:" title="分享到微信"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
{% if course.market_price > 0 %}
<a href="javascript:" title="课程咨询" data-url="{{ consult_url }}"><i class="layui-icon layui-icon-help icon-help"></i></a>
{% endif %}
<a href="javascript:" title="分享到微信" data-url="{{ qrcode_url }}"><i class="layui-icon layui-icon-login-wechat icon-wechat"></i></a>
<a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a> <a href="javascript:" title="分享到QQ空间"><i class="layui-icon layui-icon-login-qq icon-qq"></i></a>
<a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a> <a href="javascript:" title="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
</span> </span>
@ -32,6 +21,10 @@
<div class="layout-main clearfix"> <div class="layout-main clearfix">
<div class="layout-sticky">
{{ partial('course/sticky') }}
</div>
{% set show_tab_chapters = course.lesson_count > 0 %} {% set show_tab_chapters = course.lesson_count > 0 %}
{% set show_tab_packages = course.package_count > 0 %} {% set show_tab_packages = course.package_count > 0 %}
{% set show_tab_consults = course.consult_count > 0 %} {% set show_tab_consults = course.consult_count > 0 %}
@ -101,10 +94,13 @@
</div> </div>
{% set share_url = full_url({'for':'home.share'},{'id':course.id,'type':'course','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
<input type="hidden" name="share.title" value="{{ course.title }}"> <input type="hidden" name="share.title" value="{{ course.title }}">
<input type="hidden" name="share.pic" value="{{ course.cover }}"> <input type="hidden" name="share.pic" value="{{ course.cover }}">
<input type="hidden" name="share.url" value="{{ full_course_url }}"> <input type="hidden" name="share.url" value="{{ share_url }}">
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}"> <input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
</div> </div>

View File

@ -5,7 +5,6 @@
<div class="layui-card-body"> <div class="layui-card-body">
{% for teacher in course.teachers %} {% for teacher in course.teachers %}
{% set teacher_url = url({'for':'home.user.show','id':teacher.id}) %} {% set teacher_url = url({'for':'home.user.show','id':teacher.id}) %}
{% set teacher.title = teacher.title ? teacher.title : '小小教书匠' %}
<div class="sidebar-user-card clearfix"> <div class="sidebar-user-card clearfix">
<div class="avatar"> <div class="avatar">
<img src="{{ teacher.avatar }}!avatar_160" alt="{{ teacher.name }}"> <img src="{{ teacher.avatar }}!avatar_160" alt="{{ teacher.name }}">
@ -14,7 +13,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ teacher_url }}" title="{{ teacher.about }}" target="_blank">{{ teacher.name }}</a> <a href="{{ teacher_url }}" title="{{ teacher.about }}" target="_blank">{{ teacher.name }}</a>
</div> </div>
<div class="title layui-elip">{{ teacher.title }}</div> <div class="title layui-elip">{{ teacher.title|default('小小教书匠') }}</div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

View File

@ -0,0 +1,33 @@
{% set consult_url = url({'for':'home.consult.add'},{'course_id':course.id}) %}
{% set favorite_url = url({'for':'home.course.favorite','id':course.id}) %}
{% set favorite_title = course.me.favorited == 1 ? '取消收藏' : '收藏课程' %}
{% set favorite_class = course.me.favorited == 1 ? 'layui-icon-star-fill' : 'layui-icon-star' %}
<div class="toolbar-sticky">
<div class="item">
<div class="icon" title="学习人次">
<i class="layui-icon layui-icon-user icon-user"></i>
</div>
<div class="text">{{ course.user_count }}</div>
</div>
<div class="item">
<div class="icon" title="课程评价">
<i class="layui-icon layui-icon-reply-fill"></i>
</div>
<div class="text">{{ course.review_count }}</div>
</div>
{% if course.market_price > 0 %}
<div class="item">
<div class="icon" title="课程咨询" data-url="{{ consult_url }}">
<i class="layui-icon layui-icon-help icon-help"></i>
</div>
<div class="text">{{ course.consult_count }}</div>
</div>
{% endif %}
<div class="item" id="toolbar-favorite">
<div class="icon" title="{{ favorite_title }}" data-url="{{ favorite_url }}">
<i class="layui-icon layui-icon-star icon-star {{ favorite_class }}"></i>
</div>
<div class="text" data-count="{{ course.favorite_count }}">{{ course.favorite_count }}</div>
</div>
</div>

View File

@ -4,7 +4,6 @@
<div class="layui-card-body"> <div class="layui-card-body">
{% for user in users %} {% for user in users %}
{% set user_url = url({'for':'home.user.show','id':user.id}) %} {% set user_url = url({'for':'home.user.show','id':user.id}) %}
{% set user.title = user.title ? user.title : '暂露头角' %}
<div class="sidebar-user-card clearfix"> <div class="sidebar-user-card clearfix">
<div class="avatar"> <div class="avatar">
<img src="{{ user.avatar }}" alt="{{ user.name }}"> <img src="{{ user.avatar }}" alt="{{ user.name }}">
@ -13,7 +12,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a> <a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a>
</div> </div>
<div class="title layui-elip">{{ user.title }}</div> <div class="title layui-elip">{{ user.title|default('暂露头角') }}</div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

View File

@ -28,7 +28,6 @@
{% for item in pager.items %} {% for item in pager.items %}
{% set user_url = url({'for':'home.user.show','id':item.user.id}) %} {% set user_url = url({'for':'home.user.show','id':item.user.id}) %}
{% set delete_url = url({'for':'home.im_group_user.delete'},{'group_id':group.id,'user_id':item.user.id}) %} {% set delete_url = url({'for':'home.im_group_user.delete'},{'group_id':group.id,'user_id':item.user.id}) %}
{% set is_owner = item.user.id == group.owner.id ? 1 : 0 %}
<tr> <tr>
<td class="center"> <td class="center">
<img class="avatar-sm" src="{{ item.user.avatar }}!avatar_160" alt="{{ item.user.name }}"> <img class="avatar-sm" src="{{ item.user.avatar }}!avatar_160" alt="{{ item.user.name }}">
@ -38,7 +37,7 @@
<td>{{ gender_info(item.user.gender) }}</td> <td>{{ gender_info(item.user.gender) }}</td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td> <td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
<td class="center"> <td class="center">
{% if is_owner == 0 %} {% if item.user.id == group.owner.id %}
<button class="layui-btn layui-btn-sm layui-bg-red kg-delete" data-url="{{ delete_url }}">删除</button> <button class="layui-btn layui-btn-sm layui-bg-red kg-delete" data-url="{{ delete_url }}">删除</button>
{% else %} {% else %}
<button class="layui-btn layui-btn-sm layui-btn-disabled">删除</button> <button class="layui-btn layui-btn-sm layui-btn-disabled">删除</button>

View File

@ -5,7 +5,6 @@
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set group_url = url({'for':'home.im_group.show','id':item.id}) %} {% set group_url = url({'for':'home.im_group.show','id':item.id}) %}
{% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">
<span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span> <span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span>

View File

@ -2,7 +2,6 @@
{% block content %} {% block content %}
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
{% set users_url = url({'for':'home.im_group.users','id':group.id}) %} {% set users_url = url({'for':'home.im_group.users','id':group.id}) %}
{% set active_users_url = url({'for':'home.im_group.active_users','id':group.id}) %} {% set active_users_url = url({'for':'home.im_group.active_users','id':group.id}) %}
@ -18,7 +17,7 @@
<div class="layout-content"> <div class="layout-content">
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-header">小组介绍</div> <div class="layui-card-header">小组介绍</div>
<div class="layui-card-body group-about">{{ group.about }}</div> <div class="layui-card-body group-about">{{ group.about|default('这个家伙真懒,什么都没有留下') }}</div>
</div> </div>
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-header">小组成员</div> <div class="layui-card-header">小组成员</div>

View File

@ -1,5 +1,4 @@
{% set owner_url = url({'for':'home.user.show','id':group.owner.id}) %} {% set owner_url = url({'for':'home.user.show','id':group.owner.id}) %}
{% set group.owner.title = group.owner.title ? group.owner.title : '暂无头衔' %}
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-header">小组组长</div> <div class="layui-card-header">小组组长</div>
@ -12,7 +11,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ owner_url }}" title="{{ group.owner.about }}" target="_blank">{{ group.owner.name }}</a> <a href="{{ owner_url }}" title="{{ group.owner.about }}" target="_blank">{{ group.owner.name }}</a>
</div> </div>
<div class="title layui-elip">{{ group.owner.title }}</div> <div class="title layui-elip">{{ group.owner.title|default('暂露头角') }}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,7 +2,6 @@
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set user_url = url({'for':'home.user.show','id':item.id}) %} {% set user_url = url({'for':'home.user.show','id':item.id}) %}
{% set item.user.title = item.user.title ? item.user.title : '暂露头角' %}
{% set avatar_class = item.user.vip == 1 ? 'avatar vip' : 'avatar' %} {% set avatar_class = item.user.vip == 1 ? 'avatar vip' : 'avatar' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">
@ -14,7 +13,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ item.user.about }}" target="_blank">{{ item.user.name }}</a> <a href="{{ user_url }}" title="{{ item.user.about }}" target="_blank">{{ item.user.name }}</a>
</div> </div>
<div class="title layui-elip">{{ item.user.title }}</div> <div class="title layui-elip">{{ item.user.title|default('暂露头角') }}</div>
<div class="action"> <div class="action">
<span class="layui-btn apply-friend" data-id="{{ item.user.id }}" data-name="{{ item.user.name }}" data-avatar="{{ item.user.avatar }}">添加好友</span> <span class="layui-btn apply-friend" data-id="{{ item.user.id }}" data-name="{{ item.user.name }}" data-avatar="{{ item.user.avatar }}">添加好友</span>
</div> </div>

View File

@ -2,7 +2,6 @@
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for group in groups %} {% for group in groups %}
{% set group_url = url({'for':'home.im_group.show','id':group.id}) %} {% set group_url = url({'for':'home.im_group.show','id':group.id}) %}
{% set group.about = group.about ? group.about : '这家伙真懒,什么都没留下!' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">
<span class="type layui-badge layui-bg-green">{{ type_info(group.type) }}</span> <span class="type layui-badge layui-bg-green">{{ type_info(group.type) }}</span>

View File

@ -1,8 +1,6 @@
<div class="user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for user in users %} {% for user in users %}
{% set user.title = user.title ? user.title : '暂露头角' %}
{% set user.about = user.about ? user.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'home.user.show','id':user.id}) %} {% set user_url = url({'for':'home.user.show','id':user.id}) %}
{% set avatar_class = user.vip == 1 ? 'avatar vip' : 'avatar' %} {% set avatar_class = user.vip == 1 ? 'avatar vip' : 'avatar' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
@ -15,7 +13,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a> <a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a>
</div> </div>
<div class="title layui-elip">{{ user.title }}</div> <div class="title layui-elip">{{ user.title|default('暂露头角') }}</div>
<div class="action"> <div class="action">
<span class="layui-btn apply-friend" data-id="{{ user.id }}" data-name="{{ user.name }}" data-avatar="{{ user.avatar }}">添加好友</span> <span class="layui-btn apply-friend" data-id="{{ user.id }}" data-name="{{ user.name }}" data-avatar="{{ user.avatar }}">添加好友</span>
</div> </div>

View File

@ -11,7 +11,7 @@
</div> </div>
<div class="info"> <div class="info">
<div class="title layui-elip"> <div class="title layui-elip">
<a href="{{ course_url }}" target="_blank">{{ item.title }}</a> <a href="{{ article_url }}" target="_blank">{{ item.title }}</a>
</div> </div>
<div class="summary">{{ item.summary }}</div> <div class="summary">{{ item.summary }}</div>
<div class="meta"> <div class="meta">

View File

@ -2,8 +2,6 @@
<div class="user-list teacher-list clearfix"> <div class="user-list teacher-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set item.title = item.title ? item.title : '小小教书匠' %}
{% set item.about = item.about ? item.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'home.teacher.show','id':item.id}) %} {% set user_url = url({'for':'home.teacher.show','id':item.id}) %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">
@ -15,7 +13,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a> <a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
</div> </div>
<div class="title layui-elip">{{ item.title }}</div> <div class="title layui-elip">{{ item.title|default('小小教书匠') }}</div>
<div class="action"> <div class="action">
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span> <span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
</div> </div>

View File

@ -4,8 +4,6 @@
<div class="user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set item.title = item.title ? item.title : '暂露头角' %}
{% set item.about = item.about ? item.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'home.user.show','id':item.id}) %} {% set user_url = url({'for':'home.user.show','id':item.id}) %}
{% set avatar_class = item.vip == 1 ? 'avatar vip' : 'avatar' %} {% set avatar_class = item.vip == 1 ? 'avatar vip' : 'avatar' %}
<div class="layui-col-md2"> <div class="layui-col-md2">
@ -18,7 +16,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a> <a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
</div> </div>
<div class="title layui-elip">{{ item.title }}</div> <div class="title layui-elip">{{ item.title|default('暂露头角') }}</div>
<div class="action"> <div class="action">
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span> <span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
</div> </div>

View File

@ -5,7 +5,6 @@
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set group_url = url({'for':'home.im_group.show','id':item.id}) %} {% set group_url = url({'for':'home.im_group.show','id':item.id}) %}
{% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %}
<div class="layui-col-md3"> <div class="layui-col-md3">
<div class="user-card"> <div class="user-card">
<span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span> <span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span>

View File

@ -2,13 +2,8 @@
{% block content %} {% block content %}
{{ partial('macros/course') }}
{{ partial('macros/user') }} {{ partial('macros/user') }}
{% set full_user_url = full_url({'for':'home.user.show','id':user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_user_url}) %}
{% set user.area = user.area ? user.area : '火星' %}
{% set user.about = user.about ? user.about : '这个家伙很懒,什么都没留下!' %}
{% set avatar_class = user.vip == 1 ? 'avatar vip' : 'avatar' %} {% set avatar_class = user.vip == 1 ? 'avatar vip' : 'avatar' %}
<div class="breadcrumb"> <div class="breadcrumb">
@ -30,11 +25,20 @@
<img src="{{ user.avatar }}!avatar_160" alt="{{ user.name }}"> <img src="{{ user.avatar }}!avatar_160" alt="{{ user.name }}">
</div> </div>
<div class="info"> <div class="info">
<p><span class="name">{{ user.name }}</span><span>{{ gender_icon(user.gender) }}</span></p> <p>
<p><span><i class="layui-icon layui-icon-location"></i></span><span>{{ user.area }}</span></p> <span class="name">{{ user.name }}</span>
<p><span><i class="layui-icon layui-icon-time"></i></span><span>{{ date('Y-m-d H:i',user.active_time) }}</span></p> <span>{{ gender_icon(user.gender) }}</span>
</p>
<p>
<span><i class="layui-icon layui-icon-location"></i></span>
<span>{{ user.area|default('火星') }}</span>
</p>
<p>
<span><i class="layui-icon layui-icon-time"></i></span>
<span title="{{ date('Y-m-d H:i:s',user.active_time) }}">{{ user.active_time|time_ago }}</span>
</p>
</div> </div>
<div class="about">{{ user.about }}</div> <div class="about">{{ user.about|default('这个家伙很懒,什么都没留下') }}</div>
</div> </div>
{% set show_tab_courses = user.course_count > 0 %} {% set show_tab_courses = user.course_count > 0 %}
@ -76,10 +80,13 @@
</div> </div>
</div> </div>
{% set share_url = full_url({'for':'home.share'},{'id':user.id,'type':'user','referer':auth_user.id}) %}
{% set qrcode_url = url({'for':'home.qrcode'},{'text':share_url}) %}
<div class="layui-hide"> <div class="layui-hide">
<input type="hidden" name="share.title" value="{{ user.name }}"> <input type="hidden" name="share.title" value="{{ user.name }}">
<input type="hidden" name="share.pic" value="{{ user.avatar }}"> <input type="hidden" name="share.pic" value="{{ user.avatar }}">
<input type="hidden" name="share.url" value="{{ full_user_url }}"> <input type="hidden" name="share.url" value="{{ share_url }}">
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}"> <input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
</div> </div>

View File

@ -3,8 +3,6 @@
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set user_url = url({'for':'home.user.show','id':item.id}) %} {% set user_url = url({'for':'home.user.show','id':item.id}) %}
{% set item.title = item.title ? item.title : '暂露头角' %}
{% set item.about = item.about ? item.about : '这个人很懒,什么都没留下' %}
<div class="layui-col-md2"> <div class="layui-col-md2">
<div class="user-card"> <div class="user-card">
<div class="avatar"> <div class="avatar">
@ -15,7 +13,7 @@
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a> <a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
</div> </div>
<div class="title layui-elip">{{ item.title }}</div> <div class="title layui-elip">{{ item.title|default('暂露头角') }}</div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

View File

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

View File

@ -144,6 +144,10 @@ class Comment extends Model
public function beforeUpdate() public function beforeUpdate()
{ {
if ($this->deleted == 1) {
$this->published = 0;
}
$this->update_time = time(); $this->update_time = time();
} }

View File

@ -164,7 +164,7 @@ class Course extends Model
* *
* @var float * @var float
*/ */
public $rating = 0.00; public $rating = 5.00;
/** /**
* 综合得分 * 综合得分

View File

@ -23,10 +23,6 @@ class Comment extends Repository
$builder->andWhere('id = :id:', ['id' => $where['id']]); $builder->andWhere('id = :id:', ['id' => $where['id']]);
} }
if (!empty($where['parent_id'])) {
$builder->andWhere('parent_id = :parent_id:', ['parent_id' => $where['parent_id']]);
}
if (!empty($where['owner_id'])) { if (!empty($where['owner_id'])) {
$builder->andWhere('owner_id = :owner_id:', ['owner_id' => $where['owner_id']]); $builder->andWhere('owner_id = :owner_id:', ['owner_id' => $where['owner_id']]);
} }
@ -39,6 +35,10 @@ class Comment extends Repository
$builder->andWhere('item_type = :item_type:', ['item_type' => $where['item_type']]); $builder->andWhere('item_type = :item_type:', ['item_type' => $where['item_type']]);
} }
if (isset($where['parent_id'])) {
$builder->andWhere('parent_id = :parent_id:', ['parent_id' => $where['parent_id']]);
}
if (isset($where['published'])) { if (isset($where['published'])) {
$builder->andWhere('published = :published:', ['published' => $where['published']]); $builder->andWhere('published = :published:', ['published' => $where['published']]);
} }

View File

@ -4,6 +4,8 @@ namespace App\Repos;
use App\Models\CommentLike as CommentLikeModel; use App\Models\CommentLike as CommentLikeModel;
use Phalcon\Mvc\Model; use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class CommentLike extends Repository class CommentLike extends Repository
{ {
@ -21,4 +23,15 @@ class CommentLike extends Repository
]); ]);
} }
/**
* @param int $userId
* @return ResultsetInterface|Resultset|CommentLikeModel[]
*/
public function findByUserId($userId)
{
return CommentLikeModel::query()
->where('user_id = :user_id:', ['user_id' => $userId])
->execute();
}
} }

View File

@ -4,6 +4,8 @@ namespace App\Repos;
use App\Models\ConsultLike as ConsultLikeModel; use App\Models\ConsultLike as ConsultLikeModel;
use Phalcon\Mvc\Model; use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ConsultLike extends Repository class ConsultLike extends Repository
{ {
@ -21,4 +23,15 @@ class ConsultLike extends Repository
]); ]);
} }
/**
* @param int $userId
* @return ResultsetInterface|Resultset|ConsultLikeModel[]
*/
public function findByUserId($userId)
{
return ConsultLikeModel::query()
->where('user_id = :user_id:', ['user_id' => $userId])
->execute();
}
} }

View File

@ -4,6 +4,8 @@ namespace App\Repos;
use App\Models\ReviewLike as ReviewLikeModel; use App\Models\ReviewLike as ReviewLikeModel;
use Phalcon\Mvc\Model; use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Resultset;
use Phalcon\Mvc\Model\ResultsetInterface;
class ReviewLike extends Repository class ReviewLike extends Repository
{ {
@ -21,4 +23,15 @@ class ReviewLike extends Repository
]); ]);
} }
/**
* @param int $userId
* @return ResultsetInterface|Resultset|ReviewLikeModel[]
*/
public function findByUserId($userId)
{
return ReviewLikeModel::query()
->where('user_id = :user_id:', ['user_id' => $userId])
->execute();
}
} }

View File

@ -48,6 +48,7 @@ class ArticleInfo extends LogicService
'category' => $category, 'category' => $category,
'owner' => $owner, 'owner' => $owner,
'me' => $me, 'me' => $me,
'allow_comment' => $article->allow_comment,
'source_type' => $article->source_type, 'source_type' => $article->source_type,
'source_url' => $article->source_url, 'source_url' => $article->source_url,
'word_count' => $article->word_count, 'word_count' => $article->word_count,
@ -56,7 +57,6 @@ class ArticleInfo extends LogicService
'comment_count' => $article->comment_count, 'comment_count' => $article->comment_count,
'favorite_count' => $article->favorite_count, 'favorite_count' => $article->favorite_count,
'create_time' => $article->create_time, 'create_time' => $article->create_time,
'update_time' => $article->update_time,
]; ];
} }
@ -67,8 +67,6 @@ class ArticleInfo extends LogicService
'favorited' => 0, 'favorited' => 0,
]; ];
$me['allow_comment'] = $article->allow_comment ? 1 : 0;
if ($user->id > 0) { if ($user->id > 0) {
$likeRepo = new ArticleLikeRepo(); $likeRepo = new ArticleLikeRepo();

View File

@ -6,12 +6,14 @@ use App\Library\Paginator\Query as PagerQuery;
use App\Models\Comment as CommentModel; use App\Models\Comment as CommentModel;
use App\Repos\Comment as CommentRepo; use App\Repos\Comment as CommentRepo;
use App\Services\Logic\ArticleTrait; use App\Services\Logic\ArticleTrait;
use App\Services\Logic\Comment\CommentList as CommentListService; use App\Services\Logic\Comment\CommentListTrait;
use App\Services\Logic\Service as LogicService;
class CommentList extends CommentListService class CommentList extends LogicService
{ {
use ArticleTrait; use ArticleTrait;
use CommentListTrait;
public function handle($id) public function handle($id)
{ {
@ -33,7 +35,7 @@ class CommentList extends CommentListService
$pager = $commentRepo->paginate($params, $sort, $page, $limit); $pager = $commentRepo->paginate($params, $sort, $page, $limit);
return $this->handlePager($pager); return $this->handleComments($pager);
} }
} }

View File

@ -72,6 +72,7 @@ class BasicInfo extends LogicService
'model' => $chapter->model, 'model' => $chapter->model,
'play_urls' => $playUrls, 'play_urls' => $playUrls,
'resource_count' => $chapter->resource_count, 'resource_count' => $chapter->resource_count,
'comment_count' => $chapter->comment_count,
'consult_count' => $chapter->consult_count, 'consult_count' => $chapter->consult_count,
'user_count' => $chapter->user_count, 'user_count' => $chapter->user_count,
'like_count' => $chapter->like_count, 'like_count' => $chapter->like_count,
@ -100,6 +101,7 @@ class BasicInfo extends LogicService
'end_time' => $live->end_time, 'end_time' => $live->end_time,
'status' => $live->status, 'status' => $live->status,
'resource_count' => $chapter->resource_count, 'resource_count' => $chapter->resource_count,
'comment_count' => $chapter->comment_count,
'consult_count' => $chapter->consult_count, 'consult_count' => $chapter->consult_count,
'user_count' => $chapter->user_count, 'user_count' => $chapter->user_count,
'like_count' => $chapter->like_count, 'like_count' => $chapter->like_count,
@ -121,6 +123,7 @@ class BasicInfo extends LogicService
'model' => $chapter->model, 'model' => $chapter->model,
'content' => $read->content, 'content' => $read->content,
'resource_count' => $chapter->resource_count, 'resource_count' => $chapter->resource_count,
'comment_count' => $chapter->comment_count,
'consult_count' => $chapter->consult_count, 'consult_count' => $chapter->consult_count,
'user_count' => $chapter->user_count, 'user_count' => $chapter->user_count,
'like_count' => $chapter->like_count, 'like_count' => $chapter->like_count,

View File

@ -194,6 +194,13 @@ class ChapterInfo extends LogicService
$chapter->user_count += 1; $chapter->user_count += 1;
$chapter->update(); $chapter->update();
$parent = $this->checkChapter($chapter->parent_id);
$parent->user_count += 1;
$parent->update();
} }
protected function incrGroupUserCount(ImGroupModel $group) protected function incrGroupUserCount(ImGroupModel $group)

View File

@ -64,6 +64,12 @@ class ChapterLike extends LogicService
$chapter->like_count += 1; $chapter->like_count += 1;
$chapter->update(); $chapter->update();
$parent = $this->checkChapter($chapter->parent_id);
$parent->like_count += 1;
$parent->update();
} }
protected function decrChapterLikeCount(ChapterModel $chapter) protected function decrChapterLikeCount(ChapterModel $chapter)
@ -72,6 +78,13 @@ class ChapterLike extends LogicService
$chapter->like_count -= 1; $chapter->like_count -= 1;
$chapter->update(); $chapter->update();
} }
$parent = $this->checkChapter($chapter->parent_id);
if ($parent->like_count > 0) {
$parent->like_count -= 1;
$parent->update();
}
} }
protected function incrUserDailyChapterLikeCount(UserModel $user) protected function incrUserDailyChapterLikeCount(UserModel $user)

View File

@ -0,0 +1,41 @@
<?php
namespace App\Services\Logic\Chapter;
use App\Library\Paginator\Query as PagerQuery;
use App\Models\Comment as CommentModel;
use App\Repos\Comment as CommentRepo;
use App\Services\Logic\ChapterTrait;
use App\Services\Logic\Comment\CommentListTrait;
use App\Services\Logic\Service as LogicService;
class CommentList extends LogicService
{
use ChapterTrait;
use CommentListTrait;
public function handle($id)
{
$chapter = $this->checkChapter($id);
$pagerQuery = new PagerQuery();
$params = $pagerQuery->getParams();
$params['item_type'] = CommentModel::ITEM_CHAPTER;
$params['item_id'] = $chapter->id;
$params['published'] = 1;
$sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$commentRepo = new CommentRepo();
$pager = $commentRepo->paginate($params, $sort, $page, $limit);
return $this->handleComments($pager);
}
}

View File

@ -3,14 +3,16 @@
namespace App\Services\Logic\Chapter; namespace App\Services\Logic\Chapter;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Consult as ConsultRepo;
use App\Services\Logic\ChapterTrait; use App\Services\Logic\ChapterTrait;
use App\Services\Logic\Consult\ConsultList as ConsultListHandler; use App\Services\Logic\Course\ConsultListTrait;
use App\Services\Logic\Service as LogicService; use App\Services\Logic\Service as LogicService;
class ConsultList extends LogicService class ConsultList extends LogicService
{ {
use ChapterTrait; use ChapterTrait;
use ConsultListTrait;
public function handle($id) public function handle($id)
{ {
@ -28,9 +30,11 @@ class ConsultList extends LogicService
'published' => 1, 'published' => 1,
]; ];
$service = new ConsultListHandler(); $consultRepo = new ConsultRepo();
return $service->paginate($params, $sort, $page, $limit); $pager = $consultRepo->paginate($params, $sort, $page, $limit);
return $this->handleConsults($pager);
} }
} }

View File

@ -0,0 +1,83 @@
<?php
namespace App\Services\Logic\Comment;
use App\Models\Article as ArticleModel;
use App\Models\Chapter as ChapterModel;
use App\Models\Comment as CommentModel;
use App\Models\User as UserModel;
use Phalcon\Di as Di;
use Phalcon\Events\Manager as EventsManager;
trait CommentCountTrait
{
protected function incrCommentReplyCount(CommentModel $comment)
{
$comment->reply_count += 1;
$comment->update();
}
protected function incrChapterCommentCount(ChapterModel $chapter)
{
$chapter->comment_count += 1;
$chapter->update();
$parent = $this->checkChapter($chapter->parent_id);
$parent->comment_count += 1;
$parent->update();
}
protected function incrArticleCommentCount(ArticleModel $article)
{
$article->comment_count += 1;
$article->update();
}
protected function decrCommentReplyCount(CommentModel $comment)
{
if ($comment->reply_count > 0) {
$comment->reply_count -= 1;
$comment->update();
}
}
protected function decrChapterCommentCount(ChapterModel $chapter)
{
if ($chapter->comment_count > 0) {
$chapter->comment_count -= 1;
$chapter->update();
}
$parent = $this->checkChapter($chapter->parent_id);
if ($parent->comment_count > 0) {
$parent->comment_count -= 1;
$parent->update();
}
}
protected function decrArticleCommentCount(ArticleModel $article)
{
if ($article->comment_count > 0) {
$article->comment_count -= 1;
$article->update();
}
}
protected function incrUserDailyCommentCount(UserModel $user)
{
/**
* @var EventsManager $eventsManager
*/
$eventsManager = Di::getDefault()->get('eventsManager');
$eventsManager->fire('UserDailyCounter:incrCommentCount', $this, $user);
}
}

View File

@ -2,11 +2,11 @@
namespace App\Services\Logic\Comment; namespace App\Services\Logic\Comment;
use App\Models\Article as ArticleModel;
use App\Models\Comment as CommentModel; use App\Models\Comment as CommentModel;
use App\Models\User as UserModel;
use App\Services\Logic\ArticleTrait; use App\Services\Logic\ArticleTrait;
use App\Services\Logic\ChapterTrait;
use App\Services\Logic\Service as LogicService; use App\Services\Logic\Service as LogicService;
use App\Traits\Client as ClientTrait;
use App\Validators\Comment as CommentValidator; use App\Validators\Comment as CommentValidator;
use App\Validators\UserLimit as UserLimitValidator; use App\Validators\UserLimit as UserLimitValidator;
@ -14,6 +14,9 @@ class CommentCreate extends LogicService
{ {
use ArticleTrait; use ArticleTrait;
use ChapterTrait;
use ClientTrait;
use CommentCountTrait;
public function handle() public function handle()
{ {
@ -32,19 +35,26 @@ class CommentCreate extends LogicService
$comment = new CommentModel(); $comment = new CommentModel();
$data = [ $data = [
'item_id' => $post['item_id'],
'item_type' => $post['item_type'],
'owner_id' => $user->id, 'owner_id' => $user->id,
'published' => 1, 'published' => 1,
]; ];
$data['content'] = $validator->checkContent($post['content']); $data['content'] = $validator->checkContent($post['content']);
$data['client_type'] = $this->getClientType();
$data['client_ip'] = $this->getClientIp();
if (isset($post['to_user_id'])) { if ($post['item_type'] == CommentModel::ITEM_CHAPTER) {
$toUser = $validator->checkToUser($post['to_user_id']);
$data['to_user_id'] = $toUser->id; $chapter = $this->checkChapter($post['item_id']);
}
$this->incrChapterCommentCount($chapter);
} elseif ($post['item_type'] == CommentModel::ITEM_ARTICLE) {
if ($post['item_type'] == CommentModel::ITEM_ARTICLE) {
$article = $this->checkArticle($post['item_id']); $article = $this->checkArticle($post['item_id']);
$this->incrArticleCommentCount($article); $this->incrArticleCommentCount($article);
} }
@ -55,16 +65,4 @@ class CommentCreate extends LogicService
return $comment; return $comment;
} }
protected function incrArticleCommentCount(ArticleModel $article)
{
$article->comment_count += 1;
$article->update();
}
protected function incrUserDailyCommentCount(UserModel $user)
{
$this->eventsManager->fire('UserDailyCounter:incrCommentCount', $this, $user);
}
} }

View File

@ -2,9 +2,9 @@
namespace App\Services\Logic\Comment; namespace App\Services\Logic\Comment;
use App\Models\Article as ArticleModel;
use App\Models\Comment as CommentModel; use App\Models\Comment as CommentModel;
use App\Services\Logic\ArticleTrait; use App\Services\Logic\ArticleTrait;
use App\Services\Logic\ChapterTrait;
use App\Services\Logic\CommentTrait; use App\Services\Logic\CommentTrait;
use App\Services\Logic\Service as LogicService; use App\Services\Logic\Service as LogicService;
use App\Validators\Comment as CommentValidator; use App\Validators\Comment as CommentValidator;
@ -13,7 +13,9 @@ class CommentDelete extends LogicService
{ {
use ArticleTrait; use ArticleTrait;
use ChapterTrait;
use CommentTrait; use CommentTrait;
use CommentCountTrait;
public function handle($id) public function handle($id)
{ {
@ -29,18 +31,25 @@ class CommentDelete extends LogicService
$comment->update(); $comment->update();
if ($comment->item_type == CommentModel::ITEM_ARTICLE) { if ($comment->parent_id > 0) {
$parent = $this->checkComment($comment->parent_id);
$this->decrCommentReplyCount($parent);
}
if ($comment->item_type == CommentModel::ITEM_CHAPTER) {
$chapter = $this->checkChapter($comment->item_id);
$this->decrChapterCommentCount($chapter);
} elseif ($comment->item_type == CommentModel::ITEM_ARTICLE) {
$article = $this->checkArticle($comment->item_id); $article = $this->checkArticle($comment->item_id);
$this->decrArticleCommentCount($article); $this->decrArticleCommentCount($article);
} }
} }
protected function decrArticleCommentCount(ArticleModel $article)
{
if ($article->comment_count > 0) {
$article->comment_count -= 1;
$article->update();
}
}
} }

View File

@ -21,13 +21,18 @@ class CommentInfo extends LogicService
protected function handleComment(CommentModel $comment) protected function handleComment(CommentModel $comment)
{ {
$owner = $this->handleOwnerInfo($comment); $owner = $comment->owner_id > 0 ? $this->handleOwnerInfo($comment) : new \stdClass();
$toUser = $comment->to_user_id > 0 ? $this->handleToUserInfo($comment) : new \stdClass();
return [ return [
'id' => $comment->id, 'id' => $comment->id,
'owner' => $owner,
'content' => $comment->content, 'content' => $comment->content,
'parent_id' => $comment->parent_id,
'like_count' => $comment->like_count,
'reply_count' => $comment->reply_count,
'create_time' => $comment->create_time, 'create_time' => $comment->create_time,
'owner' => $owner,
'to_user' => $toUser,
]; ];
} }
@ -35,12 +40,25 @@ class CommentInfo extends LogicService
{ {
$userRepo = new UserRepo(); $userRepo = new UserRepo();
$owner = $userRepo->findById($comment->owner_id); $user = $userRepo->findById($comment->owner_id);
return [ return [
'id' => $owner->id, 'id' => $user->id,
'name' => $owner->name, 'name' => $user->name,
'avatar' => $owner->avatar, 'avatar' => $user->avatar,
];
}
protected function handleToUserInfo(CommentModel $comment)
{
$userRepo = new UserRepo();
$user = $userRepo->findById($comment->to_user_id);
return [
'id' => $user->id,
'name' => $user->name,
'avatar' => $user->avatar,
]; ];
} }

View File

@ -2,45 +2,33 @@
namespace App\Services\Logic\Comment; namespace App\Services\Logic\Comment;
use App\Builders\CommentList as CommentListBuilder; use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Comment as CommentRepo;
use App\Services\Logic\Service as LogicService; use App\Services\Logic\Service as LogicService;
class CommentList extends LogicService class CommentList extends LogicService
{ {
protected function handlePager($pager) use CommentListTrait;
public function handle()
{ {
if ($pager->total_items == 0) { $pagerQuery = new PagerQuery();
return $pager;
}
$comments = $pager->items->toArray(); $params = $pagerQuery->getParams();
$builder = new CommentListBuilder(); $params['parent_id'] = 0;
$params['published'] = 1;
$users = $builder->getUsers($comments); $sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$items = []; $commentRepo = new CommentRepo();
foreach ($comments as $comment) { $pager = $commentRepo->paginate($params, $sort, $page, $limit);
$owner = $users[$comment['owner_id']] ?? new \stdClass(); return $this->handleComments($pager);
$toUser = $users[$comment['to_user_id']] ?? new \stdClass();
$items[] = [
'id' => $comment['id'],
'content' => $comment['content'],
'owner' => $owner,
'to_user' => $toUser,
'like_count' => $comment['like_count'],
'reply_count' => $comment['reply_count'],
'create_time' => $comment['create_time'],
];
}
$pager->items = $items;
return $pager;
} }
} }

View File

@ -0,0 +1,75 @@
<?php
namespace App\Services\Logic\Comment;
use App\Builders\CommentList as CommentListBuilder;
use App\Repos\CommentLike as CommentLikeRepo;
trait CommentListTrait
{
public function handleComments($pager)
{
if ($pager->total_items == 0) {
return $pager;
}
$comments = $pager->items->toArray();
$builder = new CommentListBuilder();
$users = $builder->getUsers($comments);
$meMappings = $this->getMeMappings($comments);
$items = [];
foreach ($comments as $comment) {
$owner = $users[$comment['owner_id']] ?? new \stdClass();
$toUser = $users[$comment['to_user_id']] ?? new \stdClass();
$me = $meMappings[$comment['id']];
$items[] = [
'id' => $comment['id'],
'content' => $comment['content'],
'parent_id' => $comment['parent_id'],
'like_count' => $comment['like_count'],
'reply_count' => $comment['reply_count'],
'create_time' => $comment['create_time'],
'to_user' => $toUser,
'owner' => $owner,
'me' => $me,
];
}
$pager->items = $items;
return $pager;
}
protected function getMeMappings($comments)
{
$user = $this->getCurrentUser(true);
$likeRepo = new CommentLikeRepo();
$likedIds = [];
if ($user->id > 0) {
$likes = $likeRepo->findByUserId($user->id);
$likedIds = array_column($likes->toArray(), 'comment_id');
}
$result = [];
foreach ($comments as $comment) {
$result[$comment['id']] = [
'liked' => in_array($comment['id'], $likedIds) ? 1 : 0,
];
}
return $result;
}
}

View File

@ -0,0 +1,81 @@
<?php
namespace App\Services\Logic\Comment;
use App\Models\Comment as CommentModel;
use App\Services\Logic\ArticleTrait;
use App\Services\Logic\ChapterTrait;
use App\Services\Logic\CommentTrait;
use App\Services\Logic\Service as LogicService;
use App\Traits\Client as ClientTrait;
use App\Validators\Comment as CommentValidator;
use App\Validators\UserLimit as UserLimitValidator;
class CommentReply extends LogicService
{
use ArticleTrait;
use ChapterTrait;
use ClientTrait;
use CommentTrait;
use CommentCountTrait;
public function handle($id)
{
$post = $this->request->getPost();
$user = $this->getLoginUser();
$comment = $this->checkComment($id);
$validator = new UserLimitValidator();
$validator->checkDailyCommentLimit($user);
$parent = $comment;
$validator = new CommentValidator();
$data = [
'parent_id' => $parent->id,
'item_id' => $comment->item_id,
'item_type' => $comment->item_type,
'owner_id' => $user->id,
'published' => 1,
];
if ($comment->parent_id > 0) {
$parent = $validator->checkParent($comment->parent_id);
$data['parent_id'] = $parent->id;
$data['to_user_id'] = $comment->owner_id;
}
$data['content'] = $validator->checkContent($post['content']);
$data['client_type'] = $this->getClientType();
$data['client_ip'] = $this->getClientIp();
$comment = new CommentModel();
$comment->create($data);
$this->incrCommentReplyCount($parent);
if ($comment->item_type == CommentModel::ITEM_CHAPTER) {
$chapter = $this->checkChapter($comment->item_id);
$this->incrChapterCommentCount($chapter);
} elseif ($comment->item_type == CommentModel::ITEM_ARTICLE) {
$article = $this->checkArticle($comment->item_id);
$this->incrArticleCommentCount($article);
}
$this->incrUserDailyCommentCount($user);
return $comment;
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Services\Logic\Comment;
use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Comment as CommentRepo;
use App\Services\Logic\CommentTrait;
use App\Services\Logic\Service as LogicService;
class ReplyList extends LogicService
{
use CommentTrait;
use CommentListTrait;
public function handle($id)
{
$pagerQuery = new PagerQuery();
$params = $pagerQuery->getParams();
$params['parent_id'] = $id;
$params['published'] = 1;
$sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$commentRepo = new CommentRepo();
$pager = $commentRepo->paginate($params, $sort, $page, $limit);
return $this->handlePager($pager);
}
}

View File

@ -2,7 +2,6 @@
namespace App\Services\Logic\Course; namespace App\Services\Logic\Course;
use App\Builders\ConsultList as ConsultListBuilder;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Consult as ConsultRepo; use App\Repos\Consult as ConsultRepo;
use App\Services\Logic\CourseTrait; use App\Services\Logic\CourseTrait;
@ -12,6 +11,7 @@ class ConsultList extends LogicService
{ {
use CourseTrait; use CourseTrait;
use ConsultListTrait;
public function handle($id) public function handle($id)
{ {
@ -36,39 +36,4 @@ class ConsultList extends LogicService
return $this->handleConsults($pager); return $this->handleConsults($pager);
} }
protected function handleConsults($pager)
{
if ($pager->total_items == 0) {
return $pager;
}
$consults = $pager->items->toArray();
$builder = new ConsultListBuilder();
$users = $builder->getUsers($consults);
$items = [];
foreach ($consults as $consult) {
$owner = $users[$consult['owner_id']] ?? new \stdClass();
$items[] = [
'id' => $consult['id'],
'question' => $consult['question'],
'answer' => $consult['answer'],
'like_count' => $consult['like_count'],
'reply_time' => $consult['reply_time'],
'create_time' => $consult['create_time'],
'update_time' => $consult['update_time'],
'owner' => $owner,
];
}
$pager->items = $items;
return $pager;
}
} }

View File

@ -1,23 +1,13 @@
<?php <?php
namespace App\Services\Logic\Consult; namespace App\Services\Logic\Course;
use App\Builders\ConsultList as ConsultListBuilder; use App\Builders\ConsultList as ConsultListBuilder;
use App\Repos\Consult as ConsultRepo; use App\Repos\ConsultLike as ConsultLikeRepo;
use App\Services\Logic\Service as LogicService;
class ConsultList extends LogicService trait ConsultListTrait
{ {
public function paginate($params, $sort, $page, $limit)
{
$consultRepo = new ConsultRepo();
$pager = $consultRepo->paginate($params, $sort, $page, $limit);
return $this->handleConsults($pager);
}
protected function handleConsults($pager) protected function handleConsults($pager)
{ {
if ($pager->total_items == 0) { if ($pager->total_items == 0) {
@ -30,11 +20,14 @@ class ConsultList extends LogicService
$users = $builder->getUsers($consults); $users = $builder->getUsers($consults);
$meMappings = $this->getMeMappings($consults);
$items = []; $items = [];
foreach ($consults as $consult) { foreach ($consults as $consult) {
$owner = $users[$consult['owner_id']] ?? new \stdClass(); $owner = $users[$consult['owner_id']] ?? new \stdClass();
$me = $meMappings[$consult['id']];
$items[] = [ $items[] = [
'id' => $consult['id'], 'id' => $consult['id'],
@ -43,8 +36,8 @@ class ConsultList extends LogicService
'like_count' => $consult['like_count'], 'like_count' => $consult['like_count'],
'reply_time' => $consult['reply_time'], 'reply_time' => $consult['reply_time'],
'create_time' => $consult['create_time'], 'create_time' => $consult['create_time'],
'update_time' => $consult['update_time'],
'owner' => $owner, 'owner' => $owner,
'me' => $me,
]; ];
} }
@ -53,4 +46,28 @@ class ConsultList extends LogicService
return $pager; return $pager;
} }
protected function getMeMappings($consults)
{
$user = $this->getCurrentUser(true);
$likeRepo = new ConsultLikeRepo();
$likedIds = [];
if ($user->id > 0) {
$likes = $likeRepo->findByUserId($user->id);
$likedIds = array_column($likes->toArray(), 'consult_id');
}
$result = [];
foreach ($consults as $consult) {
$result[$consult['id']] = [
'liked' => in_array($consult['id'], $likedIds) ? 1 : 0,
];
}
return $result;
}
} }

View File

@ -5,6 +5,7 @@ namespace App\Services\Logic\Course;
use App\Builders\ReviewList as ReviewListBuilder; use App\Builders\ReviewList as ReviewListBuilder;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Repos\Review as ReviewRepo; use App\Repos\Review as ReviewRepo;
use App\Repos\ReviewLike as ReviewLikeRepo;
use App\Services\Logic\CourseTrait; use App\Services\Logic\CourseTrait;
use App\Services\Logic\Service as LogicService; use App\Services\Logic\Service as LogicService;
@ -47,11 +48,14 @@ class ReviewList extends LogicService
$users = $builder->getUsers($reviews); $users = $builder->getUsers($reviews);
$meMappings = $this->getMeMappings($reviews);
$items = []; $items = [];
foreach ($reviews as $review) { foreach ($reviews as $review) {
$owner = $users[$review['owner_id']] ?? new \stdClass(); $owner = $users[$review['owner_id']] ?? new \stdClass();
$me = $meMappings[$review['id']];
$items[] = [ $items[] = [
'id' => $review['id'], 'id' => $review['id'],
@ -60,6 +64,7 @@ class ReviewList extends LogicService
'like_count' => $review['like_count'], 'like_count' => $review['like_count'],
'create_time' => $review['create_time'], 'create_time' => $review['create_time'],
'owner' => $owner, 'owner' => $owner,
'me' => $me,
]; ];
} }
@ -68,4 +73,28 @@ class ReviewList extends LogicService
return $pager; return $pager;
} }
protected function getMeMappings($consults)
{
$user = $this->getCurrentUser(true);
$likeRepo = new ReviewLikeRepo();
$likedIds = [];
if ($user->id > 0) {
$likes = $likeRepo->findByUserId($user->id);
$likedIds = array_column($likes->toArray(), 'review_id');
}
$result = [];
foreach ($consults as $consult) {
$result[$consult['id']] = [
'liked' => in_array($consult['id'], $likedIds) ? 1 : 0,
];
}
return $result;
}
} }

View File

@ -76,7 +76,6 @@ class ConsultList extends LogicService
'like_count' => $consult['like_count'], 'like_count' => $consult['like_count'],
'reply_time' => $consult['reply_time'], 'reply_time' => $consult['reply_time'],
'create_time' => $consult['create_time'], 'create_time' => $consult['create_time'],
'update_time' => $consult['update_time'],
'course' => $course, 'course' => $course,
'chapter' => $chapter, 'chapter' => $chapter,
'owner' => $owner, 'owner' => $owner,

View File

@ -60,7 +60,6 @@ class ConsultList extends LogicService
'like_count' => $consult['like_count'], 'like_count' => $consult['like_count'],
'reply_time' => $consult['reply_time'], 'reply_time' => $consult['reply_time'],
'create_time' => $consult['create_time'], 'create_time' => $consult['create_time'],
'update_time' => $consult['update_time'],
'course' => $course, 'course' => $course,
'chapter' => $chapter, 'chapter' => $chapter,
]; ];

View File

@ -71,13 +71,11 @@
.qrcode img { .qrcode img {
width: 160px; width: 160px;
height: 160px; height: 160px;
border: 3px dashed #ccc;
} }
.qrcode-sm img { .qrcode-sm img {
width: 100px; width: 100px;
height: 100px; height: 100px;
border: 3px dashed #ccc;
} }
.breadcrumb { .breadcrumb {
@ -532,18 +530,138 @@
color: #666; color: #666;
} }
.action-sticky { #comment-form {
margin-bottom: 30px;
}
.comment-form {
margin-top: 20px;
margin-bottom: 20px;
}
.comment-form .footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
}
.comment-form .layui-textarea {
min-height: 40px;
}
.comment-card {
position: relative;
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px solid #f6f6f6;
}
.comment-card:last-child {
border-bottom: none;
}
.comment-card .avatar {
float: left;
width: 48px;
height: 48px;
margin-right: 15px;
}
.comment-card .avatar img {
width: 100%;
height: 100%;
border-radius: 60px;
}
.comment-card .info {
float: left;
width: 690px;
}
.comment-card .title {
margin-bottom: 10px;
color: #333;
}
.comment-card .user {
margin-bottom: 10px;
color: #666;
}
.comment-card .user .separator {
margin: 0 10px;
}
.comment-card .content {
margin-bottom: 10px;
line-height: 1.5em;
max-height: 6em;
overflow-wrap: break-word;
white-space: pre-wrap;
overflow: hidden;
color: #666;
}
.comment-card .footer {
display: flex;
justify-content: space-between;
line-height: 1.2em;
color: #999;
}
.comment-card .footer .left,
.comment-card .footer .right {
display: flex;
}
.comment-card .footer .column {
margin-right: 10px;
}
.comment-card .footer .column:last-child {
margin-right: 0;
}
.comment-card .footer .action:hover {
background-color: #393D49;
cursor: pointer;
color: white;
}
.comment-card .action-reply,
.comment-card .action-report,
.comment-card .action-delete {
display: none;
}
.comment-card .info:hover .action-reply,
.comment-card .info:hover .action-report,
.comment-card .info:hover .action-delete {
display: inline;
}
.reply-list {
margin-left: 48px;
}
.reply-list .comment-card .info {
float: left;
width: 640px;
}
.toolbar-sticky {
position: fixed; position: fixed;
top: 150px; top: 150px;
margin-left: -65px; margin-left: -65px;
} }
.action-sticky .item { .toolbar-sticky .item {
margin-bottom: 15px; margin-bottom: 15px;
text-align: center; text-align: center;
} }
.action-sticky .item .icon { .toolbar-sticky .item .icon {
width: 36px; width: 36px;
height: 36px; height: 36px;
line-height: 36px; line-height: 36px;
@ -553,18 +671,17 @@
background-color: #fff; background-color: #fff;
} }
.action-sticky .layui-icon { .toolbar-sticky .layui-icon {
color: #999; color: #999;
cursor: pointer; cursor: pointer;
} }
.action-sticky .item .text { .toolbar-sticky .item .text {
color: #999; color: #999;
} }
.action-sticky .active, .toolbar-sticky .active,
.action-sticky .layui-icon-star-fill, .toolbar-sticky .layui-icon-star-fill {
.action-sticky .layui-icon:hover {
color: orange; color: orange;
} }
@ -904,31 +1021,6 @@
.review-card { .review-card {
position: relative; position: relative;
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px dashed #ccc;
}
.review-card:last-child {
border-bottom: none;
}
.review-card .avatar {
float: left;
width: 60px;
height: 60px;
margin-right: 15px;
}
.review-card .avatar img {
width: 100%;
height: 100%;
border-radius: 60px;
}
.review-card .info {
float: left;
width: 650px;
} }
.review-card .rating, .review-card .more { .review-card .rating, .review-card .more {
@ -948,47 +1040,6 @@
cursor: pointer; cursor: pointer;
} }
.review-card .title {
margin-bottom: 10px;
}
.review-card .user {
margin-bottom: 15px;
color: #666;
}
.review-card .content {
margin-bottom: 15px;
line-height: 1.5em;
max-height: 6em;
overflow-wrap: break-word;
white-space: pre-wrap;
overflow: hidden;
color: #666;
}
.review-card .footer {
line-height: 1.2em;
color: #666;
}
.review-card .footer span {
margin-right: 10px;
}
.like .icon-praise {
margin-right: 5px;
cursor: pointer;
}
.like .active, .like .icon-praise:hover {
color: orange;
}
.like .like-count {
font-style: normal;
}
.sidebar-card .layui-card-header { .sidebar-card .layui-card-header {
text-align: center; text-align: center;
} }
@ -1105,7 +1156,7 @@
.read-info { .read-info {
min-height: 428px; min-height: 428px;
margin-bottom: 0; margin-bottom: 20px;
} }
.share .layui-icon { .share .layui-icon {
@ -1113,14 +1164,11 @@
cursor: pointer; cursor: pointer;
} }
.share .active,
.share .layui-icon-star-fill { .share .layui-icon-star-fill {
color: orange; color: orange;
} }
.share .active, .share .layui-icon:hover {
color: orange;
}
.share a { .share a {
margin-right: 5px; margin-right: 5px;
} }
@ -1167,7 +1215,7 @@
position: relative; position: relative;
width: 760px; width: 760px;
height: 428px; height: 428px;
margin-bottom: 0; margin-bottom: 20px;
} }
.chat-wrap .layui-card-header { .chat-wrap .layui-card-header {
@ -1387,7 +1435,6 @@
#pay-layer .qrcode img { #pay-layer .qrcode img {
width: 160px; width: 160px;
height: 160px; height: 160px;
border: 3px dashed #ccc;
} }
#pay-layer .success-tips { #pay-layer .success-tips {

View File

@ -3,15 +3,22 @@ layui.use(['jquery', 'helper'], function () {
var $ = layui.jquery; var $ = layui.jquery;
var helper = layui.helper; var helper = layui.helper;
var $related = $('#related-article-list'); var $relatedList = $('#related-article-list');
var $commentList = $('#comment-list');
helper.ajaxLoadHtml($related.data('url'), $related.attr('id')); if ($relatedList.length > 0) {
helper.ajaxLoadHtml($relatedList.data('url'), $relatedList.attr('id'));
}
if ($commentList.length > 0) {
helper.ajaxLoadHtml($commentList.data('url'), $commentList.attr('id'));
}
$('.icon-star').on('click', function () { $('.icon-star').on('click', function () {
var $this = $(this); var $this = $(this);
var $parent = $this.parent(); var $parent = $this.parent();
var $favoriteCount = $parent.next(); var $favoriteCount = $parent.next();
var favoriteCount = parseInt($favoriteCount.text()) var favoriteCount = $favoriteCount.data('count');
helper.checkLogin(function () { helper.checkLogin(function () {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
@ -20,16 +27,15 @@ layui.use(['jquery', 'helper'], function () {
if ($this.hasClass('layui-icon-star-fill')) { if ($this.hasClass('layui-icon-star-fill')) {
$this.removeClass('layui-icon-star-fill'); $this.removeClass('layui-icon-star-fill');
$this.addClass('layui-icon-star'); $this.addClass('layui-icon-star');
$parent.attr('title', '收藏'); $parent.attr('title', '收藏文章');
$favoriteCount.text(favoriteCount - 1); favoriteCount--;
favoriteCount -= 1;
} else { } else {
$this.removeClass('layui-icon-star'); $this.removeClass('layui-icon-star');
$this.addClass('layui-icon-star-fill'); $this.addClass('layui-icon-star-fill');
$parent.attr('title', '取消收藏'); $parent.attr('title', '取消收藏');
$favoriteCount.text(favoriteCount + 1); favoriteCount++;
favoriteCount += 1;
} }
$favoriteCount.data('count', favoriteCount).text(favoriteCount);
} }
}); });
}); });
@ -61,12 +67,4 @@ layui.use(['jquery', 'helper'], function () {
}); });
}); });
$('.icon-reply').on('click', function () {
console.log('scroll');
console.log($('#comment-wrap').offset().top);
$('html').animate({
scrollTop: $('#comment-wrap').offset().top
}, 500);
});
}); });

View File

@ -94,7 +94,7 @@ layui.use(['jquery', 'form', 'helper'], function () {
} }
function refreshLiveStats() { function refreshLiveStats() {
var $count = $('.layui-icon-user').next(); var $count = $('#toolbar-online > .text');
$.get(liveStatsUrl, function (res) { $.get(liveStatsUrl, function (res) {
$count.text(res.client_count); $count.text(res.client_count);
}); });

View File

@ -3,14 +3,17 @@ layui.use(['jquery', 'helper'], function () {
var $ = layui.jquery; var $ = layui.jquery;
var helper = layui.helper; var helper = layui.helper;
/** var $commentList = $('#comment-list');
* 点赞
*/ if ($commentList.length > 0) {
helper.ajaxLoadHtml($commentList.data('url'), $commentList.attr('id'));
}
$('.icon-praise').on('click', function () { $('.icon-praise').on('click', function () {
var $this = $(this); var $this = $(this);
var $parent = $this.parent(); var $parent = $this.parent();
var $likeCount = $this.next(); var $likeCount = $parent.next();
var likeCount = parseInt($likeCount.text()); var likeCount = $likeCount.data('count');
helper.checkLogin(function () { helper.checkLogin(function () {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
@ -18,23 +21,19 @@ layui.use(['jquery', 'helper'], function () {
success: function () { success: function () {
if ($this.hasClass('active')) { if ($this.hasClass('active')) {
$this.removeClass('active'); $this.removeClass('active');
$parent.attr('title', '点赞'); $parent.attr('title', '点赞支持');
$likeCount.text(likeCount - 1); likeCount--;
likeCount -= 1;
} else { } else {
$this.addClass('active'); $this.addClass('active');
$parent.attr('title', '取消点赞'); $parent.attr('title', '取消点赞');
$likeCount.text(likeCount + 1); likeCount++;
likeCount += 1;
} }
$likeCount.data('count', likeCount).text(likeCount);
} }
}); });
}); });
}); });
/**
* 咨询
*/
$('.icon-help').on('click', function () { $('.icon-help').on('click', function () {
var url = $(this).parent().data('url'); var url = $(this).parent().data('url');
helper.checkLogin(function () { helper.checkLogin(function () {
@ -47,10 +46,7 @@ layui.use(['jquery', 'helper'], function () {
}); });
}); });
/** $('.icon-download').on('click', function () {
* 资料
*/
$('.icon-resource').on('click', function () {
var url = $(this).parent().data('url'); var url = $(this).parent().data('url');
helper.checkLogin(function () { helper.checkLogin(function () {
layer.open({ layer.open({

View File

@ -0,0 +1,187 @@
layui.use(['jquery', 'form', 'layer', 'helper'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
var helper = layui.helper;
form.on('submit(addComment)', function (data) {
var submit = $(this);
var $commentList = $('#comment-list');
var $textarea = $(data.form).find('.layui-textarea');
var $tbCommentCount = $('#toolbar-comment > .text');
var tbCommentCount = $tbCommentCount.data('count');
submit.attr('disabled', 'disabled').addClass('layui-btn-disabled');
$.ajax({
type: 'POST',
url: data.form.action,
data: data.field,
success: function (res) {
$.ajax({
type: 'GET',
url: '/comment/' + res.comment.id + '/info',
success: function (html) {
tbCommentCount++;
$tbCommentCount.data('count', tbCommentCount).text(tbCommentCount);
$commentList.prepend(html);
}
});
$textarea.val('');
layer.msg('发表评论成功');
submit.removeAttr('disabled').removeClass('layui-btn-disabled');
},
error: function (xhr) {
var res = JSON.parse(xhr.responseText);
layer.msg(res.msg);
submit.removeAttr('disabled').removeClass('layui-btn-disabled');
}
});
return false;
});
form.on('submit(replyComment)', function (data) {
var submit = $(this);
var commentId = submit.data('comment-id');
var parentId = submit.data('parent-id');
var blockId = parentId > 0 ? parentId : commentId;
var $commentForm = $('#comment-form-' + commentId);
var $replyList = $('#reply-list-' + blockId);
var $textarea = $(data.form).find('.layui-textarea');
var $replyCount = $('#comment-' + blockId).find('.reply-count');
var replyCount = $replyCount.data('count');
var $tbCommentCount = $('#toolbar-comment > .text');
var tbCommentCount = $tbCommentCount.data('count');
submit.attr('disabled', 'disabled').addClass('layui-btn-disabled');
$.ajax({
type: 'POST',
url: data.form.action,
data: data.field,
success: function (res) {
$.ajax({
type: 'GET',
url: '/comment/' + res.comment.id + '/info',
success: function (html) {
$replyList.prepend(html);
}
});
replyCount++;
tbCommentCount++;
$commentForm.hide();
$replyList.show();
$textarea.val('');
$replyCount.data('count', replyCount).text(replyCount);
$tbCommentCount.data('count', tbCommentCount).text(tbCommentCount);
layer.msg('发表回复成功');
submit.removeAttr('disabled').removeClass('layui-btn-disabled');
},
error: function (xhr) {
var res = JSON.parse(xhr.responseText);
layer.msg(res.msg);
submit.removeAttr('disabled').removeClass('layui-btn-disabled');
}
});
return false;
});
$('.icon-comment').on('click', function () {
$('html').animate({
scrollTop: $('#comment-anchor').offset().top
}, 500);
});
$('#btn-cancel-comment').on('click', function () {
$('#comment-footer').hide();
});
$('#comment-content').on('click', function () {
$('#comment-footer').show();
});
$('body').on('click', '.btn-cancel-reply', function () {
var id = $(this).data('id');
$('#comment-form-' + id).hide();
});
$('body').on('click', '.action-toggle', function () {
var $this = $(this);
var id = $this.data('id');
var url = $this.data('url');
var $replyList = $('#comment-' + id + '>.reply-list');
if ($replyList.hasClass('loaded')) {
if ($this.hasClass('expanded')) {
$this.attr('title', '展开回应').removeClass('expanded');
} else {
$this.attr('title', '收起回应').addClass('expanded');
}
$replyList.toggle();
} else {
$.ajax({
type: 'GET',
url: url,
success: function (html) {
$this.attr('title', '收起回应').addClass('expanded');
$replyList.addClass('loaded').show();
$replyList.html(html);
}
});
}
});
$('body').on('click', '.action-reply', function () {
var id = $(this).data('id');
var $block = $('#comment-form-' + id);
var $textarea = $block.find('textarea');
$block.toggle();
$textarea.focus();
});
$('body').on('click', '.action-like', function () {
var $this = $(this);
var $likeCount = $this.prev();
var likeCount = $likeCount.data('count');
helper.checkLogin(function () {
$.ajax({
type: 'POST',
url: $this.data('url'),
success: function () {
if ($this.hasClass('liked')) {
$this.attr('title', '点赞支持').text('点赞').removeClass('liked');
likeCount--;
} else {
$this.attr('title', '取消点赞').text('已赞').addClass('liked');
likeCount++;
}
$likeCount.data('count', likeCount).text(likeCount);
}
});
});
});
$('body').on('click', '.action-delete', function () {
var $this = $(this);
var id = $this.data('id');
var parentId = $this.data('parent-id');
var $comment = $('#comment-' + id);
var $tbCommentCount = $('#toolbar-comment > .text');
var tbCommentCount = $tbCommentCount.data('count');
layer.confirm('确定要删除吗?', function () {
$.ajax({
type: 'POST',
url: $this.data('url'),
success: function () {
if (parentId > 0) {
var $replyCount = $('#comment-' + parentId).find('.reply-count');
var replyCount = $replyCount.data('count');
replyCount--;
$replyCount.data('count', replyCount).text(replyCount);
}
tbCommentCount--;
$tbCommentCount.data('count', tbCommentCount).text(tbCommentCount);
$comment.remove();
layer.msg('删除评论成功');
}
});
});
});
});

View File

@ -10,6 +10,8 @@ layui.use(['jquery', 'layer', 'helper'], function () {
$('.icon-star').on('click', function () { $('.icon-star').on('click', function () {
var $this = $(this); var $this = $(this);
var $parent = $this.parent(); var $parent = $this.parent();
var $favoriteCount = $parent.next();
var favoriteCount = $favoriteCount.data('count');
helper.checkLogin(function () { helper.checkLogin(function () {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
@ -18,12 +20,15 @@ layui.use(['jquery', 'layer', 'helper'], function () {
if ($this.hasClass('layui-icon-star-fill')) { if ($this.hasClass('layui-icon-star-fill')) {
$this.removeClass('layui-icon-star-fill'); $this.removeClass('layui-icon-star-fill');
$this.addClass('layui-icon-star'); $this.addClass('layui-icon-star');
$parent.attr('title', '收藏'); $parent.attr('title', '收藏课程');
favoriteCount--;
} else { } else {
$this.removeClass('layui-icon-star'); $this.removeClass('layui-icon-star');
$this.addClass('layui-icon-star-fill'); $this.addClass('layui-icon-star-fill');
$parent.attr('title', '取消收藏'); $parent.attr('title', '取消收藏');
favoriteCount++;
} }
$favoriteCount.data('count', favoriteCount).text(favoriteCount);
} }
}); });
}); });
@ -93,27 +98,23 @@ layui.use(['jquery', 'layer', 'helper'], function () {
/** /**
* 点赞咨询|评价 * 点赞咨询|评价
*/ */
$('body').on('click', '.icon-praise', function () { $('body').on('click', '.action-like', function () {
var $this = $(this); var $this = $(this);
var $parent = $this.parent(); var $likeCount = $this.prev();
var $likeCount = $this.next(); var likeCount = $likeCount.data('count');
var likeCount = parseInt($likeCount.text());
helper.checkLogin(function () { helper.checkLogin(function () {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: $parent.data('url'), url: $this.data('url'),
success: function () { success: function () {
if ($this.hasClass('active')) { if ($this.hasClass('liked')) {
$this.removeClass('active'); $this.attr('title', '点赞支持').text('点赞').removeClass('liked');
$parent.attr('title', '点赞'); likeCount--;
$likeCount.text(likeCount - 1);
likeCount -= 1;
} else { } else {
$this.addClass('active'); $this.attr('title', '取消点赞').text('已赞').addClass('liked');
$parent.attr('title', '取消点赞'); likeCount++;
$likeCount.text(likeCount + 1);
likeCount += 1;
} }
$likeCount.data('count', likeCount).text(likeCount);
} }
}); });
}); });