签到优化,编辑器添加视频音频组

This commit is contained in:
taoser 2021-05-22 18:33:26 +08:00
parent 4d55dc434f
commit 4988394f0d
10 changed files with 218 additions and 46 deletions

View File

@ -123,7 +123,7 @@ class Article extends Model
'user' => function($query){ 'user' => function($query){
$query->field('id,name,nickname,user_img,area_id,vip'); $query->field('id,name,nickname,user_img,area_id,vip');
} ]) } ])
->withCount(['comments'])->where(['status'=>1,'delete_time'=>0])->order('create_time','desc')->limit($num)->select(); ->withCount(['comments'])->where(['status'=>1,'is_top'=>0])->order('create_time','desc')->limit($num)->select();
Cache::tag('tagArt')->set('artlist',$artList,60); Cache::tag('tagArt')->set('artlist',$artList,60);
} }
return $artList; return $artList;

View File

@ -290,6 +290,28 @@ class Article extends BaseController
return json($res); return json($res);
} }
//上传附件
public function upVideo()
{
$file = request()->file('file');
try {
validate(['file'=>'fileSize:10240000|fileExt:mp4,jpg,png,jpeg'])
->check(['file'=>$file]);
$savename = \think\facade\Filesystem::disk('public')->putFile('video',$file);
} catch (ValidateException $e) {
return json(['status'=>-1,'msg'=>$e->getMessage()]);
}
$upload = Config::get('filesystem.disks.public.url');
if($savename){
$name_path =str_replace('\\',"/",$upload.'/'.$savename);
$res = ['status'=>0,'msg'=>'上传成功','url'=> $name_path];
}else{
$res = ['status'=>-1,'msg'=>'上传错误'];
}
return json($res);
}
//附件下载 //附件下载
public function download($id) public function download($id)
{ {

View File

@ -5,9 +5,6 @@ use app\common\controller\BaseController;
use app\common\model\User; use app\common\model\User;
use think\facade\Session; use think\facade\Session;
use think\facade\Db; use think\facade\Db;
use think\facade\View;
use think\Collection;
use think\Response;
use taoler\com\Level; use taoler\com\Level;
class Sign extends BaseController class Sign extends BaseController
@ -22,7 +19,7 @@ class Sign extends BaseController
$res = []; $res = [];
$res['status'] = 0; $res['status'] = 0;
//最新 //最新签到
$newlist = Db::name('user_sign')->alias('s')->join('user u', 's.uid=u.id')->field('s.*,u.name as name,u.user_img as user_img')->order('id desc')->limit(20)->select(); $newlist = Db::name('user_sign')->alias('s')->join('user u', 's.uid=u.id')->field('s.*,u.name as name,u.user_img as user_img')->order('id desc')->limit(20)->select();
if(count($newlist)){ if(count($newlist)){
@ -45,11 +42,11 @@ class Sign extends BaseController
$res['data'][1] = []; $res['data'][1] = [];
} }
// //签到排行
$totallist = Db::name('user_sign')->alias('s')->leftJoin('user u', 's.uid=u.id')->field('uid,s.id as id,max(days) as days,name,user_img')->group('uid')->order('days desc')->limit(20)->select(); $totallist = Db::name('user_sign')->alias('s')->leftJoin('user u', 's.uid=u.id')->field('uid,s.id as id,max(days) as days,name,user_img')->group('uid')->order('days desc')->limit(20)->select();
if(count($totallist)){ if(count($totallist)){
foreach($totallist as $t){ foreach($totallist as $t){
$total = ['uid'=>$t['uid'],'days'=>$f['days'],'user'=>['username'=>$t['name'],'avatar'=>$t['user_img']]]; $total = ['uid'=>$t['uid'],'days'=>$t['days'],'user'=>['username'=>$t['name'],'avatar'=>$t['user_img']]];
$res['data'][2][] = $total; $res['data'][2][] = $total;
} }
} else { } else {
@ -58,44 +55,48 @@ class Sign extends BaseController
return json($res); return json($res);
} }
//签到状态 /**
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function status() public function status()
{ {
if(session('user_id')){ if(session('user_id')){
$res = $this->todayData()->getData(); $res = $this->todayData()->getData();
if($res['is_sign'] == 1){ if($res['is_sign'] == 1){
return json(['status'=>0,'msg'=>'已签到','data'=>['signed'=>$res['is_sign'],'token'=>'1111','experience'=>$res['score'],'days'=>$res['days']]]); return json(['status'=>0,'msg'=>'已签到','data'=>['signed'=>$res['is_sign'],'token'=>'1111','experience'=>$res['score'],'days'=>$res['days']]]);
} else { } else {
return json(['status'=>0,'msg'=>'未签到','data'=>['signed'=>0,'token'=>'1111','experience'=>$res['will_getscore'],'days'=>$res['days']]]); return json(['status'=>0,'msg'=>'未签到','data'=>['signed'=>0,'experience'=>$res['will_getscore'],'days'=>$res['days']]]);
} }
} else { } else {
return json(['status'=>0,'msg'=>'未登陆']); return json(['status'=>0,'msg'=>'未登陆']);
} }
} }
//执行签到
/** /**
* 执行当天签到 * 执行签到返回json status 0成功
* @return json 签到成功返回 {status:1,info:'已签到'} * @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/ */
public function sign() public function sign()
{ {
if (!Session::has('user_id') || !Session::has('user_name')) { if (!Session::has('user_id') || !Session::has('user_name')) {
return json(['status'=>1,'code' => -1, 'msg' => '亲,登陆后才能签到哦','url' => url('Login/index')]); return json(['status'=>1,'code' => -1, 'msg' => '亲,登陆后才能签到哦']);
} else { } else {
$uid = $this->uid; $uid = $this->uid;
$todayData = $this->todayData()->getData(); $todayData = $this->todayData()->getData();
//var_dump($todayData);
if ($todayData['is_sign'] == 1) { //数组中是返回的是一个对象,不能直接用[]来显示,正确的输出方法是:$pic[0]->title问题解决 if ($todayData['is_sign'] == 1) {
//exit('{"code":-1,"msg":"你今天已经签过到了"}'); return json(['status'=>1,'code'=>1,'msg'=>'你今天已签过到!']);
return json(['status'=>1,'code'=>-1,'msg'=>'你今天已签过到!']);
} else { } else {
$data = $this->getInsertData($uid); $data = $this->getInsertData($uid);
$days = $data['days']; $days = $data['days'];
// 无今天数据 // 无今天数据
$data['uid'] = $uid; $data['uid'] = $uid;
@ -126,15 +127,16 @@ class Sign extends BaseController
//point_note($score, $uid, $id); //point_note($score, $uid, $id);
//到达积分值升级Vip等级 //到达积分值升级Vip等级
$viplv = Level::writeLv($uid); Level::writeLv($uid);
} }
return json(['status'=>0,'code'=>200,'msg'=>$msg,'data'=>['signed'=>1,'experience'=>$score,'days'=>$days]]); return json(['status'=>0,'code'=>200,'msg'=>$msg,'data'=>['signed'=>1,'experience'=>$score,'days'=>$days]]);
} else { } else {
return json(['status'=>1,'code'=>-1,'msg'=>'签到失败,请刷新后重试!']); return json(['status'=>1,'code'=>1,'msg'=>'签到失败,请刷新后重试!']);
} }
} }
} }
} }
/** /**
* 返回每次签到要插入的数据 * 返回每次签到要插入的数据
* *
@ -150,7 +152,7 @@ class Sign extends BaseController
// 昨天的连续签到天数 // 昨天的连续签到天数
$start_time = strtotime(date('Y-m-d 0:0:0', time() - 86400)) - 1; $start_time = strtotime(date('Y-m-d 0:0:0', time() - 86400)) - 1;
$end_time = strtotime(date('Y-m-d 23:59:59', time() - 86400)) + 1; $end_time = strtotime(date('Y-m-d 23:59:59', time() - 86400)) + 1;
$days = Db::name('user_sign')->where("uid = $uid and stime > $start_time and stime < $end_time")->value('days'); $days = Db::name('user_sign')->where('uid', $uid)->whereBetweenTime('stime', $start_time, $end_time)->value('days');
if ($days) { if ($days) {
$days++; $days++;
$is_sign = 1; $is_sign = 1;
@ -170,16 +172,20 @@ class Sign extends BaseController
'stime' => $time, 'stime' => $time,
]; ];
} }
/** /**
* 用户当天签到的数据 * 用户当天签到的数据 返回Array
* @return array 签到信息 is_sign,stime * @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/ */
public function todayData() public function todayData()
{ {
$time = time(); $time = time();
$start_stime = strtotime(date('Y-m-d 0:0:0', $time)) - 1; $start_stime = strtotime(date('Y-m-d 0:0:0', $time)) - 1;
$end_stime = strtotime(date('Y-m-d 23:59:59', $time)) + 1; $end_stime = strtotime(date('Y-m-d 23:59:59', $time)) + 1;
$res = Db::name('user_sign')->where('uid',session('user_id'))->where('stime', '>', $start_stime and 'stime', '<', $end_stime)->find(); $res = Db::name('user_sign')->where('uid',session('user_id'))->whereTime('stime', 'between', [$start_stime,$end_stime])->find();
$score = 0; $score = 0;
if ($res) { if ($res) {
$is_sign = 1; $is_sign = 1;
@ -295,12 +301,11 @@ class Sign extends BaseController
$start_stime = strtotime("$year-$month-1 0:0:0") - 1; $start_stime = strtotime("$year-$month-1 0:0:0") - 1;
$end_stime = strtotime("$year-$month-$day 23:59:59") + 1; $end_stime = strtotime("$year-$month-$day 23:59:59") + 1;
$list = Db::name('user_sign')->where("uid = {$this->uid} and stime > $start_stime and stime < $end_stime")->order('stime asc')->column('stime'); $list = Db::name('user_sign')->where("uid = {$this->uid} and stime > $start_stime and stime < $end_stime")->order('stime asc')->column('stime');
//if(is_array($list)){
foreach ($list as $key => $value) { foreach ($list as $key => $value) {
$list[$key] = date('j', $value); $list[$key] = date('j', $value);
} }
//}
//return $list;
return json_encode($list); return json_encode($list);
} }

View File

@ -56,9 +56,9 @@ return [
'finished' => '已结', 'finished' => '已结',
'end' => '已结', 'end' => '已结',
'no finished' => '未结', 'no finished' => '未结',
'hot' => '热贴', 'hot' => '加精',
'top' => '精贴', 'top' => '置顶',
'cancel hoting' => '取消', 'cancel hoting' => '取消精',
'cancel topping' => '取消置顶', 'cancel topping' => '取消置顶',
'go sign' => '去签到', 'go sign' => '去签到',
'more post' => '更多帖子', 'more post' => '更多帖子',

View File

@ -56,9 +56,9 @@ return [
'finished' => '已結', 'finished' => '已結',
'end' => '已結', 'end' => '已結',
'no finished' => '未結', 'no finished' => '未結',
'hot' => '熱貼', 'hot' => '加精',
'top' => '精貼', 'top' => '置頂',
'cancel hoting' => '取消', 'cancel hoting' => '取消精',
'cancel topping' => '取消置頂', 'cancel topping' => '取消置頂',
'go sign' => '去簽到', 'go sign' => '去簽到',
'more post' => '更多帖子', 'more post' => '更多帖子',

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,6 @@
@Name: Fly社区主入口 @Name: Fly社区主入口
2021-5.21 2021-5.21
*/ */
layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(exports){ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(exports){
@ -37,7 +36,6 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
} }
}; };
//数字前置补零 //数字前置补零
layui.laytpl.digit = function(num, length, end){ layui.laytpl.digit = function(num, length, end){
var str = ''; var str = '';
@ -102,6 +100,8 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
,'<span type="quote" title="引用"><i class="iconfont icon-yinyong" style="top: 1px;"></i></span>' ,'<span type="quote" title="引用"><i class="iconfont icon-yinyong" style="top: 1px;"></i></span>'
,'<span type="code" title="插入代码" class="layui-hide-xs"><i class="iconfont icon-emwdaima" style="top: 1px;"></i></span>' ,'<span type="code" title="插入代码" class="layui-hide-xs"><i class="iconfont icon-emwdaima" style="top: 1px;"></i></span>'
,'<span type="hr" title="水平线">hr</span>' ,'<span type="hr" title="水平线">hr</span>'
,'<span type="video" title="视频"><i class="layui-icon layui-icon-video"></i></span>'
,'<span type="audio" title="音频"><i class="layui-icon layui-icon-headset"></i></span>'
,'<span type="preview" title="预览"><i class="iconfont icon-yulan1"></i></span>' ,'<span type="preview" title="预览"><i class="iconfont icon-yulan1"></i></span>'
,'</div>'].join(''); ,'</div>'].join('');
@ -244,6 +244,105 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
layui.focusInsert(editor[0], '[hr]\n'); layui.focusInsert(editor[0], '[hr]\n');
editor.trigger('keyup'); editor.trigger('keyup');
} }
,video: function(editor){ //插入视频
layer.open({
type: 1
,id: 'fly-jie-video-upload'
,title: '插入视频'
,shade: false
,area: '465px'
,skin: 'layui-layer-border'
,content: ['<ul class="layui-form layui-form-pane" style="margin: 20px;">'
,'<li class="layui-form-item">'
,'<label class="layui-form-label">封面</label>'
,'<div class="layui-input-inline">'
,'<input type="text" required name="cover" placeholder="支持直接粘贴远程图片地址" value="" class="layui-input">'
,'</div>'
,'<input required type="file" name="file" lay-type="image" class="layui-upload-file" value="">'
,'</li>'
,'<li class="layui-form-item">'
,'<label class="layui-form-label">URL</label>'
,'<div class="layui-input-inline">'
,'<input type="text" required name="video" placeholder="支持直接粘贴远程视频地址" value="" class="layui-input">'
,'</div>'
,'<input required type="file" name="file" lay-type="video" class="layui-upload-file" value="上传文件">'
,'</li>'
,'<li class="layui-form-item" style="text-align: center;">'
,'<button type="button" lay-submit lay-filter="uploadImages" class="layui-btn">确认</button>'
,'</li>'
,'</ul>'].join('')
,success: function(layero, index){
var loding, video = layero.find('input[name="video"]'), cover = layero.find('input[name="cover"]');
upload.render({
url: '/article/upVideo/'
,before: function(input){ loding = layer.msg('文件上传中,请稍等哦', { icon: 16 ,shade:0.3,time:0 }); }
,elem: '#fly-jie-video-upload .layui-upload-file'
,success: function(res,input){
layer.close(loding);
if(res.status == 0){
if($(input).attr('lay-type') == 'image'){
cover.val(res.data);
}else{
video.val(res.data);
}
} else {
layer.msg(res.msg, {icon: 5});
}
}
});
form.on('submit(uploadImages)', function(data){
var field = data.field;
if(!field.video) return video.focus();
layui.focusInsert(editor[0], 'video('+field.cover+')['+ field.video + '] ');
layer.close(index);
});
}
});
}
,audio: function(editor){ //插入音频
layer.open({
type: 1
,id: 'fly-jie-audio-upload'
,title: '插入音频'
,shade: false
,area: '465px'
,skin: 'layui-layer-border'
,content: ['<ul class="layui-form layui-form-pane" style="margin: 20px;">'
,'<li class="layui-form-item">'
,'<label class="layui-form-label">URL</label>'
,'<div class="layui-input-inline">'
,'<input required name="audio" placeholder="支持直接粘贴远程音频地址" value="" class="layui-input">'
,'</div>'
,'<input required type="file" name="file" lay-type="audio" class="layui-upload-file" value="">'
,'</li>'
,'<li class="layui-form-item" style="text-align: center;">'
,'<button type="button" lay-submit lay-filter="uploadImages" class="layui-btn">确认</button>'
,'</li>'
,'</ul>'].join('')
,success: function(layero, index){
var loding,image = layero.find('input[name="audio"]');
upload.render({
url: '/Ajax/ThreadUpload/',elem: '#fly-jie-audio-upload .layui-upload-file'
,before: function(input){ loding = layer.msg('文件上传中,请稍等哦', { icon: 16 ,shade:0.3,time:0 }); }
,success: function(res){
layer.close(loding);
if(res.status == 1){
image.val(res.data);
} else {
layer.msg(res.msg, {icon: 5});
}
}
});
form.on('submit(uploadImages)', function(data){
var field = data.field;
if(!field.audio) return image.focus();
layui.focusInsert(editor[0], 'audio['+ field.audio + '] ');
layer.close(index);
});
}
});
}
,preview: function(editor, span){ //预览 ,preview: function(editor, span){ //预览
var othis = $(span), getContent = function(){ var othis = $(span), getContent = function(){
var content = editor.val(); var content = editor.val();
@ -388,6 +487,18 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
//转义换行 //转义换行
.replace(/\n/g, '<br>') .replace(/\n/g, '<br>')
//转义视频
.replace(/video\(.*?\)\[([^\s]+?)\]/g, function(str){
var cover = (str.match(/video\(([\s\S]+?)\)\[/)||[])[1];
var video = (str.match(/\)\[([^\s]+?)\]/)||[])[1];
cover = cover ? cover : '/Public/Topic/images/video_cover.jpg';
return '<video poster="'+ cover + '" controls crossorigin><source src="'+ video + '" type="video/mp4"></video>';
})
//转义音频
.replace(/audio\[([^\s]+?)\]/g, function(audio){
return '<audio controls><source src="'+ audio.replace(/(^audio\[)|(\]$)/g, '')+ '" type="audio/mp3"></audio>';
})
return content; return content;
} }
@ -475,8 +586,10 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
} }
//刷新图形验证码 //刷新图形验证码
$('body').on('click', '.fly-imagecode', function(){ $('body').on('click', '#captcha111', function(){
this.src = '/index/captcha?id='+ new Date().getTime(); var othis = $(this);
othis.attr('src', othis.attr('src')+'?'+ new Date().getTime());
//console.log(othis.attr('src'));
}); });
//头条轮播 //头条轮播
@ -543,7 +656,7 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
if(elemSigninMain[0]){ if(elemSigninMain[0]){
fly.json('/sign/status', function(res){ fly.json(signStatusUrl, function(res){
if(!res.data) return; if(!res.data) return;
signRender.token = res.data.token; signRender.token = res.data.token;
signRender(res.data); signRender(res.data);
@ -551,10 +664,20 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
} }
$('body').on('click', '#LAY_signin', function(){ $('body').on('click', '#LAY_signin', function(){
//登录判断
var uid = layui.cache.user.uid;
if(uid == -1){
console.log(uid);
layer.msg('请登录再评论', {icon: 6}, function(){
location.href = login;
})
return false;
}
var othis = $(this); var othis = $(this);
if(othis.hasClass(DISABLED)) return; if(othis.hasClass(DISABLED)) return;
fly.json('/sign/sign/', { fly.json(signInUrl, {
token: signRender.token || 1 token: signRender.token || 1
}, function(res){ }, function(res){
signRender(res.data); signRender(res.data);
@ -570,7 +693,7 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
//签到说明 //签到说明
elemSigninHelp.on('click', function(){ elemSigninHelp.on('click', function(){
$.getJSON('/sign/getsignrule', function(data) { $.getJSON(signRuleUrl, function(data) {
//拼接表格字符串 //拼接表格字符串
var $str = ''; var $str = '';
@ -611,10 +734,12 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
,'<img src="{{item.user.avatar}}">' ,'<img src="{{item.user.avatar}}">'
,'<cite class="fly-link">{{item.user.username}}</cite>' ,'<cite class="fly-link">{{item.user.username}}</cite>'
,'</a>' ,'</a>'
,'{{# var date = new Date(item.time); if(d.index < 2){ }}' ,'{{# var date = new Date(item.time); if(d.index === 0) { }}'
,'<span class="fly-grey">签到于 {{ layui.laytpl.digit(date.getHours()) + ":" + layui.laytpl.digit(date.getMinutes()) + ":" + layui.laytpl.digit(date.getSeconds()) }}</span>' ,'<span class="fly-grey"> {{ layui.laytpl.digit(date.getFullYear()) + "-" + layui.laytpl.digit(date.getMonth()+1) + "-" + layui.laytpl.digit(date.getDate())}} 签到 <i class="layui-icon layui-icon-ok"></i></span>'
,'{{# } else if(d.index == 1) { }}'
,'<span class="fly-grey">签到于 {{ layui.laytpl.digit(date.getHours()) + ":" + layui.laytpl.digit(date.getMinutes()) + ":" + layui.laytpl.digit(date.getSeconds()) }} <i class="layui-icon layui-icon-flag"></i></span>'
,'{{# } else { }}' ,'{{# } else { }}'
,'<span class="fly-grey">已连续签到 <i>{{ item.days }}</i> 天</span>' ,'<span class="fly-grey">已连续签到 <i>{{ item.days }}</i> 天 <i class="layui-icon layui-icon-face-smile"></i></span>'
,'{{# } }}' ,'{{# } }}'
,'</li>' ,'</li>'
,'{{# }); }}' ,'{{# }); }}'
@ -628,7 +753,7 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
elemSigninTop.on('click', function(){ elemSigninTop.on('click', function(){
var loadIndex = layer.load(1, {shade: 0.8}); var loadIndex = layer.load(1, {shade: 0.8});
fly.json('/sign/signJson', function(res){ //实际使用,请将 url 改为真实接口 fly.json(signJsonUrl, function(res){ //实际使用,请将 url 改为真实接口
var tpl = $(['<div class="layui-tab layui-tab-brief" style="margin: 5px 0 0;">' var tpl = $(['<div class="layui-tab layui-tab-brief" style="margin: 5px 0 0;">'
,'<ul class="layui-tab-title">' ,'<ul class="layui-tab-title">'
,'<li class="layui-this">最新签到</li>' ,'<li class="layui-this">最新签到</li>'
@ -801,6 +926,10 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function(
fly.layEditor({ fly.layEditor({
elem: '.fly-editor' elem: '.fly-editor'
}); });
//加载播放器
layui.use('plyr', function(plyr){
plyr.setup();
});
//手机设备的简单适配 //手机设备的简单适配
var treeMobile = $('.site-tree-mobile') var treeMobile = $('.site-tree-mobile')

File diff suppressed because one or more lines are too long

View File

@ -105,6 +105,10 @@
{block name="script"} {block name="script"}
<script> <script>
var replyUrl = "{:url('index/reply')}"; var replyUrl = "{:url('index/reply')}";
var signStatusUrl = "{:url('sign/status')}";
var signInUrl = "{:url('sign/sign')}";
var signRuleUrl = "{:url('sign/getsignrule')}";
var signJsonUrl = "{:url('sign/signJson')}";
$('#friend-link').on('click', function(){ $('#friend-link').on('click', function(){
layer.open({ layer.open({

View File

@ -37,4 +37,11 @@
{/block} {/block}
{block name="script"} {block name="script"}
<script>
var replyUrl = "{:url('index/reply')}";
var signStatusUrl = "{:url('sign/status')}";
var signInUrl = "{:url('sign/sign')}";
var signRuleUrl = "{:url('sign/getsignrule')}";
var signJsonUrl = "{:url('sign/signJson')}";
</script>
{/block} {/block}