chore: 重写初始提交(清空历史,整理后全量提交)
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}{$board.name}{/block}
|
||||
{block name="body"}
|
||||
<div class="layui-container fly-marginTop">
|
||||
<div class="fly-panel">
|
||||
<div class="fly-panel-title">
|
||||
<span>{$board.name}</span>
|
||||
<span class="fly-board-desc">{$board.description}</span>
|
||||
<span class="fly-board-actions">
|
||||
<a href="/forum/board/{$board.slug}?order=new" {if $order=='new'}class="layui-this"{/if}>最新</a>
|
||||
<a href="/forum/board/{$board.slug}?order=hot" {if $order=='hot'}class="layui-this"{/if}>热门</a>
|
||||
</span>
|
||||
</div>
|
||||
<ul class="fly-list">
|
||||
{volist name="topics" id="t"}
|
||||
<li class="fly-list-item">
|
||||
<h2><a class="fly-link" href="/forum/topic/{$t.id}">{$t.title}</a></h2>
|
||||
<div class="fly-list-info">
|
||||
<span class="fly-list-author">{$t.author.nickname|default='匿名'}</span>
|
||||
<span>{:date('Y-m-d', $t.create_at)}</span>
|
||||
<span class="fly-list-hint">
|
||||
<i class="iconfont icon-pinglun1"></i> {$t.reply_count}
|
||||
<i class="iconfont icon-kiss"></i> {$t.views}
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
<div class="fly-none" style="display:{if empty($topics.list)}block{else}none{/if}">本版块暂无帖子</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
@@ -0,0 +1,67 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}社区首页{/block}
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<!-- 左侧:版块 + 帖子流 -->
|
||||
<div class="layui-col-md8">
|
||||
<div class="fly-panel">
|
||||
<div class="fly-panel-title fly-cols">
|
||||
<a class="fly-col-title">最新帖子</a>
|
||||
<a class="fly-col-extra" href="/forum?order=hot">热门</a>
|
||||
</div>
|
||||
<ul class="fly-list">
|
||||
{volist name="topics" id="t"}
|
||||
<li class="fly-list-item">
|
||||
<a href="/forum/u/{$t.user_id}" class="fly-avatar">
|
||||
<img src="{$t.author.avatar|default='/static/forum/images/avatar.png'}" alt="">
|
||||
</a>
|
||||
<h2>
|
||||
<a class="fly-link" href="/forum/topic/{$t.id}">{$t.title}</a>
|
||||
{if $t.is_top == 1}<span class="layui-badge">置顶</span>{/if}
|
||||
{if $t.is_essence == 1}<span class="layui-badge layui-bg-green">精</span>{/if}
|
||||
</h2>
|
||||
<div class="fly-list-info">
|
||||
<a href="/forum/u/{$t.user_id}" class="fly-list-author">{$t.author.nickname|default='匿名'}</a>
|
||||
<span>{:date('Y-m-d', $t.create_at)}</span>
|
||||
<span class="fly-list-hint">
|
||||
<i class="iconfont icon-pinglun1" title="回复"></i> {$t.reply_count}
|
||||
<i class="iconfont icon-kiss" title="浏览"></i> {$t.views}
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
<div class="fly-none" style="display:{if empty($topics.list)}block{else}none{/if}">暂无帖子</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧:版块导航 + 热议 -->
|
||||
<div class="layui-col-md4">
|
||||
<div class="fly-panel">
|
||||
<h3 class="fly-panel-title">版块</h3>
|
||||
<div class="fly-board">
|
||||
{volist name="boards" id="b"}
|
||||
<a class="fly-board-item" href="/forum/board/{$b.slug}">
|
||||
<i class="layui-icon">{$b.icon|default=''}</i> {$b.name}
|
||||
<em>{$b.topic_count}</em>
|
||||
</a>
|
||||
{/volist}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fly-panel fly-rank">
|
||||
<h3 class="fly-panel-title">热议</h3>
|
||||
<ul class="fly-rank-list">
|
||||
{volist name="hot" id="h" length="10"}
|
||||
<li><a href="/forum/topic/{$h.id}">{$h.title}</a></li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="fly-panel" style="text-align:center;">
|
||||
<a href="/forum/post" class="layui-btn layui-btn-danger" style="width:100%;">发表新帖</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
@@ -0,0 +1,38 @@
|
||||
{extend name="index/layout" /}
|
||||
{block name="title"}附近帖子{/block}
|
||||
{block name="body"}
|
||||
<div class="fly-panel">
|
||||
<div class="fly-panel-title">附近帖子(半径 {$radius} km)</div>
|
||||
<div id="geo-tip" style="padding:10px;color:#999;">
|
||||
正在获取您的位置…
|
||||
</div>
|
||||
<ul class="fly-list" id="nearby-list" style="display:none;">
|
||||
{volist name="list" id="t"}
|
||||
<li>
|
||||
<a class="fly-list-title" href="/forum/topic/{$t.id}">{$t.title}</a>
|
||||
<span class="fly-list-info">
|
||||
{if isset($t.distance_km)}约 {$t.distance_km|round=2} km{/if}
|
||||
{$t.board.name|default=''}
|
||||
</span>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
<script>
|
||||
(function(){
|
||||
var tip = document.getElementById('geo-tip');
|
||||
var list = document.getElementById('nearby-list');
|
||||
function load(lat, lng){
|
||||
tip.style.display='none'; list.style.display='block';
|
||||
}
|
||||
if (navigator.geolocation) {
|
||||
navigator.geolocation.getCurrentPosition(function(p){
|
||||
var lat = p.coords.latitude, lng = p.coords.longitude;
|
||||
window.location.href = '/forum/nearby?lat='+lat+'&lng='+lng+'&radius=10';
|
||||
}, function(){ tip.textContent='获取位置失败,可在 URL 手动传 ?lat=&lng='; });
|
||||
} else {
|
||||
tip.textContent='浏览器不支持定位,请在 URL 手动传 ?lat=&lng=';
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
{/block}
|
||||
@@ -0,0 +1,11 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}未找到{/block}
|
||||
{block name="body"}
|
||||
<div class="layui-container fly-marginTop">
|
||||
<div class="fly-panel" style="padding:40px;text-align:center;">
|
||||
<i class="layui-icon" style="font-size:60px;color:#FF5722;"></i>
|
||||
<p style="margin-top:20px;font-size:16px;">{$msg|default='页面不存在'}</p>
|
||||
<p style="margin-top:10px;"><a href="/forum" class="layui-btn layui-btn-primary">返回社区首页</a></p>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
@@ -0,0 +1,84 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}发表新帖{/block}
|
||||
{block name="body"}
|
||||
<div class="layui-container fly-marginTop">
|
||||
<div class="fly-panel" pad20>
|
||||
<div class="layui-form layui-form-pane">
|
||||
<form class="layui-form" id="postForm">
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">所在版块</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="board_id" lay-verify="required">
|
||||
<option value=""></option>
|
||||
{volist name="boards" id="b"}
|
||||
<option value="{$b.id}">{$b.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type" lay-verify="required">
|
||||
{foreach $typeMap as $k=>$v}
|
||||
<option value="{$k}">{$v}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" required lay-verify="required" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">内容</label>
|
||||
<div class="layui-input-block">
|
||||
<script id="editor" name="content" type="text/plain" style="height:360px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button class="layui-btn" lay-submit lay-filter="postSubmit">立即发布</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script src="/assets/library/ueditor/ueditor.config.js"></script>
|
||||
<script src="/assets/library/ueditor/ueditor.all.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function(){
|
||||
var form = layui.form, $ = layui.jquery;
|
||||
|
||||
// 初始化 UEditor 富文本编辑器
|
||||
var ue = UE.getEditor('editor', {
|
||||
serverUrl: '/forum/backend/ueditor',
|
||||
initialFrameHeight: {$editorHeight|default=360},
|
||||
zIndex: 9999
|
||||
});
|
||||
|
||||
form.on('submit(postSubmit)', function(data){
|
||||
// 同步编辑器内容到表单字段
|
||||
data.field.content = UE.getEditor('editor').getContent();
|
||||
if (!data.field.content || data.field.content.replace(/<[^>]*>/g, '').trim() === '') {
|
||||
layer.msg('请填写帖子内容');
|
||||
return false;
|
||||
}
|
||||
$.post('/forum/post', data.field, function(res){
|
||||
if (res.code === 0) {
|
||||
var id = res.data && res.data.id;
|
||||
location.href = '/forum/topic/' + id;
|
||||
} else {
|
||||
layer.msg(res.message || '发布失败');
|
||||
}
|
||||
}, 'json');
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
@@ -0,0 +1,19 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}搜索{/block}
|
||||
{block name="body"}
|
||||
<div class="layui-container fly-marginTop">
|
||||
<form class="fly-search-form" action="/forum/search" method="get">
|
||||
<input type="text" name="q" value="{$kw}" placeholder="搜索帖子标题" class="layui-input">
|
||||
<button class="layui-btn">搜索</button>
|
||||
</form>
|
||||
<div class="fly-panel">
|
||||
{volist name="list" id="t"}
|
||||
<div class="fly-search-item">
|
||||
<a href="/forum/topic/{$t.id}">{$t.title}</a>
|
||||
<span>{:date('Y-m-d', $t.create_at)}</span>
|
||||
</div>
|
||||
{/volist}
|
||||
<div class="fly-none" style="display:{if empty($list.list)}block{else}none{/if}">{if $kw==''}请输入关键词{else}未找到相关帖子{/if}</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
@@ -0,0 +1,101 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}{$topic.title}{/block}
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md9">
|
||||
<div class="fly-panel" pad20>
|
||||
<div class="fly-detail">
|
||||
<h1 class="fly-detail-title">
|
||||
{if $topic.is_top == 1}<span class="layui-badge">置顶</span>{/if}
|
||||
{$topic.title}
|
||||
</h1>
|
||||
<div class="fly-detail-info">
|
||||
<span class="layui-badge layui-bg-green">{$typeName}</span>
|
||||
<a href="/forum/board/{$board.slug}">{$board.name}</a>
|
||||
<span>作者:<a href="/forum/u/{$topic.user_id}">{$author.nickname|default='匿名'}</a></span>
|
||||
<span>{:date('Y-m-d H:i', $topic.create_at)}</span>
|
||||
<span class="fly-detail-hint">{$topic.views} 阅 / {$topic.reply_count} 答</span>
|
||||
</div>
|
||||
<div class="fly-detail-body">
|
||||
{$topic.content|raw}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="layui-bg-gray">
|
||||
|
||||
<div class="fly-detail-reply">
|
||||
<div class="fly-detail-reply-title">
|
||||
回复 ({$topic.reply_count})
|
||||
</div>
|
||||
<ul class="fly-reply-list">
|
||||
{volist name="replyList" id="r"}
|
||||
<li class="fly-reply-item">
|
||||
<a href="/forum/u/{$r.user_id}" class="fly-reply-avatar">
|
||||
<img src="{if $r.avatar}{$r.avatar}{else}/static/forum/images/avatar.png{/if}">
|
||||
</a>
|
||||
<div class="fly-reply-main">
|
||||
<div class="fly-reply-head">
|
||||
<a href="/forum/u/{$r.user_id}" class="fly-reply-name">{$r.nickname}</a>
|
||||
<span class="fly-reply-floor">{$r.floor}楼</span>
|
||||
<span class="fly-reply-time">{:date('Y-m-d H:i', $r.create_at)}</span>
|
||||
</div>
|
||||
<div class="fly-reply-body">
|
||||
{$r.content|raw}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
<div class="fly-none" style="display:{if empty($replies)}block{else}none{/if}">暂无回复,快来抢沙发</div>
|
||||
</div>
|
||||
|
||||
<!-- 回复表单 -->
|
||||
{if $user}
|
||||
<form class="fly-reply-form layui-form" id="replyForm">
|
||||
<input type="hidden" name="topic_id" value="{$topic.id}">
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<textarea name="content" required lay-verify="required" placeholder="回复内容" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button class="layui-btn" lay-submit lay-filter="replySubmit">提交回复</button>
|
||||
</div>
|
||||
</form>
|
||||
{else}
|
||||
<div class="fly-reply-tip"><a href="/user/login">登录</a> 后参与回复</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md3">
|
||||
<div class="fly-panel">
|
||||
<h3 class="fly-panel-title">{$board.name}</h3>
|
||||
<p>{$board.description}</p>
|
||||
</div>
|
||||
{if !empty($related)}
|
||||
<div class="fly-panel" style="margin-top:15px;">
|
||||
<h3 class="fly-panel-title">相关帖子</h3>
|
||||
<ul class="fly-related-list">
|
||||
{volist name="related" id="rel"}
|
||||
<li><a href="/forum/topic/{$rel.id}">{$rel.title}</a></li>
|
||||
{/volist}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function(){
|
||||
var form = layui.form, $ = layui.jquery;
|
||||
form.on('submit(replySubmit)', function(data){
|
||||
$.post('/forum/reply', data.field, function(res){
|
||||
if (res.code === 0) { location.reload(); }
|
||||
else { layer.msg(res.message || '失败'); }
|
||||
}, 'json');
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
@@ -0,0 +1,26 @@
|
||||
{extend name="layout" /}
|
||||
{block name="title"}{$user.nickname} 的主页{/block}
|
||||
{block name="body"}
|
||||
<div class="layui-container fly-marginTop">
|
||||
<div class="fly-home fly-panel">
|
||||
<img src="{$user.avatar|default='/static/forum/images/avatar.png'}" alt="{$user.nickname}">
|
||||
<h1>{$user.nickname}</h1>
|
||||
<p class="fly-home-sign">{$user.intro|default='这家伙很懒,什么都没留下'}</p>
|
||||
</div>
|
||||
<div class="fly-panel">
|
||||
<h3 class="fly-panel-title">TA 的帖子</h3>
|
||||
<ul class="fly-list">
|
||||
{volist name="topics" id="t"}
|
||||
<li class="fly-list-item">
|
||||
<h2><a class="fly-link" href="/forum/topic/{$t.id}">{$t.title}</a></h2>
|
||||
<div class="fly-list-info">
|
||||
<span>{:date('Y-m-d', $t.create_at)}</span>
|
||||
<span class="fly-list-hint">{$t.reply_count} 答 / {$t.views} 阅</span>
|
||||
</div>
|
||||
</li>
|
||||
{/volist}
|
||||
</ul>
|
||||
<div class="fly-none" style="display:{if empty($topics)}block{else}none{/if}">TA 还没有发帖</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
Reference in New Issue
Block a user