【智慧书城 - 包含github代码地址】 智慧书城 — 项目业务价值点已实现项目智慧书城(p3)github地址: https://github.com/startmas/Model_Test范围当前已落地代码认证 预约 P0P3)用途简历提炼、答辩讲解、面试准备、区分「RUD 堆砌」与「真实业务闭环」最后更新2026-07一、文档说明本文档回答一个问题智慧书城项目目前已实现的部分全部价值点在哪里与相关文档的分工文档侧重[书城系统功能规划]全量需求与后续路线[书城系统分阶段实施指南]分阶段任务清单[预约系统业务价值点]预约模块深度展开[P2签到业务流程与技术栈]签到流程与 Redis 设计二、一句话结论这个项目最有价值的不是「功能多」而是形成了一条可演示、可讲清楚、有技术深度的业务闭环登录 → 预约座位 → 到馆扫码签到 → 连续 7 天赠券 → 浏览图书 → 用券余额购书 ↘ 申请借阅 → 管理员确认 → 归还普通分页、CRUD 是配套能力并发控制、状态机、缓存、跨模块规则联动才是值得写进简历和面试里讲的部分。三、已实现模块一览模块包路径已实现能力统一认证com.zx.auth密码/邮箱/手机验证码、QQ OAuth、JWT 双 Token、RBAC、限流座位预约com.zx.reservation选座预约、行锁防超卖、取消释放、管理端生成座位/时段图书目录com.zx.bookstore.catalog分类、上架、详情 Redis Cache-Aside到馆签到com.zx.marketing.checkin每日场馆码、预约联动、BitMap 连签、满 7 天发券优惠券com.zx.bookstore.coupon连签发券、门槛校验、购书抵扣、核销购书交易com.zx.bookstore.trade下单算价、余额支付、库存扣减、幂等图书借阅com.zx.bookstore.borrow申请、审核、归还、占用册数校验四、价值分层总览层级内容简历/答辩权重⭐⭐⭐ 核心亮点座位防超卖、签到 BitMap、购书事务、借阅占用、认证安全必讲⭐⭐ 完整度三级资源模型、Cache-Aside、状态机、幂等、模块化错误码、RBAC 复用补充⭐ 基础能力分页列表、CRUD、管理后台、Demo 数据初始化一带而过五、跨模块联动价值这是项目比「七个独立 Demo」更强的地方认证 JWT/RBAC ──→ 所有业务接口统一鉴权 预约 BOOKED ──→ 签到校验「今日有预约、场馆一致、在时段内」 签到连签 7 天 ──→ 优惠券 CHECKIN_7 自动发放 优惠券 ──→ 购书下单抵扣 payAmount 图书 saleStock ──→ 购书支付扣减 图书 borrowStock 占用数 ──→ 借阅申请校验 用户 balance ──→ 购书支付扣款/api/user/me 展示 管理端 ADMIN ──→ 生成座位/时段、签到码、审核借阅、标记预约完成六、分模块价值点详解6.1 统一认证com.zx.auth⭐⭐⭐ 核心亮点价值点说明JWT 双 TokenAccess 短效访问 APIRefresh 长效续期减少频繁登录Refresh Rotation每次刷新发放新 Token 对旧 Session 作废降低泄露风险重放检测使用已撤销的 Refresh Token 会触发全 Session 撤销会话绝对上限默认 90 天滑动续期不突破首次登录起的绝对过期多种登录密码、邮箱验证码、手机验证码、QQ PC 扫码 OAuth安全限流发码 60s/小时/IP 限制连续登录失败 5 次锁定 15 分钟Redis⭐⭐ 完整度价值点说明RBACUSER/ADMINPreAuthorize贯穿预约、图书、签到、交易验证码仅存 Redis哈希存储响应不返回明文邮箱走 SMTP自动注册验证码登录时用户不存在则自动创建并绑定 identityLogout 双路径Access 有效时拉黑 jti过期时仍可用 Refresh 撤销 SessionQQ OAuthstate 防 CSRF回调后 302 到前端 hash 传 Token需配置后启用⭐ 基础能力GET /api/user/me返回 id、username、roles、balanceBCrypt 密码哈希、统一ApiResponse响应格式6.2 座位预约com.zx.reservation模块深度展开见 预约系统业务价值点⭐⭐⭐ 核心亮点1座位粒度防超卖1. SELECT ... FROM reservation_seat WHERE id ? FOR UPDATE ← 行级锁 2. 校验 (time_slot_id, seat_id) 是否已有 BOOKED 订单 3. 事务内 INSERT reservation_order 4. 失败 → 3011「该座位在该时段已被预约」库存模型时段 × 座位不是粗粒度「还剩 3 个名额」可演示两人同时抢 A03仅一人成功2业务规则链创建预约前按序校验规则错误码含义时段/座位有效3001 / 3010基础校验自习室启用3007下架不可约时段未过期3009开始时间 当前同时段不重复约3003用户该时段仅 1 单 BOOKED每日上限3006BOOKEDCOMPLETED 2座位未被占用3011防超卖3预约单状态机BOOKED ──取消──→ CANCELLED释放座位占用 BOOKED ──完成──→ COMPLETED座位视为已消费canTransitTo()显式拒绝非法跳转 → 3004取消本人或 ADMIN完成仅 ADMIN4幂等创建请求带idempotencyKey→ 已存在则直接返回原订单不重复 INSERT与 3003 区别幂等防「同一请求重试」3003 防「用户主动约两次」⭐⭐ 完整度价值点说明三级资源模型自习室 → 座位rowNum/colNum→ 时段 → 预约单两种剩余展示时段级remainingSeats座位级available可渲染座位 Grid取消即释放改状态为 CANCELLED占用由订单状态实时推导无需手动改计数管理端闭环创建资源、批量生成座位/时段、全部订单、标记完成签到码接口GET .../checkin-code为签到模块提供每日场馆码认证复用用户/管理接口分角色user_id关联auth_userDemo 数据ReservationDemoDataInitializer启动时生成座位与时段⭐ 基础能力自习室分页列表、我的预约、预约详情、资源 CRUD6.3 图书目录com.zx.bookstore.catalog⭐⭐⭐ 核心亮点价值点说明Cache-Aside详情先 Redismiss 查 MySQL 再回填更新失效改书/下架 evictbook:detail:{id}防脏读防雪崩TTL 1800s random(0~300s)避免大量 key 同时过期⭐⭐ 完整度价值点说明双库存字段saleStock购书、borrowStock借阅同一书目分流分类管理启用分类列表、管理端新建分类、重名校验逻辑下架DELETE 置 status0列表/详情不可见⭐ 基础能力分页列表、按分类/关键字筛选、管理端上架/更新6.4 到馆签到com.zx.marketing.checkin流程细节见 P2签到业务流程与技术栈⭐⭐⭐ 核心亮点1预约联动签到——不是无门槛按钮签到规则错误码场馆每日码有效4310今日未重复签到4301有今日 BOOKED 预约4302预约单存在且属本人4309 / 4312预约场馆与扫码场馆一致4311预约日期为今日4303在可签到窗口内4308该预约未签到过43042Redis 数据结构设计Key用途venue:checkin:code:{venueId}:{date}每日场馆码TTL 到当日结束sign:user:{userId}:{yyyyMM}BitMap每位表示当月某天是否签到sign:streak:{userId}连续签到天数sign:last:{userId}上次签到日期断签判断3连签赠券连续 7 天 → 同步发放CHECKIN_7优惠券 → streak 归零写checkin_record、更新预约checkin_at、Redis BitMap 与 streak 同事务后更新⭐⭐ 完整度价值点说明eligible 预检扫码后先查可签预约列表前端友好签到日历 APIGET /calendar?month返回已签日期列表管理端签到码返回checkinUrl前端用 qrcode 生成二维码跨模块协作依赖 reservation 订单状态触发 coupon 发券⭐ 基础能力GET /streak查询当前连续天数6.5 优惠券com.zx.bookstore.coupon⭐⭐⭐ 核心亮点价值点说明连签自动发券签到满 7 天触发无需用户手动领取门槛校验下单时校验thresholdAmount未达门槛 4103抵扣算价calculateDiscount计算discountAmount与payAmount支付核销markUsed防重复使用关联订单 ID⭐⭐ 完整度价值点说明券状态UNUSED / USED / EXPIRED获得方式记录obtainWay如 CHECKIN_7便于运营追溯模板机制coupon_templateuser_coupon分离⭐ 基础能力GET /api/coupons/mine?status我的优惠券列表6.6 购书交易com.zx.bookstore.trade⭐⭐⭐ 核心亮点支付事务TradeService.pay1. 校验订单归属与状态 PENDING_PAY 2. FOR UPDATE 锁图书 → deductSaleStock可售库存 3. FOR UPDATE 锁用户 → deductBalance余额扣减 4. markPaid乐观状态流转防重复支付 5. couponService.markUsed优惠券核销任一步失败Transactional整体回滚典型电商「下单 → 支付」模型可对接真实支付渠道下单幂等idempotencyKey重复提交返回同一订单⭐⭐ 完整度价值点说明主子表trade_ordertrade_order_item算价清晰totalAmount / discountAmount / payAmount 分离取消未支付单PENDING_PAY → CANCELLED余额展示/api/user/me的 balance默认 100.00⭐ 基础能力我的订单列表/详情、单本图书下单quantity 默认 16.7 图书借阅com.zx.bookstore.borrow⭐⭐⭐ 核心亮点价值点说明占用册数建模countOccupiedByBookId borrowStock不是简单减库存一人一本hasActiveBorrowByUser→ 有未还书不可再借4003行锁申请findByIdForUpdate锁图书行后校验占用状态机APPLIED → CONFIRMED → RETURNED / CANCELLED / REJECTED⭐⭐ 完整度价值点说明审核流程用户申请 → 管理员 confirm / reject双向归还用户return或管理员adminReturn应还日期确认借出后计算dueAt基于图书 borrowDays权限隔离4007 无权操作他人借阅单⭐ 基础能力我的借阅列表/详情、管理端全部借阅单查询七、工程技术价值横向7.1 四层架构一致Controller → Service → Repository → Mapper/Entity各模块auth、reservation、bookstore、checkin均遵循同一分层便于维护与答辩讲解。7.2 模块化异常与错误码模块码段Handler认证1001–1002、2001–2006、3001(403)统一鉴权预约3001–3011ReservationExceptionHandler图书4001、4005BookstoreExceptionHandler借阅4002–4007BorrowExceptionHandler优惠券4101–4104CouponExceptionHandler购书4201–4206TradeExceptionHandler签到4301–4312CheckinExceptionHandlerQQ OAuth5001QqOAuthController前端可按码段统一 Toast、刷新座位图、跳转登录等。7.3 并发与一致性手段汇总场景手段预约抢座MySQLFOR UPDATE 占用校验购书支付FOR UPDATE 条件更新库存/余额借阅申请FOR UPDATE 占用计数签到连签Redis 原子更新 MySQL 签到记录重复提交idempotencyKey预约、购书重复支付markPaid乐观状态流转7.4 Redis 使用汇总用途Key 模式会话/TokenRefresh Session、Access 黑名单验证码哈希存储 TTL限流发码间隔、登录失败计数图书缓存book:detail:{id}签到码venue:checkin:code:{venueId}:{date}签到 BitMapsign:user:{userId}:{yyyyMM}连签sign:streak:{userId}、sign:last:{userId}7.5 已落地状态机一览实体状态关键流转预约单BOOKED / CANCELLED / COMPLETED取消释放占用完成消费座位借阅单APPLIED / CONFIRMED / RETURNED / CANCELLED / REJECTED审核、归还购书单PENDING_PAY / PAID / CANCELLED支付扣库存余额取消未支付八、与普通 CRUD 项目的区别普通项目本项目已实现能增删改查能演示并发抢座、余额支付事务登录就完事双 Token Rotation 限流 多方式登录签到按钮 1预约联动 场馆码 BitMap 连签发券下单 INSERT库存 余额 优惠券同一事务借书减库存占用册数 审核状态机各模块孤立预约 → 签到 → 券 → 购书 完整链路九、答辩演示脚本约 3 分钟1. admin 登录展示 roles 含 ADMIN 2. 管理端生成座位、生成今日时段 3. 用户预约今日 A03 座 → 成功 orderNo seatNo 4. 可选并发抢同一座 → 3011 5. 管理端获取 checkin-code → 展示二维码 6. 用户扫码 → eligible → 签到成功streak 1 7. 浏览图书详情第二次命中 Redis 缓存 8. 创建购书订单 → 选优惠券 → 余额支付 → balance 减少 9. 可选申请借阅 → admin 确认 → 归还十、简历写法项目名称智慧书城综合业务平台项目描述示例基于 Spring Boot 的智慧书城后端已完成统一认证、座位预约、到馆签到、借购书与优惠券模块。实现座位级行锁防超卖与完整业务规则链签到采用 Redis BitMap 记录连签并联动预约履约满 7 天自动发券购书在同一事务内完成库存扣减、余额支付与优惠券核销借阅模块通过占用册数建模与状态机管理审核归还流程。技术关键词Spring Boot·JWT 双 Token·Redis BitMap·MySQL 行锁·Cache-Aside·状态机·RBAC·幂等只讲 2 个最深的技术点时间紧时座位级防超卖FOR UPDATE(slot_id, seat_id)占用 3011跨模块闭环预约 → 签到 BitMap → 发券 → 购书事务支付十一、面试高频追问追问回答要点怎么防超卖预约座位 FOR UPDATE 占用校验购书deductSaleStock借阅countOccupied签到为什么用 BitMap按月存 31 bit省空间calendar 接口批量 getBit连签断了怎么办比较sign:last非连续则 streak 重置为 1支付如何保证一致Transactional库存/余额/券核销同成功或同回滚幂等怎么做的预约/购书idempotencyKeyUNIQUE存在则返回原单缓存怎么保证一致性Cache-Aside 写时 evictTTL 加随机偏移防雪崩和秒杀有什么区别当前券仅连签发高并发抢券为后续规划Refresh Token 被盗怎么办Rotation 重放检测撤销全 SessionAccess 短效十二、相关代码索引模块核心类认证AuthService、JwtService、AuthRedisService、QqOAuthService预约ReservationService、ReservationOrderStatus、ReservationSeatMapper图书BookCatalogService、BookRedisService签到CheckinService、CheckinRedisService优惠券CouponService购书TradeService借阅BorrowService