Files
mengyastore/项目面试询问相关.md

73 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 萌芽小店Mengyastore面试经历要点
## 1. 项目一句话
一个前后端分离的轻量级商城系统,支持商品浏览、下单与发货(自动/手动)、邮件通知、聊天客服、收藏夹,以及 PWA 安装与离线缓存。
## 2. 技术栈(可直接复述)
- 前端Vue 3Composition API、Vite、Vue Router 4、Pinia、Axios、`markdown-it`商品描述渲染、PWA`vite-plugin-pwa`
- 后端Go 1.21+、Gin、GORM、MySQL、SMTP 邮件发送net/smtp + TLS
- 部署Docker / docker-compose后端二进制容器化 + 挂载只读配置)
- 认证SproutGate OAuth用户侧 Bearer token 校验);管理员使用 `adminToken``/api/admin/verify` + 请求头/查询参数校验)
## 3. 整体架构
- 前端:按功能拆分模块(`admin/` 管理后台、`store/` 商品/结账、`chat/` 客服、`wishlist/` 收藏、`maintenance/` 维护页),并在路由层做维护模式守卫。
- 后端:使用 `internal/handlers` 按业务拆路由与处理逻辑;使用 `internal/storage` 把数据访问封装成独立存储层;通过 `cmd/migrate` 做旧数据到 MySQL 的迁移/初始化。
- 数据库:以 `products / product_codes / orders / chat_messages / wishlists / site_settings` 等核心表承载业务状态与统计。
## 4. 关键业务链路(面试重点)
### 4.1 商品浏览与下单
- 商品列表:`GET /api/products`
- 记录浏览量:`POST /api/products/:id/view`
- 下单(创建订单与支付流程):`POST /api/checkout`
- 确认付款/触发发货:`POST /api/orders/:id/confirm`
### 4.2 自动发货 vs 手动发货
- 自动发货(`deliveryMode = "auto"`):在下单/确认流程中从 `product_codes` 取出卡密,写入订单 `delivered_codes`,订单完成后返回卡密内容,并更新销量统计。
- 手动发货(`deliveryMode = "manual"`):下单不提取卡密,确认后订单状态变为完成但不返回卡密;管理员在后台查看订单信息后进行发货相关操作。
### 4.3 邮件通知SMTP 可配置)
- 由管理员在后台配置 SMTP`GET/POST /api/admin/site/smtp`
- 下单或状态变更时触发邮件通知(例如订单确认/发货相关通知)。
### 4.4 聊天客服HTTP 轮询)
- 用户端拉取消息:`GET /api/chat/messages`
- 用户端发送消息(有频率限制):`POST /api/chat/messages`
- 管理员端会话管理:
- 获取全部会话:`GET /api/admin/chat`
- 获取指定用户会话:`GET /api/admin/chat/:account`
- 管理员回复:`POST /api/admin/chat/:account`
- 清除对话:`DELETE /api/admin/chat/:account`
### 4.5 维护模式与管理后台鉴权
- 维护模式:前端在路由守卫里调用 `GET /api/site/maintenance`,站点维护时重定向到 `/maintenance`(管理员可豁免)。
- 管理后台鉴权:`POST /api/admin/verify` 校验 token后续管理员接口通过 `X-Admin-Token` 头部携带。
## 5. PWA 体验亮点(可讲“工程化”)
- 支持 `display: standalone` 的安装到桌面体验
- Service Worker静态资源 `CacheFirst`API 请求 `NetworkFirst`API 有短时缓存策略)
- 自动检测新版本并提示更新
- 启动动画与引导SplashScreen 过渡体验)
## 6. 数据治理/防刷点(面试可用)
- 针对购买并发/绕过:通过统计 `pending``completed` 等订单状态来限制每账户购买数量,减少并发下的超额风险。
- 对外接口与管理员接口分离:公开接口与需要登录/需要管理员 token 的接口分层,降低权限误用概率。
## 7. 部署与环境配置(可讲“落地”)
- 后端容器通过 `DATABASE_DSN` 环境变量覆盖配置文件里的 DSN
- `config.json` 作为只读挂载到容器内,减少运行时误写配置的风险
- 端口映射示例:`28081:8080`
## 8. 面试常问我怎么回答(可直接拿来用)
1. 为什么不使用 WebSocket
- 该项目选择 HTTP 轮询实现客服,降低复杂度;在并发不极端的场景下更易落地、便于维护,并且配合频率限制即可控制滥用。
2. 自动发货如何保证数据一致?
- 关键状态更新与卡密提取/写入集中在后端的“创建订单/确认订单”链路内,确保业务流程按接口语义串联执行(如订单完成状态与卡密归属同步)。
3. PWA 离线策略怎么选?
- 静态资源走 `CacheFirst` 提升加载速度与离线能力API 走 `NetworkFirst` 保持业务数据的新鲜度,必要时做短时缓存降抖。
## 9. 你可以按自己的贡献再补一句(占位)
- 个人在项目中主要负责:前端模块/接口封装/后端某模块实现(按实际替换)
- 自己解决过的一个难点:例如“接口鉴权边界/订单发货逻辑/SMTP 配置联调/PWA 缓存策略”等(按实际替换)