Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
alading2018
ShopXO
提交
d98369d7
ShopXO
项目概览
alading2018
/
ShopXO
与 Fork 源项目一致
Fork自
纵之格 / ShopXO
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
ShopXO
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d98369d7
编写于
11月 09, 2021
作者:
G
gongfuxiang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
文章优化、支持分类、支持小程序
上级
dcf49be5
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
707 addition
and
112 deletion
+707
-112
app/api/controller/Article.php
app/api/controller/Article.php
+148
-0
app/index/controller/Article.php
app/index/controller/Article.php
+111
-10
app/index/view/default/article/category.html
app/index/view/default/article/category.html
+165
-0
app/index/view/default/article/index.html
app/index/view/default/article/index.html
+45
-27
app/index/view/default/index/index.html
app/index/view/default/index/index.html
+4
-6
app/index/view/default/safety/index.html
app/index/view/default/safety/index.html
+1
-1
app/route/route.config
app/route/route.config
+1
-0
app/service/ArticleService.php
app/service/ArticleService.php
+137
-38
public/static/index/default/css/article.css
public/static/index/default/css/article.css
+94
-29
public/static/index/default/css/index.css
public/static/index/default/css/index.css
+1
-1
未找到文件。
app/api/controller/Article.php
0 → 100644
浏览文件 @
d98369d7
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://opensource.org/licenses/mit-license.php )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace
app\api\controller
;
use
app\service\ApiService
;
use
app\service\SystemBaseService
;
use
app\service\ArticleService
;
/**
* 文章
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
class
Article
extends
Common
{
/**
* 构造方法
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
__construct
()
{
// 调用父类前置方法
parent
::
__construct
();
}
/**
* 初始化
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
Index
()
{
// 获取分类
$article_category
=
ArticleService
::
ArticleCategoryList
();
// 返回数据
$result
=
[
'category_list'
=>
$article_category
[
'data'
],
];
return
ApiService
::
ApiDataReturn
(
SystemBaseService
::
DataReturn
(
$result
));
}
/**
* 分类文章列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
DataList
()
{
// 参数
$params
=
$this
->
data_post
;
// 分页
$number
=
10
;
$page
=
max
(
1
,
isset
(
$this
->
data_post
[
'page'
])
?
intval
(
$this
->
data_post
[
'page'
])
:
1
);
// 条件
$where
=
ArticleService
::
ArticleWhere
(
$params
);
// 获取总数
$total
=
ArticleService
::
ArticleTotal
(
$where
);
$page_total
=
ceil
(
$total
/
$number
);
$start
=
intval
((
$page
-
1
)
*
$number
);
// 获取列表
$data_params
=
[
'm'
=>
$start
,
'n'
=>
$number
,
'where'
=>
$where
,
];
$data
=
ArticleService
::
ArticleList
(
$data_params
);
// 返回数据
$result
=
[
'total'
=>
$total
,
'page_total'
=>
$page_total
,
'data'
=>
$data
[
'data'
],
];
return
ApiService
::
ApiDataReturn
(
SystemBaseService
::
DataReturn
(
$result
));
}
/**
* 文章详情
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
Detail
()
{
// 获取文章
if
(
!
empty
(
$this
->
data_request
[
'id'
]))
{
// 获取数据
$id
=
intval
(
$this
->
data_request
[
'id'
]);
$params
=
[
'where'
=>
[
'is_enable'
=>
1
,
'id'
=>
$id
,
],
'field'
=>
'id,title,title_color,jump_url,content,access_count,article_category_id,seo_title,seo_keywords,seo_desc,add_time'
,
'm'
=>
0
,
'n'
=>
1
,
];
$data
=
ArticleService
::
ArticleList
(
$params
);
if
(
!
empty
(
$data
[
'data'
][
0
]))
{
// 访问统计
ArticleService
::
ArticleAccessCountInc
([
'id'
=>
$id
]);
// 返回数据
$result
=
[
'data'
=>
$data
[
'data'
][
0
],
'category_list'
=>
$article_category
[
'data'
],
];
$ret
=
SystemBaseService
::
DataReturn
(
$result
);
}
else
{
$ret
=
DataReturn
(
'文章不存在或已删除'
,
-
1
);
}
}
else
{
$ret
=
DataReturn
(
'文章ID有误'
,
-
1
);
}
return
ApiService
::
ApiDataReturn
(
$ret
);
}
}
?>
\ No newline at end of file
app/index/controller/Article.php
浏览文件 @
d98369d7
...
...
@@ -36,11 +36,12 @@ class Article extends Common
}
/**
* [Index 文章详情]
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-06T21:31:53+0800
* 文章详情
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
Index
()
{
...
...
@@ -77,8 +78,11 @@ class Article extends Common
}
// 获取分类
$article_category_content
=
ArticleService
::
ArticleCategoryListContent
();
MyViewAssign
(
'category_list'
,
$article_category_content
[
'data'
]);
$article_category
=
ArticleService
::
ArticleCategoryList
();
MyViewAssign
(
'category_list'
,
$article_category
[
'data'
]);
// 上一篇、下一篇
MyViewAssign
(
'last_next_data'
,
ArticleService
::
ArticleLastNextData
(
$id
));
// seo
$seo_title
=
empty
(
$article
[
'seo_title'
])
?
$article
[
'title'
]
:
$article
[
'seo_title'
];
...
...
@@ -93,7 +97,7 @@ class Article extends Common
}
// 钩子
$this
->
PluginsHook
(
$id
,
$article
);
$this
->
Plugins
Content
Hook
(
$id
,
$article
);
MyViewAssign
(
'article'
,
$article
);
return
MyView
();
...
...
@@ -105,7 +109,104 @@ class Article extends Common
}
/**
* 钩子处理
* 文章分类
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
*/
public
function
Category
()
{
// 条件
$where
=
ArticleService
::
ArticleWhere
(
$this
->
data_request
);
// 总数
$total
=
ArticleService
::
ArticleTotal
(
$where
);
// 分页
$page_params
=
[
'number'
=>
$this
->
page_size
,
'total'
=>
$total
,
'where'
=>
$this
->
data_request
,
'page'
=>
$this
->
page
,
'url'
=>
MyUrl
(
'index/article/category'
),
];
$page
=
new
\
base\Page
(
$page_params
);
// 获取列表
$data_params
=
[
'm'
=>
$page
->
GetPageStarNumber
(),
'n'
=>
$this
->
page_size
,
'where'
=>
$where
,
];
$ret
=
ArticleService
::
ArticleList
(
$data_params
);
// 获取分类
$article_category
=
ArticleService
::
ArticleCategoryList
();
MyViewAssign
(
'category_list'
,
$article_category
[
'data'
]);
// 分类信息
$category_info
=
ArticleService
::
ArticleCategoryInfo
(
$this
->
data_request
,
$article_category
[
'data'
]);
MyViewAssign
(
'category_info'
,
$category_info
);
// 浏览器名称
MyViewAssign
(
'home_seo_site_title'
,
SeoService
::
BrowserSeoTitle
(
empty
(
$category_info
)
?
'所有文章'
:
$category_info
[
'name'
],
1
));
// 基础参数赋值
MyViewAssign
(
'page_html'
,
$page
->
GetPageHtml
());
MyViewAssign
(
'data_list'
,
$ret
[
'data'
]);
MyViewAssign
(
'params'
,
$this
->
data_request
);
// 钩子
$this
->
PluginsCategoryHook
(
$ret
[
'data'
],
$this
->
data_request
);
return
MyView
();
}
/**
* 分类钩子处理
* @author whats
* @version 1.0.0
* @date 2019-04-22
* @desc description
* @param [array] $data [文章内容]
* @param [array] $params [输入参数]
*/
private
function
PluginsCategoryHook
(
&
$data
,
$params
=
[])
{
$hook_arr
=
[
// 分类内容顶部钩子
'plugins_view_article_category_top'
,
// 分类底部钩子
'plugins_view_article_category_bottom'
,
// 分类内容顶部钩子
'plugins_view_article_category_content_top'
,
// 分类内容底部钩子
'plugins_view_article_category_content_botton'
,
// 分类左侧内部顶部钩子
'plugins_view_article_category_left_inside_top'
,
// 分类左侧内部底部钩子
'plugins_view_article_category_left_inside_botton'
,
];
foreach
(
$hook_arr
as
$hook_name
)
{
MyViewAssign
(
$hook_name
.
'_data'
,
MyEventTrigger
(
$hook_name
,
[
'hook_name'
=>
$hook_name
,
'is_backend'
=>
false
,
'data'
=>
&
$data
,
'params'
=>
$params
,
]));
}
}
/**
* 内容钩子处理
* @author whats
* @version 1.0.0
* @date 2019-04-22
...
...
@@ -113,7 +214,7 @@ class Article extends Common
* @param [int] $article_id [文章id]
* @param [array] $article [文章内容]
*/
private
function
PluginsHook
(
$article_id
,
&
$article
)
private
function
Plugins
Content
Hook
(
$article_id
,
&
$article
)
{
$hook_arr
=
[
// 文章内容顶部钩子
...
...
app/index/view/default/article/category.html
0 → 100644
浏览文件 @
d98369d7
{{include file="public/header" /}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
<!-- 文章分类顶部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_top
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_top_data) and is_array($plugins_view_article_category_top_data)}}
{{foreach $plugins_view_article_category_top_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
<!-- content start -->
<div
class=
"am-container article-content am-padding-sm"
>
<!-- 右侧内容 -->
<div
class=
"am-u-md-10 am-u-md-push-2 article-right"
>
{{if !empty($category_info)}}
<div
class=
"article-header am-text-center am-padding-0"
>
<h1
class=
"am-article-title"
>
{{$category_info.name}}
</h1>
<hr
class=
"am-article-divider"
/>
</div>
{{/if}}
<!-- 文章分类内容底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_content_top
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_content_top_data) and is_array($plugins_view_article_category_content_top_data)}}
{{foreach $plugins_view_article_category_content_top_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
<!-- 内容 -->
{{if !empty($data_list)}}
<div
data-am-widget=
"list_news"
class=
"am-list-news am-list-news-default am-margin-0"
>
<div
class=
"am-list-news-bd"
>
<ul
class=
"am-list category-content-list"
>
{{foreach $data_list as $v}}
<li
class=
"am-g am-list-item-dated"
>
<a
href=
"{{$v.url}}"
class=
"am-list-item-hd"
{{
if
!
empty
($
v
['
title_color
'])}}
style=
"color:{{$v.title_color}};"
{{/
if
}}
>
{{$v.title}}
</a>
<span
class=
"am-list-date"
>
{{$v.add_time}}
</span>
</li>
{{/foreach}}
</ul>
</div>
</div>
<!-- 分页 -->
<div
class=
"am-padding-top-sm"
>
{{$page_html|raw}}
</div>
{{else /}}
{{include file="public/not_data" /}}
{{/if}}
<!-- 文章分类内容底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_content_botton
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_content_botton_data) and is_array($plugins_view_article_category_content_botton_data)}}
{{foreach $plugins_view_article_category_content_botton_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
</div>
<!-- 左侧内容 -->
<div
class=
"am-u-md-2 am-u-md-pull-10 article-sidebar am-padding-0"
>
<div
class=
"am-offcanvas"
id=
"article-nav-sidebar"
>
<div
class=
"am-offcanvas-bar am-offcanvas-bar-overlay"
>
<!-- 左侧内部顶部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_left_inside_top
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_left_inside_top_data) and is_array($plugins_view_article_category_left_inside_top_data)}}
{{foreach $plugins_view_article_category_left_inside_top_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
<!-- 左侧内容 -->
{{if !empty($category_list)}}
<section
data-am-widget=
"accordion"
class=
"am-accordion am-accordion-gapped am-padding-0"
data-am-accordion=
'{}'
>
<!-- 分类 -->
<div
class=
"am-panel am-panel-default am-panel-group am-margin-bottom-0"
>
<div
class=
"am-panel-hd am-padding-left-sm"
>
<h3
class=
"am-panel-title"
>
文章分类
</h3>
</div>
<ul
class=
"am-nav category-list"
>
{{foreach $category_list as $v}}
<li>
<a
href=
"{{$v.url}}"
title=
"{{$v.name}}"
{{
if
isset
($
params
['
id
'])
and
$
params
['
id
']
eq
$
v
['
id
']}}
class=
"am-active"
{{/
if
}}
>
{{$v.name}}
</a>
</li>
{{/foreach}}
</ul>
</div>
</section>
{{/if}}
<!-- 左侧内部底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_left_inside_botton
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_left_inside_botton_data) and is_array($plugins_view_article_category_left_inside_botton_data)}}
{{foreach $plugins_view_article_category_left_inside_botton_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
</div>
</div>
</div>
<a
href=
"javascript:;"
class=
"am-icon-btn am-icon-th-list am-show-sm-only article-nav-button"
data-am-offcanvas=
"{target: '#article-nav-sidebar'}"
>
<span
class=
"am-sr-only"
>
侧栏导航
</span>
</a>
</div>
<!-- content end -->
<!-- 文章分类底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_category_bottom
</span>
</div>
{{/if}}
{{if !empty($plugins_view_article_category_bottom_data) and is_array($plugins_view_article_category_bottom_data)}}
{{foreach $plugins_view_article_category_bottom_data as $hook}}
{{if is_string($hook) or is_int($hook)}}
{{$hook|raw}}
{{/if}}
{{/foreach}}
{{/if}}
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->
\ No newline at end of file
app/index/view/default/article/index.html
浏览文件 @
d98369d7
...
...
@@ -27,10 +27,10 @@
{{/if}}
<!-- content start -->
<div
class=
"am-container article-content"
>
<div
class=
"am-container article-content
am-padding-sm
"
>
<!-- 右侧内容 -->
<div
class=
"am-u-md-10 am-u-md-push-2 article-right"
>
<div
class=
"a
m-u-sm-12 article-header
"
>
<div
class=
"a
rticle-header am-text-center am-padding-0
"
>
<h1
class=
"am-article-title"
>
{{$article.title}}
</h1>
<p
class=
"am-article-meta"
>
<span>
发布时间:{{$article.add_time}}
</span>
...
...
@@ -56,6 +56,31 @@
<!-- 文章内容 -->
<div
class=
"am-article am-scrollable-horizontal"
>
{{$article.content|raw}}
</div>
<!-- 上一条、下一条 -->
<div
class=
"last-next-data am-margin-top-lg am-padding-bottom-sm"
>
<hr
class=
"am-article-divider am-margin-bottom-sm"
/>
<div
class=
"am-nbfc am-padding-horizontal-sm"
>
<div
class=
"am-fl"
>
<span>
上一篇:
</span>
{{if !empty($last_next_data['last'])}}
<a
href=
"{{$last_next_data.last.url}}"
class=
"am-text-primary"
>
{{$last_next_data.last.title}}
</a>
<span
class=
"text-tips am-margin-left-sm"
>
{{$last_next_data.last.add_time}}
</span>
{{else /}}
<span
class=
"text-tips"
>
没有符合条件的文章
</span>
{{/if}}
</div>
<div
class=
"am-fr"
>
<span>
下一篇:
</span>
{{if !empty($last_next_data['next'])}}
<a
href=
"{{$last_next_data.next.url}}"
class=
"am-text-primary"
>
{{$last_next_data.next.title}}
</a>
<span
class=
"text-tips am-margin-left-sm"
>
{{$last_next_data.next.add_time}}
</span>
{{else /}}
<span
class=
"text-tips"
>
没有符合条件的文章
</span>
{{/if}}
</div>
</div>
</div>
<!-- 文章内容底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
...
...
@@ -72,10 +97,10 @@
</div>
<!-- 左侧内容 -->
<div
class=
"am-u-md-2 am-u-md-pull-10 article-sidebar"
>
<div
class=
"am-u-md-2 am-u-md-pull-10 article-sidebar
am-padding-0
"
>
<div
class=
"am-offcanvas"
id=
"article-nav-sidebar"
>
<div
class=
"am-offcanvas-bar am-offcanvas-bar-overlay"
>
<!--
文章
左侧内部顶部钩子 -->
<!-- 左侧内部顶部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_detail_left_inside_top
</span>
...
...
@@ -89,33 +114,26 @@
{{/foreach}}
{{/if}}
<!--
文章
左侧内容 -->
<!-- 左侧内容 -->
{{if !empty($category_list)}}
<section
data-am-widget=
"accordion"
class=
"am-accordion am-accordion-gapped"
data-am-accordion=
'{}'
>
{{foreach $category_list as $v}}
<dl
class=
"am-accordion-item {{if $article['article_category_id'] eq $v['id']}}am-active{{/if}}"
>
<dt
class=
"am-accordion-title"
>
<li
class=
"am-nav-header"
>
{{$v.name}}
</li>
</dt>
<dd
class=
"am-accordion-bd am-collapse {{if $article['article_category_id'] eq $v['id']}}am-in{{/if}}"
>
<div
class=
"am-accordion-content"
>
{{if !empty($v.items)}}
<ul
class=
"am-nav"
>
{{foreach $v.items as $vs}}
<li>
<a
href=
"{{$vs.url}}"
{{
if
!
empty
($
vs.title_color
)}}
style=
"color:{{$vs.title_color}};"
{{/
if
}}
>
{{$vs.title}}
</a>
</li>
{{/foreach}}
</ul>
{{/if}}
</div>
</dd>
</dl>
{{/foreach}}
<section
data-am-widget=
"accordion"
class=
"am-accordion am-accordion-gapped am-padding-0"
data-am-accordion=
'{}'
>
<!-- 分类 -->
<div
class=
"am-panel am-panel-default am-panel-group am-margin-bottom-0"
>
<div
class=
"am-panel-hd am-padding-left-sm"
>
<h3
class=
"am-panel-title"
>
文章分类
</h3>
</div>
<ul
class=
"am-nav category-list"
>
{{foreach $category_list as $v}}
<li>
<a
href=
"{{$v.url}}"
title=
"{{$v.name}}"
{{
if
isset
($
article
['
article_category_id
'])
and
$
article
['
article_category_id
']
eq
$
v
['
id
']}}
class=
"am-active"
{{/
if
}}
>
{{$v.name}}
</a>
</li>
{{/foreach}}
</ul>
</div>
</section>
{{/if}}
<!--
文章
左侧内部底部钩子 -->
<!-- 左侧内部底部钩子 -->
{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}}
<div
class=
"plugins-tag"
>
<span>
plugins_view_article_detail_left_inside_botton
</span>
...
...
app/index/view/default/index/index.html
浏览文件 @
d98369d7
...
...
@@ -82,12 +82,10 @@
<ul>
{{foreach $article_list as $article}}
<li
class=
"am-text-truncate"
>
<a
href=
"{{$article.url}}"
target=
"_blank"
>
{{if isset($article['article_category_name'])}}
<span>
[
</span><p
class=
"news-category-name am-inline-block am-text-truncate"
>
{{$article.article_category_name}}
</p><span>
]
</span>
{{/if}}
<span
{{
if
!
empty
($
article.title_color
)}}
style=
"color:{{$article.title_color}};"
{{/
if
}}
>
{{$article.title}}
</span>
</a>
{{if isset($article['article_category_name']) and isset($article['category_url'])}}
<span>
[
</span><a
href=
"{{$article.category_url}}"
target=
"_blank"
><p
class=
"news-category-name am-inline-block am-text-truncate"
>
{{$article.article_category_name}}
</p></a><span>
]
</span>
{{/if}}
<a
href=
"{{$article.url}}"
target=
"_blank"
{{
if
!
empty
($
article.title_color
)}}
style=
"color:{{$article.title_color}};"
{{/
if
}}
>
{{$article.title}}
</a>
</li>
{{/foreach}}
</ul>
...
...
app/index/view/default/safety/index.html
浏览文件 @
d98369d7
...
...
@@ -40,7 +40,7 @@
{{/if}}
{{/if}}
{{if !empty($v['tips'])}}
<p
class=
"am-text-xs am-margin-bottom-xs
cr-999
"
>
{{$v.tips}}
</p>
<p
class=
"am-text-xs am-margin-bottom-xs"
>
{{$v.tips}}
</p>
{{/if}}
</div>
{{if empty($data[$v['type']]) and empty($v['msg'])}}
...
...
app/route/route.config
浏览文件 @
d98369d7
...
...
@@ -41,6 +41,7 @@ Route::rule('buy', 'index/buy/index', 'GET|POST');
Route
::
post
(
'buy-add'
,
'index/buy/add'
);
// 文章
Route
::
get
(
'article-category'
.$
ds
.
'[:id]'
,
'index/article/category'
);
Route
::
get
(
'article'
.$
ds
.
':id'
,
'index/article/index'
);
// 页面设计
...
...
app/service/ArticleService.php
浏览文件 @
d98369d7
...
...
@@ -72,18 +72,41 @@ class ArticleService
$n
=
isset
(
$params
[
'n'
])
?
intval
(
$params
[
'n'
])
:
10
;
$data
=
Db
::
name
(
'Article'
)
->
field
(
$field
)
->
where
(
$where
)
->
order
(
$order_by
)
->
limit
(
$m
,
$n
)
->
select
()
->
toArray
();
return
DataReturn
(
'处理成功'
,
0
,
self
::
DataHandle
(
$data
));
}
/**
* 数据处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-09
* @desc description
* @param [array] $data [文章数据]
*/
public
static
function
DataHandle
(
$data
)
{
if
(
!
empty
(
$data
))
{
$category_names
=
Db
::
name
(
'ArticleCategory'
)
->
where
([
'id'
=>
array_column
(
$data
,
'article_category_id'
)])
->
column
(
'name'
,
'id'
);
// 字段列表
$keys
=
ArrayKeys
(
$data
);
// 分类名称
if
(
in_array
(
'article_category_id'
,
$keys
))
{
$category_names
=
Db
::
name
(
'ArticleCategory'
)
->
where
([
'id'
=>
array_column
(
$data
,
'article_category_id'
)])
->
column
(
'name'
,
'id'
);
}
foreach
(
$data
as
&
$v
)
{
// url
$v
[
'url'
]
=
MyUrl
(
'index/article/index'
,
[
'id'
=>
$v
[
'id'
]])
;
$v
[
'url'
]
=
(
APPLICATION
==
'web'
)
?
MyUrl
(
'index/article/index'
,
[
'id'
=>
$v
[
'id'
]])
:
'/pages/article-detail/article-detail?id='
.
$v
[
'id'
]
;
// 分类名称
if
(
isset
(
$v
[
'article_category_id'
]))
{
$v
[
'article_category_name'
]
=
isset
(
$category_names
[
$v
[
'article_category_id'
]])
?
$category_names
[
$v
[
'article_category_id'
]]
:
''
;
$v
[
'article_category_name'
]
=
(
!
empty
(
$category_names
)
&&
isset
(
$category_names
[
$v
[
'article_category_id'
]]))
?
$category_names
[
$v
[
'article_category_id'
]]
:
''
;
$v
[
'category_url'
]
=
(
APPLICATION
==
'web'
)
?
MyUrl
(
'index/article/category'
,
[
'id'
=>
$v
[
'article_category_id'
]])
:
'/pages/article-category/article-category?id='
.
$v
[
'article_category_id'
];
}
// 内容
...
...
@@ -117,7 +140,7 @@ class ArticleService
}
}
}
return
DataReturn
(
'处理成功'
,
0
,
$data
)
;
return
$data
;
}
/**
...
...
@@ -133,6 +156,31 @@ class ArticleService
return
(
int
)
Db
::
name
(
'Article'
)
->
where
(
$where
)
->
count
();
}
/**
* 条件
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
* @param [array] $params [输入参数]
*/
public
static
function
ArticleWhere
(
$params
=
[])
{
// 默认条件
$where
=
[
[
'is_enable'
,
'='
,
1
],
];
// 分类id
if
(
!
empty
(
$params
[
'id'
]))
{
$where
[]
=
[
'article_category_id'
,
'='
,
intval
(
$params
[
'id'
])];
}
return
$where
;
}
/**
* 文章保存
* @author Devil
...
...
@@ -250,37 +298,6 @@ class ArticleService
}
}
/**
* 获取分类和所有文章
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-10-19
* @desc description
* @param [array] $params [输入参数]
*/
public
static
function
ArticleCategoryListContent
(
$params
=
[])
{
$data
=
Db
::
name
(
'ArticleCategory'
)
->
field
(
'id,name'
)
->
where
([
'is_enable'
=>
1
])
->
order
(
'id asc, sort asc'
)
->
select
()
->
toArray
();
if
(
!
empty
(
$data
))
{
foreach
(
$data
as
&
$v
)
{
$items
=
Db
::
name
(
'Article'
)
->
field
(
'id,title,title_color'
)
->
where
([
'article_category_id'
=>
$v
[
'id'
],
'is_enable'
=>
1
])
->
select
()
->
toArray
();
if
(
!
empty
(
$items
))
{
foreach
(
$items
as
&
$vs
)
{
// url
$vs
[
'url'
]
=
MyUrl
(
'index/article/index'
,
[
'id'
=>
$vs
[
'id'
]]);
}
}
$v
[
'items'
]
=
$items
;
}
}
return
DataReturn
(
'处理成功'
,
0
,
$data
);
}
/**
* 文章访问统计加1
* @author Devil
...
...
@@ -312,10 +329,58 @@ class ArticleService
{
$field
=
empty
(
$params
[
'field'
])
?
'*'
:
$params
[
'field'
];
$order_by
=
empty
(
$params
[
'order_by'
])
?
'sort asc'
:
trim
(
$params
[
'order_by'
]);
$data
=
Db
::
name
(
'ArticleCategory'
)
->
where
([
'is_enable'
=>
1
])
->
field
(
$field
)
->
order
(
$order_by
)
->
select
()
->
toArray
();
return
DataReturn
(
'处理成功'
,
0
,
$data
);
return
DataReturn
(
'处理成功'
,
0
,
self
::
CategoryDataHandle
(
$data
));
}
/**
* 分类处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
* @param [array] $data [分类数据]
*/
public
static
function
CategoryDataHandle
(
$data
)
{
if
(
!
empty
(
$data
))
{
foreach
(
$data
as
&
$v
)
{
$v
[
'url'
]
=
(
APPLICATION
==
'web'
)
?
MyUrl
(
'index/article/category'
,
[
'id'
=>
$v
[
'id'
]])
:
'/pages/article-category/article-category?id='
.
$v
[
'id'
];
}
}
return
$data
;
}
/**
* 获取分类信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-08
* @desc description
* @param [array] $params [输入参数]
* @param [array] $data [指定分类数据列表]
*/
public
static
function
ArticleCategoryInfo
(
$params
=
[],
$data
=
[])
{
// 数据不存在则读取
if
(
!
empty
(
$params
[
'id'
]))
{
if
(
empty
(
$data
))
{
$data
=
Db
::
name
(
'ArticleCategory'
)
->
where
([
'is_enable'
=>
1
,
'id'
=>
intval
(
$params
[
'id'
])])
->
field
(
'*'
)
->
order
(
'sort asc'
)
->
select
()
->
toArray
();
}
else
{
$temp
=
array_column
(
$data
,
null
,
'id'
);
$data
=
array_key_exists
(
$params
[
'id'
],
$temp
)
?
[
$temp
[
$params
[
'id'
]]]
:
[];
}
}
else
{
$data
=
[];
}
$data
=
self
::
CategoryDataHandle
(
$data
);
return
(
empty
(
$data
)
||
empty
(
$data
[
0
]))
?
null
:
$data
[
0
];
}
/**
...
...
@@ -511,5 +576,39 @@ class ArticleService
}
return
DataReturn
(
'删除失败'
,
-
100
);
}
/**
* 上一篇、下一篇数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-11-09
* @desc description
* @param [int] $article_id [文章id]
*/
public
static
function
ArticleLastNextData
(
$article_id
)
{
// 指定字段
$field
=
'id,title,add_time'
;
// 上一条数据
$where
=
[
[
'is_enable'
,
'='
,
1
],
[
'id'
,
'<'
,
$article_id
],
];
$last
=
self
::
DataHandle
(
Db
::
name
(
'Article'
)
->
where
(
$where
)
->
field
(
$field
)
->
order
(
'id desc'
)
->
limit
(
1
)
->
select
()
->
toArray
());
// 上一条数据
$where
=
[
[
'is_enable'
,
'='
,
1
],
[
'id'
,
'>'
,
$article_id
],
];
$next
=
self
::
DataHandle
(
Db
::
name
(
'Article'
)
->
where
(
$where
)
->
field
(
$field
)
->
order
(
'id asc'
)
->
limit
(
1
)
->
select
()
->
toArray
());
return
[
'last'
=>
empty
(
$last
)
?
[]
:
$last
[
0
],
'next'
=>
empty
(
$next
)
?
[]
:
$next
[
0
],
];
}
}
?>
\ No newline at end of file
public/static/index/default/css/article.css
浏览文件 @
d98369d7
.article-sidebar
,
.article-header
,
.am-accordion-gapped
.am-accordion-title
{
padding
:
0
;}
.article-content
{
padding-top
:
10px
;}
.article-header
{
text-align
:
center
;}
.article-header
.am-article-divider
{
margin
:
10px
0
20px
0
;}
.article-header
.am-article-meta
{
margin-top
:
5px
;}
.article-header
.am-article-meta
span
:not
(
:first-child
)
{
margin-left
:
15px
;}
.article-nav-button
{
position
:
fixed
;
z-index
:
10
;
bottom
:
70px
;
right
:
10px
;
-webkit-box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);
-moz-box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);
box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);}
.am-offcanvas-bar
:after
{
background
:
#eee
;}
.article-sidebar
ul
li
{
margin-top
:
0
;}
.article-sidebar
ul
li
a
{
font-size
:
12px
;
padding
:
5px
;}
.article-content
.am-accordion-content
{
padding
:
5px
;}
.am-nav-header
{
padding
:
8px
5px
5px
5px
;
font-weight
:
500
;}
.am-accordion-gapped
dl
:first-child
{
margin-top
:
0
;}
.am-accordion-gapped
dl
:last-child
{
margin-bottom
:
0
;}
.am-accordion-gapped
.am-accordion-title
:after
{
margin-top
:
-6px
;}
.am-accordion-gapped
.am-accordion-title
,
.am-accordion-gapped
.am-accordion-item
,
.am-accordion-gapped
.am-accordion-item.am-active
{
border-color
:
#eee
;}
.article-content
img
{
max-width
:
100%
;
}
.article-content
img
{
max-width
:
100%
;
}
.article-header
.am-article-divider
{
margin
:
15px
0
20px
0
;
}
.article-header
.am-article-meta
{
margin-top
:
5px
;
}
.article-header
.am-article-meta
span
:not
(
:first-child
)
{
margin-left
:
15px
;
}
.article-nav-button
{
position
:
fixed
;
z-index
:
10
;
bottom
:
70px
;
right
:
10px
;
-webkit-box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);
-moz-box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);
box-shadow
:
0
0
15px
rgba
(
0
,
0
,
0
,
0.5
);
}
.am-offcanvas-bar
:after
{
background
:
transparent
;
}
.article-sidebar
ul
li
{
margin-top
:
0
;
}
.article-sidebar
ul
li
a
{
font-size
:
12px
;
padding
:
8px
10px
;
}
.article-sidebar
.am-panel
,
.category-content-list
li
{
border-color
:
#eee
!important
;
}
.article-sidebar
.am-panel
{
-webkit-box-shadow
:
none
;
-moz-box-shadow
:
none
;
box-shadow
:
none
;
}
.category-list
li
a
.am-active
{
background-color
:
#eee
;
color
:
#d2364c
;
}
.category-content-list
li
:first-child
{
border-top
:
0
;
}
.last-next-data
.text-tips
{
color
:
#999
;
}
@media
only
screen
and
(
min-width
:
641px
)
{
.article-sidebar
.am-offcanvas
{
display
:
block
;
position
:
static
;
background
:
none
;}
.article-sidebar
.am-offcanvas-bar
{
position
:
static
;
width
:
auto
;
background
:
none
;
-webkit-transform
:
translate3d
(
0
,
0
,
0
);
-ms-transform
:
translate3d
(
0
,
0
,
0
);
transform
:
translate3d
(
0
,
0
,
0
);}
.article-sidebar
ul
li
:not
(
:last-child
)
{
border-bottom
:
1px
solid
#f5f5f5
;}
.am-accordion-gapped
{
margin
:
0
15px
0
0
;}
.article-sidebar
{
padding-left
:
5px
;
}
.article-sidebar
.am-offcanvas
{
display
:
block
;
position
:
static
;
background
:
none
;
}
.article-sidebar
.am-offcanvas-bar
{
position
:
static
;
width
:
auto
;
background
:
none
;
-webkit-transform
:
translate3d
(
0
,
0
,
0
);
-ms-transform
:
translate3d
(
0
,
0
,
0
);
transform
:
translate3d
(
0
,
0
,
0
);
}
.article-sidebar
ul
li
:not
(
:last-child
)
{
border-bottom
:
1px
solid
#f1f1f1
;
}
.am-accordion-gapped
{
margin
:
0
15px
0
0
;
}
.article-sidebar
{
padding-left
:
5px
!important
;
}
}
@media
only
screen
and
(
min-width
:
1025px
)
{
.article-sidebar
{
padding-left
:
0
;
}
.article-sidebar
{
padding-left
:
0
!important
;
}
}
@media
only
screen
and
(
max-width
:
640px
)
{
.article-right
{
padding
:
0
5px
;}
.article-sidebar
.am-offcanvas-bar
{
background
:
#f9f9f9
;}
.article-sidebar
ul
li
:not
(
:last-child
)
{
border-bottom
:
1px
solid
#eee
;}
.am-accordion-gapped
{
margin
:
0
;}
.article-sidebar
ul
li
a
{
padding-left
:
20px
;}
.article-right
{
padding
:
0
5px
;
}
.article-sidebar
.am-offcanvas-bar
{
background
:
#f9f9f9
;
}
.article-sidebar
ul
li
:not
(
:last-child
)
{
border-bottom
:
1px
solid
#eee
;
}
.am-accordion-gapped
{
margin
:
0
;
}
.last-next-data
.am-fl
,
.last-next-data
.am-fr
{
float
:
none
!important
;
}
.last-next-data
.am-fr
{
margin-top
:
10px
;
}
}
public/static/index/default/css/index.css
浏览文件 @
d98369d7
...
...
@@ -17,7 +17,7 @@ ul, li, ol {list-style: none;}
.banner-mixed
{
position
:
relative
;
border-top
:
1px
solid
#F5F5F5
;
border-bottom
:
1px
#f5f5f5
solid
;
overflow
:
hidden
;}
.banner-news-title
{
position
:
absolute
;
left
:
10px
;
padding-right
:
10px
;
border-right
:
1px
solid
#eee
;}
.banner-news
li
,
#banner-news
li
a
{
height
:
30px
;
line-height
:
30px
;
font-size
:
12px
;}
.banner-news
{
max-width
:
1200px
;
margin
:
0px
auto
;
overflow
:
hidden
;
height
:
30px
;
width
:
100%
;
text-align
:
left
;
color
:
#fff
;
}
.banner-news
{
max-width
:
1200px
;
margin
:
0px
auto
;
overflow
:
hidden
;
height
:
30px
;
width
:
100%
;
text-align
:
left
;}
.news-category-name
{
line-height
:
11px
;
max-width
:
50px
;
}
.banner-news
li
{
padding
:
0
10px
0
80px
;}
.mod-vip
{
display
:
none
;}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录