首页改介绍页;列表只服务当前软件;新增UUID追踪让提交人看得到未审核反馈
用户提的两个核心问题:
一、首页不该列全部问题
场景:这套系统是给某个软件配反馈入口、把地址贴进那软件的「意见反馈」里。
访客总是从某个软件过来的,看别的软件的问题对他没意义。
⇒ / 不带 sw 时渲染介绍页(特点介绍 + 「点右上角设置按钮选软件」+ 软件卡片)
带 sw 才是该软件的问题列表,检索/筛选/分类全在本软件范围内
二、提交后未审核,用户点不进去(真实缺陷)
邮件里给了「点击查看您刚才提交的反馈」,但 thread.php 只在 visible=1 时
才给看,未审核的一律 404 / 只看到「等待审核」静态页 —— 链接等于白给。
⇒ threads 加 track_token(32位hex = 128位熵),提交时生成:
- 邮件里所有链接一律带 ?t=<token>(不再是裸 id)
- 带对 token:可看完整详情、可回复,哪怕未公开/已关闭
- 没 token 或 token 错:对外一律 404,不泄露存在性
- 公开列表仍用 id 链接(公开内容谁都能看,用于避免重复提交)
实现细节:
- threads.track_token + 唯一索引;幂等迁移,存量数据自动回填
- fb_track_new_token / fb_track_token_ok(hash_equals 防时序探测)
/ fb_thread_viewable / fb_thread_link(thread, personal)
- thread.php 权限从 fb_thread_public 改为 fb_thread_viewable
- 带 token 看自己未公开的反馈时,顶部给「私人跟踪链接」提示条
- 回复表单与回复后跳转都保留 token,否则回复完就失去访问权
- 提交完成后直接带 token 跳详情页,不再只给静态等待页
- close 类邮件补上「查看这条反馈」按钮(原来完全没链接)
- 顶栏「全部问题」改为「问题列表」且只在选中软件后显示
- 详情/提交页「返回问题列表」按所属软件返回,不再回介绍页
- new.php 无 sw 时不再默认落到第一个软件,改为让用户先选
(默默替选会让反馈进错软件、通知发错人)
验证:首页 0 条问题卡片且未泄露任何标题、三个软件入口齐全;
未公开#4 无 token 404 / 错 token 404 / 正确 token 200 且显示完整详情
(不再卡在「等待审核」)、提示条与表单 token 都在;
已公开#2 无 token 可看;5 类邮件(回执/通过/回复/状态/关闭)链接全带 token;
两套回归各 30+ 项断言全过。
This commit is contained in:
@@ -1,22 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* 问题列表
|
||||
* 首页 / 当前软件的问题列表
|
||||
*
|
||||
* 两种形态(用户 2026-11-03 定的产品逻辑):
|
||||
* ① **不带 sw**:首页 = 轻反馈系统的介绍页。
|
||||
* 不再列「全部问题」—— 多个软件的反馈混在一起,对访客毫无意义:
|
||||
* 他不是所有软件的使用者,看别人的反馈没价值。
|
||||
* ② **带 sw**:当前软件的问题列表。
|
||||
* 检索/筛选/分类全部只在本软件范围内,弱化其他软件。
|
||||
*/
|
||||
require __DIR__ . '/lib/bootstrap.php';
|
||||
|
||||
$pdo = fb_db();
|
||||
|
||||
/* ---- 软件切换:只配一个软件时自动落到它,不暴露软件选择器 ---- */
|
||||
/* ---- 软件切换 ---- */
|
||||
$swList = fb_softwares(true);
|
||||
$swKey = isset($_GET['sw']) ? (string)$_GET['sw'] : '';
|
||||
$sw = null;
|
||||
if ($swKey !== '') {
|
||||
$sw = fb_software($swKey);
|
||||
// 指定的软件不存在或已停用 → 退回默认,不报错(老链接要能打开)
|
||||
// 指定的软件不存在或已停用 → 退回首页(不自动落到第一个软件)
|
||||
if (!$sw || (int)$sw['enabled'] !== 1) { $sw = null; }
|
||||
}
|
||||
if ($sw === null && $swList) { $sw = $swList[0]; }
|
||||
$swId = $sw ? (int)$sw['id'] : 0;
|
||||
|
||||
/* ==================================================================
|
||||
* ① 没有指定软件 → 首页介绍页
|
||||
* ------------------------------------------------------------------
|
||||
* 用户原话:「首页应该是对我们这个轻量级反馈系统的介绍,
|
||||
* 说明它的特点是什么,然后告诉用户,如果现在想提交反馈,
|
||||
* 可以点右上角的设置按钮,选择不同的系统,进去就可以了。」
|
||||
*
|
||||
* 🔴 不要在这里列问题。以前首页默认落到第一个软件并列出全部问题,
|
||||
* 等于把 A 软件的反馈摊给 B 软件的用户看。
|
||||
* ================================================================== */
|
||||
if ($sw === null) {
|
||||
fb_render_home($swList);
|
||||
exit;
|
||||
}
|
||||
|
||||
$swId = (int)$sw['id'];
|
||||
|
||||
$cats = fb_categories($swId);
|
||||
$statuses = fb_status_keys();
|
||||
@@ -194,3 +216,94 @@ fb_layout_head($sw ? fb_software_site_title($sw) : $headTitle, ['software' => $s
|
||||
|
||||
<?php
|
||||
fb_layout_foot();
|
||||
|
||||
/* ==================================================================
|
||||
* 首页介绍页
|
||||
* ------------------------------------------------------------------
|
||||
* 用户 2026-11-03 定的产品逻辑:首页不讲"有哪些问题",只讲"这是什么"。
|
||||
*
|
||||
* 场景说明(决定了下面文案的取舍):
|
||||
* 这个系统一般是给某个软件配一个反馈入口,把地址贴进那个软件的
|
||||
* 「意见反馈」里。所以访客**总是从某个软件过来的**,他心里已经有一个
|
||||
* 明确的目标软件;首页要做的是「介绍 + 指路」,不是「陈列别人的问题」。
|
||||
* ================================================================== */
|
||||
function fb_render_home(array $swList) {
|
||||
$siteName = (string)fb_cfg('site_name');
|
||||
$title = $siteName !== '' ? $siteName : '轻反馈';
|
||||
|
||||
fb_layout_head($title . ' · 轻量级反馈系统');
|
||||
|
||||
$n = count($swList);
|
||||
?>
|
||||
<div class="home">
|
||||
<section class="home-hero">
|
||||
<h1>轻量级反馈系统</h1>
|
||||
<p class="home-lead">给每个软件一个独立的反馈入口:用户不用注册,填个昵称和邮箱就能提问题;
|
||||
所有进展都会自动发邮件通知他。</p>
|
||||
</section>
|
||||
|
||||
<section class="home-feats">
|
||||
<div class="home-feat">
|
||||
<div class="home-feat-ic">📮</div>
|
||||
<h3>不用注册</h3>
|
||||
<p>填昵称和常用邮箱即可提交。后续每一条进展都会发邮件通知,不用反复回来刷。</p>
|
||||
</div>
|
||||
<div class="home-feat">
|
||||
<div class="home-feat-ic">🔗</div>
|
||||
<h3>私人追踪链接</h3>
|
||||
<p>提交后会收到一条专属链接,凭它随时查看进度——哪怕这条反馈还没审核通过。</p>
|
||||
</div>
|
||||
<div class="home-feat">
|
||||
<div class="home-feat-ic">🗂</div>
|
||||
<h3>按软件分开</h3>
|
||||
<p>每个软件一套独立的问题列表和分类,互不干扰。同一软件的其他人也能看到已解决的问题。</p>
|
||||
</div>
|
||||
<div class="home-feat">
|
||||
<div class="home-feat-ic">💬</div>
|
||||
<h3>公开讨论</h3>
|
||||
<p>已公开的问题任何人都能查看和回复。提交前先搜一下,避免重复提同样的问题。</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-enter">
|
||||
<h2>进入某个软件的反馈系统</h2>
|
||||
<?php if ($n === 0): ?>
|
||||
<p class="muted">管理员还没有配置软件。</p>
|
||||
<?php else: ?>
|
||||
<p class="home-enter-tip">
|
||||
点击右上角的<span class="home-menu-demo" aria-hidden="true"><i></i><i></i><i></i></span>
|
||||
<b>设置按钮</b>,从列表里选择您要反馈的软件即可。
|
||||
</p>
|
||||
<div class="home-sw-list">
|
||||
<?php foreach ($swList as $s): ?>
|
||||
<?php
|
||||
list($c) = fb_software_colors($s);
|
||||
if ($c === '') { $c = '#0057B8'; }
|
||||
?>
|
||||
<a class="home-sw" href="?sw=<?php echo e(urlencode((string)$s['slug'])); ?>"
|
||||
style="--swc:<?php echo e($c); ?>">
|
||||
<span class="home-sw-ic">
|
||||
<?php
|
||||
$ik = trim((string)(isset($s['icon_key']) ? $s['icon_key'] : ''));
|
||||
$iu = $ik !== '' ? fb_icon_url($ik, 72) : '';
|
||||
?>
|
||||
<?php if ($iu !== ''): ?>
|
||||
<img src="<?php echo e($iu); ?>" alt="" width="36" height="36">
|
||||
<?php else: ?>
|
||||
<span><?php echo e(fb_software_icon($s)); ?></span>
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
<span class="home-sw-nm"><?php echo e((string)$s['name']); ?></span>
|
||||
<span class="home-sw-go">进入 →</span>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<p class="home-enter-alt muted small">
|
||||
也可以直接点上方的软件卡片进入。
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</section>
|
||||
</div>
|
||||
<?php
|
||||
fb_layout_foot();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user