[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94860":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":18,"readmeContent":19,"aiSummary":20,"trendingCount":14,"starSnapshotCount":14,"syncStatus":21,"lastSyncTime":9,"discoverSource":22},94860,"XiaoShiLiu","ZTMYO\u002FXiaoShiLiu","ZTMYO","一个高仿小红书的图文社区项目，支持图文发布、社交互动等核心功能，旨在提供从前端到后端的完整实践范本",null,"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu","Vue",277,88,0,42.85,false,"main","2026-08-24 04:01:22","\u003Cp align=\"center\">\n    \u003Cimg alt=\"logo\" src=\".\u002Fdoc\u002Fimgs\u002F小石榴.png\" width=\"100\" \u002F>\n\u003C\u002Fp>\n\u003Ch1 align=\"center\" style=\"margin: 20px 30px 0px 30px; font-weight: bold;\">XiaoShiLiu\u003C\u002Fh1>\n\n---\n\u003Cp align=\"center\">\n    \u003Cb>基于 Express + Vue 前后端分离仿小红书项目\u003C\u002Fb>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Ci>一个高仿小红书的图文社区项目，支持图文发布、社交互动等核心功能，旨在提供从前端到后端的完整实践范本\u003C\u002Fi>\n\u003Cp align=\"center\">\u003Ca href=\"https:\u002F\u002Fwww.shiliu.space\">演示网站\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1J4agztEBX\u002F?spm_id_from=333.1387.homepage.video_card.click\">视频介绍\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu\">简体中文\u003C\u002Fa>|\u003Ca href=\"doc\u002Fi18n\u002FREADME_En.md\">English\u003C\u002Fa>|\u003Ca href=\"doc\u002Fi18n\u002FREADME_zh-Hant.md\">繁體中文\u003C\u002Fa>\n\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu\u002Fstargazers\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FZTMYO\u002FXiaoShiLiu?style=flat&logo=github&color=brightgreen&label=Stars\">\n    \u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu\u002Fnetwork\u002Fmembers\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002FZTMYO\u002FXiaoShiLiu?style=round-square&color=brightgreen&logo=data:image\u002Fsvg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIj4KPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik01IDUuMzcydi44NzhjMCAuNDE0LjMzNi43NS43NS43NWg0LjVhLjc1Ljc1IDAgMCAwIC43NS0uNzV2LS44NzhhMi4yNSAyLjI1IDAgMSAxIDEuNSAwdi44NzhhMi4yNSAyLjI1IDAgMCAxLTIuMjUgMi4yNWgtMS41djIuMTI4YTIuMjUxIDIuMjUxIDAgMSAxLTEuNSAwVjguNWgtMS41QTIuMjUgMi4yNSAwIDAgMSAzLjUgNi4yNXYtLjg3OGEyLjI1IDIuMjUgMCAxIDEgMS41IDBaTTUgMy4yNWEuNzUuNzUgMCAxIDAtMS41IDAgLjc1Ljc1IDAgMCAwIDEuNSAwWm02Ljc1Ljc1YS43NS43NSAwIDEgMCAwLTEuNS43NS43NSAwIDAgMCAwIDEuNVptLTMgOC43NWEuNzUuNzUgMCAxIDAtMS41IDAgLjc1Ljc1IDAgMCAwIDEuNSAwWiI+PC9wYXRoPgo8L3N2Zz4=\">\n    \u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FXiaoShiLiu-v1.3.2-brightgreen.svg?logo=data:image\u002Fsvg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAgMCBDNC4yMzMwMTEyMSAyLjgyMjAwNzQ3IDcuMTcxNTk2NjQgNS45NTIyODk5MiA4LjgxMjUgMTAuODc1IEM5LjE4MDc2MjI0IDE2LjQ5MDk5OTE2IDkuMDI4MDYwMDcgMjAuMDUxNjU5ODkgNS44MTI1IDI0Ljg3NSBDMS44ODAxNjE5MSAyOC44NTAzMTQ0NiAtMS4zMzIwOTg0OSAzMC43NTMzMzQzMyAtNyAzMS4xMjUgQy0xMS43MTg5MjIyMyAzMS4wMzg1NzI4NSAtMTUuMjAxOTI2NjkgMjkuODM5MTA3NjUgLTE4LjYzMjgxMjUgMjYuNDQ1MzEyNSBDLTIyLjQ1Nzc0Mjg2IDIyLjA1MjEwNjc3IC0yMy41MDQ5MDc2NCAxOC43NDI5NTY4OSAtMjMuMzk4NDM3NSAxMi45Mjk2ODc1IEMtMjIuOTEyNTgwNTggOC4xOTcwODExNiAtMjAuNjcwMDc0MTQgNS4wOTQ1OTE5MSAtMTcuMTg3NSAyLjA2MjUgQy0xMS43NzQzMTUyMyAtMS44ODQ2MTM5IC02LjE5MjU0NDY4IC0yLjE4NTYwNDAxIDAgMCBaIE0tNy4xODc1IDQuODc1IEMtOC4xNzc1IDUuNTM1IC05LjE2NzUgNi4xOTUgLTEwLjE4NzUgNi44NzUgQy0xMC4xODc1IDcuNTM1IC0xMC4xODc1IDguMTk1IC0xMC4xODc1IDguODc1IEMtMTAuODA2MjUgOS4xNDMxMjUgLTExLjQyNSA5LjQxMTI1IC0xMi4wNjI1IDkuNjg3NSBDLTE0LjQ4NzAyMzMgMTAuODMwNTY4NDggLTE0LjQ4NzAyMzMgMTAuODMwNTY4NDggLTE2LjE4NzUgMTMuODc1IEMtMTYuNTc3NjM3MTYgMTUuODY0Njk5NSAtMTYuOTE5NTI2NDkgMTcuODY1MTk4NjkgLTE3LjE4NzUgMTkuODc1IEMtMTYuMTk3NSAyMC4zNyAtMTYuMTk3NSAyMC4zNyAtMTUuMTg3NSAyMC44NzUgQy0xNC40NjU5MDU3NiAyMi41MTg2MzEzNCAtMTMuNzkzOTg1NzkgMjQuMTg1NTAzODYgLTEzLjE4NzUgMjUuODc1IEMtMTIuNTI3NSAyNS44NzUgLTExLjg2NzUgMjUuODc1IC0xMS4xODc1IDI1Ljg3NSBDLTEwLjg1NzUgMjYuODY1IC0xMC41Mjc1IDI3Ljg1NSAtMTAuMTg3NSAyOC44NzUgQy05LjUyNzUgMjcuODg1IC04Ljg2NzUgMjYuODk1IC04LjE4NzUgMjUuODc1IEMtNi44Njc1IDI1Ljg3NSAtNS41NDc1IDI1Ljg3NSAtNC4xODc1IDI1Ljg3NSBDLTMuODU3NSAyNi44NjUgLTMuNTI3NSAyNy44NTUgLTMuMTg3NSAyOC44NzUgQy0zLjE4NzUgMjcuODg1IC0zLjE4NzUgMjYuODk1IC0zLjE4NzUgMjUuODc1IEMtMi4xOTc1IDI1LjU0NSAtMS4yMDc1IDI1LjIxNSAtMC4xODc1IDI0Ljg3NSBDMC40MDMyMDAxNCAyMi45Mjg5NjcyNiAwLjQwMzIwMDE0IDIyLjkyODk2NzI2IDAuODEyNSAyMC44NzUgQzEuNDcyNSAyMC4yMTUgMi4xMzI1IDE5LjU1NSAyLjgxMjUgMTguODc1IEMxLjU3OTU5MDMxIDEzLjExMDE4NTAyIDEuNTc5NTkwMzEgMTMuMTEwMTg1MDIgLTIuMTg3NSA4Ljg3NSBDLTIuODQ3NSA4Ljg3NSAtMy41MDc1IDguODc1IC00LjE4NzUgOC44NzUgQy00LjE4NzUgNy44ODUgLTQuMTg3NSA2Ljg5NSAtNC4xODc1IDUuODc1IEMtNS4xNzc1IDUuNTQ1IC02LjE2NzUgNS4yMTUgLTcuMTg3NSA0Ljg3NSBaIE0tMTguMTg3NSAxOS44NzUgQy0xOC4xODc1IDIyLjg3NSAtMTguMTg3NSAyMi44NzUgLTE4LjE4NzUgMjIuODc1IFogTTIuODEyNSAxOS44NzUgQzMuMTQyNSAyMC44NjUgMy40NzI1IDIxLjg1NSAzLjgxMjUgMjIuODc1IEMzLjgxMjUgMjEuODg1IDMuODEyNSAyMC44OTUgMy44MTI1IDE5Ljg3NSBDMy40ODI1IDE5Ljg3NSAzLjE1MjUgMTkuODc1IDIuODEyNSAxOS44NzUgWiAiIGZpbGw9IiNGQ0ZDRkMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjE4NzUsMS4xMjUpIi8+CjxwYXRoIGQ9Ik0wIDAgQzIuMDYyNSAwLjQzNzUgMi4wNjI1IDAuNDM3NSA0IDEgQzQgMS45OSA0IDIuOTggNCA0IEM0Ljk5IDQuMzMgNS45OCA0LjY2IDcgNSBDMy43ODU0ODczMSA2LjYwNzI1NjM1IDAuNTYzODc0NjQgNi4wNTc0ODE4NSAtMyA2IEMtMS4xMjUgMS4xMjUgLTEuMTI1IDEuMTI1IDAgMCBaICIgZmlsbD0iI0U5RTlFOSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUsMjYpIi8+Cjwvc3ZnPgo=\">\n    \u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu\u002Fblob\u002Fmaster\u002FLICENSE\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FZTMYO\u002FXiaoShiLiu?color=8ebc06\">\n    \u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fstatic\u002Fv1?message=Vue&color=4f4f4f&logo=Vue.js&logoColor=4FC08D&label=\">\n    \u003Cimg\n        src=\"https:\u002F\u002Fimg.shields.io\u002Fstatic\u002Fv1?&message=JavaScript&color=4f4f4f&logo=JavaScript&logoColor=F7DF1E&label=\">\n    \u003C\u002Fa>\n\u003C\u002Fp>\n\n\n> **声明**  \n> 本项目基于 [GPLv3 协议](.\u002FLICENSE)，免费开源，仅供学习交流，禁止转卖，谨防受骗。如需商用请保留版权信息，确保合法合规使用，运营风险自负，与作者无关。\n\n---\n\n> 📁 **项目结构说明**：本项目包含完整的前后端代码，前端位于 `vue3-project\u002F` 目录，后端位于 `express-project\u002F` 目录。详细结构请查看 [项目结构文档](.\u002Fdoc\u002FPROJECT_STRUCTURE.md)。\n\n## 项目展示\n\n### PC端界面\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F1.png\" alt=\"PC端界面1\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F2.png\" alt=\"PC端界面2\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F3.png\" alt=\"PC端界面3\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F4.png\" alt=\"PC端界面4\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F5.png\" alt=\"PC端界面5\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F6.png\" alt=\"PC端界面6\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F7.png\" alt=\"PC端界面7\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F8.png\" alt=\"PC端界面8\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F9.png\" alt=\"PC端界面9\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F10.png\" alt=\"PC端界面10\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F11.png\" alt=\"PC端界面11\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F12.png\" alt=\"PC端界面12\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F13.png\" alt=\"PC端界面13\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F14.png\" alt=\"PC端界面14\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F15.png\" alt=\"PC端界面15\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n    \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F16.png\" alt=\"PC端界面16\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F17.png\" alt=\"PC端界面17\" width=\"300\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002F18.png\" alt=\"PC端界面18\" width=\"300\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\n\n### 移动端界面\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm1.png\" alt=\"移动端界面1\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm2.png\" alt=\"移动端界面2\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm3.png\" alt=\"移动端界面3\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm4.png\" alt=\"移动端界面4\" width=\"200\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm5.png\" alt=\"移动端界面5\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm6.png\" alt=\"移动端界面6\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm7.png\" alt=\"移动端界面7\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm8.png\" alt=\"移动端界面8\" width=\"200\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm9.png\" alt=\"移动端界面9\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm10.png\" alt=\"移动端界面10\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm11.png\" alt=\"移动端界面11\" width=\"200\"\u002F>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\".\u002Fdoc\u002Fimgs\u002Fm12.png\" alt=\"移动端界面12\" width=\"200\"\u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## 项目文档\n\n| 文档 | 说明 |\n|------|------|\n| [部署指南](.\u002Fdoc\u002FDEPLOYMENT.md) | 部署配置和环境搭建说明 |\n| [项目结构](.\u002Fdoc\u002FPROJECT_STRUCTURE.md) | 项目目录结构架构说明 |\n| [数据库设计](.\u002Fdoc\u002FDATABASE_DESIGN.md) | 数据库表结构设计文档 |\n| [API接口文档](.\u002Fdoc\u002FAPI_DOCS.md) | 后端API接口说明和示例 |\n\n## 项目亮点\n\n- **工程化：** 环境配置、代码规范、构建与产物优化的完整流程\n- **业务能力：** 鉴权流程、路由守卫、状态管理与接口封装\n- **体验优化：** 骨架屏、懒加载、预加载、无障碍与响应式适配\n- **组件与分层：** 可复用组件拆分、按领域分组与别名引入\n- **后台管理：** 基础CRUD、数据管理与配置面板，支持后续扩展权限与统计\n- **快速部署：** 基于 Docker 的一键部署方案，支持多环境配置与自动化部署\n\n## 技术栈\n\n> 💡点击可展开查看详细内容\n\u003Cdetails>\n\u003Csummary>\u003Cb>前端技术\u003C\u002Fb>\u003C\u002Fsummary>\n\n- **Vue.js 3** - 前端框架（Composition API）\n- **Vue Router 4** - 路由管理\n- **Pinia** - 状态管理\n- **Vite** - 构建工具和开发服务器\n- **Axios** - HTTP客户端\n- **VueUse** - Vue组合式工具库\n- **CropperJS** - 图片裁剪\n- **Vue3 Emoji Picker** - 表情选择器\n- **svg-captcha** - 验证码生成器\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>后端技术\u003C\u002Fb>\u003C\u002Fsummary>\n\n- **Node.js** - 运行环境\n- **Express.js** - Web框架\n- **MySQL** - 数据库\n- **JWT** - 身份认证\n- **Multer** - 文件上传\n- **bcrypt** - 密码加密\n- **CORS** - 跨域资源共享\n\n\u003C\u002Fdetails>\n\n\n\n## 第三方API\n- **图片存储：** 灌装的示例图片来自 [栗次元图床](https:\u002F\u002Ft.alcy.cc\u002F)，提供稳定的图片存储服务\n- **图片上传：** 用户上传图片使用了 [夏柔API](https:\u002F\u002Fapi.aa1.cn\u002Fdoc\u002F360tc.html)，确保图片上传的稳定性和速度\n- **属地查询：** IP属地查询服务使用 [保罗API](https:\u002F\u002Fapi.pearktrue.cn\u002Fconsole\u002Fdetail?id=290)，实现精准的IP属地定位功能\n\n\n## 环境要求\n\n| 组件 | 版本要求 |\n|------|----------|\n| Node.js | >= 16.0.0 |\n| MySQL | >= 5.7 |\n| MariaDB | >= 10.3 |\n| npm | >= 8.0.0 |\n| yarn | >= 1.22.0 |\n| 浏览器 | 支持ES6+ |\n\n> 提示：上述为传统本地开发的最低版本要求。若使用 Docker 部署，默认镜像版本如下：MySQL 5.7、Node 18-alpine（前后端构建\u002F运行）、Nginx alpine；Docker >= 20、Docker Compose >= 2。详见[部署指南文档](.\u002Fdoc\u002FDEPLOYMENT.md)。\n\n## 环境配置\n\n项目使用环境变量进行配置管理，前后端分别有独立的 `.env` 文件：\n\n### 后端配置 (express-project\u002F.env)\n\n```env\n# 服务器配置\nPORT=3001\nNODE_ENV=development\n\n# 数据库配置\nDB_HOST=localhost\nDB_USER=root\nDB_PASSWORD=123456\nDB_NAME=xiaoshiliu\nDB_PORT=3306\n\n# JWT配置\nJWT_SECRET=xiaoshiliu_secret_key_2025\nJWT_EXPIRES_IN=7d\nREFRESH_TOKEN_EXPIRES_IN=30d\n\n# API配置\nAPI_BASE_URL=http:\u002F\u002Flocalhost:3001\n\n# 上传配置\n# 单张图片最大文件大小\nIMAGE_MAX_SIZE=10mb\n# 单个视频最大文件大小\nVIDEO_MAX_SIZE=100mb\n# 图片上传策略 (local: 本地存储, imagehost: 第三方图床, r2: Cloudflare R2)\nIMAGE_UPLOAD_STRATEGY=imagehost\n# 视频上传策略 (local: 本地存储, r2: Cloudflare R2)\nVIDEO_UPLOAD_STRATEGY=local\n\n# 本地存储配置\nLOCAL_UPLOAD_DIR=uploads\nLOCAL_BASE_URL=http:\u002F\u002Flocalhost:3001\n# 视频存储目录\nVIDEO_UPLOAD_DIR=uploads\u002Fvideos\n# 视频封面存储目录\nVIDEO_COVER_DIR=uploads\u002Fcovers\n\n# 第三方图床配置（当IMAGE_UPLOAD_STRATEGY=imagehost时使用）\nIMAGEHOST_API_URL=https:\u002F\u002Fapi.xinyew.cn\u002Fapi\u002F360tc\nIMAGEHOST_TIMEOUT=60000\n\n# Cloudflare R2 配置（当IMAGE_UPLOAD_STRATEGY=r2或VIDEO_UPLOAD_STRATEGY=r2时使用）\nR2_ACCESS_KEY_ID=your_r2_access_key_id_here\nR2_SECRET_ACCESS_KEY=your_r2_secret_access_key_here\nR2_ENDPOINT=https:\u002F\u002Fyour_account_id.r2.cloudflarestorage.com\nR2_BUCKET_NAME=your_bucket_name_here\nR2_ACCOUNT_ID=your_account_id_here\nR2_REGION=auto\n# 可选：如果有自定义域名，可以设置 R2_PUBLIC_URL\n# R2_PUBLIC_URL=https:\u002F\u002Fyour-custom-domain.com\n\n# CORS配置\nCORS_ORIGIN=http:\u002F\u002Flocalhost:5173\n\n# 邮件服务配置\n# 是否启用邮件功能 (true\u002Ffalse)，默认不启用\nEMAIL_ENABLED=false\n# SMTP服务器地址\nSMTP_HOST=smtp.qq.com\n# SMTP服务器端口\nSMTP_PORT=465\n# 是否使用SSL\u002FTLS (true\u002Ffalse)\nSMTP_SECURE=true\n# 邮箱账号\nSMTP_USER=your_email@example.com\n# 邮箱密码\u002F授权码\nSMTP_PASSWORD=your_email_password\n# 发件人邮箱\nEMAIL_FROM=your_email@example.com\n# 发件人名称\nEMAIL_FROM_NAME=小石榴校园图文社区\n\n# IP属地查询配置\n# 主API地址\nIP_LOCATION_PRIMARY_API=https:\u002F\u002Fapi.pearktrue.cn\u002Fapi\u002Fip\u002Fdetails\n# 主API超时时间（毫秒）\nIP_LOCATION_PRIMARY_TIMEOUT=10000\n# 备用API地址\nIP_LOCATION_BACKUP_API=https:\u002F\u002Fapi.pearktrue.cn\u002Fapi\u002Fip\u002Fhigh\n# 备用API超时时间（毫秒）\nIP_LOCATION_BACKUP_TIMEOUT=5000\n```\n\n### 前端配置 (vue3-project\u002F.env)\n\n```env\n# API基础URL\nVITE_API_BASE_URL=http:\u002F\u002Flocalhost:3001\u002Fapi\n\n# 是否使用真实API\nVITE_USE_REAL_API=true\n\n# 应用标题\nVITE_APP_TITLE=小石榴图文社区\n```\n\n> 💡 **配置说明**：\n> - 后端支持本地存储、第三方图床和 Cloudflare R2 三种上传策略\n> - 图片和视频可以分别配置不同的上传策略\n> - 邮件功能默认关闭，启用后支持邮箱验证注册和找回密码\n> - IP属地查询支持主备双API，自动切换保证服务可用性\n> - 前端使用 Vite 环境变量，变量名需以 `VITE_` 开头\n> - 详细配置说明请参考 [部署指南](.\u002Fdoc\u002FDEPLOYMENT.md)\n\n### 1. 安装依赖\n\n```bash\n# 使用 cnpm或npm\ncnpm install\n# 或使用 yarn\nyarn install\n```\n\n### 2. 启动开发服务器\n\n```bash\n# 启动开发服务器\nnpm run dev\n\n# 或使用 yarn\nyarn dev\n```\n\n开发服务器将在 `http:\u002F\u002Flocalhost:5173` 启动\n\n### 3. 构建生产版本\n\n```bash\n# 构建生产版本\nnpm run build\n\n# 预览生产版本\nnpm run preview\n```\n\n> ⚠️ **重要提醒**：前端项目需要配合后端服务使用，详细配置请查看 [部署指南](.\u002Fdoc\u002FDEPLOYMENT.md)\n\n## Star历史\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=ZTMYO\u002FXiaoShiLiu&type=Date&theme=dark)](https:\u002F\u002Fgithub.com\u002FZTMYO\u002FXiaoShiLiu)\n\n---\n\n\u003Cdiv align=\"center\">\n\nCopyright © 2025 - **XiaoShiLiu**\\\nBy ZTMYO\\\nMade with ❤️ & ⌨️\n\n\u003C\u002Fdiv>\n\n\n","XiaoShiLiu 是一个高仿小红书的图文社区开源项目，提供从前端（Vue）到后端（Express）的完整前后端分离实现。核心功能包括图文笔记发布、用户关注、点赞收藏、评论互动及内容推荐等典型社交功能，并包含基础的用户认证与权限管理。技术上采用 RESTful API 设计，支持 MySQL 数据存储，代码结构清晰，注释较充分，适合作为 Web 全栈开发的学习范例或教学参考项目，也适用于快速搭建轻量级图文社区原型。",2,"trending"]