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:
commit
68b3b652a1
14
CHANGELOG.md
14
CHANGELOG.md
@ -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)
|
||||
|
||||
### 更新
|
||||
|
@ -32,14 +32,16 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<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>
|
||||
<tbody>
|
||||
{% 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 edit_url = url({'for':'admin.article.edit','id':item.id}) %}
|
||||
{% set update_url = url({'for':'admin.article.update','id':item.id}) %}
|
||||
@ -65,17 +68,16 @@
|
||||
<span>标签:{{ tags_info(item.tags) }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>创建:{{ date('Y-m-d H:i',item.create_time) }},更新:{{ date('Y-m-d H:i',item.update_time) }}</p>
|
||||
</td>
|
||||
<td>{{ source_info(item.source_type,item.source_url) }}</td>
|
||||
<td>
|
||||
<p>昵称:{{ item.owner.name }}</p>
|
||||
<p>编号:{{ item.owner.id }}</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>浏览:{{ item.view_count }},评论:{{ item.comment_count }}</p>
|
||||
<p>点赞:{{ item.like_count }},收藏:{{ item.favorite_count }}</p>
|
||||
<p class="meta">
|
||||
<span>来源:{{ source_info(item.source_type,item.source_url) }}</span>
|
||||
<span>作者:<a href="{{ owner_url }}" target="_blank">{{ item.owner.name }}</a></span>
|
||||
<span>创建:{{ date('Y-m-d',item.create_time) }}</span>
|
||||
</p>
|
||||
</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="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>
|
||||
|
@ -22,7 +22,7 @@
|
||||
<ul class="layui-tab-title kg-tab-title">
|
||||
<li class="layui-this">基本信息</li>
|
||||
<li>{{ content_title(course.model) }}</li>
|
||||
<li>学习资料</li>
|
||||
<li>课件资料</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
<form class="layui-form kg-form" id="res-form">
|
||||
<div class="layui-form-item" id="res-upload-block">
|
||||
<label class="layui-form-label">资源文件</label>
|
||||
<div class="layui-input-block">
|
||||
<span class="layui-btn" id="res-upload-btn">选择文件</span>
|
||||
<input class="layui-hide" type="file" name="res_file" accept="*/*">
|
||||
|
@ -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>
|
||||
|
@ -26,14 +26,20 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="12%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<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>
|
||||
<td>{{ item.id }}</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>
|
||||
</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_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>
|
||||
|
@ -6,13 +6,17 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="12%">
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<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 delete_url = url({'for':'admin.chapter.delete','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>
|
||||
<td>{{ item.id }}</td>
|
||||
<td>
|
||||
<span><a href="{{ edit_url }}">{{ item.title }}</a></span>
|
||||
<p>
|
||||
<a href="{{ edit_url }}">{{ item.title }}</a>
|
||||
<span class="layui-badge layui-bg-green">课</span>
|
||||
</p>
|
||||
</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 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>
|
||||
@ -47,6 +56,8 @@
|
||||
{% else %}
|
||||
<li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li>
|
||||
{% endif %}
|
||||
<hr>
|
||||
<li><a href="javascript:" class="kg-comment" data-url="{{ comment_url }}">评论管理</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -1,14 +1,14 @@
|
||||
{%- macro file_status(value) %}
|
||||
{% if value == 'pending' %}
|
||||
<span class="layui-badge layui-bg-gray">待上传</span>
|
||||
待上传
|
||||
{% elseif value == 'uploaded' %}
|
||||
<span class="layui-badge layui-bg-black">已上传</span>
|
||||
已上传
|
||||
{% elseif value == 'translating' %}
|
||||
<span class="layui-badge layui-bg-blue">转码中</span>
|
||||
转码中
|
||||
{% elseif value == 'translated' %}
|
||||
<span class="layui-badge layui-bg-green">已转码</span>
|
||||
已转码
|
||||
{% elseif value == 'failed' %}
|
||||
<span class="layui-badge layui-bg-red">已失败</span>
|
||||
已失败
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
@ -21,14 +21,19 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<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 delete_url = url({'for':'admin.chapter.delete','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>
|
||||
<td>{{ item.id }}</td>
|
||||
<td>
|
||||
<span><a href="{{ edit_url }}">{{ item.title }}</a></span>
|
||||
<p>
|
||||
<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>{{ file_status(item.attrs['file']['status']) }}</td>
|
||||
<td>{{ item.attrs['duration']|duration }}</td>
|
||||
<td>{{ item.resource_count }}</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 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>
|
||||
@ -64,6 +78,8 @@
|
||||
{% else %}
|
||||
<li><a href="javascript:" class="kg-restore" data-url="{{ restore_url }}">还原</a></li>
|
||||
{% endif %}
|
||||
<hr>
|
||||
<li><a href="javascript:" class="kg-comment" data-url="{{ comment_url }}">评论管理</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -26,13 +26,21 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="12%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>编号</th>
|
||||
<th>名称</th>
|
||||
<th>课时数</th>
|
||||
<th>课时</th>
|
||||
<th>课件</th>
|
||||
<th>学员</th>
|
||||
<th>点赞</th>
|
||||
<th>评论</th>
|
||||
<th>排序</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
@ -50,11 +58,11 @@
|
||||
<a href="{{ child_url }}">{{ item.title }}</a>
|
||||
<span class="layui-badge layui-bg-green">章</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ child_url }}">
|
||||
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span>
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ item.lesson_count }}</td>
|
||||
<td>{{ item.resource_count }}</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" value="{{ item.priority }}" data-url="{{ update_url }}"></td>
|
||||
<td class="center">
|
||||
<div class="layui-dropdown">
|
||||
|
@ -32,14 +32,20 @@
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<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>
|
||||
@ -69,22 +75,22 @@
|
||||
{% endif %}
|
||||
<span>难度:{{ level_info(item.level) }}</span>
|
||||
</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>{{ 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>
|
||||
<a href="{{ catalog_url }}">
|
||||
<span class="layui-badge layui-bg-green">{{ item.lesson_count }}</span>
|
||||
</a>
|
||||
</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>
|
||||
<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><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>
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
<table class="kg-table layui-table layui-form">
|
||||
<colgroup>
|
||||
<col width="10%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
@ -38,7 +37,6 @@
|
||||
<th>头像</th>
|
||||
<th>名称</th>
|
||||
<th>群主</th>
|
||||
<th>类型</th>
|
||||
<th>成员</th>
|
||||
<th>发布</th>
|
||||
<th>操作</th>
|
||||
@ -56,15 +54,23 @@
|
||||
<td class="center">
|
||||
<img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}">
|
||||
</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>
|
||||
{% 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 %}
|
||||
N/A
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ type_info(item.type) }}</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 class="center">
|
||||
|
@ -1,12 +1,12 @@
|
||||
{%- macro source_info(type,url) %}
|
||||
{% if type == 1 %}
|
||||
<span>原创</span>
|
||||
原创
|
||||
{% elseif type == 2 %}
|
||||
<a href="{{ url }}" target="_blank">转载</a>
|
||||
{% elseif type == 3 %}
|
||||
<span>翻译</span>
|
||||
翻译
|
||||
{% else %}
|
||||
<span>N/A</span>
|
||||
N/A
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
|
@ -25,7 +25,8 @@
|
||||
|
||||
<table class="layui-table kg-table">
|
||||
<colgroup>
|
||||
<col width="10%">
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
@ -38,9 +39,10 @@
|
||||
<tr>
|
||||
<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">
|
||||
<img class="avatar-sm" src="{{ item.avatar }}!avatar_160" alt="{{ item.name }}">
|
||||
</td>
|
||||
<td><a href="{{ preview_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>({{ item.id }}){{ status_info(item) }}</td>
|
||||
<td>{{ item.area }}</td>
|
||||
<td>{{ gender_info(item.gender) }}</td>
|
||||
<td>
|
||||
<p>
|
||||
<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>
|
||||
<p>教学:{{ edu_role_info(item.edu_role) }}</p>
|
||||
<p>后台:{{ admin_role_info(item.admin_role) }}</p>
|
||||
</td>
|
||||
<td>{{ date('Y-m-d H:i:s',item.active_time) }}</td>
|
||||
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
|
||||
<td>{{ item.course_count }}</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">
|
||||
<div class="layui-dropdown">
|
||||
<button class="layui-btn layui-btn-sm">操作 <i class="layui-icon layui-icon-triangle-d"></i></button>
|
||||
|
144
app/Http/Home/Controllers/CommentController.php
Normal file
144
app/Http/Home/Controllers/CommentController.php
Normal 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' => '删除评论成功']);
|
||||
}
|
||||
|
||||
}
|
@ -12,6 +12,20 @@ use Phalcon\Mvc\View;
|
||||
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")
|
||||
*/
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Home\Controllers;
|
||||
|
||||
use App\Http\Home\Services\ShareUrl as ShareUrlService;
|
||||
use App\Library\CsrfToken as CsrfTokenService;
|
||||
use App\Repos\Upload as UploadRepo;
|
||||
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")
|
||||
*/
|
||||
|
159
app/Http/Home/Services/ShareUrl.php
Normal file
159
app/Http/Home/Services/ShareUrl.php
Normal 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());
|
||||
}
|
||||
|
||||
}
|
21
app/Http/Home/Views/article/comment.volt
Normal file
21
app/Http/Home/Views/article/comment.volt
Normal 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>
|
@ -4,52 +4,27 @@
|
||||
|
||||
{{ partial('macros/article') }}
|
||||
|
||||
{% set list_url = url({'for':'home.article.list'}) %}
|
||||
{% set category_url = url({'for':'home.article.list'},{'category_id':article.category.id}) %}
|
||||
{% set article_list_url = url({'for':'home.article.list'}) %}
|
||||
{% 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 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">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="/">首页</a>
|
||||
<a href="{{ list_url }}">专栏</a>
|
||||
<a href="{{ category_url }}">{{ article.category.name }}</a>
|
||||
<a href="{{ article_list_url }}">专栏</a>
|
||||
<a><cite>文章详情</cite></a>
|
||||
</span>
|
||||
<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="分享到微博"><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>
|
||||
</div>
|
||||
|
||||
<div class="layout-main clearfix">
|
||||
|
||||
<div class="action-sticky">
|
||||
<div class="item">
|
||||
<div class="icon" data-url="{{ like_url }}">
|
||||
<i class="layui-icon layui-icon-praise icon-praise {{ liked_class }}"></i>
|
||||
<div class="layout-sticky">
|
||||
{{ partial('article/sticky') }}
|
||||
</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 class="layout-content">
|
||||
<div class="article-info wrap">
|
||||
<div class="title">{{ article.title }}</div>
|
||||
@ -60,7 +35,7 @@
|
||||
</span>
|
||||
<span class="view">{{ article.view_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 class="content markdown-body">{{ article.content }}</div>
|
||||
{% if article.tags %}
|
||||
@ -79,18 +54,15 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="comment-wrap" id="comment-wrap">
|
||||
<div class="comment-form">
|
||||
|
||||
<div id="comment-anchor"></div>
|
||||
{% if article.allow_comment == 1 %}
|
||||
<div class="article-comment wrap">
|
||||
{{ partial('article/comment') }}
|
||||
</div>
|
||||
<div class="comment-list">
|
||||
|
||||
{% else %}
|
||||
<div class="wrap center gray">评论已关闭</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% set related_article_url = url({'for':'home.article.related','id':article.id}) %}
|
||||
|
||||
<div class="layout-sidebar">
|
||||
<div class="sidebar">
|
||||
<div class="layui-card">
|
||||
@ -104,7 +76,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ owner_url }}" title="{{ article.owner.about }}">{{ article.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ article.owner.title }}</div>
|
||||
<div class="title layui-elip">{{ article.owner.title|default('初出江湖') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -112,10 +84,9 @@
|
||||
</div>
|
||||
<div class="sidebar" id="related-article-list" data-url="{{ related_article_url }}"></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}) %}
|
||||
|
||||
<div class="layui-hide">
|
||||
@ -137,5 +108,6 @@
|
||||
|
||||
{{ js_include('home/js/article.show.js') }}
|
||||
{{ js_include('home/js/article.share.js') }}
|
||||
{{ js_include('home/js/comment.js') }}
|
||||
|
||||
{% endblock %}
|
27
app/Http/Home/Views/article/sticky.volt
Normal file
27
app/Http/Home/Views/article/sticky.volt
Normal 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>
|
20
app/Http/Home/Views/chapter/comment.volt
Normal file
20
app/Http/Home/Views/chapter/comment.volt
Normal 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>
|
@ -2,16 +2,12 @@
|
||||
|
||||
{% 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 resources_url = url({'for':'home.chapter.resources','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_stats_url = url({'for':'home.live.stats','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 like_url = url({'for':'home.chapter.like','id':chapter.id}) %}
|
||||
{% set qrcode_url = url({'for':'home.qrcode'},{'text':full_chapter_url}) %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -19,18 +15,16 @@
|
||||
<a><cite>{{ chapter.title }}</cite></a>
|
||||
</span>
|
||||
<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-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="分享到微信"><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="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="layout-main">
|
||||
<div class="layout-sticky">
|
||||
{{ partial('chapter/live/sticky') }}
|
||||
</div>
|
||||
<div class="layout-content">
|
||||
<div class="player-wrap wrap">
|
||||
<div id="player"></div>
|
||||
@ -63,10 +57,13 @@
|
||||
<input type="hidden" name="bind_user_url" value='{{ bind_user_url }}'>
|
||||
</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">
|
||||
<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.url" value="{{ full_chapter_url }}">
|
||||
<input type="hidden" name="share.url" value="{{ share_url }}">
|
||||
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
|
||||
</div>
|
||||
|
||||
@ -77,7 +74,7 @@
|
||||
{{ 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.chat.js') }}
|
||||
{{ js_include('home/js/chapter.action.js') }}
|
||||
{{ js_include('home/js/chapter.show.js') }}
|
||||
{{ js_include('home/js/course.share.js') }}
|
||||
|
||||
{% endblock %}
|
27
app/Http/Home/Views/chapter/live/sticky.volt
Normal file
27
app/Http/Home/Views/chapter/live/sticky.volt
Normal 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>
|
@ -2,13 +2,8 @@
|
||||
|
||||
{% 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 resources_url = url({'for':'home.chapter.resources','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">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -16,23 +11,22 @@
|
||||
<a><cite>{{ chapter.title }}</cite></a>
|
||||
</span>
|
||||
<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-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="分享到微信"><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="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="layout-main clearfix">
|
||||
<div class="layout-sticky">
|
||||
{{ partial('chapter/sticky') }}
|
||||
</div>
|
||||
<div class="layout-content">
|
||||
<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 class="layout-sidebar">
|
||||
{{ partial('chapter/catalog') }}
|
||||
@ -45,10 +39,13 @@
|
||||
<input type="hidden" name="chapter.learning_url" value="{{ learning_url }}">
|
||||
</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">
|
||||
<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.url" value="{{ full_chapter_url }}">
|
||||
<input type="hidden" name="share.url" value="{{ share_url }}">
|
||||
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
|
||||
</div>
|
||||
|
||||
@ -66,6 +63,7 @@
|
||||
{{ js_include('home/js/markdown.preview.js') }}
|
||||
{{ js_include('home/js/course.share.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 %}
|
42
app/Http/Home/Views/chapter/sticky.volt
Normal file
42
app/Http/Home/Views/chapter/sticky.volt
Normal 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>
|
@ -2,14 +2,8 @@
|
||||
|
||||
{% 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 resources_url = url({'for':'home.chapter.resources','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">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -17,14 +11,6 @@
|
||||
<a><cite>{{ chapter.title }}</cite></a>
|
||||
</span>
|
||||
<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="分享到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>
|
||||
@ -32,10 +18,17 @@
|
||||
</div>
|
||||
|
||||
<div class="layout-main clearfix">
|
||||
<div class="layout-sticky">
|
||||
{{ partial('chapter/sticky') }}
|
||||
</div>
|
||||
<div class="layout-content">
|
||||
<div class="player-wrap wrap">
|
||||
<div id="player"></div>
|
||||
</div>
|
||||
<div id="comment-anchor"></div>
|
||||
<div class="vod-comment wrap">
|
||||
{{ partial('chapter/comment') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
{{ partial('chapter/catalog') }}
|
||||
@ -50,10 +43,13 @@
|
||||
<input type="hidden" name="chapter.play_urls" value='{{ chapter.play_urls|json_encode }}'>
|
||||
</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">
|
||||
<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.url" value="{{ full_chapter_url }}">
|
||||
<input type="hidden" name="share.url" value="{{ share_url }}">
|
||||
<input type="hidden" name="share.qrcode" value="{{ qrcode_url }}">
|
||||
</div>
|
||||
|
||||
@ -63,7 +59,8 @@
|
||||
|
||||
{{ 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/chapter.action.js') }}
|
||||
{{ js_include('home/js/chapter.show.js') }}
|
||||
{{ js_include('home/js/chapter.vod.player.js') }}
|
||||
{{ js_include('home/js/comment.js') }}
|
||||
|
||||
{% endblock %}
|
63
app/Http/Home/Views/comment/info.volt
Normal file
63
app/Http/Home/Views/comment/info.volt
Normal 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 %}
|
70
app/Http/Home/Views/comment/list.volt
Normal file
70
app/Http/Home/Views/comment/list.volt
Normal 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 %}
|
69
app/Http/Home/Views/comment/replies.volt
Normal file
69
app/Http/Home/Views/comment/replies.volt
Normal 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 %}
|
19
app/Http/Home/Views/comment/reply.volt
Normal file
19
app/Http/Home/Views/comment/reply.volt
Normal 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 %}
|
@ -5,7 +5,7 @@
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.id}) %}
|
||||
{% set consult_url = url({'for':'home.consult.show','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">
|
||||
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
|
||||
<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="content">{{ item.answer }}</div>
|
||||
<div class="footer">
|
||||
<span class="time">{{ item.create_time|time_ago }}</span>
|
||||
<a class="like" href="javascript:" title="点赞" data-url="{{ like_url }}">
|
||||
<i class="layui-icon layui-icon-praise icon-praise"></i>
|
||||
<em class="like-count">{{ item.like_count }}</em>
|
||||
</a>
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i:s',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>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -5,7 +5,7 @@
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'home.user.show','id':item.owner.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">
|
||||
<a href="{{ owner_url }}" title="{{ item.owner.name }}" target="_blank">
|
||||
<img src="{{ item.owner.avatar }}!avatar_160" alt="{{ item.owner.name }}">
|
||||
@ -18,11 +18,19 @@
|
||||
</div>
|
||||
<div class="content">{{ item.content }}</div>
|
||||
<div class="footer">
|
||||
<span class="time">{{ date('Y-m-d',item.create_time) }}</span>
|
||||
<a href="javascript:" class="like" title="点赞" data-url="{{ like_url }}">
|
||||
<i class="layui-icon layui-icon-praise icon-praise"></i>
|
||||
<em class="like-count">{{ item.like_count }}</em>
|
||||
</a>
|
||||
<div class="left">
|
||||
<div class="column">
|
||||
<span class="time" title="{{ date('Y-m-d H:i:s',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>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -4,13 +4,6 @@
|
||||
|
||||
{{ 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">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="/">首页</a>
|
||||
@ -18,11 +11,7 @@
|
||||
<a><cite>{{ course.title }}</cite></a>
|
||||
</span>
|
||||
<span class="share">
|
||||
<a href="javascript:" title="{{ favorite_title }}" data-url="{{ favorite_url }}"><i class="layui-icon {{ favorite_star }} icon-star"></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="分享到微信"><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="分享到微博"><i class="layui-icon layui-icon-login-weibo icon-weibo"></i></a>
|
||||
</span>
|
||||
@ -32,6 +21,10 @@
|
||||
|
||||
<div class="layout-main clearfix">
|
||||
|
||||
<div class="layout-sticky">
|
||||
{{ partial('course/sticky') }}
|
||||
</div>
|
||||
|
||||
{% set show_tab_chapters = course.lesson_count > 0 %}
|
||||
{% set show_tab_packages = course.package_count > 0 %}
|
||||
{% set show_tab_consults = course.consult_count > 0 %}
|
||||
@ -101,10 +94,13 @@
|
||||
|
||||
</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">
|
||||
<input type="hidden" name="share.title" value="{{ course.title }}">
|
||||
<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 }}">
|
||||
</div>
|
||||
|
||||
|
@ -5,7 +5,6 @@
|
||||
<div class="layui-card-body">
|
||||
{% for teacher in course.teachers %}
|
||||
{% 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="avatar">
|
||||
<img src="{{ teacher.avatar }}!avatar_160" alt="{{ teacher.name }}">
|
||||
@ -14,7 +13,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ teacher_url }}" title="{{ teacher.about }}" target="_blank">{{ teacher.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ teacher.title }}</div>
|
||||
<div class="title layui-elip">{{ teacher.title|default('小小教书匠') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
33
app/Http/Home/Views/course/sticky.volt
Normal file
33
app/Http/Home/Views/course/sticky.volt
Normal 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>
|
@ -4,7 +4,6 @@
|
||||
<div class="layui-card-body">
|
||||
{% for user in users %}
|
||||
{% 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="avatar">
|
||||
<img src="{{ user.avatar }}" alt="{{ user.name }}">
|
||||
@ -13,7 +12,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ user.title }}</div>
|
||||
<div class="title layui-elip">{{ user.title|default('暂露头角') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
@ -28,7 +28,6 @@
|
||||
{% for item in pager.items %}
|
||||
{% 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 is_owner = item.user.id == group.owner.id ? 1 : 0 %}
|
||||
<tr>
|
||||
<td class="center">
|
||||
<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>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
|
||||
<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>
|
||||
{% else %}
|
||||
<button class="layui-btn layui-btn-sm layui-btn-disabled">删除</button>
|
||||
|
@ -5,7 +5,6 @@
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for item in pager.items %}
|
||||
{% 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="user-card">
|
||||
<span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span>
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
|
||||
{% 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}) %}
|
||||
|
||||
@ -18,7 +17,7 @@
|
||||
<div class="layout-content">
|
||||
<div class="layui-card">
|
||||
<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 class="layui-card">
|
||||
<div class="layui-card-header">小组成员</div>
|
||||
|
@ -1,5 +1,4 @@
|
||||
{% 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-header">小组组长</div>
|
||||
@ -12,7 +11,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ owner_url }}" title="{{ group.owner.about }}" target="_blank">{{ group.owner.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ group.owner.title }}</div>
|
||||
<div class="title layui-elip">{{ group.owner.title|default('暂露头角') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -2,7 +2,6 @@
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for item in pager.items %}
|
||||
{% 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' %}
|
||||
<div class="layui-col-md3">
|
||||
<div class="user-card">
|
||||
@ -14,7 +13,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ item.user.about }}" target="_blank">{{ item.user.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ item.user.title }}</div>
|
||||
<div class="title layui-elip">{{ item.user.title|default('暂露头角') }}</div>
|
||||
<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>
|
||||
</div>
|
||||
|
@ -2,7 +2,6 @@
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for group in groups %}
|
||||
{% 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="user-card">
|
||||
<span class="type layui-badge layui-bg-green">{{ type_info(group.type) }}</span>
|
||||
|
@ -1,8 +1,6 @@
|
||||
<div class="user-list clearfix">
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% 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 avatar_class = user.vip == 1 ? 'avatar vip' : 'avatar' %}
|
||||
<div class="layui-col-md3">
|
||||
@ -15,7 +13,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ user.about }}" target="_blank">{{ user.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ user.title }}</div>
|
||||
<div class="title layui-elip">{{ user.title|default('暂露头角') }}</div>
|
||||
<div class="action">
|
||||
<span class="layui-btn apply-friend" data-id="{{ user.id }}" data-name="{{ user.name }}" data-avatar="{{ user.avatar }}">添加好友</span>
|
||||
</div>
|
||||
|
@ -11,7 +11,7 @@
|
||||
</div>
|
||||
<div class="info">
|
||||
<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 class="summary">{{ item.summary }}</div>
|
||||
<div class="meta">
|
||||
|
@ -2,8 +2,6 @@
|
||||
<div class="user-list teacher-list clearfix">
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% 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}) %}
|
||||
<div class="layui-col-md3">
|
||||
<div class="user-card">
|
||||
@ -15,7 +13,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ item.title }}</div>
|
||||
<div class="title layui-elip">{{ item.title|default('小小教书匠') }}</div>
|
||||
<div class="action">
|
||||
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
|
||||
</div>
|
||||
|
@ -4,8 +4,6 @@
|
||||
<div class="user-list clearfix">
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% 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 avatar_class = item.vip == 1 ? 'avatar vip' : 'avatar' %}
|
||||
<div class="layui-col-md2">
|
||||
@ -18,7 +16,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ item.title }}</div>
|
||||
<div class="title layui-elip">{{ item.title|default('暂露头角') }}</div>
|
||||
<div class="action">
|
||||
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
|
||||
</div>
|
||||
|
@ -5,7 +5,6 @@
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for item in pager.items %}
|
||||
{% 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="user-card">
|
||||
<span class="type layui-badge layui-bg-green">{{ type_info(item.type) }}</span>
|
||||
|
@ -2,13 +2,8 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ partial('macros/course') }}
|
||||
{{ 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' %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
@ -30,11 +25,20 @@
|
||||
<img src="{{ user.avatar }}!avatar_160" alt="{{ user.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<p><span class="name">{{ user.name }}</span><span>{{ gender_icon(user.gender) }}</span></p>
|
||||
<p><span><i class="layui-icon layui-icon-location"></i></span><span>{{ user.area }}</span></p>
|
||||
<p><span><i class="layui-icon layui-icon-time"></i></span><span>{{ date('Y-m-d H:i',user.active_time) }}</span></p>
|
||||
<p>
|
||||
<span class="name">{{ user.name }}</span>
|
||||
<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 class="about">{{ user.about }}</div>
|
||||
<div class="about">{{ user.about|default('这个家伙很懒,什么都没留下') }}</div>
|
||||
</div>
|
||||
|
||||
{% set show_tab_courses = user.course_count > 0 %}
|
||||
@ -76,10 +80,13 @@
|
||||
</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">
|
||||
<input type="hidden" name="share.title" value="{{ user.name }}">
|
||||
<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 }}">
|
||||
</div>
|
||||
|
||||
|
@ -3,8 +3,6 @@
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for item in pager.items %}
|
||||
{% 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="user-card">
|
||||
<div class="avatar">
|
||||
@ -15,7 +13,7 @@
|
||||
<div class="name layui-elip">
|
||||
<a href="{{ user_url }}" title="{{ item.about }}" target="_blank">{{ item.name }}</a>
|
||||
</div>
|
||||
<div class="title layui-elip">{{ item.title }}</div>
|
||||
<div class="title layui-elip">{{ item.title|default('暂露头角') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
@ -11,7 +11,7 @@ class AppInfo
|
||||
|
||||
protected $link = 'https://koogua.com';
|
||||
|
||||
protected $version = '1.3.1';
|
||||
protected $version = '1.3.2';
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
|
@ -144,6 +144,10 @@ class Comment extends Model
|
||||
|
||||
public function beforeUpdate()
|
||||
{
|
||||
if ($this->deleted == 1) {
|
||||
$this->published = 0;
|
||||
}
|
||||
|
||||
$this->update_time = time();
|
||||
}
|
||||
|
||||
|
@ -164,7 +164,7 @@ class Course extends Model
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
public $rating = 0.00;
|
||||
public $rating = 5.00;
|
||||
|
||||
/**
|
||||
* 综合得分
|
||||
|
@ -23,10 +23,6 @@ class Comment extends Repository
|
||||
$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'])) {
|
||||
$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']]);
|
||||
}
|
||||
|
||||
if (isset($where['parent_id'])) {
|
||||
$builder->andWhere('parent_id = :parent_id:', ['parent_id' => $where['parent_id']]);
|
||||
}
|
||||
|
||||
if (isset($where['published'])) {
|
||||
$builder->andWhere('published = :published:', ['published' => $where['published']]);
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ namespace App\Repos;
|
||||
|
||||
use App\Models\CommentLike as CommentLikeModel;
|
||||
use Phalcon\Mvc\Model;
|
||||
use Phalcon\Mvc\Model\Resultset;
|
||||
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ namespace App\Repos;
|
||||
|
||||
use App\Models\ConsultLike as ConsultLikeModel;
|
||||
use Phalcon\Mvc\Model;
|
||||
use Phalcon\Mvc\Model\Resultset;
|
||||
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ namespace App\Repos;
|
||||
|
||||
use App\Models\ReviewLike as ReviewLikeModel;
|
||||
use Phalcon\Mvc\Model;
|
||||
use Phalcon\Mvc\Model\Resultset;
|
||||
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -48,6 +48,7 @@ class ArticleInfo extends LogicService
|
||||
'category' => $category,
|
||||
'owner' => $owner,
|
||||
'me' => $me,
|
||||
'allow_comment' => $article->allow_comment,
|
||||
'source_type' => $article->source_type,
|
||||
'source_url' => $article->source_url,
|
||||
'word_count' => $article->word_count,
|
||||
@ -56,7 +57,6 @@ class ArticleInfo extends LogicService
|
||||
'comment_count' => $article->comment_count,
|
||||
'favorite_count' => $article->favorite_count,
|
||||
'create_time' => $article->create_time,
|
||||
'update_time' => $article->update_time,
|
||||
];
|
||||
}
|
||||
|
||||
@ -67,8 +67,6 @@ class ArticleInfo extends LogicService
|
||||
'favorited' => 0,
|
||||
];
|
||||
|
||||
$me['allow_comment'] = $article->allow_comment ? 1 : 0;
|
||||
|
||||
if ($user->id > 0) {
|
||||
|
||||
$likeRepo = new ArticleLikeRepo();
|
||||
|
@ -6,12 +6,14 @@ use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\Comment as CommentModel;
|
||||
use App\Repos\Comment as CommentRepo;
|
||||
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 CommentListTrait;
|
||||
|
||||
public function handle($id)
|
||||
{
|
||||
@ -33,7 +35,7 @@ class CommentList extends CommentListService
|
||||
|
||||
$pager = $commentRepo->paginate($params, $sort, $page, $limit);
|
||||
|
||||
return $this->handlePager($pager);
|
||||
return $this->handleComments($pager);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ class BasicInfo extends LogicService
|
||||
'model' => $chapter->model,
|
||||
'play_urls' => $playUrls,
|
||||
'resource_count' => $chapter->resource_count,
|
||||
'comment_count' => $chapter->comment_count,
|
||||
'consult_count' => $chapter->consult_count,
|
||||
'user_count' => $chapter->user_count,
|
||||
'like_count' => $chapter->like_count,
|
||||
@ -100,6 +101,7 @@ class BasicInfo extends LogicService
|
||||
'end_time' => $live->end_time,
|
||||
'status' => $live->status,
|
||||
'resource_count' => $chapter->resource_count,
|
||||
'comment_count' => $chapter->comment_count,
|
||||
'consult_count' => $chapter->consult_count,
|
||||
'user_count' => $chapter->user_count,
|
||||
'like_count' => $chapter->like_count,
|
||||
@ -121,6 +123,7 @@ class BasicInfo extends LogicService
|
||||
'model' => $chapter->model,
|
||||
'content' => $read->content,
|
||||
'resource_count' => $chapter->resource_count,
|
||||
'comment_count' => $chapter->comment_count,
|
||||
'consult_count' => $chapter->consult_count,
|
||||
'user_count' => $chapter->user_count,
|
||||
'like_count' => $chapter->like_count,
|
||||
|
@ -194,6 +194,13 @@ class ChapterInfo extends LogicService
|
||||
$chapter->user_count += 1;
|
||||
|
||||
$chapter->update();
|
||||
|
||||
$parent = $this->checkChapter($chapter->parent_id);
|
||||
|
||||
$parent->user_count += 1;
|
||||
|
||||
$parent->update();
|
||||
|
||||
}
|
||||
|
||||
protected function incrGroupUserCount(ImGroupModel $group)
|
||||
|
@ -64,6 +64,12 @@ class ChapterLike extends LogicService
|
||||
$chapter->like_count += 1;
|
||||
|
||||
$chapter->update();
|
||||
|
||||
$parent = $this->checkChapter($chapter->parent_id);
|
||||
|
||||
$parent->like_count += 1;
|
||||
|
||||
$parent->update();
|
||||
}
|
||||
|
||||
protected function decrChapterLikeCount(ChapterModel $chapter)
|
||||
@ -72,6 +78,13 @@ class ChapterLike extends LogicService
|
||||
$chapter->like_count -= 1;
|
||||
$chapter->update();
|
||||
}
|
||||
|
||||
$parent = $this->checkChapter($chapter->parent_id);
|
||||
|
||||
if ($parent->like_count > 0) {
|
||||
$parent->like_count -= 1;
|
||||
$parent->update();
|
||||
}
|
||||
}
|
||||
|
||||
protected function incrUserDailyChapterLikeCount(UserModel $user)
|
||||
|
41
app/Services/Logic/Chapter/CommentList.php
Normal file
41
app/Services/Logic/Chapter/CommentList.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -3,14 +3,16 @@
|
||||
namespace App\Services\Logic\Chapter;
|
||||
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Repos\Consult as ConsultRepo;
|
||||
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;
|
||||
|
||||
class ConsultList extends LogicService
|
||||
{
|
||||
|
||||
use ChapterTrait;
|
||||
use ConsultListTrait;
|
||||
|
||||
public function handle($id)
|
||||
{
|
||||
@ -28,9 +30,11 @@ class ConsultList extends LogicService
|
||||
'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);
|
||||
}
|
||||
|
||||
}
|
||||
|
83
app/Services/Logic/Comment/CommentCountTrait.php
Normal file
83
app/Services/Logic/Comment/CommentCountTrait.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -2,11 +2,11 @@
|
||||
|
||||
namespace App\Services\Logic\Comment;
|
||||
|
||||
use App\Models\Article as ArticleModel;
|
||||
use App\Models\Comment as CommentModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Services\Logic\ArticleTrait;
|
||||
use App\Services\Logic\ChapterTrait;
|
||||
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;
|
||||
|
||||
@ -14,6 +14,9 @@ class CommentCreate extends LogicService
|
||||
{
|
||||
|
||||
use ArticleTrait;
|
||||
use ChapterTrait;
|
||||
use ClientTrait;
|
||||
use CommentCountTrait;
|
||||
|
||||
public function handle()
|
||||
{
|
||||
@ -32,19 +35,26 @@ class CommentCreate extends LogicService
|
||||
$comment = new CommentModel();
|
||||
|
||||
$data = [
|
||||
'item_id' => $post['item_id'],
|
||||
'item_type' => $post['item_type'],
|
||||
'owner_id' => $user->id,
|
||||
'published' => 1,
|
||||
];
|
||||
|
||||
$data['content'] = $validator->checkContent($post['content']);
|
||||
$data['client_type'] = $this->getClientType();
|
||||
$data['client_ip'] = $this->getClientIp();
|
||||
|
||||
if (isset($post['to_user_id'])) {
|
||||
$toUser = $validator->checkToUser($post['to_user_id']);
|
||||
$data['to_user_id'] = $toUser->id;
|
||||
}
|
||||
if ($post['item_type'] == CommentModel::ITEM_CHAPTER) {
|
||||
|
||||
$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']);
|
||||
|
||||
$this->incrArticleCommentCount($article);
|
||||
}
|
||||
|
||||
@ -55,16 +65,4 @@ class CommentCreate extends LogicService
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
namespace App\Services\Logic\Comment;
|
||||
|
||||
use App\Models\Article as ArticleModel;
|
||||
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\Validators\Comment as CommentValidator;
|
||||
@ -13,7 +13,9 @@ class CommentDelete extends LogicService
|
||||
{
|
||||
|
||||
use ArticleTrait;
|
||||
use ChapterTrait;
|
||||
use CommentTrait;
|
||||
use CommentCountTrait;
|
||||
|
||||
public function handle($id)
|
||||
{
|
||||
@ -29,18 +31,25 @@ class CommentDelete extends LogicService
|
||||
|
||||
$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);
|
||||
|
||||
$this->decrArticleCommentCount($article);
|
||||
}
|
||||
}
|
||||
|
||||
protected function decrArticleCommentCount(ArticleModel $article)
|
||||
{
|
||||
if ($article->comment_count > 0) {
|
||||
$article->comment_count -= 1;
|
||||
$article->update();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -21,13 +21,18 @@ class CommentInfo extends LogicService
|
||||
|
||||
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 [
|
||||
'id' => $comment->id,
|
||||
'owner' => $owner,
|
||||
'content' => $comment->content,
|
||||
'parent_id' => $comment->parent_id,
|
||||
'like_count' => $comment->like_count,
|
||||
'reply_count' => $comment->reply_count,
|
||||
'create_time' => $comment->create_time,
|
||||
'owner' => $owner,
|
||||
'to_user' => $toUser,
|
||||
];
|
||||
}
|
||||
|
||||
@ -35,12 +40,25 @@ class CommentInfo extends LogicService
|
||||
{
|
||||
$userRepo = new UserRepo();
|
||||
|
||||
$owner = $userRepo->findById($comment->owner_id);
|
||||
$user = $userRepo->findById($comment->owner_id);
|
||||
|
||||
return [
|
||||
'id' => $owner->id,
|
||||
'name' => $owner->name,
|
||||
'avatar' => $owner->avatar,
|
||||
'id' => $user->id,
|
||||
'name' => $user->name,
|
||||
'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,
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -2,45 +2,33 @@
|
||||
|
||||
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;
|
||||
|
||||
class CommentList extends LogicService
|
||||
{
|
||||
|
||||
protected function handlePager($pager)
|
||||
use CommentListTrait;
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if ($pager->total_items == 0) {
|
||||
return $pager;
|
||||
}
|
||||
$pagerQuery = new PagerQuery();
|
||||
|
||||
$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();
|
||||
$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;
|
||||
return $this->handleComments($pager);
|
||||
}
|
||||
|
||||
}
|
||||
|
75
app/Services/Logic/Comment/CommentListTrait.php
Normal file
75
app/Services/Logic/Comment/CommentListTrait.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
81
app/Services/Logic/Comment/CommentReply.php
Normal file
81
app/Services/Logic/Comment/CommentReply.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
36
app/Services/Logic/Comment/ReplyList.php
Normal file
36
app/Services/Logic/Comment/ReplyList.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Services\Logic\Course;
|
||||
|
||||
use App\Builders\ConsultList as ConsultListBuilder;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Repos\Consult as ConsultRepo;
|
||||
use App\Services\Logic\CourseTrait;
|
||||
@ -12,6 +11,7 @@ class ConsultList extends LogicService
|
||||
{
|
||||
|
||||
use CourseTrait;
|
||||
use ConsultListTrait;
|
||||
|
||||
public function handle($id)
|
||||
{
|
||||
@ -36,39 +36,4 @@ class ConsultList extends LogicService
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,23 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Logic\Consult;
|
||||
namespace App\Services\Logic\Course;
|
||||
|
||||
use App\Builders\ConsultList as ConsultListBuilder;
|
||||
use App\Repos\Consult as ConsultRepo;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
use App\Repos\ConsultLike as ConsultLikeRepo;
|
||||
|
||||
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)
|
||||
{
|
||||
if ($pager->total_items == 0) {
|
||||
@ -30,11 +20,14 @@ class ConsultList extends LogicService
|
||||
|
||||
$users = $builder->getUsers($consults);
|
||||
|
||||
$meMappings = $this->getMeMappings($consults);
|
||||
|
||||
$items = [];
|
||||
|
||||
foreach ($consults as $consult) {
|
||||
|
||||
$owner = $users[$consult['owner_id']] ?? new \stdClass();
|
||||
$me = $meMappings[$consult['id']];
|
||||
|
||||
$items[] = [
|
||||
'id' => $consult['id'],
|
||||
@ -43,8 +36,8 @@ class ConsultList extends LogicService
|
||||
'like_count' => $consult['like_count'],
|
||||
'reply_time' => $consult['reply_time'],
|
||||
'create_time' => $consult['create_time'],
|
||||
'update_time' => $consult['update_time'],
|
||||
'owner' => $owner,
|
||||
'me' => $me,
|
||||
];
|
||||
}
|
||||
|
||||
@ -53,4 +46,28 @@ class ConsultList extends LogicService
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
@ -5,6 +5,7 @@ namespace App\Services\Logic\Course;
|
||||
use App\Builders\ReviewList as ReviewListBuilder;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Repos\Review as ReviewRepo;
|
||||
use App\Repos\ReviewLike as ReviewLikeRepo;
|
||||
use App\Services\Logic\CourseTrait;
|
||||
use App\Services\Logic\Service as LogicService;
|
||||
|
||||
@ -47,11 +48,14 @@ class ReviewList extends LogicService
|
||||
|
||||
$users = $builder->getUsers($reviews);
|
||||
|
||||
$meMappings = $this->getMeMappings($reviews);
|
||||
|
||||
$items = [];
|
||||
|
||||
foreach ($reviews as $review) {
|
||||
|
||||
$owner = $users[$review['owner_id']] ?? new \stdClass();
|
||||
$me = $meMappings[$review['id']];
|
||||
|
||||
$items[] = [
|
||||
'id' => $review['id'],
|
||||
@ -60,6 +64,7 @@ class ReviewList extends LogicService
|
||||
'like_count' => $review['like_count'],
|
||||
'create_time' => $review['create_time'],
|
||||
'owner' => $owner,
|
||||
'me' => $me,
|
||||
];
|
||||
}
|
||||
|
||||
@ -68,4 +73,28 @@ class ReviewList extends LogicService
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -76,7 +76,6 @@ class ConsultList extends LogicService
|
||||
'like_count' => $consult['like_count'],
|
||||
'reply_time' => $consult['reply_time'],
|
||||
'create_time' => $consult['create_time'],
|
||||
'update_time' => $consult['update_time'],
|
||||
'course' => $course,
|
||||
'chapter' => $chapter,
|
||||
'owner' => $owner,
|
||||
|
@ -60,7 +60,6 @@ class ConsultList extends LogicService
|
||||
'like_count' => $consult['like_count'],
|
||||
'reply_time' => $consult['reply_time'],
|
||||
'create_time' => $consult['create_time'],
|
||||
'update_time' => $consult['update_time'],
|
||||
'course' => $course,
|
||||
'chapter' => $chapter,
|
||||
];
|
||||
|
@ -71,13 +71,11 @@
|
||||
.qrcode img {
|
||||
width: 160px;
|
||||
height: 160px;
|
||||
border: 3px dashed #ccc;
|
||||
}
|
||||
|
||||
.qrcode-sm img {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 3px dashed #ccc;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
@ -532,18 +530,138 @@
|
||||
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;
|
||||
top: 150px;
|
||||
margin-left: -65px;
|
||||
}
|
||||
|
||||
.action-sticky .item {
|
||||
.toolbar-sticky .item {
|
||||
margin-bottom: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.action-sticky .item .icon {
|
||||
.toolbar-sticky .item .icon {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
line-height: 36px;
|
||||
@ -553,18 +671,17 @@
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.action-sticky .layui-icon {
|
||||
.toolbar-sticky .layui-icon {
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.action-sticky .item .text {
|
||||
.toolbar-sticky .item .text {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.action-sticky .active,
|
||||
.action-sticky .layui-icon-star-fill,
|
||||
.action-sticky .layui-icon:hover {
|
||||
.toolbar-sticky .active,
|
||||
.toolbar-sticky .layui-icon-star-fill {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
@ -904,31 +1021,6 @@
|
||||
|
||||
.review-card {
|
||||
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 {
|
||||
@ -948,47 +1040,6 @@
|
||||
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 {
|
||||
text-align: center;
|
||||
}
|
||||
@ -1105,7 +1156,7 @@
|
||||
|
||||
.read-info {
|
||||
min-height: 428px;
|
||||
margin-bottom: 0;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.share .layui-icon {
|
||||
@ -1113,14 +1164,11 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.share .active,
|
||||
.share .layui-icon-star-fill {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
.share .active, .share .layui-icon:hover {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
.share a {
|
||||
margin-right: 5px;
|
||||
}
|
||||
@ -1167,7 +1215,7 @@
|
||||
position: relative;
|
||||
width: 760px;
|
||||
height: 428px;
|
||||
margin-bottom: 0;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.chat-wrap .layui-card-header {
|
||||
@ -1387,7 +1435,6 @@
|
||||
#pay-layer .qrcode img {
|
||||
width: 160px;
|
||||
height: 160px;
|
||||
border: 3px dashed #ccc;
|
||||
}
|
||||
|
||||
#pay-layer .success-tips {
|
||||
|
@ -3,15 +3,22 @@ layui.use(['jquery', 'helper'], function () {
|
||||
var $ = layui.jquery;
|
||||
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 () {
|
||||
var $this = $(this);
|
||||
var $parent = $this.parent();
|
||||
var $favoriteCount = $parent.next();
|
||||
var favoriteCount = parseInt($favoriteCount.text())
|
||||
var favoriteCount = $favoriteCount.data('count');
|
||||
helper.checkLogin(function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
@ -20,16 +27,15 @@ layui.use(['jquery', 'helper'], function () {
|
||||
if ($this.hasClass('layui-icon-star-fill')) {
|
||||
$this.removeClass('layui-icon-star-fill');
|
||||
$this.addClass('layui-icon-star');
|
||||
$parent.attr('title', '收藏');
|
||||
$favoriteCount.text(favoriteCount - 1);
|
||||
favoriteCount -= 1;
|
||||
$parent.attr('title', '收藏文章');
|
||||
favoriteCount--;
|
||||
} else {
|
||||
$this.removeClass('layui-icon-star');
|
||||
$this.addClass('layui-icon-star-fill');
|
||||
$parent.attr('title', '取消收藏');
|
||||
$favoriteCount.text(favoriteCount + 1);
|
||||
favoriteCount += 1;
|
||||
favoriteCount++;
|
||||
}
|
||||
$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);
|
||||
});
|
||||
|
||||
});
|
@ -94,7 +94,7 @@ layui.use(['jquery', 'form', 'helper'], function () {
|
||||
}
|
||||
|
||||
function refreshLiveStats() {
|
||||
var $count = $('.layui-icon-user').next();
|
||||
var $count = $('#toolbar-online > .text');
|
||||
$.get(liveStatsUrl, function (res) {
|
||||
$count.text(res.client_count);
|
||||
});
|
||||
|
@ -3,14 +3,17 @@ layui.use(['jquery', 'helper'], function () {
|
||||
var $ = layui.jquery;
|
||||
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 () {
|
||||
var $this = $(this);
|
||||
var $parent = $this.parent();
|
||||
var $likeCount = $this.next();
|
||||
var likeCount = parseInt($likeCount.text());
|
||||
var $likeCount = $parent.next();
|
||||
var likeCount = $likeCount.data('count');
|
||||
helper.checkLogin(function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
@ -18,23 +21,19 @@ layui.use(['jquery', 'helper'], function () {
|
||||
success: function () {
|
||||
if ($this.hasClass('active')) {
|
||||
$this.removeClass('active');
|
||||
$parent.attr('title', '点赞');
|
||||
$likeCount.text(likeCount - 1);
|
||||
likeCount -= 1;
|
||||
$parent.attr('title', '点赞支持');
|
||||
likeCount--;
|
||||
} else {
|
||||
$this.addClass('active');
|
||||
$parent.attr('title', '取消点赞');
|
||||
$likeCount.text(likeCount + 1);
|
||||
likeCount += 1;
|
||||
likeCount++;
|
||||
}
|
||||
$likeCount.data('count', likeCount).text(likeCount);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* 咨询
|
||||
*/
|
||||
$('.icon-help').on('click', function () {
|
||||
var url = $(this).parent().data('url');
|
||||
helper.checkLogin(function () {
|
||||
@ -47,10 +46,7 @@ layui.use(['jquery', 'helper'], function () {
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* 资料
|
||||
*/
|
||||
$('.icon-resource').on('click', function () {
|
||||
$('.icon-download').on('click', function () {
|
||||
var url = $(this).parent().data('url');
|
||||
helper.checkLogin(function () {
|
||||
layer.open({
|
187
public/static/home/js/comment.js
Normal file
187
public/static/home/js/comment.js
Normal 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('删除评论成功');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
@ -10,6 +10,8 @@ layui.use(['jquery', 'layer', 'helper'], function () {
|
||||
$('.icon-star').on('click', function () {
|
||||
var $this = $(this);
|
||||
var $parent = $this.parent();
|
||||
var $favoriteCount = $parent.next();
|
||||
var favoriteCount = $favoriteCount.data('count');
|
||||
helper.checkLogin(function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
@ -18,12 +20,15 @@ layui.use(['jquery', 'layer', 'helper'], function () {
|
||||
if ($this.hasClass('layui-icon-star-fill')) {
|
||||
$this.removeClass('layui-icon-star-fill');
|
||||
$this.addClass('layui-icon-star');
|
||||
$parent.attr('title', '收藏');
|
||||
$parent.attr('title', '收藏课程');
|
||||
favoriteCount--;
|
||||
} else {
|
||||
$this.removeClass('layui-icon-star');
|
||||
$this.addClass('layui-icon-star-fill');
|
||||
$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 $parent = $this.parent();
|
||||
var $likeCount = $this.next();
|
||||
var likeCount = parseInt($likeCount.text());
|
||||
var $likeCount = $this.prev();
|
||||
var likeCount = $likeCount.data('count');
|
||||
helper.checkLogin(function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: $parent.data('url'),
|
||||
url: $this.data('url'),
|
||||
success: function () {
|
||||
if ($this.hasClass('active')) {
|
||||
$this.removeClass('active');
|
||||
$parent.attr('title', '点赞');
|
||||
$likeCount.text(likeCount - 1);
|
||||
likeCount -= 1;
|
||||
if ($this.hasClass('liked')) {
|
||||
$this.attr('title', '点赞支持').text('点赞').removeClass('liked');
|
||||
likeCount--;
|
||||
} else {
|
||||
$this.addClass('active');
|
||||
$parent.attr('title', '取消点赞');
|
||||
$likeCount.text(likeCount + 1);
|
||||
likeCount += 1;
|
||||
$this.attr('title', '取消点赞').text('已赞').addClass('liked');
|
||||
likeCount++;
|
||||
}
|
||||
$likeCount.data('count', likeCount).text(likeCount);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user