一,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 三种鉴权模式

  1. 普通用户 JWT(AuthMiddleware)

    • 适用:大多数 /api/auth/* 接口
    • Header:Authorization: Bearer <token>
    • WebSocket 兼容:可通过 query 参数 token
  2. 管理员 JWT(AuthMiddleware_admin)

    • 适用:管理员接口(封禁、删用户、管理员管理等)
    • Header:Authorization: Bearer <admin_token>
  3. 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
2
3
4
5
{
"code": 200,
"data": {},
"msg": "ok"
}

但项目中存在部分接口直接 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: 批量同目标举报置 nosin
    • Violation: 置 ok,删除违规内容,处罚用户(punishnum + 1,并延长 banend
  • 生成双向通知(被处罚人 + 举报人)

4.5 聊天未读/在线态

  • WebSocket 建连后维护 clientMap
  • 未读 Redis Key(由 util 拼接):类似 RecvUnread 模式
  • 进入聊天界面时清除对应未读
  • 目标不在线或不在当前聊天窗口会累积未读并触发邮件提醒(若未关闭)

5. API 分组总表(按路由)

完整可导入规范见:docs/openapi.yaml

5.1 OAuth2 / 连接认证

  • POST /api/auth/connect/check
  • POST /api/auth/connect/authorize
  • POST /api/auth/connect/token
  • POST /api/auth/connect/userinfo
  • GET /api/auth/connect/records

5.2 认证与用户

  • POST /api/auth/register
  • POST /api/auth/login
  • POST /api/auth/refresh
  • POST /api/auth/modifyPassword
  • POST /api/auth/validateEmail
  • GET /api/auth/info
  • POST /api/auth/getInfo
  • POST /api/auth/updateUserInfo
  • POST /api/auth/deleteMe
  • POST /api/auth/identityValidate
  • POST /api/auth/changeEmailPush
  • POST /api/auth/getAvatar
  • POST /api/auth/uploadAvatar
  • POST /api/auth/updateAvatar
  • POST /api/auth/statistics

5.3 帖子/评论/评分

  • POST /api/auth/post
  • POST /api/auth/browse
  • POST /api/auth/getPostNum
  • POST /api/auth/showDetails
  • POST /api/auth/getPostType
  • POST /api/auth/updateLike
  • POST /api/auth/updateSave
  • POST /api/auth/updateBrowseNum
  • POST /api/auth/deletePost
  • POST /api/auth/submitReport
  • POST /api/auth/showPcomments
  • POST /api/auth/postPcomment
  • POST /api/auth/postRcomment
  • POST /api/auth/postCcomment
  • POST /api/auth/deletePcomment
  • POST /api/auth/deleteCcomment
  • POST /api/auth/updatePcommentLike
  • POST /api/auth/updatePcommentDeny
  • POST /api/auth/updateCcommentLike
  • POST /api/auth/updateCcommentDeny
  • POST /api/auth/submitRating
  • POST /api/auth/userPostRating
  • POST /api/auth/getAverageRating
  • POST /api/auth/getStars
  • GET /api/auth/getTags
  • POST /api/auth/gettitle
  • GET /api/auth/calculateHeat

5.4 文件与反馈

  • POST /api/auth/uploadPhotos
  • POST /api/auth/uploadZip
  • POST /api/auth/submitFeedback
  • GET /api/auth/getAllFeedback
  • POST /api/auth/getFileList
  • POST /api/auth/uploadFile
  • POST /api/auth/addFolder
  • POST /api/auth/fileDelete
  • POST /api/auth/folderDelete
  • POST /api/auth/getObjectUrl

5.5 通知与聊天

  • GET /api/auth/getNotice
  • GET /api/auth/getNoticeNum
  • PATCH /api/auth/readNotice/{noticeID}
  • GET /api/auth/getChatHistory
  • GET /api/auth/getChatNotice
  • GET /websocket/auth/chat(WebSocket)

5.6 商城

  • POST /api/auth/postProduct
  • POST /api/auth/getProducts
  • POST /api/auth/getProductDetail
  • POST /api/auth/getProductNum
  • POST /api/auth/deleteProduct
  • POST /api/auth/saleProduct
  • POST /api/auth/getCarouselImg

5.7 管理员

  • POST /api/auth/adminLogin
  • GET /api/auth/admininfo
  • POST /api/auth/addAdmin
  • POST /api/auth/changePassword
  • POST /api/auth/deleteUser
  • POST /api/auth/deleteAdmin
  • POST /api/auth/showUsers
  • GET /api/auth/getSues
  • POST /api/auth/noViolation
  • POST /api/auth/violation
  • POST /api/auth/adminPost

6. 参数与实现特征(联调重点)

  • 大量 POST 接口通过 c.Bind(...),可接受 application/jsonx-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 启动阶段

  1. config.InitConfig() 读取配置。
  2. config.InitEmailConfig() 初始化邮件配置。
  3. common.InitDB() 建立 MySQL 连接,执行 AutoMigrate 与部分外键约束。
  4. common.RedisInit() 建立 Redis 连接。
  5. common.InitJWTkey() 初始化 JWT 秘钥。
  6. Gin 初始化后挂载日志中间件 middleware.LoggerToFile()、CORS 中间件、静态文件服务。
  7. route.CollectRoute(r) 注册所有路由。
  8. 启动 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.goChatMsg,带发送者/接收者外键与时间)。
  • 生态扩展域oauth2app/oauth2code/oauth2token/oauth2authrecord
  • 商城域product

5. 私信系统原理(重点)

核心文件:

  • controller/chat.go
  • model/chat.go
  • util/chatUtil.go
  • middleware/authMiddleware.go

5.1 连接建立

  • 客户端通过 GET /api/auth/websocket/auth/chat 建立 WebSocket。
  • 鉴权支持两种方式:
    • Header:Authorization: Bearer <token>
    • Query:?token=<jwt>(WebSocket 场景兼容)
  • 连接成功后,为用户创建 ChatNodeConn + DataQueue),存入全局 sync.MapclientMap)。

5.2 消息收发流程

  1. recvMsgFromUser 持续读取消息,支持心跳包(HeartBeat)。
  2. 非心跳消息进入 dispatch
    • 校验 senderUserID 与当前连接用户一致;
    • 拒绝伪造 chatMsgID(必须由后端生成);
    • 入库 model.ChatMsg
    • 组装返回结构并调用 sendMsg 派发。
  3. 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,三者需协同。
  • 连接异常清理:读超时/异常断连后要删除在线状态,避免脏状态导致未读错误。
  • 幂等与伪造防护:通过 senderUserIDchatMsgID 校验,限制伪造发送者与篡改主键。
  • 用户体验平衡:既要实时消息,又要离线补偿(未读 + 邮件提醒)。

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/Failcode/data/msg),也有直接返回对象数组/字符串的接口。
  • 前端接入成本上升,错误处理分支更多,文档与实际容易偏差。

7.3 私信实时性与一致性

  • 内存连接池 + Redis 未读态 + MySQL 历史消息三层状态协同复杂。
  • 断连、重复连接、页面切换时可能出现未读数抖动,需要额外清理策略。

7.4 内容域关系复杂

  • 帖子、一级评论、二级评论、点赞、点踩、收藏、举报互相关联,删除与级联一致性处理复杂。
  • GORM 外键约束与业务层删除动作需保持一致,避免孤儿数据。

7.5 定时任务与在线业务共存

  • 热度刷新、token 清理、数据库备份同时运行,需关注资源竞争和异常恢复。
  • 热度公式依赖浏览/评论/点赞,统计实时性与计算成本存在平衡点。

7.6 文件与对象存储边界

  • 本地静态文件与 COS 文件管理并存,路径安全、权限边界、对象 URL 时效需统一策略。

7.7 安全与风控细节

  • 部分接口参数中携带 userID/phone,虽常有上下文校验,但仍需持续检查“越权读取/操作”。
  • WebSocket CheckOrigin=true 当前是全放开策略,生产需结合域名白名单/网关策略收紧。

8. 架构层面改进建议(优先级建议)

  1. 补齐 Service 层:将复杂业务从 controller 下沉,形成可测试、可复用、可组合的服务层。
  2. 统一响应协议:所有接口统一 code/msg/data,避免前端多分支解析。
  3. 私信状态收敛:为连接状态与会话状态引入更明确生命周期,增加断线重连与幂等处理。
  4. 鉴权策略标准化:抽象统一权限校验函数,减少“接口内二次校验”散落。
  5. 可观测性增强:补齐关键业务日志(消息派发失败、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/项目全景技术文档.mddocs/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/register
  • POST /api/login
  • POST /api/refresh
  • POST /api/modifyPassword
  • POST /api/validateEmail
  • GET /api/auth/info
  • POST /api/auth/updateUserInfo
  • POST /api/auth/deleteMe
  • POST /adminLogin
  • POST /api/admin/*

3.2 帖子系统

  • 发布帖子(含分区、标签、图片 URL)。
  • 浏览帖子(支持搜索、筛选、排序、分页、按类型)。
  • 详情查看(含点赞/收藏/评论等状态)。
  • 点赞/收藏/浏览计数更新。
  • 删除帖子。
  • 标题生成(辅助能力)。
  • 获取标签。

对应接口:

  • POST /api/auth/post
  • POST /api/auth/browse
  • POST /api/auth/showDetails
  • POST /api/auth/updateLike
  • POST /api/auth/updateSave
  • POST /api/auth/updateBrowseNum
  • POST /api/auth/deletePost
  • POST /api/auth/gettitle
  • GET /api/auth/getTags

3.3 评论系统(一级/二级)

  • 查询评论树(一级评论 + 嵌套二级评论)。
  • 发表一级评论、二级回复。
  • 对一级/二级评论点赞与点踩切换。
  • 删除一级/二级评论。
  • 评论行为联动通知与邮件提醒。

对应接口:

  • POST /api/auth/showPcomments
  • POST /api/auth/postPcomment
  • POST /api/auth/postCcomment
  • POST /api/auth/updatePcommentLike
  • POST /api/auth/updatePcommentDeny
  • POST /api/auth/updateCcommentLike
  • POST /api/auth/updateCcommentDeny
  • POST /api/auth/deletePcomment
  • POST /api/auth/deleteCcomment

3.4 评分贴能力

  • 提交评分。
  • 查询用户对某帖评分。
  • 计算平均分。
  • 星级分布统计。
  • 评分评论。

对应接口:

  • POST /api/auth/submitRating
  • POST /api/auth/userPostRating
  • POST /api/auth/getAverageRating
  • POST /api/auth/getStars
  • POST /api/auth/postRcomment

3.5 通知与消息提醒

  • 通知分页查询(读/未读过滤)。
  • 通知数量统计(总数/已读/未读)。
  • 单条通知已读。
  • 评论/回复等行为触发通知。

对应接口:

  • GET /api/auth/getNotice
  • GET /api/auth/getNoticeNum
  • PATCH /api/auth/readNotice/:noticeID

3.6 私信系统(WebSocket)

  • 建立 WebSocket 聊天连接。
  • 发送消息并持久化。
  • 拉取历史聊天记录。
  • 未读总数统计。
  • 会话在线状态识别(是否正在某个聊天窗口)。
  • 离线/不在窗口时未读累计与邮件提醒。

对应接口:

  • GET /api/auth/websocket/auth/chat
  • GET /api/auth/getChatHistory
  • GET /api/auth/getChatNotice

3.7 举报与治理(管理员侧)

  • 用户提交举报(针对帖子/评论)。
  • 管理员查看举报列表。
  • 管理员判定违规/不违规并执行处理。

对应接口:

  • POST /api/auth/submitReport
  • GET /api/admin/getSues
  • POST /api/admin/noViolation
  • POST /api/admin/violation

3.8 商城模块

  • 发布商品。
  • 商品列表/详情。
  • 商品计数。
  • 删除商品(软删除)。
  • 标记售出。
  • 轮播图接口(当前实现较简)。

对应接口:

  • POST /api/auth/postProduct
  • POST /api/auth/getProducts
  • POST /api/auth/getProductDetail
  • POST /api/auth/getProductNum
  • POST /api/auth/deleteProduct
  • POST /api/auth/saleProduct
  • POST /api/auth/getCarouselImg

3.9 文件上传与课程资料管理

  • 上传帖子图片、头像、zip。
  • 课程目录文件列表读取(COS)。
  • 教学文件上传(教师身份)。
  • 新建文件夹、删除文件/文件夹。
  • 获取对象临时 URL。

对应接口:

  • POST /api/uploadPhotos
  • POST /api/uploadAvatar
  • POST /api/updateAvatar
  • POST /api/uploadZip
  • POST /api/auth/getFileList
  • POST /api/auth/uploadFile
  • POST /api/auth/addFolder
  • POST /api/auth/fileDelete
  • POST /api/auth/folderDelete
  • POST /api/auth/getObjectUrl

3.10 对外 OAuth2 能力

  • 应用检查、用户授权、授权记录查询。
  • 授权码换 token。
  • 使用 OAuth2 token 获取用户信息(按 scope)。

对应接口:

  • POST /api/auth/connect/check
  • POST /api/auth/connect/authorize
  • GET /api/auth/connect/records
  • POST /api/connect/token
  • POST /api/oauth/connect/userinfo

4. API 全量清单(路由级)

route/routes.go 为真实来源,路径前缀按实际代码整理。

4.1 /api/auth(用户 JWT)

  • OAuth2 管理:connect/checkconnect/authorizeconnect/records
  • 评分:submitRatinguserPostRatinggetPostTypegetAverageRatinggetStarspostRcomment
  • 帖子:apiTestpostbrowsegetPostNumupdateLikeshowDetailsupdateSaveupdateBrowseNumdeletePostsubmitReportgetTagsgettitle
  • 评论:showPcommentspostPcommentpostCcommentupdateCcommentLikeupdatePcommentLikeupdateCcommentDenyupdatePcommentDenydeletePcommentdeleteCcomment
  • 用户:infogetAvatargetInfoupdateUserInfodeleteMeidentityValidatechangeEmailPushstatistics
  • 反馈/热榜:submitFeedbackgetAllFeedbackcalculateHeat
  • 通知:getNoticegetNoticeNumreadNotice/:noticeID
  • 文件:getFileListfileDeletefolderDeleteuploadFileaddFoldergetObjectUrl
  • 聊天:websocket/auth/chatgetChatHistorygetChatNotice
  • 商城:postProductgetProductsgetProductDetailgetProductNumdeleteProductsaleProductgetCarouselImg

4.2 /api(公开)

  • registerloginrefresh
  • uploadPhotosuploadAvatarupdateAvataruploadZip
  • connect/token
  • modifyPasswordvalidateEmail

4.3 /api/oauth(OAuth2 token)

  • connect/userinfo

4.4 /api/admin(管理员 JWT)

  • addAdminchangePassworddeleteUserdeleteAdminshowUsers
  • admininfogetSues
  • noViolationviolation
  • adminPost

4.5 独立公开接口

  • POST /adminLogin

5. 私信系统深度拆解(高频被追问)

核心文件:

  • controller/chat.go
  • model/chat.go
  • util/chatUtil.go
  • middleware/authMiddleware.go

5.1 关键数据结构

  • ChatMsg(MySQL 持久化):消息 ID、发送者、接收者、内容、创建时间。
  • clientMap(内存):userID -> ChatNode,保存当前连接。
  • ChatNodeConn + DataQueue,用于异步发送。

5.2 Redis Key 设计

  • 会话在线态:{sender}To{target}IsExist
  • 会话未读数:{receiver}RecvUnread{sender}

5.3 时序流程(你可直接口述)

  1. 用户连接 GET /api/auth/websocket/auth/chat,中间件鉴权通过后升级 WS。
  2. 服务器建立 ChatNode,加入 clientMap,启动读写协程。
  3. 客户端发消息,服务端校验 senderUserID 与当前连接一致。
  4. 消息入库后向目标用户投递:
    • 在线且在会话页:直接推送;
    • 在线但不在会话页:INCR 未读并推送;
    • 离线:INCR 未读并邮件提醒。
  5. 用户拉历史 getChatHistory 时,设置会话在线态并清除该会话未读。

5.4 私信实现亮点

  • 同时支持“实时消息 + 离线补偿 + 未读统计”。
  • 有防伪造校验(禁止伪造发送者和消息主键)。
  • Redis 与 DB 各司其职:DB 保存历史,Redis 保存状态。

5.5 可预期追问

  • “为什么不用消息队列?”
  • “横向扩容后 clientMap 怎么办?”
  • “会话未读为什么是会话级而不是消息级?”

参考答法:

  • 当前规模优先简化路径,先确保功能闭环;后续可以通过 Redis Pub/Sub 或 MQ 做跨实例派发,并增加消息级 read 状态表。

6. 数据库模型与关系(面试官深挖重点)

6.1 核心业务表

  • 用户:users
  • 帖子:posts
  • 一级评论:pcomments
  • 二级评论:ccomments
  • 点赞/点踩/收藏/浏览:plikespclikescclikespcdeniesccdeniespsavespbrowses
  • 通知:notices
  • 举报:sues
  • 私信:chat_msgs
  • 商城:products
  • OAuth2:oauth2_appsoauth2_codesoauth2_tokensoauth2_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.goCopy()

  • 每 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 个问题与答题模板

每个答案你都可以结合“现状 + 取舍 + 未来优化”三段式回答。

  1. 为什么选 Go + Gin?
  • 并发性能好、部署简单、生态成熟;Gin 路由与中间件模型清晰,适合中大型 API 服务。
  1. 为什么是 MySQL + Redis 双存储?
  • MySQL 保证持久和关系一致;Redis 承担高频读写临时态(未读、热榜、验证码),降低数据库压力。
  1. JWT 与 session 的取舍?
  • JWT 无状态、便于分布式;代价是撤销与精细会话管理复杂,所以我们补了 refresh token 轮换策略。
  1. refresh token 如何防重放?
  • 落库并记录 is_used,刷新时先校验未使用再标记使用并签发新对。
  1. 私信为什么用 WebSocket?
  • 低延迟双向通信,避免轮询;同时结合 Redis 未读实现离线补偿。
  1. 未读为什么放 Redis?
  • 自增计数和聚合读取效率高,且是临时状态,适合缓存层。
  1. 消息可靠性如何保证?
  • 先落库再派发,至少保证服务端已持久化;后续可加 ack 重传、MQ、投递状态表。
  1. 如何防止消息伪造?
  • 校验消息体 senderUserID 必须等于连接用户,拒绝客户端伪造 sender。
  1. 评论树怎么做的?
  • 一级评论主列表,二级评论按父评论展开;并返回点赞/点踩状态。
  1. 热榜如何计算?
  • 基于浏览、评论、点赞与时间衰减公式,定时刷新到 Redis ZSet。
  1. 举报系统怎么闭环?
  • 用户提交举报,管理员审核判定违规/不违规并执行后续处理。
  1. 为什么做三套鉴权?
  • 用户、管理员、第三方 OAuth2 是不同信任域,需要 token 与权限边界隔离。
  1. 文件上传如何做权限?
  • 公开上传与课程文件上传分开,课程文件接口在鉴权组并限制教师身份。
  1. 如何做接口文档管理?
  • 路由代码为真实源,OpenAPI 同步维护,联调优先看路由+controller。
  1. 系统瓶颈在哪里?
  • 重查询接口存在 N+1 模式;私信跨实例派发是未来扩展瓶颈。
  1. 做过哪些安全控制?
  • JWT 鉴权、权限分组、验证码、管理员独立 token;同时识别到 WS/CORS/上传仍需收敛。
  1. 遇到过最难的问题?
  • 私信在线态、会话态、未读态多源状态一致性,尤其在断线重连场景。
  1. 如何处理异常和可观测?
  • 中间件日志记录请求维度;业务侧统一响应封装。后续应补全结构化错误码和链路追踪。
  1. 如果重构,第一步做什么?
  • 抽 Service 层 + 统一事务边界 + 统一响应协议。
  1. 如何支持高并发扩容?
  • 无状态接口可直接水平扩容;私信需引入跨节点消息总线(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.gomiddleware/oauthMiddleware.go
  • 基础组件:common/database.gocommon/jwt.gocommon/redis.go
  • 定时任务:heat/cron.go
  • 文档:docs/openapi.yamldocs/项目全景技术文档.md

15. 使用建议

  • 面试前先背第 13 节,再熟悉第 5、9、10 节。
  • 被追问时优先说“现状实现”,再说“风险与优化方案”。
  • 若需要展示工程能力,重点讲第 2、7、8、12 节。