这是一个华南理工大学的旧物交易市场网站,学生们可以在上面发布二手商品和联系方式。只有使用学校邮箱登录之后才能发布。不登陆也能查看商品。
- 后端语言确定使用 Go。
- 后端主要负责用户登录、商品发布与管理、公告管理、图片上传、权限校验和数据接口输出。
- 前后端通过 HTTP API 交互,接口数据格式统一为 JSON。
- 数据库确定使用 SQLite。
- SQLite 适合作为本项目第一阶段的实现方案,部署简单,开发成本低。
- 当前项目场景以校内使用、小规模访问、功能快速落地为主,SQLite 可以满足需求。
- 如果未来访问量明显增长,或者需要更复杂的检索和运维能力,再考虑迁移到 PostgreSQL。
- 当前方案定为:前端使用 TypeScript + React + Vite + TanStack Router + TanStack Query,后端使用 Go,数据库使用 SQLite。
- 前端需要按照前后端分离方式设计,避免页面逻辑与后端实现强耦合。
- 后端接口和数据表结构在设计时应尽量保持清晰,便于后续扩展或迁移数据库。
- 前端路由方案确定使用 TanStack Router。
- 前端数据请求、缓存和异步状态管理确定使用 TanStack Query。
- TanStack Router 主要负责页面路由、路由参数、页面跳转和路由层级组织。
- TanStack Query 主要负责公告列表、商品列表、商品详情、我的商品、登录态等数据的请求与缓存。
- 商品发布、修改、删除、登录、退出登录等操作完成后,需要通过 TanStack Query 做缓存失效和数据刷新。
- 登录方式确定为“校内邮箱注册 / 登录”。
- 注册时使用华工邮箱 + 验证码完成校验,并允许用户设置密码。
- 登录时同时支持两种方式:
- 华工邮箱 + 验证码登录
- 华工邮箱 + 密码登录
- 用户未登录时可以浏览公告和市场。
- 用户只有在完成注册并成功登录后,才能发布、修改和删除自己的商品。
- 系统不单独提供昵称字段,用户身份以邮箱账号为准。
- 后端需要校验邮箱后缀,只允许学校邮箱进行登录。
- 当前邮箱域名固定写死为
@mail.scut.edu.cn,不作为配置项暴露。 - 如果邮箱不属于允许范围,需要直接拒绝发送验证码。
- 用户在前端输入华工邮箱地址。
- 如果是注册流程,前端调用后端接口发送验证码。
- 后端生成验证码并发送到该校内邮箱。
- 用户输入收到的验证码,并设置登录密码。
- 前端调用后端接口完成注册。
- 注册成功后,后端创建登录态,并返回当前用户信息。
- 后续登录时,用户可以选择“邮箱 + 验证码”或“邮箱 + 密码”。
- 后端需要提供发送验证码接口、验证码登录接口、密码登录接口和注册接口。
- 验证码需要有过期时间,例如 5 分钟。
- 验证码只能使用一次。
- 同一邮箱需要做发送频率限制,避免被恶意刷接口。
- 用户密码需要安全存储,不能明文保存,建议使用哈希方案。
- 登录成功后,建议后端使用 Cookie Session 维持登录状态。
- 后端在执行发布、修改、删除等操作时,必须校验当前登录用户身份。
- 校内邮箱域名固定为
@mail.scut.edu.cn,这一项不需要放入配置文件。 - 除上述两项外,其他可变的业务参数建议统一收敛到配置文件中,避免分散硬编码在页面或接口逻辑里。
- 后端验证码发送需要通过配置文件提供 SMTP 参数,第一阶段仅要求支持 STARTTLS,不要求 SMTPS / SSL 直连。
- 当前项目的正式配置建议落在后端配置文件中,例如
backend/config/server.json。 - 如需类型约束,可以在后端保留与配置文件对应的结构体定义。
- 建议至少拆分为四组配置:
server、auth、smtp、audit。 auth建议包含:
- 密码最小长度
- 验证码有效期
- 验证码发送冷却时间
- 登录态有效期
smtp建议包含:
- SMTP 服务器地址
- SMTP 端口
- 发信账号
- 发信邮箱
- 授权码或 SMTP 密码
- 发信人名称
- 超时时间
- 发送邮件时默认走 STARTTLS 升级连接,不使用 SSL 直连 465 端口。
audit建议包含:
audit.modeaudit.enable_ruleaudit.enable_ai- 审核队列 SLA 文案
- 审核策略说明文案
- 风险规则中的关键词和风险分
- 系统中需要有一个管理员账号。
- 管理员账号同样通过登录流程进入系统,但拥有额外的审核权限。
- 后端需要区分普通用户和管理员用户身份。
- 管理员登录成功后,前端需要展示管理员专用的审核页面入口。
- 普通用户登录后不能看到审核页面,也不能访问审核相关接口。
- 网站计划部署在 DragonOS 实验室内部一台连接校内网的机器上。
- 该机器作为前后端服务的部署节点,对外提供网站访问能力。
- 当前设想是通过部署位置和网络环境控制访问范围,使网站仅能在校园网环境下访问。
- 也就是说,只有连接华工校园网的用户才能打开该网站。
- 这可以作为平台的第一层访问限制,与“校内邮箱注册 / 登录”共同组成访问与发布权限控制。
- 网站计划在
osc的域名体系下新增一个子域名。 - 该子域名将解析或映射到 DragonOS 实验室内该机器的 IP 和对应服务端口。
- 用户最终通过该子域名访问网站,而不是直接访问 IP 和端口。
- 前端构建产物可以由 Go 后端统一托管,也可以由反向代理提供静态文件。
- Go 后端负责 API、登录、权限校验、图片上传和 SQLite 数据访问。
- SQLite 数据文件保存在部署机器本地,并做好备份。
- 如果后续需要,可以在前面加一层 Nginx,用于域名接入、反向代理和静态资源分发。
- 需要保证部署机器可以正常发送验证码邮件。
- 需要确认实验室机器的网络策略允许目标端口被校园网访问。
- 需要确认
osc子域名映射时,能够正确转发到部署机器上的服务端口。 - 如果站点后续启用 HTTPS,还需要同时考虑证书部署与反向代理配置。
- 平台需要尽量拦截违法违规内容,例如黄赌毒、政治敏感信息、诈骗引流、开盒和隐私泄露信息。
- 审核方案需要控制成本,不能依赖全量人工审核,也不依赖高成本的大模型审核。
- 第一阶段采用“规则拦截 + 举报机制 + 少量人工复核”的低成本方案。
- 不采用所有内容都先人工审核的方式。
- 不采用所有内容都走 AI 模型审核的方式。
- 默认先由后端进行规则检测。
- 明显违规内容直接拒绝发布。
- 可疑内容进入待审核状态,不直接公开展示。
- 正常内容直接发布上线。
- 上线后的内容继续接受举报和风控检测。
- 平台支持两种审核方式:规则审核和 AI 审核。
- 后端需要通过配置文件控制审核方式,而不是把审核策略写死在代码里。
- 配置文件应支持以下模式:
- 仅启用规则审核
- 仅启用 AI 审核
- 同时启用规则审核和 AI 审核
- 后端启动时读取配置,并按配置决定发布流程中的审核链路。
- 规则审核基于敏感词词库、正则规则和基础风控规则实现。
- 规则审核结果分为三类:
- 明显违规:直接禁止发布,并返回错误提示。
- 疑似违规:商品进入“待审核”状态,不直接公开展示。
- 通过:商品可以继续进入后续审核流程或直接发布。
- “明显违规”主要指命中高风险违法词、隐私泄露规则、开盒信息等强规则内容。
- “疑似违规”主要指命中部分风险词,但不能完全确定违规的内容。
- AI 审核作为可选审核能力,不强制要求第一阶段默认启用。
- AI 审核可用于补充判断规则审核难以覆盖的模糊内容。
- AI 审核结果同样分为三类:
- 明显违规:直接禁止发布。
- 疑似违规:进入“待审核”状态。
- 通过:允许继续发布流程。
- AI 审核是否启用,由配置文件决定。
- 当同时启用规则审核和 AI 审核时,两者共同参与判定。
- 联合审核建议采用从严策略:
- 任一审核结果为“明显违规”,则直接禁止发布。
- 如果没有“明显违规”,但任一审核结果为“疑似违规”,则进入“待审核”状态。
- 只有规则审核和 AI 审核都通过时,商品才允许直接发布。
- 这样可以降低漏审风险。
- 后端配置文件中需要包含审核模式开关。
- 建议至少提供以下配置项:
audit.modeaudit.enable_ruleaudit.enable_ai
- 也可以只保留一种配置表达方式,但最终必须能够表达“规则审核”“AI 审核”“同时启用”三种模式。
- 后续如果接入不同 AI 服务商,也可以在配置文件中继续增加 AI 审核提供方、接口地址、模型名称、超时等配置项。
- 黄赌毒相关信息。
- 政治敏感和违法违规信息。
- 诈骗、引流、黑灰产相关信息。
- 泄露他人隐私、开盒、人肉搜索相关信息。
- 辱骂、骚扰、恶意攻击性内容。
- 与二手交易平台定位明显无关的垃圾内容。
- 后端对商品标题、商品描述、联系方式等文本字段进行审核。
- 第一阶段以敏感词词库和规则匹配为主。
- 对明显违规关键词直接拦截,不允许提交。
- 对命中部分风险词但不完全确定的内容,进入待审核队列。
- 需要对联系方式字段单独加强校验,避免用户在联系方式中夹带违规内容。
- 平台明确禁止发布他人的身份证号、学号、手机号、宿舍号、详细住址、银行卡号等敏感信息。
- 后端可以通过正则规则识别明显的隐私信息模式。
- 一旦命中高风险隐私信息,默认不直接发布。
- 对于疑似开盒、人肉搜索、曝光他人信息的内容,应直接进入高风险处理流程。
- 第一阶段不引入高成本图片 AI 审核。
- 图片层面先做基础限制,例如文件类型、文件大小、图片数量。
- 对图片内容的违规风险,主要依赖用户举报和人工复核。
- 如果后续平台规模扩大,再考虑补充第三方图片审核服务。
- 每个商品页面都应提供举报入口。
- 举报原因建议固定为几个选项,例如:
- 违法违规
- 色情低俗
- 政治敏感
- 泄露隐私 / 开盒
- 诈骗 / 引流
- 其他
- 被举报内容需要进入审核队列。
- 同一商品在短时间内被多人举报时,可以先自动下架,再等待人工复核。
- 对单个账号的发布频率、修改频率、验证码发送频率进行限制。
- 对短时间内反复发布、删除、修改内容的账号进行风控标记。
- 对多次发布违规内容或多次被举报属实的账号,可以限制发帖或直接封禁。
- 人工审核只处理高风险和被系统筛出的内容,不处理全部商品。
- 人工优先处理以下队列:
- 命中高风险关键词的内容
- 命中隐私泄露规则的内容
- 被用户举报的内容
- 多次违规账号发布的新内容
- 这样可以把人工审核量控制在较低水平。
- 平台需要明确发布规则,并在前端和文档中说明。
- 平台应明确禁止黄赌毒、政治敏感、隐私泄露、开盒、诈骗、恶意骚扰等内容。
- 平台应保留删除内容、下架商品、限制账号、封禁账号的处理权。
- 后端需要保留必要的日志信息,便于后续排查违规行为。
- 第一阶段优先实现以下能力:
- 敏感词词库检测
- 隐私信息正则检测
- 举报入口和举报原因分类
- 待审核 / 已下架 / 正常展示状态
- 基础限流与账号风控
- 简单的后台审核队列
- 第一阶段暂不依赖大模型审核,以降低部署和运行成本。
前端以桌面端优先,同时兼容手机浏览器。整体风格尽量简洁、校园化、信息清晰,重点突出商品图片、标题、价格和校区信息。页面结构以顶部导航 + 主内容区为主,未登录用户可以浏览,登录后才允许发布和管理商品。
- 让未登录用户可以快速浏览市场和公告。
- 让已登录用户可以低成本发布、修改、删除自己的商品。
- 页面信息层级清楚,尽量减少学习成本。
- 首页负责传达通知,市场负责浏览和搜索,我的商品负责管理。
普通用户至少包含三个一级界面:
- 首页 / 公告
- 市场
- 我的商品
管理员登录后包含四个一级界面:
- 首页 / 公告
- 市场
- 我的商品
- 审核
- 顶部导航栏固定展示网站名称、首页、市场、我的商品。
- 右上角展示登录状态。
- 未登录时显示“登录 / 注册”入口。
- 登录入口需要支持注册、验证码登录、密码登录三种操作路径。
- 已登录时显示当前邮箱账号,并提供退出登录。
- 如果当前登录用户是管理员,则顶部导航栏额外显示“审核”入口。
- 页面底部需要提供信息型页脚,可集中展示联系方式、二维码、项目仓库链接和友情链接。
- 页脚内容应保持低干扰,不与顶部导航和市场筛选抢占主要注意力。
- 页脚内容建议通过前端本地配置维护,便于替换反馈邮箱、社群二维码和外链地址。
- 页脚区块数量、顺序和标题应可配置,避免把“联系方式”“友情链接”等模块写死在代码里。
- 所有页面需要保留统一的留白、标题样式、按钮样式和卡片样式。
- 移动端导航可折叠,但核心入口不能隐藏过深。
- 前端页面路由由 TanStack Router 管理。
- 页面中的公告、商品、用户信息等异步数据由 TanStack Query 管理。
首页用于展示平台公告、使用须知和校内交易提醒。
- 公告列表默认按照“置顶优先、再按时间倒序”排序。
- 已置顶公告排在最前面;多个置顶公告之间仍按发布时间倒序排列。
- 未置顶公告排在置顶公告之后,未置顶部分同样按发布时间倒序排列。
- 每条公告至少展示标题、发布时间、正文。
- 重要公告可以置顶或高亮展示。
- 首页顶部可以增加一小段平台介绍,例如“华南理工大学校内旧物交易平台”。
- 首页需要展示当前公开可见的出售商品数量、收购商品数量和已注册用户数量。
- 首页统计数量不包含“待审核”状态的商品。
- 公告列表默认直接展开展示,不需要复杂操作就能阅读。
- 公告较多时支持分页或“加载更多”。
- 若当前没有公告,显示空状态提示,而不是空白页面。
- 管理员登录后,首页公告区域需要提供“发布公告”入口。
- 管理员可以直接在前端填写公告标题和正文并发布。
- 所有公告都需要提供“置顶”和“删除”操作按钮,且这些按钮仅管理员可见。
- 公告执行置顶、取消置顶、删除、发布后,列表需要立即刷新。
市场页面是网站核心页面,用于浏览所有在售商品。
- 顶部为搜索和筛选区域。
- 中间为商品列表区域。
- 商品列表使用图墙 / 卡片流布局。
- 商品列表默认按修改时间倒序排列,最近发布或最近修改的商品排在最前面。
- 商品列表需要支持按修改时间升序、修改时间降序、价格升序、价格降序切换排序。
- 每个商品卡片只展示第一张图片作为封面。
- 图片下方展示核心文字信息,建议至少包含商品标题、价格、交易类型、商品类型、校区、发布时间。
- 商品卡片不展示发布者姓名、昵称、邮箱账号等身份信息。
- 商品图片区域尽量保持统一比例,避免页面高低错乱。
- 商品标题最多展示两行,超出部分省略。
- 价格需要比普通文字更醒目。
- 校区标签以小标签或轻量徽标形式展示。
- 商品卡片需要展示“交易类型”和“商品类型”两个字段。
- 商品状态包含“在售”“待审核”“审核不通过”。
- 其中“待审核”和“审核不通过”状态都不在公开市场显示。
- 商品类型至少包含两个选项:
- 活动票 / 讲座票
- 其他
- 其中“活动票 / 讲座票”类型的商品仅登录用户可见,未登录用户在市场列表和详情页中都不能看到。
- 若商品已下架,不应继续出现在公开市场列表中。
- 管理员登录后,市场中的商品卡片需要额外出现“下架”按钮。
- 管理员点击“下架”后,商品状态应改为“审核不通过”,并立即从公开市场列表中消失。
- 支持按商品标题和商品内容关键词搜索。
- 搜索框应放在页面显眼位置。
- 输入关键词后可点击搜索按钮,也可按回车触发搜索。
- 搜索结果为空时,显示明确提示,例如“暂无相关商品”。
- 至少支持按校区筛选。
- 至少支持按交易类型筛选,交易类型包含“出售”“收购”。
- 需要支持按商品类型筛选,商品类型至少包含“活动票 / 讲座票”和“其他”。
- 未登录用户的商品类型筛选中不显示“活动票 / 讲座票”选项。
- 校区建议包含常用枚举值,例如五山校区、大学城校区、国际校区。
- 筛选条件切换后,商品列表应立即刷新。
- 排序条件切换后,商品列表应立即刷新,并在分页场景下保持全量顺序一致。
- 后续可预留更多筛选位,例如价格区间、更多商品分类。
- 点击商品卡片后进入商品详情页或详情弹层。
- 详情中展示完整图片集、完整标题、正文描述、交易类型、商品类型、校区、发布时间、联系方式。
- 未登录用户也可以查看详情和联系方式。
- 但商品类型为“活动票 / 讲座票”的详情仅登录用户可见。
- 若联系方式较敏感,可在界面上提醒用户注意隐私与交易安全。
- 首次加载需要有加载中状态。
- 搜索无结果、筛选无结果、系统错误都要有对应提示。
- 移动端下商品卡片应变为双列或单列,保证可读性。
- 商品列表、详情页和筛选结果页的 loading、error、empty 状态需要结合 TanStack Query 统一处理。
- 市场页需要支持分页,避免商品数量过多时页面过长。
该页面仅对已登录用户开放,用于管理自己发布的商品。
- 列表展示当前用户发布的所有商品。
- 列表按发布时间倒序排列,最近发布或最近修改的商品排在最前面。
- 每个商品使用独立卡片展示,内容包括封面、标题、价格、交易类型、商品类型、校区、发布时间、当前状态。
- 我的商品列表需要支持分页。
- 每个商品卡片至少包含两个操作:
- 修改:进入编辑界面,允许修改商品内容。
- 删除:从市场中删除商品,删除前需要二次确认。
- 页面上需要有明显的“发布商品”按钮。
- 点击后进入商品编辑 / 发布界面。
- 支持上传多张图片。
- 支持填写商品标题。
- 支持填写商品描述内容。
- 支持填写价格。
- 支持选择交易类型,至少包含“出售”和“收购”。
- 支持选择商品类型,第一阶段至少包含“活动票 / 讲座票”和“其他”。
- 支持选择校区。
- 支持填写联系方式。
- 页面底部提供“立即发布”按钮。
- 如果是编辑已有商品,则按钮文案可变为“保存修改”。
- 标题、内容、交易类型、商品类型、校区、联系方式为必填项。
- 图片至少上传一张。
- 提交前需要做基本表单校验,并给出明确报错提示。
- 提交中按钮应进入禁用或 loading 状态,避免重复提交。
- 新发布商品默认进入“待审核”状态。
- 用户修改了已有商品后,商品时间要同步更新,并重新进入“待审核”状态,直到审核通过后再公开显示。
- 用户修改了已有商品后,除了状态变为“待审核”,还需要重新进入审核队列,管理员应能在审核页中看到该商品。
- 发布成功后,需要明确提示成功,并返回“我的商品”或对应商品详情。
- 未登录用户访问“我的商品”时,应提示先使用学校邮箱登录。
- 只有通过学校邮箱登录的用户才能发布商品。
- 用户只能修改和删除自己发布的商品,不能操作他人的商品。
- 前端需要结合 TanStack Router 做基础路由权限控制,并结合 TanStack Query 维护当前登录用户状态。
该页面仅对管理员账号开放,用于处理所有“待审核”状态的商品。
- 页面展示所有待审核商品。
- 列表按提交时间倒序排列,最近进入待审核的商品排在最前面。
- 每个待审核商品应展示封面、标题、价格、交易类型、商品类型、校区、发布时间、发布账号、联系方式和当前状态。
- 管理员需要能够快速看到商品标题、正文描述和联系方式,便于判断是否违规。
- 每个待审核商品至少有两个审核操作:
- 通过:商品状态改为“在售”,随后进入公开市场。
- 拒绝:商品状态改为“审核不通过”,不进入公开市场,并记录审核结果。
- 如果后续需要,也可以增加“删除”或“封禁用户”等更高权限操作,但第一阶段不是必须。
- 普通用户不能访问审核页面。
- 普通用户即使手动输入审核页面地址,也应被前端拦截并由后端拒绝。
- 只有管理员账号才能调用审核通过、审核拒绝等接口。
- 审核页需要支持分页,避免待审核商品过多时页面过长。
- 如果没有待审核商品,显示明确的空状态提示。
- 审核操作成功后,列表应立即刷新。
- 审核操作失败时,需要给出明确错误提示。
- 增加统一的空状态设计,例如“还没有发布商品”“暂无公告”“没有找到相关商品”。
- 增加删除确认弹窗,避免误删。
- 增加图片上传预览,便于用户确认封面和顺序。
- 增加基础响应式设计,保证手机上也能顺畅使用。
- 增加基础反馈组件,例如成功提示、失败提示、加载骨架屏。
- 如果后续时间允许,可以补充商品分类、收藏、举报、公告编辑等扩展能力。