# find-spy **Repository Path**: jaydu/find-spy ## Basic Information - **Project Name**: find-spy - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-29 - **Last Updated**: 2026-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 谁是卧底 - 跨平台应用 这是一个基于 React+Taro 的跨平台“谁是卧底”应用,支持微信小程序和 Web 端。 ## 技术栈 - **前端框架**:React + Taro 4.1.11 - **开发语言**:TypeScript - **样式方案**:SCSS - **状态管理**:React useState/useEffect - **网络请求**:Taro.request + WebSocket - **构建工具**:Vite ## 当前能力 - 进入应用先保存头像和昵称,再进入大厅 - 大厅只保留 `创建房间` 和 `加入房间` - 主持人可在房间内选择 `要法官` / `不要法官` - 主持人可配置平民数、卧底数,人数满后发牌 - 每个玩家只在自己的设备上看到自己的词 - 线下发言,应用内投票,直到游戏结束 - 被投出去的玩家头像显示 `❌` - 支持平票重投、结算公开身份、再来一局 - 支持复制房间码和分享拉人进房 - **投票环境,投票选项去掉自己** - **如果投票环境自己被投出去,就显示自己已经出局,投票按钮置灰** - **结算获胜时,显示卧底和平民** ## 你要改的配置 1. 在 [web/src/utils/config.ts](C:/Users/jaydu/Desktop/code/wodi/web/src/utils/config.ts) 里把 `API_BASE_URL` 改成你的服务端地址 2. 在微信开发者工具里把该域名加入 `request 合法域名` 3. 你的服务端按下面这套接口返回数据 ## 前端约定的接口 ### 1. 登录 `POST /api/auth/login` 请求体: ```json { "code": "wx.login 返回的 code", "nickname": "玩家昵称", "avatarUrl": "玩家头像" } ``` 响应体: ```json { "token": "服务端登录态 token", "playerId": "玩家唯一 ID", "nickname": "可选,服务端最终昵称", "avatarUrl": "可选,服务端最终头像" } ``` 说明: - 前端会把 `token` 放进 `Authorization: Bearer ` - 后续所有接口默认都带这个 token ### 2. 创建房间 `POST /api/rooms` 响应体: ```json { "roomCode": "123456" } ``` ### 3. 加入房间 `POST /api/rooms/join` 请求体: ```json { "roomCode": "123456" } ``` ### 4. 获取房间详情 `GET /api/rooms/:roomCode` 响应体: ```json { "room": { "roomCode": "123456", "hostPlayerId": "host-1", "hostNickname": "主持人", "hostAvatarUrl": "https://...", "gameMode": "with_judge", "status": "waiting", "phase": "waiting", "civilianCount": 4, "undercoverCount": 1, "expectedPlayers": 6, "currentRound": 0, "winner": "", "resultText": "", "lastEliminatedPlayerId": "" }, "players": [ { "playerId": "p1", "nickname": "A", "avatarUrl": "https://...", "role": "", "word": "", "isOut": false, "createdAt": 1710000000000 } ], "roundVotes": [ { "voterPlayerId": "p1", "voterNickname": "A", "targetPlayerId": "p2", "targetNickname": "B" } ] } ``` 说明: - `roundVotes` 只需要返回当前轮次的票 - 等待发牌阶段可返回空数组 ### 5. 更新房间设置 `PATCH /api/rooms/:roomCode/settings` 请求体按需传,前端可能传这些字段: ```json { "gameMode": "with_judge", "civilianCount": 4, "undercoverCount": 1, "expectedPlayers": 6 } ``` 响应体建议直接回房间快照: ```json { "room": {}, "players": [], "roundVotes": [] } ``` ### 6. 发牌 `POST /api/rooms/:roomCode/start` ### 7. 提交投票 `POST /api/rooms/:roomCode/votes` 请求体: ```json { "targetPlayerId": "p2" } ``` ### 8. 结算投票 `POST /api/rooms/:roomCode/votes/finish` ### 9. 再来一局 `POST /api/rooms/:roomCode/restart` ### 10. 退出房间 `POST /api/rooms/:roomCode/leave` ## 字段约定 ### room - `gameMode`: `with_judge` 或 `no_judge` - `status`: `waiting` / `playing` / `finished` - `phase`: `waiting` / `voting` / `finished` - `winner`: `平民` / `卧底` / `""` - `resultText`: 本轮提示文案,例如平票、谁被淘汰、谁获胜 ### player - `role`: `平民` / `卧底` / `法官` / `""` - `word`: 未发牌前可为空 - `isOut`: 是否出局 ## 项目结构 ``` ├── web/ # Taro 项目根目录 │ ├── src/ # 源代码目录 │ │ ├── pages/ # 页面组件 │ │ │ ├── index/ # 首页(登录、创建/加入房间) │ │ │ └── room/ # 房间页(游戏主界面) │ │ ├── utils/ # 工具类 │ │ │ ├── api.ts # API 封装 │ │ │ ├── config.ts # 配置文件 │ │ │ └── game.ts # 游戏逻辑 │ │ ├── app.ts # 应用入口 │ │ ├── app.config.ts # 应用配置(路由等) │ │ └── app.scss # 全局样式 │ ├── config/ # 构建配置 │ ├── dist/ # 构建输出目录 │ └── package.json # 项目依赖 ├── server/ # 示例后端 ├── pages/ # 原微信小程序代码(已废弃) └── utils/ # 原微信小程序工具类(已废弃) ``` ## 代码入口 - 首页登录、建房、加房:[web/src/pages/index/index.tsx](C:/Users/jaydu/Desktop/code/wodi/web/src/pages/index/index.tsx) - 房间、投票、结算:[web/src/pages/room/room.tsx](C:/Users/jaydu/Desktop/code/wodi/web/src/pages/room/room.tsx) - API 封装:[web/src/utils/api.ts](C:/Users/jaydu/Desktop/code/wodi/web/src/utils/api.ts) - 服务端地址配置:[web/src/utils/config.ts](C:/Users/jaydu/Desktop/code/wodi/web/src/utils/config.ts) - 词库和胜负判断工具:[web/src/utils/game.ts](C:/Users/jaydu/Desktop/code/wodi/web/src/utils/game.ts) - 示例后端:[server/index.js](C:/Users/jaydu/Desktop/code/wodi/server/index.js) ## 构建和运行 ### 安装依赖 ```bash cd web npm install ``` ### 开发模式 - **Web 端**:`npm run dev:h5` - **微信小程序**:`npm run dev:weapp` ### 生产构建 - **Web 端**:`npm run build:h5` - **微信小程序**:`npm run build:weapp` 构建产物将生成在 `web/dist` 目录中。 ## 说明 - 项目里还保留了 [cloudfunctions](C:/Users/jaydu/Desktop/code/wodi/cloudfunctions) 目录,但前端已经不再依赖云函数 - 如果你完全不用云开发,可以后续自行删除这部分目录 - 仓库里包含一个内存版 Express 示例后端,启动说明见 [server/README.md](C:/Users/jaydu/Desktop/code/wodi/server/README.md) - 原微信小程序代码已迁移到 Taro 项目中,保留的 `pages/` 和 `utils/` 目录已废弃