【生活娱乐赛道】胡桃木 — 属于二次元爱好者的清新交流社区

生活娱乐 · 胡桃木 —— 属于二次元爱好者的清新交流社区

赛道:生活娱乐 | 作者:邱息 / qiuxi903 | 开发周期:2026-06-21 ~ 2026-07-15(25 天)

技术栈:Vue 3 + Vite + TypeScript + Element Plus + Pinia + Tailwind CSS | Spring Boot 3.2 + JPA + MySQL 8.0 + Redis 6.0 + JWT + Spring Security + JavaMail

开发工具:TRAE IDE/TRAE WORK(全程 TRAE 开发)


一、Demo 简介

是什么

胡桃木(Hutaomu) 是一个面向 ACGN 爱好者的清新交流社区网站(Web 端,响应式适配移动端)。它将同人创作、动漫讨论、百科资料、音乐分享、社区交友等二次元核心需求聚合到一个入口,让用户不再在多个 App 之间疲于切换。

面向谁

  • 14–35 岁的 ACGN 文化爱好者
  • 同人画师、Cosplayer、文手等内容创作者
  • 追番、打二游的普通观众和玩家
  • 希望有一个干净平台整理和分享个人收藏的爱好者

主要功能

胡桃木是一个功能完整、可注册体验的全栈社区系统。以下是已落地的核心模块:

1. 完整账号体系

  • 注册 / 登录 / 邮箱验证码验证 / 忘记密码(邮箱重置)
  • 首次注册 OOBE 引导系统(主题选择、兴趣板块、个人资料初始化)
  • 个人资料页、头像上传裁剪、封面自定义、关注与粉丝体系
  • 邀请码注册机制、异地登录二次验证保护

2. 内容发布与互动

  • 发帖(Markdown 富文本编辑器 + 图片上传 + 分区选择)
  • 同人画廊发布(多图上传、裁剪对齐)
  • 视频发布、Wiki 词条创建
  • 点赞、收藏、转发、举报
  • 评论系统:YouTube 式层级嵌套(最多 3 层 + thread line 连接线),第 1 层默认展示 2 条 + 分页加载更多,深层回复默认折叠,支持评论点赞

3. 动漫资料板块(核心特色)

  • 接入 Bangumi 开放 API,支持每日放送、全库浏览、分页筛选、类型过滤
  • 动漫详情页:Tab 信息切换、InfoBox 资料卡、Staff 制作人员、相关作品推荐、评分分布柱状图
  • 声优 / 导演 / 制作公司专属人物页,支持搜索秒出
  • 短片(PV/MV)独立分区筛选、老番过滤

4. 百科资料系统(Wiki)

  • 自研 Markdown 渲染引擎:支持表格、嵌套列表、多行引用、任务列表、代码块、图片画廊与灯箱(键盘导航)、动态目录、锚点跳转
  • 支持创建和编辑词条,InfoBox 右浮布局 + 移动端自适应

5. 音乐播放器

  • 接入 Meting 在线歌单 API,后台可配置歌单来源
  • 会员 / 试听歌曲自动识别过滤
  • mini 控制条 + 展开态、歌曲封面展示、外链跳转原曲、拖动把手
  • localStorage 歌单缓存,刷新即可恢复播放

6. 消息与通知

  • 私信聊天(在线状态指示、固定头部与输入区)
  • 通知系统(点赞、评论、关注、系统通知),未读红点、点击跳转自动消除
  • 移动端消息:先选联系人再进聊天,内容不重叠

7. 管理后台

  • 用户管理(封禁 / 解禁 / 角色调整)、内容审核(帖子 / 画廊 / Wiki / 视频)
  • 板块管理(增删改、关注数校验)、系统通知群发(用户筛选 + 历史记录)
  • 站点配置(ICP 备案、公安备案、邮件服务、音乐歌单)
  • 操作日志、数据统计(访问量、发帖量、活跃用户)

8. 主题与个性化

  • 5 套完整主题:亮色、暗色、高对比、冰璃、二次元动态壁纸(支持自动切换 / 锁定)
  • 自定义背景图、主题色、字体大小
  • 主题设置跟随账号云端同步
  • 壁纸悬浮控制窗(可拖动、自动换图、刷新换图)

9. 搜索系统

  • 全局搜索覆盖五类内容(帖子 / 画廊 / 视频 / Wiki / 用户)
  • 搜索历史持久化(localStorage,最多 20 条,可逐条删除或清空)
  • 板块内搜索、关键词高亮

10. 部署与运维

  • Docker 一键部署(docker-compose.yml + 前后端 Dockerfile + nginx.conf)
  • 数据库 setup 通道:首次启动时在页面上配置数据库连接,无需手动修改配置文件
  • JWT Token 存入 Redis,支持服务端主动失效
  • 统一 API 响应格式 { code, message, data }、全局异常处理器兜底

产品截图







二、Demo 创作思路

灵感来源

作为一个长期活跃在二次元圈子的普通用户,我经常遇到"想刷点高质量同人内容,却不知道去哪"的尴尬。现有平台要么广告满天飞,要么推荐算法混乱,要么社区氛围被"出圈"内容稀释。

国内二次元用户群体庞大,但内容分散在微博、小红书、LOFTER 等 N 个平台。用户想找同人图、讨论新番、交流二游攻略、认识同好,往往需要在多个 App 之间来回切换,体验割裂且效率低下。

想解决的问题

  1. 内容分散:想看的东西分布在 N 个平台,每天来回切换,心累
  2. 算法干扰:推荐系统常塞不相关、低质量的内容,找"好东西"成本高
  3. 氛围混杂:公共社区评论区质量参差不齐,缺少纯粹的同好氛围
  4. 功能不完整:有些平台只有图片、有些只有短视频,缺少一个能同时承载图文、长文、百科资料的综合社区
  5. 账号与隐私:部分平台强制实名、广告推送频繁,用户体验不佳

为什么做这个方向

  • 真实需求:二次元文化在国内仍被标签化,一个积极、友好、有管理的中文社区,能让爱好者获得更健康的交流空间
  • 信息整理价值:社区内的百科资料、官方资讯板块承担着知识整理和科普的功能,帮助新入坑的朋友更快了解作品与文化
  • 取舍明确:不追求"大而全的社交平台",而是聚焦"二次元同好社区"这一个垂直场景,把内容质量、社区氛围、用户体验做扎实
  • 有过程、有体验、讲得清楚:大赛看的是真实价值,我选择了一个自己每天都在使用的场景,每一个功能决策都有真实体验支撑

三、Demo 体验地址

在线体验https://bbs.hutaomu.cn

  • 支持注册、登录、发帖、评论、点赞等全部交互
  • 可游客身份浏览公开内容
  • 移动端浏览器自动适配响应式布局

测试账号(评审可直接登录体验)

项目 内容
注册邀请码 AGZ4SFM2
测试账号 hutaomu903@163.com
测试密码 usertest123

已自测:链接可正常打开,注册、发帖、动漫浏览、百科查看、音乐播放等核心功能均可体验。


四、TRAE 实践过程

4.1 整体开发流程

胡桃木从 0 到 1 全程使用 TRAE IDE 的 AI 智能体协作开发,共完成 123 轮对话#1 ~ #123),覆盖需求拆解、架构设计、编码实现、Bug 修复、UI 打磨、性能优化、部署配置的完整流程。

开发阶段时间线

阶段 时间 对话编号 核心产出
项目搭建 06-21 ~ 06-23 #1 ~ #23 目录结构、前后端框架、首页、登录注册、侧边栏、帖子流
核心功能 06-24 ~ 07-04 #24 ~ #41 封面持久化、全局搜索、创作者中心、OOBE 引导、邀请码、邮箱验证
界面打磨 07-05 ~ 07-08 #28 ~ #37 设计系统、动效统一、图标扁平化、移动端适配、字体切换、去"AI 生成感"
互动深化 07-09 ~ 07-11 #46 ~ #64 通知系统、消息入口、移动端防文字竖排、壁纸自动切换、壁纸悬浮控制窗
音乐播放器 07-12 ~ 07-13 #69 ~ #100 Meting 歌单接入、会员歌曲过滤、mini 控制条、歌名显示优化、翻译插件规避
评论系统 07-12 #87 ~ #97 三种方案迭代 → 最终确定 YouTube 式层级嵌套 + thread line 连接线
管理后台 07-12 #80 ~ #86 系统通知群发、用户筛选、历史展示、表格样式统一、图标线性 SVG 化
动漫板块 07-13 ~ 07-14 #104 ~ #120 Bangumi API 接入、详情页重构、声优/导演人物页、每日放送、全库分页
百科系统 07-14 ~ 07-15 #114 ~ #122 Markdown 渲染引擎强化(表格/嵌套列表/灯箱)、词条创建编辑、布局重构
收尾整理 07-15 #121 ~ #123 Banner 推荐机制重构、可读性修复、根目录清理、文档归位、Git 推送

4.2 关键开发步骤截图

开发关键步骤截图




4.3 关键任务对话 Session ID

Session ID

序号 Session ID
1 .3727820800404186:7f9a9890f88dd802215469c51aa29004_6a39d709dbaac7fdc439ef5d.6a4bec07b370a6e67fd7b182.6a4bec0782a18a82c207efef:Trae CN.T(2026/7/7 01:55:19)
2 .3727820800404186:43d2e7098687d0128ff8797a2be1fef7_6a4bc55eb370a6e67fd7ac07.6a4be3d4b370a6e67fd7b00c.6a4be3d382a18a82c207efed:Trae CN.T(2026/7/7 01:20:20)
3 .3727820800404186:bbfe473c2b9494aaa45d0f9e227b53e5_6a4c8f81b370a6e67fd7b3a4.6a4ce619f6806046fa745adc.6a4ce61886abc94fe581fa03:Trae CN.T(2026/7/7 19:42:17)
4 .3727820800404186:d5bef228eba721ec129d50460e0bda0b_6a4ce788f6806046fa745b2a.6a4d32c1f6806046fa745fcf.6a4d32c086abc94fe581fa17:Trae CN.T(2026/7/8 01:09:21)
5 .3727820800404186:5111b270739660a1ba7e2e1853a2842d_6a4d33a3f6806046fa745ff0.6a4e20a8dcb893a77e113c7c.6a4e20a70a17248d7818377a:Trae CN.T(2026/7/8 18:04:24)
6 .3727820800404186:67a42239c89fa67c3bbaab24cb5c7e7b_6a4d7df1dcb893a77e113598.6a4e349683eeff684dc78975.6a4e34950147242761c4159c:Trae CN.T(2026/7/8 19:29:26)
7 .3727820800404186:67f538ffcbe7af061ccb1c094207281d_6a4e20f8dcb893a77e113c88.6a4e3f4783eeff684dc78aaf.6a4e3f460147242761c415a2:Trae CN.T(2026/7/8 20:15:03)
8 .3727820800404186:4967770ca9e922a6be3246f6f4fafd93_6a4e44bb83eeff684dc78ae2.6a4f7bb283eeff684dc79a84.6a4f7bb00147242761c415d9:Trae CN.T(2026/7/9 18:45:06)
9 .3727820800404186:3214cd23d4d4024d1bccceaa490509e9_6a4f765783eeff684dc799f2.6a5126eef92860e61945a7dc.6a5126ec4a85834be059add8:Trae CN.T(2026/7/11 01:07:58)
10 .3727820800404186:c30c39daaabd48061b899383d323d2bb_6a51151ef92860e61945a4ac.6a527dc3f92860e61945b625.6a527dc24a85834be059ae13:Trae CN.T(2026/7/12 01:30:43)
11 .3727820800404186:2274817b19e3024709f97ee79fbc1e0e_6a527e80f92860e61945b631.6a5348b2d7103583e9937d7a.6a5348af503b941b3b755ce1:Trae CN.T(2026/7/12 15:56:34)
12 .3727820800404186:a5ddae9889dc9f2479443d1c4d81f2d5_6a535007d7103583e9937dea.6a537fd2d7103583e99381cf.6a537fd1503b941b3b755cfb:Trae CN.T(2026/7/12 19:51:46)
13 .3727820800404186:07991b5d3fb7b0126e6eac7dc4c10a91_6a538ce8d7103583e9938286.6a53ed8dd7103583e993887f.6a53ed8c503b941b3b755d2c:Trae CN.T(2026/7/13 03:39:57)
14 .3727820800404186:dc7705fe93695ad2835d68f3306f2017_6a53ee9bd7103583e99388be.6a54cb5cd7103583e9939927.6a54cb58503b941b3b755d5d:Trae CN.T(2026/7/13 19:26:20)
15 .3727820800404186:de7362077e2ff9752df7b5c3cde1eb8b_6a54e02ad7103583e9939a45.6a554162d7103583e993aa06.6a554160503b941b3b755d77:Trae CN.T(2026/7/14 03:49:54)
16 .3727820800404186:a2afbdfba6b5633ef53ee33d563f5db4_6a553f55d7103583e993a94f.6a55d902d7103583e993ace4.6a55d901503b941b3b755d86:Trae CN.T(2026/7/14 14:36:50)
17 .3727820800404186:da80f979539de35b6ae1dcd4ea4f9349_6a55d90fd7103583e993acec.6a56629a17a8c1e37d84de61.6a56629630d3c3740f0e6d0b:Trae CN.T(2026/7/15 00:23:54)
18 .3727820800404186:0e4e0dc30d9b9a34dab87114e6ebcbe3_6a56269b17a8c1e37d84c9d5.6a56681417a8c1e37d84e19f.6a56681230d3c3740f0e6d16:Trae CN.T(2026/7/15 00:47:16)
19 .3727820800404186:0d315d1ff91a36bce058286203e29be0_6a56369917a8c1e37d84cd1e.6a5670d317a8c1e37d84e4b8.6a5670d230d3c3740f0e6d1b:Trae CN.T(2026/7/15 01:24:35)
20 .3727820800404186:7b01d277718e8fb442ba2184c0e3c3dd_6a56769f17a8c1e37d84ead9.6a5690949d4e337cf9e3cf4d.6a569093be8965a3d1d57bb6:Trae CN.T(2026/7/15 03:40:04)
21 .3727820800404186:0cbdf56721491cc5931d3f5a28e20f82_6a56619217a8c1e37d84dd6b.6a569fa79d4e337cf9e3d3e7.6a569fa5be8965a3d1d57bc0:Trae CN.T(2026/7/15 04:44:23)
22 .3727820800404186:efb443bba1c6df38d3f7ec30e9766ce0_6a56a0fe9d4e337cf9e3d443.6a56a2ae9d4e337cf9e3d4e2.6a56a2abbe8965a3d1d57bc4:Trae CN.T(2026/7/15 04:57:18)
23 .3727820800404186:90dac1e8db9ca52b9b82968285f4fbf1_6a5693b79d4e337cf9e3d09a.6a56afab9d4e337cf9e3d7ea.6a56afaabe8965a3d1d57bd0:Trae CN.T(2026/7/15 05:52:43)
24 .3727820800404186:c5cc77d93d18358d14720e64125dc610_6a56b2fd9d4e337cf9e3d8ab.6a56dc7d9d4e337cf9e3dc03.6a56dc7bbe8965a3d1d57bf0:Trae CN.T(2026/7/15 09:03:57)
25 .3727820800404186:649be357ad5a1e0db6e331c247fc734e_6a56ad8c9d4e337cf9e3d76d.6a56e5829d4e337cf9e3dc88.6a56e580be8965a3d1d57bf7:Trae CN.T(2026/7/15 09:42:26)
26 .3727820800404186:12618216ee57d0552fc6f88ccd5198a4_6a56d8d59d4e337cf9e3db22.6a56ed359d4e337cf9e3dcab.6a56ed34be8965a3d1d57bf9:Trae CN.T(2026/7/15 10:15:17)
27 .7645668732962882576:dc31881639f1f369cea3839fedd24bf1_6a40934a4f01ff1b79c99d89.6a40a6824f01ff1b79c99e88.6a40a68100fe04e5f767fee3:Trae.T(2026/6/28 12:43:46)
28 .3727820800404186:139a52a644cb3b8ee1094128e01694bc_6a39d709dbaac7fdc439ef5d.6a4115580eb43d5bc4f4a41c.6a411556930060cc671c1e18:Trae CN.T(2026/6/28 20:36:40)
29 3727820800404186f584d30e04af8c0e26d8beada283b39b_6a37e78f298e016f06d7666c.6a3a8c2e322141f6a696db08.6a3a8c2e322141f6a696db06TRAE Work CN.0.1.21.no_sid.no_ppe.T(2026623 213750)
30 3727820800404186:0fab090ea8dccf5205818b32727ed7cf_6a37e78f298e016f06d7666c.6a3aafb8322141f6a696dc47.6a3aafb8322141f6a696dc45:TRAE Work CN.0.1.21.no_sid.no_ppe.T(2026/6/24 00:09:28)

4.4 真实开发过程:任务拆解 + 踩坑复盘

案例 1:评论嵌套结构的四次方案迭代(#87 ~ #97

评论回复的展示结构是整个项目中最折腾的功能之一,真实经历了四次推翻重来:

  • 第一版:传统论坛式平铺 + 递归嵌套。深层回复缩进过深,移动端直接溢出。
  • 第二版:加固返回白屏修复后仍有层级混乱问题。
  • 第三版:改为短视频式两层平铺,但用户反馈"不像社区该有的样子"。
  • 最终版:YouTube 式层级嵌套,最多 3 层 + thread line 连接线,第 1 层默认 2 条 + 分页加载更多,第 2 层及更深默认全部折叠。

期间还附带修复了"回复子评论后内容不显示""返回主页帖子不可见但可点击"等连锁 bug。

感悟:复杂交互没有一次到位的方案,关键是快速迭代 + 真实场景验证。TRAE 的优势恰恰是"改起来快"。

案例 2:动漫板块的持续打磨(#104 ~ #120

动漫板块耗时最长的模块,前后经历 17 轮对话:

  • 接入 Bangumi 开放 API 获取番剧数据,实现每日放送、全库浏览、分页筛选
  • 详情页拆解为 Tab/InfoBox/Staff/相关推荐四个区域,评分分布用柱状图直观呈现
  • 声优 / 导演 / 制作公司独立人物页,支持搜索秒出
  • 短片(PV/MV)分区筛选、老番过滤

踩坑:Bangumi 浏览/筛选/排序重构时遇到"美漫窜位、类型标注不一致、日漫不纯、大数据量卡顿"的问题,通过重构查询与排序逻辑,配合首屏自动补满兜底机制解决。

案例 3:百科(Wiki)系统的全链路实现(#114 ~ #122

百科是最体现"全栈"能力的模块:

  • 自研 Markdown 渲染引擎:从零实现了表格、嵌套列表、多行引用、任务列表、代码块、图片画廊、图片灯箱(支持键盘左右导航)、动态目录生成、标题锚点跳转
  • 词条创建与编辑:支持富文本录入,InfoBox 资料卡右浮动布局,移动端自适应为全宽
  • 防盗链处理:外部百科图片转 base64 内嵌,避免引用图片裂开

踩坑:Wiki 详情页布局经历多次重构——从固定章节结构改为 Markdown 全文渲染 + 动态目录,InfoBox 从左浮动改为右浮动使正文自然环绕。图片灯箱最初没有键盘导航,用户反馈后补上了左右方向键支持。

案例 4:音乐播放器的细节打磨(#69 ~ #100

音乐播放器看似简单,实际打磨了 30+ 轮对话:

  • Meting 在线歌单接入,遇到限流后迁移备用实例
  • 会员 / 试听歌曲过滤:从"30 秒片段特征判断"升级为后端精确字段检测
  • mini 控制条:三按钮 + 圆形中央按钮展示当前曲目封面
  • 歌名显示:从"滚动两圈后定格开头"→"不溢出居中、溢出左对齐保开头 + 省略号"
  • 沉浸式翻译插件会把歌名翻译成英文:逐元素标记不可翻译 → 整体标记 → 改用 <code> 标签阻止——前后试了 5 种方案才彻底解决

感悟:歌名被翻译插件翻译这种"小众但真实"的坑,只有真正用起来才会发现。

案例 5:主题系统的稳健性优化(#121

主题系统支持 5 套主题,后期发现两个底层缺陷:

  • accent.replace() 链式调用对已是 rgba 格式的主题色(冰璃主题)会输出错误字符串 → 改为统一的 hexToRgba() 辅助函数
  • root.className = ... 整体覆写会清除临时 class(如 notransition、mobile-menu-open)→ 改为 classList.toggle() 精准增删

状态色也从硬编码抽成了 token 变量(--danger / --success / --warning),各主题独立覆盖。

4.5 代码规模

维度 数据
前端 Vue 视图 34 个页面组件
后端 Controller 20+ 个 API 控制器
后端 Entity 23 个数据实体
TRAE 对话轮次 123 轮
Git 推送 前端 7 次 / 后端 6 次

4.6 AI 协作的工程化实践

为了在 25 天、123 轮对话中保持开发可追溯、不"失忆",项目建立了一套工程化协作机制:

  • 持久化协作规则AI协作规则.md):定义每次对话必读文件清单、四类日志分工、前后端标签标注规则、重大事件确认流程、防幻觉机制
  • 四类日志各司其职:AI 对话记录(决策与上下文)、项目更新日志(功能变更)、问题修复日志(Bug 追踪)、删除记录(清理可追溯)
  • 跨会话记忆:每次新会话开始,AI 先读完所有日志文件再工作,杜绝"凭空记忆"
  • Git 干净推送:前后端仓库分离,只推源码(排除 node_modules / target / uploads / logs),每次推送记录日期、提交说明、commit hash

五、开发心得与踩坑总结

5.1 用 TRAE 做全栈项目的三点体会

  1. 敢于迭代,不怕推翻:评论嵌套迭代 4 版,Wiki 渲染器重构 3 次,主题系统持续优化。TRAE 改代码快,试错成本低,这是传统手写代码不具备的优势。
  2. 需求描述比代码本身重要:动漫详情页参考 anispaceee 风格、评论用 YouTube 式嵌套、歌名保开头 + 省略号——把参考对象和期望行为讲清楚,AI 一次出来的结果就很接近目标。
  3. 真实使用才能发现真问题:沉浸式翻译插件翻译歌名、移动端 flex 文字被挤竖排、ElDropdown 的粉红 focus ring——这些都不是"设计时能想到"的,而是真正用起来才暴露的。

5.2 代表性踩坑案例

问题 根因 解决方案
返回主页白屏,帖子不可见但可点击 <Transition> mode 在渲染中途切换 beforeEach 中提前设置 isBackNavigation,确保组件渲染前拿到正确值
ElDropdown 出现粉红 focus ring Element Plus 内部 JS 注入 box-shadow 全局 CSS 覆盖所有 ElDropdown 相关元素的 outline 和 box-shadow
移动端文字被挤成竖排 flex 容器空间不足 全局 white-space: nowrap 兜底 + 关键区域改用 Grid
MySQL 8.0.29 以下不支持 CREATE INDEX IF NOT EXISTS 版本兼容性差异 改用 INFORMATION_SCHEMA.STATISTICS 查询判断索引是否存在
邮箱验证前就创建了用户记录 注册流程设计缺陷 改为延迟建号:验证码校验通过后才创建用户
二次元主题下浅色文字看不清 壁纸颜色多变、文字对比度不足 浅色文字添加 accent 渐变底边,提升可读性

5.3 不是"一次性 Demo"

这个项目在工程化方面做了扎实的投入:

  • 前后端分离,统一 API 响应格式,全局异常处理兜底
  • Docker 一键部署,数据库 setup 通道免手动改配置
  • JWT + Redis 的 Token 管理,支持服务端主动踢下线
  • 123 轮对话全程日志可追溯,任何代码变更都能回溯到当时的决策上下文

这些基础让项目具备了"可维护、可扩展、可部署"的能力,也为后续复赛迭代打好了地基。


六、报名帖链接

已通过的社区报名帖:[【生活娱乐赛道】胡桃木 —— 属于二次元爱好者的清新交流社区]


七、开源与致谢


—— 邱息 / qiuxi903,2026 年 7 月 · TRAE AI 创造力大赛初赛 Demo 帖

这不得至少上复赛啊 投了投了 真心佩服

1 个赞

完成度巨高,天呐,大佬太牛了

二次元的知乎,真不错