Browse Source

feat(empty-state): 增加统一的空状态

master
peijunlei 2 weeks ago
parent
commit
54072fcec7
  1. 25
      app/common.php
  2. 30
      public/themes/dist_static/static/css/empty.css
  3. 12
      public/themes/dist_static/static/css/search.css
  4. 11
      public/themes/website/1/zh/demo/announce.html
  5. 8
      public/themes/website/1/zh/demo/components/empty.html
  6. 14
      public/themes/website/1/zh/demo/download.html
  7. 11
      public/themes/website/1/zh/demo/faq.html
  8. 11
      public/themes/website/1/zh/demo/news.html
  9. 14
      public/themes/website/1/zh/demo/search.html
  10. 11
      public/themes/website/1/zh/demo/video.html

25
app/common.php

@ -1613,4 +1613,27 @@ if (!function_exists('getCategoryChildrenCount')) {
$categoryModel = new \app\model\Category(); $categoryModel = new \app\model\Category();
return $categoryModel->where('parent_id', $id)->count(); return $categoryModel->where('parent_id', $id)->count();
} }
}
}
if (!function_exists('isHcListEmpty')) {
/**
* 判断内容列表/分页结果是否为空(兼容数组与 ThinkPHP Paginator)
* @param mixed $list
* @return bool
*/
function isHcListEmpty($list): bool
{
if ($list === null || $list === '' || $list === []) {
return true;
}
if (is_object($list) && method_exists($list, 'isEmpty')) {
return (bool)$list->isEmpty();
}
if (is_object($list) && method_exists($list, 'total')) {
return (int)$list->total() === 0;
}
if (is_countable($list)) {
return count($list) === 0;
}
return false;
}
}

30
public/themes/dist_static/static/css/empty.css

@ -0,0 +1,30 @@
.s-empty {
display: flex;
align-items: center;
justify-content: center;
min-height: 16rem;
padding: 2.5rem 1.5rem;
border-radius: 1.25rem;
background: rgba(175, 181, 185, 0.08);
box-sizing: border-box;
}
.s-empty__text {
margin: 0;
color: var(--color-text-muted);
font-family: "MiSans VF", "PingFang SC", sans-serif;
font-size: var(--font-18);
line-height: var(--font-26);
text-align: center;
}
@media (max-width: 576px) {
.s-empty {
min-height: 12rem;
padding: 32Px 16Px;
border-radius: 16Px;
}
.s-empty__text {
font-size: 16Px;
line-height: 24Px;
}
}

12
public/themes/dist_static/static/css/search.css

@ -228,18 +228,6 @@
color: var(--color-primary); color: var(--color-primary);
} }
.sr-empty {
margin: 4rem 0 0;
color: var(--color-text-muted);
font-family: "MiSans VF", "PingFang SC", sans-serif;
font-size: var(--font-16);
line-height: var(--font-24);
text-align: center;
}
.sr-empty[hidden] {
display: none;
}
@media (max-width: 992px) { @media (max-width: 992px) {
.sr-page { .sr-page {
padding-top: calc(var(--header-h) + 32Px); padding-top: calc(var(--header-h) + 32Px);

11
public/themes/website/1/zh/demo/announce.html

@ -47,6 +47,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js"> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/announce.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/announce.css">
</head> </head>
@ -99,7 +100,17 @@
</a> </a>
{/hcTaglib:contentPage} {/hcTaglib:contentPage}
</div> </div>
{php}
$list_empty = isHcListEmpty($hc_content ?? null);
if ($list_empty) {
$empty_text = '暂无相关公告';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
{$hc_content|raw} {$hc_content|raw}
{/if}
</div> </div>
</main> </main>
<div class="mask" id="mask"> <div class="mask" id="mask">

8
public/themes/website/1/zh/demo/components/empty.html

@ -0,0 +1,8 @@
{php}
if (!isset($empty_text) || $empty_text === '') {
$empty_text = '暂无相关内容';
}
{/php}
<div class="s-empty" role="status">
<p class="s-empty__text">{$empty_text}</p>
</div>

14
public/themes/website/1/zh/demo/download.html

@ -49,6 +49,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js"> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/download.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/download.css">
</head> </head>
@ -117,8 +118,17 @@
{/hcTaglib:contentPage} {/hcTaglib:contentPage}
</div> </div>
{$hc_content|raw}
{php}
$list_empty = isHcListEmpty($hc_content ?? null);
if ($list_empty) {
$empty_text = '暂无相关资料';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
{$hc_content|raw}
{/if}
</div> </div>
</main> </main>
<div class="mask" id="mask"> <div class="mask" id="mask">

11
public/themes/website/1/zh/demo/faq.html

@ -47,6 +47,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js"> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/faq.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/faq.css">
</head> </head>
@ -94,7 +95,17 @@
</div> </div>
{/hcTaglib:contentPage} {/hcTaglib:contentPage}
</div> </div>
{php}
$list_empty = isHcListEmpty($hc_content ?? null);
if ($list_empty) {
$empty_text = '暂无相关问题';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
{$hc_content|raw} {$hc_content|raw}
{/if}
</div> </div>
</main> </main>
<div class="mask" id="mask"> <div class="mask" id="mask">

11
public/themes/website/1/zh/demo/news.html

@ -54,6 +54,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/news2.js" /> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/news2.js" />
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css" /> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css" />
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css" /> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css" />
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css" />
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/news.css" /> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/news.css" />
</head> </head>
@ -202,8 +203,18 @@
</div> </div>
{php}
$list_empty = isHcListEmpty($hc_content ?? null);
if ($list_empty) {
$empty_text = '暂无相关新闻';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
<!-- 分页 --> <!-- 分页 -->
{$hc_content|raw} {$hc_content|raw}
{/if}
</div> </div>
</main> </main>

14
public/themes/website/1/zh/demo/search.html

@ -47,6 +47,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js"> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/search.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/search.css">
</head> </head>
@ -116,10 +117,17 @@
{/volist} {/volist}
</div> </div>
{empty name="list"}
<p class="sr-empty">未找到相关结果,请尝试其他关键词</p>
{/empty}
{php}
$list_empty = isHcListEmpty($list ?? null);
if ($list_empty) {
$empty_text = '未找到相关结果,请尝试其他关键词';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
{$list_page|raw} {$list_page|raw}
{/if}
</div> </div>
</main> </main>

11
public/themes/website/1/zh/demo/video.html

@ -47,6 +47,7 @@
<link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js"> <link rel="modulepreload" crossorigin href="/themes/dist_static/static/js/common.js">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/common.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/pagination.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/empty.css">
<link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/video.css"> <link rel="stylesheet" crossorigin href="/themes/dist_static/static/css/video.css">
</head> </head>
@ -100,7 +101,17 @@
</button> </button>
{/hcTaglib:contentPage} {/hcTaglib:contentPage}
</div> </div>
{php}
$list_empty = isHcListEmpty($hc_content ?? null);
if ($list_empty) {
$empty_text = '暂无相关视频';
}
{/php}
{if $list_empty}
{include file="components/empty"}
{else /}
{$hc_content|raw} {$hc_content|raw}
{/if}
<div class="v-modal" id="v-modal" hidden> <div class="v-modal" id="v-modal" hidden>
<div class="v-modal__backdrop" data-v-modal-close></div> <div class="v-modal__backdrop" data-v-modal-close></div>

Loading…
Cancel
Save