部门问答

指导与反馈

前半部分是使用说明,后半部分可以提交反馈。遇到问题先看《使用指导手册》。

📘 使用指导手册

给普通同事看:怎么用这个系统。

如何提问
  1. 点顶部导航的「我要提问」。
  2. 填「问题标题」(必填,一句话说清楚问题)。
  3. 填「补充说明」(选填):背景、已经试过什么、希望得到什么答复。
  4. 填「你的称呼」(选填):留空也能提交,页面上会显示成「匿名同事」。填了之后同事知道是谁问的,方便把答案追给你。
  5. 需要的话加附件(选填),然后点「提交问题」。
如何同问
  1. 在首页问题卡片左侧有一个「同问」按钮,上面显示当前同问人数。
  2. 点一下表示「我也想问」→ 数字 +1,按钮变成「已同问」。
  3. 再点一下可以取消同问 → 数字 -1。
  4. 同一个人对同一个问题只能投一票,重复点不会重复计数。
  5. 首页默认按同问人数排序,最多人关心的问题排在最上面。
如何查看回答
  1. 在首页,点问题标题、卡片空白处,或者右下角的「查看回答」按钮,都能进入问题详情页。
  2. 详情页能看到:问题状态、完整内容、提问人和提问时间、提问人上传的附件、以及下面所有回答。
  3. 回答区每条都标了回答人和回答时间;如果是你自己答的,会高亮并带「你的回答」标记。
如何查看常见问题
  1. 点顶部导航的「常见问题」。
  2. 这里是由管理员整理的高频问题答案,通常比提问更快得到解答。
  3. 页面上方有搜索框,输入关键字即时筛选(标题和内容都能搜)。
  4. 先来这里找一找,能省下提问的时间。
如何上传附件
  1. 在「我要提问」页面的「附件」处选择文件(选填)。
  2. 支持图片 / PDF / Word / Excel / PPT(含 WPS 的 .wps / .et / .dps),单个文件不超过 30 MB,一次最多 5 个。
  3. 提交后,图片会直接在问题详情页以缩略图显示,点一下看原图;其他文件显示图标和「打开 / 下载」按钮。
  4. 提问后发现要补充材料,目前需要重新提一个问题并带上附件。
如何查看「我的提问」
  1. 点顶部导航的「我的提问」。
  2. 这里列出你提过的所有问题,以及每条的当前状态(待解答 / 已解答 / 已关闭)。
  3. 顶部三个统计卡能一眼看出:一共提了多少、还有多少待解答、多少已解决。
  4. 点标题或右侧按钮可直接进入详情页看回答。
  5. 注意:如果你现在是匿名访客身份,这个列表绑定在当前浏览器上 —— 清除浏览器 Cookie 或换设备后就找不回了。想长期保留,可以到登录页注册一个邮箱账号。
如何回答问题
  1. 进入任意问题详情页,拉到底部有「我要回答」输入框。
  2. 不需要管理员权限 —— 所有登录用户(包括匿名访客)都可以回答。
  3. 写下回答后点「发布回答」。回答仅代表个人观点,请勿发布与工作无关的内容。
  4. 答错了可以自己编辑或删除(在回答右下角有「编辑」「删除」按钮)。
如何修改或删除自己发的内容
  1. 进入问题详情页,你自己的问题和回答旁边会出现「编辑」「删除」按钮。
  2. 点「编辑」展开表单,改完点「保存修改」,该条旁边会出现「(已编辑)」标记。
  3. 点「删除」会弹出确认框,确认后才会真的删除,且无法恢复。
  4. 问题被删除时,它下面的所有回答和附件也会一起删除。

🏗️ 框架搭建说明

给后续维护的同学看:技术选型、数据结构、权限设计和部署思路。

技术栈
  • Astro 7output: "server",SSR 服务端渲染;适配器@astrojs/nodestandalone 模式)
  • Supabase—— PostgreSQL 数据库 + Auth 认证 + Storage 文件存储,三合一
  • Tailwind CSS 4(CSS-first 配置,样式都写在模板里的工具类上)
  • Chart.js—— 仅管理后台的数据看板用到,且只在 /admin 页面加载
  • TypeScript—— 全项目类型检查(pnpm check
主要数据表
表名用途
profiles用户资料(显示名、角色、是否匿名)。邮箱只有自己和管理员能看
questions问题(标题、内容、状态、提问人、时间)
answers回答(内容、回答人、时间)
upvotes同问投票,同一人对同一问题只能有一条
attachments挂在问题上的附件(文件 URL、名称、类型)
shared_files文件库的共享文件记录
faqs常见问题(由管理员维护)
feedbacks本页提交的用户反馈
RLS 权限逻辑

权限不靠前端控制,而是由数据库的RLS(行级安全策略)强制执行的 —— 前端只是「不显示按钮」,真正的拦截在数据库。 就算有人绕过页面直接调接口,一样会被拦下。

角色从低到高:viewer(查看者,默认)→ manager(管理员)→ owner(所有者)。 新注册的用户一律是 viewer。

操作查看者管理员所有者
浏览问题 / 回答 / 常见问题 / 文件库
提问、同问、回答问题
编辑 / 删除自己发的内容
提交反馈
阅读别人的反馈
维护常见问题(增删改)
上传 / 删除文件库文件
修改问题状态、批量操作
删除别人的内容
查看所有用户(含邮箱)
修改用户角色

补充说明:匿名访客拿到的也是 viewer 身份(Supabase 的匿名登录会发一个真实 JWT,角色是 authenticated),所以「所有登录用户可做」的事它都能做。「最后一个 owner 不能被降级」由后端接口保护,避免系统里再也没人能授权。

本地启动方式
  1. 进入项目目录并安装依赖:pnpm install
  2. 在项目根目录的 .env里填好 PUBLIC_SUPABASE_URLPUBLIC_SUPABASE_ANON_KEY(Supabase 控制台 → Project Settings → API)
  3. 到 Supabase 的 SQL Editor 里按顺序执行supabase/migrations/下的迁移脚本(0001 → 0008)
  4. 到 Supabase → Authentication → Sign In / Providers,打开Anonymous Sign-Ins(不开的话访客拿不到身份,就无法提问)
  5. 启动:pnpm dev→ 打开 http://localhost:4321/

其他常用命令:pnpm check 类型检查 ·pnpm test 回归测试 ·pnpm build 生产构建

后续部署思路

当前用的是 @astrojs/node的 standalone 模式,构建产物是一个标准 Node 服务 (dist/server/entry.mjs), 所以最简单的做法是:放到一台内网服务器上跑, 前面挂个 Nginx 做反向代理和 HTTPS。

  • 数据库:把 Supabase 从开发项目换成正式项目,重新执行一遍迁移脚本,并把站点域名加进 Authentication → URL Configuration 的 Redirect URLs,否则邮件里的登录链接会跳错。
  • 环境变量:部署环境里同样要配PUBLIC_SUPABASE_URL /PUBLIC_SUPABASE_ANON_KEY.env不要提交进版本库。
  • 换平台:如果要上 Vercel / Cloudflare,把适配器从 @astrojs/node换成对应适配器即可,业务代码不用改。
  • 上线前建议:确认至少有一个 owner 账号(用 supabase/promote_owner.sql), 否则没人能管理后台。

💬 反馈

使用中遇到问题、或者有改进建议,都可以在这里告诉我们。只有管理员能看到全部反馈。

最多 2000 字。描述得越具体,越容易定位问题。