去掉软件标签的描边;修「全部问题」列表分类标签渲染成空

两个问题:

一、两个标签中间那道「线」
  不是 CSS 分隔符 —— 是 .badge.sw(软件徽章)带 border:1px solid var(--swc-line),
  而 .badge.cat / .badge.st 都没有边框。并排显示时那道描边看起来
  就像凭空插了一条分隔线。去掉边框,三个标签统一为无边框胶囊。

二、反馈类型(Bug / 功能建议)在后台「全部问题」列表里不显示
  🔴 根因:fb_category_label() 参数是**数字 id**,内部会 (int) 化。
     而全部问题列表传的是 $t["category"](老 slug 字段,值为 bug),
     (int)bug === 0 → 函数返回空串 → 渲染出一个**空的** badge:
     标签框在、里面什么都没有,看起来就像「类型没了」。
  修法:
    - 新增 fb_category_label_by_slug($softwareId, $slug) 给老数据兜底
      (slug 在不同软件下可能重名,必须带 software_id)
    - 全部问题列表改用 category_id 优先、slug 兜底
    - 前台列表同样处理,并且**取不到名字就不渲染这个标签**,
      绝不再输出空胶囊
    - 在 fb_category_label() 的注释里写明「必须传数字 id」,
      避免下次再踩

验证:
  函数对照跑通:#4 category_id=6 → Bug;#5 category_id=7 → 功能建议;
  旧写法 fb_category_label("bug") → (空),确认这就是根因。
  浏览器实测详情页三个标签 border-top-width 全部 0px / style none,
  圆角都是 999px,描边已消除。
  前台列表两个条目分类标签分别渲染出 Bug / 功能建议,不再是空。
  7 个路由全 200。
This commit is contained in:
2026-11-03 20:50:00 +08:00
parent dcf510ef28
commit 974dd52367
5 changed files with 48 additions and 5 deletions
+11 -1
View File
@@ -766,7 +766,17 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
</div> </div>
<div class="item-tags"> <div class="item-tags">
<?php if ($aSw): ?><?php echo fb_software_chip($aSw); ?><?php endif; ?> <?php if ($aSw): ?><?php echo fb_software_chip($aSw); ?><?php endif; ?>
<span class="badge cat"><?php echo e(fb_category_label($t['category'])); ?></span> <?php
/* 🔴 这里必须用 category_id(数字),不能用 $t['category'](老 slug 字段)。
* fb_category_label() 内部会把参数 (int) 化,传 'bug' 会变成 0 → 返回空串,
* 结果就是渲染出一个**空的** <span class="badge cat"></span>。
* 用户 2026-11-03 看到的就是「反馈类型没了」。
* 优先 category_id,没有才回退 slug(老数据兼容)。 */
$aCat = !empty($t['category_id'])
? fb_category_label((int)$t['category_id'])
: fb_category_label_by_slug((int)$t['software_id'], (string)$t['category']);
?>
<?php if ($aCat !== ''): ?><span class="badge cat"><?php echo e($aCat); ?></span><?php endif; ?>
<span class="badge st st-<?php echo e($t['status']); ?>"><?php echo e(fb_status_label($t['status'])); ?></span> <span class="badge st st-<?php echo e($t['status']); ?>"><?php echo e(fb_status_label($t['status'])); ?></span>
<?php if ((int)$t['visible'] !== 1): ?><span class="badge st st-closed">未公开</span><?php endif; ?> <?php if ((int)$t['visible'] !== 1): ?><span class="badge st st-closed">未公开</span><?php endif; ?>
</div> </div>
+4 -1
View File
@@ -599,7 +599,10 @@ main.wrap{padding-top:24px; padding-bottom:40px; min-height:60vh}
.badge.sw{ .badge.sw{
display:inline-flex; align-items:center; gap:5px; display:inline-flex; align-items:center; gap:5px;
background:var(--swc-soft, #eef2f8); color:var(--swc, #2b4a74); background:var(--swc-soft, #eef2f8); color:var(--swc, #2b4a74);
border:1px solid var(--swc-line, #cfdcee); font-weight:600; /* ⚠️ 不要加 border —— 用户 2026-11-03 指出「两个标签中间加个线干嘛」。
* 分类/状态标签都没有边框,只有软件标签有,并排显示时那道描边
* 看起来就像凭空插了一条分隔线。统一成无边框的胶囊。 */
font-weight:600;
padding:1px 9px 1px 6px; padding:1px 9px 1px 6px;
} }
.badge.sw .badge-sw-ic{ .badge.sw .badge-sw-ic{
+9 -1
View File
@@ -166,7 +166,15 @@ if (!$sw):
<span class="item-id" title="问题编号">#<?php echo (int)$t['id']; ?></span> <span class="item-id" title="问题编号">#<?php echo (int)$t['id']; ?></span>
</div> </div>
<div class="item-tags"> <div class="item-tags">
<span class="badge cat"><?php echo e(fb_category_label($t['category_id'])); ?></span> <?php
/* 分类标签必须有名字才渲染 —— 否则会输出一个空胶囊(什么都看不见),
* 用户会以为「反馈类型丢了」。老数据 category_id 可能为空,
* 这时按 slug 兜底;两者都取不到才不显示。 */
$lCat = !empty($t['category_id'])
? fb_category_label((int)$t['category_id'])
: fb_category_label_by_slug((int)$t['software_id'], (string)$t['category']);
?>
<?php if ($lCat !== ''): ?><span class="badge cat"><?php echo e($lCat); ?></span><?php endif; ?>
<span class="badge st st-<?php echo e($t['status']); ?>"><?php echo e(fb_status_label($t['status'])); ?></span> <span class="badge st st-<?php echo e($t['status']); ?>"><?php echo e(fb_status_label($t['status'])); ?></span>
</div> </div>
<p class="item-ex"><?php echo e(fb_excerpt($t['excerpt'], 120)); ?></p> <p class="item-ex"><?php echo e(fb_excerpt($t['excerpt'], 120)); ?></p>
+1 -1
View File
@@ -8,7 +8,7 @@ if (!defined('FB_ROOT')) {
define('FB_ROOT', dirname(__DIR__)); define('FB_ROOT', dirname(__DIR__));
// 静态资源版本号:改 assets/ 下的 css/js 后把这个数字 +1, // 静态资源版本号:改 assets/ 下的 css/js 后把这个数字 +1,
// 让浏览器与 CDN 缓存失效。全站只此一处,别再往页面里写死数字。 // 让浏览器与 CDN 缓存失效。全站只此一处,别再往页面里写死数字。
if (!defined('FB_ASSET_V')) { define('FB_ASSET_V', 37); } if (!defined('FB_ASSET_V')) { define('FB_ASSET_V', 38); }
} }
/* ------------------------------------------------------------------ /* ------------------------------------------------------------------
+23 -1
View File
@@ -486,7 +486,11 @@ function fb_category_by_slug($softwareId, $slug) {
return $r ? $r : null; return $r ? $r : null;
} }
/** 分类显示名:只给 id 就能拿到名字(列表渲染用) */ /** 分类显示名:只给 id 就能拿到名字(列表渲染用)
*
* ⚠️ 参数必须是**数字 id**。传字符串 slug(如 'bug')会被 (int) 成 0 而返回空串,
* 调用方如果不判空就会渲染出一个空标签 —— 这个坑踩过(见 admin.php 全部问题列表)。
* 需要按 slug 取名字请用 fb_category_label_by_slug()。 */
function fb_category_label($id) { function fb_category_label($id) {
if (!$id) { return ''; } if (!$id) { return ''; }
static $cache = []; static $cache = [];
@@ -498,6 +502,24 @@ function fb_category_label($id) {
return $cache[$id]; return $cache[$id];
} }
/**
* 按「软件 + slug」取分类显示名 —— 给只存了老 slug 字段的历史数据兜底。
* slug 在不同软件下可能重名,所以必须带上 software_id 才能定位。
*/
function fb_category_label_by_slug($softwareId, $slug) {
$slug = trim((string)$slug);
if ($slug === '') { return ''; }
if ((int)$softwareId > 0) {
$c = fb_category_by_slug((int)$softwareId, $slug);
if ($c) { return (string)$c['name']; }
}
// 实在定不到软件(老数据 software_id 为空)时,按 slug 全局找一个
$st = fb_db()->prepare('SELECT name FROM categories WHERE slug = ? LIMIT 1');
$st->execute([$slug]);
$nm = $st->fetchColumn();
return $nm !== false ? (string)$nm : '';
}
/** 全部状态(按排序) */ /** 全部状态(按排序) */
function fb_statuses($onlyEnabled = true) { function fb_statuses($onlyEnabled = true) {
$sql = 'SELECT * FROM statuses'; $sql = 'SELECT * FROM statuses';