软工集市后端解析文档
一,SSE Market 后端 API 深度解析(APIMD)
1. 服务概览
- 技术栈:
Go + Gin + GORM + MySQL + Redis + WebSocket - 启动入口:
main.go - 监听端口:
8080 - 静态资源:
/uploads->public/uploads/resized->public/resized
- 路由注册:
route/routes.go
2. 鉴权与访问控制
2.1 三种鉴权模式
-
普通用户 JWT(AuthMiddleware)
- 适用:大多数
/api/auth/*接口 - Header:
Authorization: Bearer <token> - WebSocket 兼容:可通过 query 参数
token
- 适用:大多数
-
管理员 JWT(AuthMiddleware_admin)
- 适用:管理员接口(封禁、删用户、管理员管理等)
- Header:
Authorization: Bearer <admin_token>
-
OAuth2 Access Token(OAuthMiddleware)
- 适用:
/api/auth/connect/userinfo - Header:
Authorization: Bearer <oauth2_access_token> - 当前 scope 主要为
read_basic
- 适用:
2.2 Token 生命周期
- 用户 Access Token:7 天
- 用户 Refresh Token:30 天(数据库
refresh_tokens一次性消费) - 管理员 Token:1 天
- OAuth2 Access Token:5 分钟
2.3 统一响应风格(主流)
多数接口使用:
1 | { |
但项目中存在部分接口直接 c.JSON(...) 返回原始对象数组(如帖子列表、评论列表、部分统计)。前后端联调需按具体接口处理。
3. 模块拆分与核心职责
3.1 账号与身份(userController)
- 注册、登录、刷新 token、改密
- 邮箱验证码发送与校验(Redis)
- 用户资料读取/修改、头像上传
- OAuth2 授权流程(授权码模式简化版)
3.2 帖子与互动(postController + commentController + rpostController)
- 发帖、浏览、详情、点赞、收藏、浏览计数
- 一级评论/二级评论及点赞/点踩
- 举报与评分贴(星级评价)
- 热度榜读取(Redis ZSet)
3.3 通知与聊天(noticeController + chat.go)
- 通知分页读取、已读标记、计数
- WebSocket 私聊
- 未读数通过 Redis Key 维护
3.4 商城(shopController)
- 商品发布、列表、详情、软删除、售出标记
3.5 管理后台(managerController + sueController)
- 管理员登录/信息
- 增删管理员、删用户
- 举报审核(违规/不违规)与处罚落地
3.6 教学文件(fileController)
- 课程目录/文件对象管理(COS)
- 教师身份上传、删文件夹/文件、获取对象 URL
4. 关键业务流程(深度)
4.1 注册与验证码防刷
validateEmail发码后,验证码进入 Redis:vcode:<email>- 失败计数:
vcode_fail:<email>
- 连续失败达到阈值(
MAX_VALIDATE_FAIL=5)删除验证码,要求重发。 - 注册成功后删除验证码与失败计数键。
- 同时发放
token + refresh_token,refresh token 入库,支持单次刷新。
4.2 Token 刷新(一次性)
- 校验 refresh token JWT 合法性
- 校验 DB 中 token 存在、未使用、未过期
- 将旧 token 标记为
is_used=true - 重新签发 access token + refresh token 并持久化新 refresh token
这保证了 refresh token 不能重复回放。
4.3 帖子热度模型
来自控制器逻辑可见,热度近似由以下动作驱动:
- 点赞:
+3 - 浏览:
+1 - 评论:
+6 - 删除评论时会按时间衰减回收热度(存在
0.5^days逻辑)
另有 /api/auth/calculateHeat 从 Redis hot_posts_zset 读取 Top10。
4.4 举报闭环
- 用户提交举报(
status=wait, finish=false) - 管理员判定:
NoViolation: 批量同目标举报置nosinViolation: 置ok,删除违规内容,处罚用户(punishnum + 1,并延长banend)
- 生成双向通知(被处罚人 + 举报人)
4.5 聊天未读/在线态
- WebSocket 建连后维护
clientMap - 未读 Redis Key(由 util 拼接):类似
RecvUnread模式 - 进入聊天界面时清除对应未读
- 目标不在线或不在当前聊天窗口会累积未读并触发邮件提醒(若未关闭)
5. API 分组总表(按路由)
完整可导入规范见:
docs/openapi.yaml
5.1 OAuth2 / 连接认证
POST /api/auth/connect/checkPOST /api/auth/connect/authorizePOST /api/auth/connect/tokenPOST /api/auth/connect/userinfoGET /api/auth/connect/records
5.2 认证与用户
POST /api/auth/registerPOST /api/auth/loginPOST /api/auth/refreshPOST /api/auth/modifyPasswordPOST /api/auth/validateEmailGET /api/auth/infoPOST /api/auth/getInfoPOST /api/auth/updateUserInfoPOST /api/auth/deleteMePOST /api/auth/identityValidatePOST /api/auth/changeEmailPushPOST /api/auth/getAvatarPOST /api/auth/uploadAvatarPOST /api/auth/updateAvatarPOST /api/auth/statistics
5.3 帖子/评论/评分
POST /api/auth/postPOST /api/auth/browsePOST /api/auth/getPostNumPOST /api/auth/showDetailsPOST /api/auth/getPostTypePOST /api/auth/updateLikePOST /api/auth/updateSavePOST /api/auth/updateBrowseNumPOST /api/auth/deletePostPOST /api/auth/submitReportPOST /api/auth/showPcommentsPOST /api/auth/postPcommentPOST /api/auth/postRcommentPOST /api/auth/postCcommentPOST /api/auth/deletePcommentPOST /api/auth/deleteCcommentPOST /api/auth/updatePcommentLikePOST /api/auth/updatePcommentDenyPOST /api/auth/updateCcommentLikePOST /api/auth/updateCcommentDenyPOST /api/auth/submitRatingPOST /api/auth/userPostRatingPOST /api/auth/getAverageRatingPOST /api/auth/getStarsGET /api/auth/getTagsPOST /api/auth/gettitleGET /api/auth/calculateHeat
5.4 文件与反馈
POST /api/auth/uploadPhotosPOST /api/auth/uploadZipPOST /api/auth/submitFeedbackGET /api/auth/getAllFeedbackPOST /api/auth/getFileListPOST /api/auth/uploadFilePOST /api/auth/addFolderPOST /api/auth/fileDeletePOST /api/auth/folderDeletePOST /api/auth/getObjectUrl
5.5 通知与聊天
GET /api/auth/getNoticeGET /api/auth/getNoticeNumPATCH /api/auth/readNotice/{noticeID}GET /api/auth/getChatHistoryGET /api/auth/getChatNoticeGET /websocket/auth/chat(WebSocket)
5.6 商城
POST /api/auth/postProductPOST /api/auth/getProductsPOST /api/auth/getProductDetailPOST /api/auth/getProductNumPOST /api/auth/deleteProductPOST /api/auth/saleProductPOST /api/auth/getCarouselImg
5.7 管理员
POST /api/auth/adminLoginGET /api/auth/admininfoPOST /api/auth/addAdminPOST /api/auth/changePasswordPOST /api/auth/deleteUserPOST /api/auth/deleteAdminPOST /api/auth/showUsersGET /api/auth/getSuesPOST /api/auth/noViolationPOST /api/auth/violationPOST /api/auth/adminPost
6. 参数与实现特征(联调重点)
- 大量
POST接口通过c.Bind(...),可接受application/json或x-www-form-urlencoded(取决于客户端发送)。 - 上传类接口使用
multipart/form-data,文件字段一般是file。 - 一部分 GET 依赖 query 参数:
getNotice(pageSize, requireID, read)getChatHistory(senderUserID, targetUserID)connect/records(page, page_size)
- 个别接口返回体非统一 envelope(如直接数组/对象),请以实际接口为准。
7. 风险与改进建议(来自代码审阅)
- 建议统一响应结构,减少前端分支判断。
- 建议逐步把“状态变更动作”从
POST迁移为语义化 HTTP 方法(如PATCH/DELETE)。 - 建议为所有接口补充显式请求 DTO + 校验标签,避免弱类型
Bind带来的歧义。 - 建议完善 OpenAPI 中字段级 schema,并在 CI 中做契约校验。
8. apifox已导入的接口文档
在 Apifox 邀请你加入项目 SSE Market Server API https://app.apifox.com/invite/project?token=EayE1t8g-iAuJ0XO73J_9
二, SSE Market Server 项目全景技术文档
本文基于当前仓库代码整理,覆盖:
- 项目架构与请求链路
- 私信系统(WebSocket + Redis + MySQL)原理
- 各 API 功能总览(按路由分组)
- 项目实现难点、细节与改进建议
1. 项目定位与技术栈
- 定位:校园/课程场景下的社区与二手商城后端服务,包含发帖、评论、评分、通知、私信、举报与管理员治理。
- 语言与框架:Go + Gin。
- 数据层:MySQL(GORM v1
github.com/jinzhu/gorm)+ Redis(缓存、状态、未读计数、热度榜)。 - 认证体系:用户 JWT、管理员 JWT、OAuth2 Access Token(三套鉴权并存)。
- 异步/定时:Cron 定时任务(热度刷新、refresh token 清理、数据库备份与评分计算任务)。
- 文件能力:本地静态目录 + COS 文件接口(课程文件管理)。
2. 代码分层与关键目录
main.go:程序入口,初始化配置/邮件/JWT/数据库/Redis,挂载中间件与路由,启动 HTTP 服务与热度任务。route/routes.go:全量路由注册与鉴权分组(/api/auth、/api、/api/oauth、/api/admin)。controller/:业务接口实现(帖子、评论、用户、私信、通知、商城、管理员、举报、文件等)。model/:GORM 模型定义(用户、帖子、评论、聊天消息、OAuth2、通知、举报、商品等)。common/:数据库连接、Redis 初始化、JWT 签发与解析等基础能力。middleware/:鉴权中间件、跨域中间件、请求日志中间件、OAuth2 中间件。response/:统一响应封装(code/data/msg)。heat/:热度计算与定时任务。api/:外部能力封装(邮件、内容检测、COS 等)。util/:通用工具与聊天 Redis Key 生成器等。dto/:接口出入参/返回 DTO。docs/openapi.yaml:当前 API 的 OpenAPI 文档(已覆盖大部分字段)。
3. 应用启动与请求处理链路
3.1 启动阶段
config.InitConfig()读取配置。config.InitEmailConfig()初始化邮件配置。common.InitDB()建立 MySQL 连接,执行AutoMigrate与部分外键约束。common.RedisInit()建立 Redis 连接。common.InitJWTkey()初始化 JWT 秘钥。- Gin 初始化后挂载日志中间件
middleware.LoggerToFile()、CORS 中间件、静态文件服务。 route.CollectRoute(r)注册所有路由。- 启动
heat.StartHeat()(每小时热度刷新 + 每 48h 清理已使用 refresh token)。
3.2 请求主链路
客户端请求 -> Gin Router -> 分组中间件鉴权 -> Controller 参数绑定与校验 -> DB/Redis/API 调用 -> response.Success/Fail 返回。
3.3 架构特点
- 控制器承载较重:多数业务逻辑直接写在
controller,Service 层拆分较少。 - MySQL 与 Redis 双状态:强一致数据在 MySQL,临时在线态/未读态/热榜在 Redis。
- 多鉴权并行:用户 JWT、管理员 JWT、OAuth2 token 针对不同路由组。
4. 数据模型与业务域
- 用户域:
model/user.go,含身份、分数、头像、邮箱通知开关等。 - 内容域:
post/pcomment/ccomment/plike/psave/pbrowse组成帖子、评论、点赞、收藏、浏览链路。 - 治理域:
sue(举报)、notice(通知)、admin(管理员操作)。 - 私信域:
chat.go(ChatMsg,带发送者/接收者外键与时间)。 - 生态扩展域:
oauth2app/oauth2code/oauth2token/oauth2authrecord。 - 商城域:
product。
5. 私信系统原理(重点)
核心文件:
controller/chat.gomodel/chat.goutil/chatUtil.gomiddleware/authMiddleware.go
5.1 连接建立
- 客户端通过
GET /api/auth/websocket/auth/chat建立 WebSocket。 - 鉴权支持两种方式:
- Header:
Authorization: Bearer <token> - Query:
?token=<jwt>(WebSocket 场景兼容)
- Header:
- 连接成功后,为用户创建
ChatNode(Conn + DataQueue),存入全局sync.Map(clientMap)。
5.2 消息收发流程
recvMsgFromUser持续读取消息,支持心跳包(HeartBeat)。- 非心跳消息进入
dispatch:- 校验
senderUserID与当前连接用户一致; - 拒绝伪造
chatMsgID(必须由后端生成); - 入库
model.ChatMsg; - 组装返回结构并调用
sendMsg派发。
- 校验
sendMsg2User协程从DataQueue取消息并写回 WebSocket。
5.3 聊天记录与会话态
GET /api/auth/getChatHistory:- 强制校验
senderUserID == 当前登录用户ID; - 拉取双方双向历史消息并按
createdAt升序返回。
- 强制校验
- 进入聊天页时:
- 先删除用户全部“正在聊天页”标记(防止残留);
- 再设置当前会话在线标记:
{sender}To{target}IsExist; - 清空对应未读计数:
{sender}RecvUnread{target}。
5.4 未读计数设计(Redis)
- Key 规则:
- 聊天页在线态:
{sender}To{target}IsExist - 未读计数:
{receiver}RecvUnread{sender}
- 聊天页在线态:
- 目标用户离线或不在当前会话页时:
INCR未读计数- 触发邮件提醒(若用户未关闭邮件通知)。
GET /api/auth/getChatNotice通过 SCAN 聚合{userID}RecvUnread*得到未读总数。
5.5 会话列表用户来源
GetRelevantUser从聊天消息表中统计与当前用户有往来的用户集合(去重),并附带 Redis 未读值返回。
5.6 私信系统的实现难点
- 状态分裂问题:连接在线态在内存
clientMap,会话在线态与未读在 Redis,历史消息在 MySQL,三者需协同。 - 连接异常清理:读超时/异常断连后要删除在线状态,避免脏状态导致未读错误。
- 幂等与伪造防护:通过
senderUserID与chatMsgID校验,限制伪造发送者与篡改主键。 - 用户体验平衡:既要实时消息,又要离线补偿(未读 + 邮件提醒)。
6. API 功能总览(按路由分组)
说明:完整字段建议以
docs/openapi.yaml为准。下面强调功能与鉴权边界。
6.1 用户鉴权组 /api/auth(需用户 JWT)
OAuth2 授权管理
POST /connect/check:检查三方应用信息。POST /connect/authorize:用户授权,返回携带 code 的跳转地址。GET /connect/records:查询 OAuth2 授权记录(分页)。
评分贴/评分能力
POST /submitRating:提交评分。POST /userPostRating:查询当前用户对指定帖评分。POST /getAverageRating:获取帖子平均分。POST /getStars:获取 1-5 星分布。POST /postRcomment:发布评分评论。
帖子能力
POST /post:发布帖子。POST /browse:浏览帖子列表(含搜索、排序、分页、类型)。POST /getPostNum:统计帖子数量。POST /getPostType:查询帖子类型。POST /updateLike:点赞/取消点赞。POST /showDetails:帖子详情。POST /updateSave:收藏/取消收藏。POST /updateBrowseNum:更新浏览数。POST /deletePost:删除帖子。POST /submitReport:提交举报。GET /getTags:获取标签。POST /gettitle:标题生成。GET /calculateHeat:查询热榜。
评论能力
POST /showPcomments:评论树查询。POST /postPcomment:一级评论。POST /postCcomment:二级评论/回复。POST /updateCcommentLike:二级评论点赞切换。POST /updatePcommentLike:一级评论点赞切换。POST /updateCcommentDeny:二级评论点踩切换。POST /updatePcommentDeny:一级评论点踩切换。POST /deletePcomment:删除一级评论。POST /deleteCcomment:删除二级评论。
用户资料与账号
GET /info:获取当前登录用户信息。POST /getAvatar:按手机号获取头像。POST /getInfo:按手机号/ID 获取用户详情。POST /updateUserInfo:更新用户资料。POST /deleteMe:注销账号。POST /identityValidate:邮箱验证码校验。POST /changeEmailPush:切换邮件推送开关。POST /statistics:个人统计面板。
通知能力
GET /getNotice:通知列表分页。GET /getNoticeNum:通知数统计。PATCH /readNotice/:noticeID:标记通知已读。
文件与课程资源
POST /getFileList:获取课程目录文件。POST /fileDelete:删除文件。POST /folderDelete:删除目录。POST /uploadFile:课程文件上传。POST /addFolder:新增目录。POST /getObjectUrl:获取对象临时 URL。
私信聊天
GET /websocket/auth/chat:建立聊天 WebSocket。GET /getChatHistory:获取双方聊天记录。GET /getChatNotice:获取聊天未读总数。
商城
POST /postProduct:发布商品。POST /getProducts:商品列表。POST /getProductDetail:商品详情。POST /getProductNum:商品数量。POST /deleteProduct:删除商品(软删)。POST /saleProduct:标记售出。POST /getCarouselImg:轮播图(当前返回简单字符串)。
其他
POST /submitFeedback:提交反馈。GET /getAllFeedback:拉取反馈列表。POST /apiTest:内容审核/测试接口。
6.2 公开组 /api(无需 JWT)
POST /register:用户注册。POST /login:用户登录。POST /refresh:刷新 token(refresh token 轮换逻辑)。POST /uploadPhotos:上传帖子图片。POST /uploadAvatar:上传头像资源。POST /updateAvatar:上传并绑定头像。POST /uploadZip:上传压缩包。POST /connect/token:OAuth2 code 换 access token。POST /modifyPassword:找回/修改密码。POST /validateEmail:发送邮箱验证码。
6.3 OAuth2 资源组 /api/oauth(需 OAuth2 token)
POST /connect/userinfo:按 OAuth2 scope 返回用户资料。
6.4 管理员组 /api/admin(需管理员 JWT)
POST /addAdmin:新增管理员。POST /changePassword:修改管理员密码。POST /deleteUser:删除用户。POST /deleteAdmin:删除管理员。POST /showUsers:条件筛选用户。GET /admininfo:管理员信息。GET /getSues:拉取举报单。POST /noViolation:举报判定无违规。POST /violation:举报判定违规并执行处罚。POST /adminPost:管理员发帖。
额外公开入口:
POST /adminLogin:管理员登录(不在/api/admin组)。
7. 项目实现难点与关键细节
7.1 多鉴权体系并存
- 用户 JWT、管理员 JWT、OAuth2 token 三套逻辑并行,路由组与中间件需严格匹配。
- WebSocket 需兼容 Query Token,和常规 Bearer 鉴权路径不同,易造成边界漏洞。
7.2 统一响应与非统一响应混用
- 代码中既有
response.Success/Fail(code/data/msg),也有直接返回对象数组/字符串的接口。 - 前端接入成本上升,错误处理分支更多,文档与实际容易偏差。
7.3 私信实时性与一致性
- 内存连接池 + Redis 未读态 + MySQL 历史消息三层状态协同复杂。
- 断连、重复连接、页面切换时可能出现未读数抖动,需要额外清理策略。
7.4 内容域关系复杂
- 帖子、一级评论、二级评论、点赞、点踩、收藏、举报互相关联,删除与级联一致性处理复杂。
- GORM 外键约束与业务层删除动作需保持一致,避免孤儿数据。
7.5 定时任务与在线业务共存
- 热度刷新、token 清理、数据库备份同时运行,需关注资源竞争和异常恢复。
- 热度公式依赖浏览/评论/点赞,统计实时性与计算成本存在平衡点。
7.6 文件与对象存储边界
- 本地静态文件与 COS 文件管理并存,路径安全、权限边界、对象 URL 时效需统一策略。
7.7 安全与风控细节
- 部分接口参数中携带
userID/phone,虽常有上下文校验,但仍需持续检查“越权读取/操作”。 - WebSocket
CheckOrigin=true当前是全放开策略,生产需结合域名白名单/网关策略收紧。
8. 架构层面改进建议(优先级建议)
- 补齐 Service 层:将复杂业务从
controller下沉,形成可测试、可复用、可组合的服务层。 - 统一响应协议:所有接口统一
code/msg/data,避免前端多分支解析。 - 私信状态收敛:为连接状态与会话状态引入更明确生命周期,增加断线重连与幂等处理。
- 鉴权策略标准化:抽象统一权限校验函数,减少“接口内二次校验”散落。
- 可观测性增强:补齐关键业务日志(消息派发失败、Redis 异常、定时任务耗时)与告警。
9. 阅读与维护建议
- 想快速理解接口:先看
route/routes.go,再跳对应controller文件。 - 想排查登录/权限:按
middleware/*auth*.go+common/jwt.go顺序看。 - 想排查消息未读问题:按
controller/chat.go->util/chatUtil.go-> Redis key 状态排查。 - 想排查热榜:看
heat/cron.go热度公式与 Redis ZSet。 - 联调时请优先以
docs/openapi.yaml为字段基线,再对照 controller 实现确认边界行为。
三,SSE Market Server 面试深挖资料(超详版)
适用场景:技术面试、项目答辩、深挖追问。
建议搭配docs/项目全景技术文档.md与docs/openapi.yaml一起使用。
0. 一句话项目介绍(开场可直接说)
我做的是一个基于 Go + Gin 的校园社区/二手交易后端,核心模块包括用户认证、帖子评论、评分贴、通知、私信 WebSocket、举报治理、商城、文件管理和 OAuth2 对外授权;数据层是 MySQL + Redis,鉴权体系同时支持用户 JWT、管理员 JWT 和 OAuth2 token,并且有热榜与 token 清理等定时任务。
1. 面试开场推荐讲法(2-3 分钟)
1.1 业务目标
- 提供一个面向校园场景的“内容社区 + 二手交易 + 站内沟通”平台后端。
- 既要支撑高频互动(点赞、评论、私信、通知),又要保证治理能力(举报、管理员处罚、权限分层)。
1.2 技术方案
- 框架:Gin。
- 存储:MySQL(持久化主数据)+ Redis(热点状态、未读计数、热榜)。
- 鉴权:用户 JWT、管理员 JWT、OAuth2 token 三套并行。
- 通信:HTTP + WebSocket(私信)。
- 任务:Cron(热度刷新、已使用 refresh token 清理、备份与积分统计)。
1.3 你做了什么(可替换成你的真实贡献)
- 设计并维护了路由分组与鉴权链路。
- 完成了帖子/评论/通知/举报等核心业务闭环。
- 实现了 WebSocket 私信、未读计数与离线邮件提醒。
- 推进了接口文档化(OpenAPI)和项目级技术文档沉淀。
2. 系统架构全景(可画图讲)
2.1 分层结构
- 入口层:
main.go - 路由层:
route/routes.go - 中间件层:
middleware/*.go - 业务层:
controller/*.go(现状为 Controller 承载主要业务) - 数据模型层:
model/*.go - 基础设施层:
common/*.go(DB、Redis、JWT) - 通用响应层:
response/response.go - 外部能力层:
api/*.go(邮件、COS、文本审核) - 定时任务层:
heat/cron.go+main.go中的Copy()
2.2 请求主链路
客户端请求
-> Gin Router 匹配路由
-> 中间件鉴权(Auth/Auth_admin/OAuth)
-> Controller 参数绑定 + 权限校验 + 业务逻辑
-> MySQL/Redis/API 调用
-> 统一响应(部分接口直接 JSON)。
2.3 三套鉴权体系
- 用户 JWT:
/api/auth/* - 管理员 JWT:
/api/admin/* - OAuth2 token:
/api/oauth/*
补充:/api/* 为公开接口(注册/登录/刷新/上传等)+ 单独 POST /adminLogin。
3. 全功能清单(按业务模块)
这一节是“面试官问:你们系统都有哪些功能?”时可直接按模块回答。
3.1 账号与认证
- 用户注册:邮箱验证码 + CDKey 校验 + 密码加密存储。
- 用户登录:邮箱+密码,签发 access token 与 refresh token。
- 刷新 token:refresh token 一次性使用策略(落库标记)。
- 忘记/修改密码:验证码校验后重置密码。
- 用户信息管理:查询/修改用户资料、头像相关能力。
- 注销账号:账号删除流程。
- 管理员登录与管理:管理员 token、管理员增删改、用户管理。
对应核心接口:
POST /api/registerPOST /api/loginPOST /api/refreshPOST /api/modifyPasswordPOST /api/validateEmailGET /api/auth/infoPOST /api/auth/updateUserInfoPOST /api/auth/deleteMePOST /adminLoginPOST /api/admin/*
3.2 帖子系统
- 发布帖子(含分区、标签、图片 URL)。
- 浏览帖子(支持搜索、筛选、排序、分页、按类型)。
- 详情查看(含点赞/收藏/评论等状态)。
- 点赞/收藏/浏览计数更新。
- 删除帖子。
- 标题生成(辅助能力)。
- 获取标签。
对应接口:
POST /api/auth/postPOST /api/auth/browsePOST /api/auth/showDetailsPOST /api/auth/updateLikePOST /api/auth/updateSavePOST /api/auth/updateBrowseNumPOST /api/auth/deletePostPOST /api/auth/gettitleGET /api/auth/getTags
3.3 评论系统(一级/二级)
- 查询评论树(一级评论 + 嵌套二级评论)。
- 发表一级评论、二级回复。
- 对一级/二级评论点赞与点踩切换。
- 删除一级/二级评论。
- 评论行为联动通知与邮件提醒。
对应接口:
POST /api/auth/showPcommentsPOST /api/auth/postPcommentPOST /api/auth/postCcommentPOST /api/auth/updatePcommentLikePOST /api/auth/updatePcommentDenyPOST /api/auth/updateCcommentLikePOST /api/auth/updateCcommentDenyPOST /api/auth/deletePcommentPOST /api/auth/deleteCcomment
3.4 评分贴能力
- 提交评分。
- 查询用户对某帖评分。
- 计算平均分。
- 星级分布统计。
- 评分评论。
对应接口:
POST /api/auth/submitRatingPOST /api/auth/userPostRatingPOST /api/auth/getAverageRatingPOST /api/auth/getStarsPOST /api/auth/postRcomment
3.5 通知与消息提醒
- 通知分页查询(读/未读过滤)。
- 通知数量统计(总数/已读/未读)。
- 单条通知已读。
- 评论/回复等行为触发通知。
对应接口:
GET /api/auth/getNoticeGET /api/auth/getNoticeNumPATCH /api/auth/readNotice/:noticeID
3.6 私信系统(WebSocket)
- 建立 WebSocket 聊天连接。
- 发送消息并持久化。
- 拉取历史聊天记录。
- 未读总数统计。
- 会话在线状态识别(是否正在某个聊天窗口)。
- 离线/不在窗口时未读累计与邮件提醒。
对应接口:
GET /api/auth/websocket/auth/chatGET /api/auth/getChatHistoryGET /api/auth/getChatNotice
3.7 举报与治理(管理员侧)
- 用户提交举报(针对帖子/评论)。
- 管理员查看举报列表。
- 管理员判定违规/不违规并执行处理。
对应接口:
POST /api/auth/submitReportGET /api/admin/getSuesPOST /api/admin/noViolationPOST /api/admin/violation
3.8 商城模块
- 发布商品。
- 商品列表/详情。
- 商品计数。
- 删除商品(软删除)。
- 标记售出。
- 轮播图接口(当前实现较简)。
对应接口:
POST /api/auth/postProductPOST /api/auth/getProductsPOST /api/auth/getProductDetailPOST /api/auth/getProductNumPOST /api/auth/deleteProductPOST /api/auth/saleProductPOST /api/auth/getCarouselImg
3.9 文件上传与课程资料管理
- 上传帖子图片、头像、zip。
- 课程目录文件列表读取(COS)。
- 教学文件上传(教师身份)。
- 新建文件夹、删除文件/文件夹。
- 获取对象临时 URL。
对应接口:
POST /api/uploadPhotosPOST /api/uploadAvatarPOST /api/updateAvatarPOST /api/uploadZipPOST /api/auth/getFileListPOST /api/auth/uploadFilePOST /api/auth/addFolderPOST /api/auth/fileDeletePOST /api/auth/folderDeletePOST /api/auth/getObjectUrl
3.10 对外 OAuth2 能力
- 应用检查、用户授权、授权记录查询。
- 授权码换 token。
- 使用 OAuth2 token 获取用户信息(按 scope)。
对应接口:
POST /api/auth/connect/checkPOST /api/auth/connect/authorizeGET /api/auth/connect/recordsPOST /api/connect/tokenPOST /api/oauth/connect/userinfo
4. API 全量清单(路由级)
以
route/routes.go为真实来源,路径前缀按实际代码整理。
4.1 /api/auth(用户 JWT)
- OAuth2 管理:
connect/check、connect/authorize、connect/records - 评分:
submitRating、userPostRating、getPostType、getAverageRating、getStars、postRcomment - 帖子:
apiTest、post、browse、getPostNum、updateLike、showDetails、updateSave、updateBrowseNum、deletePost、submitReport、getTags、gettitle - 评论:
showPcomments、postPcomment、postCcomment、updateCcommentLike、updatePcommentLike、updateCcommentDeny、updatePcommentDeny、deletePcomment、deleteCcomment - 用户:
info、getAvatar、getInfo、updateUserInfo、deleteMe、identityValidate、changeEmailPush、statistics - 反馈/热榜:
submitFeedback、getAllFeedback、calculateHeat - 通知:
getNotice、getNoticeNum、readNotice/:noticeID - 文件:
getFileList、fileDelete、folderDelete、uploadFile、addFolder、getObjectUrl - 聊天:
websocket/auth/chat、getChatHistory、getChatNotice - 商城:
postProduct、getProducts、getProductDetail、getProductNum、deleteProduct、saleProduct、getCarouselImg
4.2 /api(公开)
register、login、refreshuploadPhotos、uploadAvatar、updateAvatar、uploadZipconnect/tokenmodifyPassword、validateEmail
4.3 /api/oauth(OAuth2 token)
connect/userinfo
4.4 /api/admin(管理员 JWT)
addAdmin、changePassword、deleteUser、deleteAdmin、showUsersadmininfo、getSuesnoViolation、violationadminPost
4.5 独立公开接口
POST /adminLogin
5. 私信系统深度拆解(高频被追问)
核心文件:
controller/chat.gomodel/chat.goutil/chatUtil.gomiddleware/authMiddleware.go
5.1 关键数据结构
ChatMsg(MySQL 持久化):消息 ID、发送者、接收者、内容、创建时间。clientMap(内存):userID -> ChatNode,保存当前连接。ChatNode:Conn + DataQueue,用于异步发送。
5.2 Redis Key 设计
- 会话在线态:
{sender}To{target}IsExist - 会话未读数:
{receiver}RecvUnread{sender}
5.3 时序流程(你可直接口述)
- 用户连接
GET /api/auth/websocket/auth/chat,中间件鉴权通过后升级 WS。 - 服务器建立
ChatNode,加入clientMap,启动读写协程。 - 客户端发消息,服务端校验
senderUserID与当前连接一致。 - 消息入库后向目标用户投递:
- 在线且在会话页:直接推送;
- 在线但不在会话页:
INCR未读并推送; - 离线:
INCR未读并邮件提醒。
- 用户拉历史
getChatHistory时,设置会话在线态并清除该会话未读。
5.4 私信实现亮点
- 同时支持“实时消息 + 离线补偿 + 未读统计”。
- 有防伪造校验(禁止伪造发送者和消息主键)。
- Redis 与 DB 各司其职:DB 保存历史,Redis 保存状态。
5.5 可预期追问
- “为什么不用消息队列?”
- “横向扩容后
clientMap怎么办?” - “会话未读为什么是会话级而不是消息级?”
参考答法:
- 当前规模优先简化路径,先确保功能闭环;后续可以通过 Redis Pub/Sub 或 MQ 做跨实例派发,并增加消息级 read 状态表。
6. 数据库模型与关系(面试官深挖重点)
6.1 核心业务表
- 用户:
users - 帖子:
posts - 一级评论:
pcomments - 二级评论:
ccomments - 点赞/点踩/收藏/浏览:
plikes、pclikes、cclikes、pcdenies、ccdenies、psaves、pbrowses - 通知:
notices - 举报:
sues - 私信:
chat_msgs - 商城:
products - OAuth2:
oauth2_apps、oauth2_codes、oauth2_tokens、oauth2_auth_records - 刷新 token:
refresh_tokens
6.2 外键与级联
在 common/database.go 中通过 GORM 设置部分外键,例如:
pcomments.ptargetID -> posts.postID(级联)ccomments.ctargetID -> pcomments.pcommentID(级联)
讲法建议:
- “我在设计时把强关系放 MySQL 外键保证基本一致性,临时态放 Redis 处理实时性。”
7. 中间件与权限模型
7.1 AuthMiddleware(用户)
- 支持
Authorization: Bearer。 - WebSocket 兼容 query token。
- 解析 JWT 后加载用户并写入
ctx.Set("user")。
7.2 AuthMiddleware_admin(管理员)
- 独立管理员 token 解析与上下文注入。
7.3 OAuthMiddleware
- 解析 OAuth2 token。
- 校验用户、应用激活状态、scope。
7.4 面试可讲的设计取舍
- 优点:边界清晰,不同角色 token 隔离。
- 代价:三套鉴权并行,维护成本高,容易出现校验分散。
8. 定时任务与离线计算
8.1 热榜任务 heat/cron.go
RefreshHeat:按浏览/评论/点赞与时间衰减计算热度,写入 Redis ZSet。StartHeat:每小时刷新。CleanUsedRefreshTokens:周期清理已使用 refresh token 记录。
8.2 入口任务 main.go 中 Copy()
- 每 12 小时数据库备份(
mysqldump)。 - 每小时积分计算(
CalculateAndSaveScores)。
8.3 可讲价值
- “在线请求只做必要实时计算,重统计交给定时任务,减少接口延迟并稳定高峰性能。”
9. 项目难点与细节(深挖题库)
9.1 多状态一致性
- MySQL(持久)+ Redis(临时态)+ 内存连接(实时态)并存。
- 难点在于断连、重连、并发写时的状态一致性。
9.2 评论/通知/邮件联动
- 发表评论不仅写评论表,还要更新计数、写通知、可能发邮件。
- 是典型“多副作用链路”,容易出现部分成功。
9.3 接口风格不完全统一
- 部分接口统一
code/data/msg,部分直接返回对象数组。 - 前端与监控处理复杂度上升。
9.4 安全细节
- WebSocket
CheckOrigin放开。 - CORS 配置需要结合生产域名收敛。
- 上传文件校验需严格化(后缀 + MIME + 文件头)。
9.5 可扩展性挑战
controller逻辑较重,后续扩展建议拆 Service 层与事务边界。
10. 面试官最常见 20 个问题与答题模板
每个答案你都可以结合“现状 + 取舍 + 未来优化”三段式回答。
- 为什么选 Go + Gin?
- 并发性能好、部署简单、生态成熟;Gin 路由与中间件模型清晰,适合中大型 API 服务。
- 为什么是 MySQL + Redis 双存储?
- MySQL 保证持久和关系一致;Redis 承担高频读写临时态(未读、热榜、验证码),降低数据库压力。
- JWT 与 session 的取舍?
- JWT 无状态、便于分布式;代价是撤销与精细会话管理复杂,所以我们补了 refresh token 轮换策略。
- refresh token 如何防重放?
- 落库并记录
is_used,刷新时先校验未使用再标记使用并签发新对。
- 私信为什么用 WebSocket?
- 低延迟双向通信,避免轮询;同时结合 Redis 未读实现离线补偿。
- 未读为什么放 Redis?
- 自增计数和聚合读取效率高,且是临时状态,适合缓存层。
- 消息可靠性如何保证?
- 先落库再派发,至少保证服务端已持久化;后续可加 ack 重传、MQ、投递状态表。
- 如何防止消息伪造?
- 校验消息体
senderUserID必须等于连接用户,拒绝客户端伪造 sender。
- 评论树怎么做的?
- 一级评论主列表,二级评论按父评论展开;并返回点赞/点踩状态。
- 热榜如何计算?
- 基于浏览、评论、点赞与时间衰减公式,定时刷新到 Redis ZSet。
- 举报系统怎么闭环?
- 用户提交举报,管理员审核判定违规/不违规并执行后续处理。
- 为什么做三套鉴权?
- 用户、管理员、第三方 OAuth2 是不同信任域,需要 token 与权限边界隔离。
- 文件上传如何做权限?
- 公开上传与课程文件上传分开,课程文件接口在鉴权组并限制教师身份。
- 如何做接口文档管理?
- 路由代码为真实源,OpenAPI 同步维护,联调优先看路由+controller。
- 系统瓶颈在哪里?
- 重查询接口存在 N+1 模式;私信跨实例派发是未来扩展瓶颈。
- 做过哪些安全控制?
- JWT 鉴权、权限分组、验证码、管理员独立 token;同时识别到 WS/CORS/上传仍需收敛。
- 遇到过最难的问题?
- 私信在线态、会话态、未读态多源状态一致性,尤其在断线重连场景。
- 如何处理异常和可观测?
- 中间件日志记录请求维度;业务侧统一响应封装。后续应补全结构化错误码和链路追踪。
- 如果重构,第一步做什么?
- 抽 Service 层 + 统一事务边界 + 统一响应协议。
- 如何支持高并发扩容?
- 无状态接口可直接水平扩容;私信需引入跨节点消息总线(Redis Pub/Sub、MQ)与连接网关层。
11. 你可以主动强调的“项目亮点”
- 功能覆盖完整:社区核心链路 + 即时通信 + 治理后台 + OAuth2 对外能力。
- 架构真实可落地:HTTP/WS 混合通信、三套鉴权、双存储分工明确。
- 业务闭环完整:从用户行为到通知、举报、管理员处理都有链路。
- 文档与工程意识:有 OpenAPI、有全景文档、有可维护的模块边界。
12. 你也要坦诚的“项目不足”(面试加分点)
controller偏重,Service/Repository 分层不足。- 部分接口响应风格不统一。
- 私信跨实例扩展未做完备方案。
- 若干安全细节(WS Origin、CORS、上传校验)仍有优化空间。
- 多步写链路事务化还可加强。
建议表达方式:
- “这个点我在复盘时已经识别,下一阶段计划是……(给出具体改造路径)”
13. 面试前速记(30 秒版)
- 架构:Gin + MySQL + Redis + JWT + WebSocket + Cron。
- 三套鉴权:用户、管理员、OAuth2。
- 核心模块:帖子评论、评分、通知、私信、举报、商城、文件。
- 私信机制:DB 存历史、Redis 存未读和会话态、内存存连接。
- 难点:多状态一致性、评论联动副作用、权限边界与可扩展性。
- 优化方向:Service 拆层、事务收敛、响应统一、安全基线、跨实例消息总线。
14. 对应代码索引(方便现场快速打开)
- 入口:
main.go - 路由:
route/routes.go - 用户与 OAuth2:
controller/userController.go - 帖子:
controller/postController.go - 评论:
controller/commentController.go - 私信:
controller/chat.go - 通知:
controller/noticeController.go - 商城:
controller/shopController.go - 管理员:
controller/managerController.go - 举报:
controller/sueController.go - 文件:
controller/fileController.go - 鉴权中间件:
middleware/authMiddleware.go、middleware/oauthMiddleware.go - 基础组件:
common/database.go、common/jwt.go、common/redis.go - 定时任务:
heat/cron.go - 文档:
docs/openapi.yaml、docs/项目全景技术文档.md
15. 使用建议
- 面试前先背第 13 节,再熟悉第 5、9、10 节。
- 被追问时优先说“现状实现”,再说“风险与优化方案”。
- 若需要展示工程能力,重点讲第 2、7、8、12 节。




