# business-mobile-gateway > 移动端网关模块 - 为 APP/小程序/H5 提供统一接口 ## 模块说明 `business-mobile-gateway` 是所有业务模块对移动端(APP、微信小程序、H5)提供接口的汇总模块。 ## 目录结构 ``` business-mobile-gateway/ ├── src/main/java/com/jeesharp/business/mobile/ │ └── member/ # 会员模块移动端接口 │ ├── controller/ # 控制器 │ │ ├── MobileAuthController.java # 登录认证 │ │ ├── MobileMemberController.java # 会员信息 │ │ ├── MobileUserCenterController.java # 用户中心 │ │ ├── MobilePointsController.java # 积分 │ │ ├── MobileCouponController.java # 优惠券 │ │ ├── MobileBalanceController.java # 余额 │ │ ├── MobileGrowthController.java # 成长值 │ │ └── MobileMessageController.java # 消息通知 │ ├── dto/ # 请求数据传输对象 │ │ ├── SendSmsCodeDTO.java │ │ ├── LoginByMobileDTO.java │ │ ├── LoginByPasswordDTO.java │ │ ├── LoginByWechatMiniDTO.java │ │ ├── LoginByWechatDTO.java │ │ ├── LoginByAlipayDTO.java │ │ ├── LoginByAppleDTO.java │ │ ├── LoginByThirdPartyDTO.java │ │ ├── LoginByOneClickDTO.java │ │ ├── RefreshTokenDTO.java │ │ ├── BindMobileDTO.java │ │ ├── ChangePasswordDTO.java │ │ ├── ResetPasswordDTO.java │ │ ├── CancelAccountDTO.java │ │ ├── UpdateMemberDTO.java │ │ └── RealNameAuthDTO.java │ └── vo/ # 响应视图对象 │ ├── LoginResultVO.java │ ├── MemberDetailVO.java │ ├── UserCenterVO.java │ ├── PointsSummaryVO.java │ ├── BalanceSummaryVO.java └── pom.xml ``` ## URL 规范 ``` /mobile/{模块名}/{类名}/{操作} ``` **示例**: - `/mobile/member/auth/loginByMobile` - 手机验证码登录 - `/mobile/member/member/info` - 获取会员信息 - `/mobile/member/points/signIn` - 签到 ## 接口概览 ### 登录认证(/mobile/member/auth) | 接口 | 方法 | 说明 | |------|------|------| | `/sendSmsCode` | POST | 发送短信验证码 | | `/loginByMobile` | POST | 手机验证码登录 | | `/loginByPassword` | POST | 账号密码登录 | | `/loginByWechatMini` | POST | 微信小程序登录 | | `/loginByWechatApp` | POST | 微信APP登录 | | `/loginByWechatMp` | POST | 微信公众号登录 | | `/loginByAlipay` | POST | 支付宝登录 | | `/loginByApple` | POST | 苹果登录 | | `/loginByHuawei` | POST | 华为登录 | | `/loginByQQ` | POST | QQ登录 | | `/loginByWeibo` | POST | 微博登录 | | `/loginByDouyin` | POST | 抖音登录 | | `/loginByOneClick` | POST | 一键登录 | | `/refreshToken` | POST | 刷新Token | | `/logout` | POST | 退出登录 | | `/cancel` | POST | 注销账号 | | `/bindMobile` | POST | 绑定手机号 | | `/changePassword` | POST | 修改密码 | | `/resetPassword` | POST | 重置密码 | | `/publicKey` | GET | 获取加密公钥 | ### 会员信息(/mobile/member/member) | 接口 | 方法 | 说明 | |------|------|------| | `/info` | GET | 获取当前会员信息 | | `/update` | POST | 更新会员信息 | | `/realNameAuth` | POST | 实名认证 | | `/levelInfo` | GET | 获取等级详情 | | `/inviteInfo` | GET | 获取邀请信息 | | `/inviteList` | POST | 获取邀请记录 | ### 用户中心(/mobile/member/userCenter) | 接口 | 方法 | 说明 | |------|------|------| | `/index` | GET | 获取用户中心首页数据(全量) | | `/indexSimple` | GET | 获取用户中心首页数据(简化版) | | `/profile` | GET | 获取个人信息详情 | | `/updateProfile` | POST | 修改个人信息 | | `/updateAvatar` | POST | 修改头像 | | `/updateNickname` | POST | 修改昵称 | | `/realNameStatus` | GET | 获取实名认证状态 | | `/realNameAuth` | POST | 实名认证 | | `/security` | GET | 获取账户安全信息 | | `/assets` | GET | 获取资产概览 | | `/level` | GET | 获取会员等级信息 | | `/orderStats` | GET | 获取订单统计 | | `/functions` | GET | 获取常用功能列表 | ### 积分(/mobile/member/points) | 接口 | 方法 | 说明 | |------|------|------| | `/summary` | GET | 获取积分概览 | | `/list` | POST | 获取积分流水 | | `/signIn` | POST | 签到 | | `/signInStatus` | GET | 获取签到状态 | ### 消费券模板(/mobile/coupon,兼容小程序 GET) | 接口 | 方法 | 说明 | |------|------|------| | `/templates` | GET | 模板列表(免登录可浏览;已登录合并已领状态) | | `/template/{id}` | GET | 模板详情 | ### 消费券模板(/mobile/coupon/couponTemplate,规范路径) | 接口 | 方法 | 说明 | |------|------|------| | `/list` | POST | 模板分页(Body:`CouponTemplateQueryVO`,仅进行中且在领取窗口内) | | `/info` | GET | 模板详情,`id` 查询参数 | ### 优惠券(/mobile/member/coupon) | 接口 | 方法 | 说明 | |------|------|------| | `/available` | POST | 可领取优惠券列表 | | `/receive` | POST | 领取优惠券 | | `/my` | POST | 我的优惠券列表 | | `/myList` | POST | 同 `/my`(与设计文档路径示例对齐) | | `/detail` | GET | 优惠券详情 | | `/walletDetail` | GET | 已领券卡面详情(`CouponDemoVO`,`memberCouponId`) | | `/usable` | POST | 订单可用优惠券 | | `/exchange` | POST | 积分兑换优惠券 | ### 余额(/mobile/member/balance) | 接口 | 方法 | 说明 | |------|------|------| | `/summary` | GET | 获取余额概览 | | `/list` | POST | 获取余额流水 | | `/recharge` | POST | 余额充值下单 | ### 成长值(/mobile/member/growth) | 接口 | 方法 | 说明 | |------|------|------| | `/list` | POST | 获取成长值流水 | ### 消息通知(/mobile/member/message) | 接口 | 方法 | 说明 | |------|------|------| | `/list` | POST | 获取消息列表 | | `/unreadCount` | GET | 获取未读消息数 | | `/read` | POST | 标记消息已读 | | `/readAll` | POST | 全部标记已读 | ## 依赖说明 ```xml org.jeesharp.boot business-mobile-gateway ``` ## 短信验证码配置 验证码发送依赖 `jeesharp-spring-boot-starter-sms`,需在 `application.yml` 中配置: ```yaml jeesharp: sms: provider: MOCK # 开发环境用 MOCK,生产用 ALIBABA/TENCENT/HUAWEI scene-template-mapping: login: SMS_xxx # 登录验证码模板 register: SMS_xxx # 注册验证码模板 reset_pwd: SMS_xxx # 重置密码模板 bind: SMS_xxx # 绑定手机模板 alibaba: # 使用阿里云时配置 access-key-id: xxx access-key-secret: xxx sign-name: "【您的签名】" ``` 详见 [jeesharp-spring-boot-starter-sms README](../../jeesharp-framework/jeesharp-spring-boot-starter-sms/README.md)。 ## 第三方登录配置(JustAuth) 本模块已集成 JustAuth SDK,支持多种第三方登录方式。需在 `application.yml` 中配置: ```yaml jeesharp: oauth: # 微信小程序配置 wechatMini: appId: your_miniapp_appid secret: your_miniapp_secret # 微信公众号配置 wechat: clientId: your_mp_appid clientSecret: your_mp_secret redirectUri: https://your-domain.com/callback/wechat # 微信开放平台(APP)配置 wechatApp: clientId: your_open_appid clientSecret: your_open_secret redirectUri: https://your-domain.com/callback/wechat-app # QQ登录配置 qq: clientId: your_qq_appid clientSecret: your_qq_appkey redirectUri: https://your-domain.com/callback/qq # 支付宝登录配置 alipay: clientId: your_alipay_appid clientSecret: your_alipay_private_key redirectUri: https://your-domain.com/callback/alipay alipayPublicKey: your_alipay_public_key # 微博登录配置 weibo: clientId: your_weibo_appkey clientSecret: your_weibo_secret redirectUri: https://your-domain.com/callback/weibo # 抖音登录配置 douyin: clientId: your_douyin_client_key clientSecret: your_douyin_client_secret redirectUri: https://your-domain.com/callback/douyin # 华为登录配置 huawei: clientId: your_huawei_client_id clientSecret: your_huawei_client_secret redirectUri: https://your-domain.com/callback/huawei ``` **注意事项**: - 微信小程序登录使用微信官方 API,不依赖 JustAuth - 苹果登录暂未实现(需要对接 Apple 官方 API) - 各平台的 AppId、Secret 等需要在对应开放平台申请 - redirectUri 需要与开放平台配置的回调地址一致 ## TODO - [x] 实现 `MobileAuthService` 认证服务 - [x] 集成短信网关(jeesharp-spring-boot-starter-sms)发送验证码 - [x] 集成 JustAuth SDK 实现第三方登录(微信、QQ、支付宝、微博、抖音、华为) - [x] 实现微信小程序登录(使用微信官方 API) - [ ] 实现苹果登录(Apple Sign In) - [ ] 实现一键登录(运营商SDK) - [x] 实现签到逻辑(MemberSignInApplicationService + `app_member_sign_in_record`) - [ ] 实现优惠券服务 - [ ] 实现消息推送服务 ## 更新日志 | 版本 | 日期 | 说明 | |------|------|------| | 3.0.1 | 2026-01-24 | 初始版本,包含会员模块移动端接口框架 | --- ## 移动端登录鉴权白名单(v1.0 / 2026-05-29) 本节记录"未登录也能访问"的接口集合,与 [web-starter/application.yaml](../../web-starter/src/main/resources/application.yaml) 中 `jeesharp.member-auth.sa-interceptor.exclude-path-patterns` 一一对应。 ### 1. 平台机制 接口免登录由三个层次共同保障: | 层 | 作用范围 | 配置入口 | | --- | --- | --- | | Spring Security `permitAllUrls` | URL 级匿名访问 | `jeesharp.security.permitAllUrls` | | Sa-Token `SaInterceptor` | 校验登录态 | `jeesharp.member-auth.sa-interceptor.exclude-path-patterns` | | Sa-Token `@SaIgnore` 注解 | 类/方法级精确跳过 | Controller 注解 | ⚠️ `application.yaml` 中的 `exclude-path-patterns` 需要平台核心 starter ≥ `3.0.1-Beta-22`(已支持 `SaInterceptorProperties` 合并默认值)才会生效。 ### 2. 白名单分类 | 分类 | 路径 | 说明 | | --- | --- | --- | | **登录与注册** | `/mobile/member/auth/**` | 短信验证码、各类登录、刷新 Token | | **通用免登录通道** | `/mobile/noAuth/**` | 开机动画 SplashAd、首页弹窗 OperationPopup 等 | | **支付回调** | `/mobile/pay/notify/**`(C 端支付成功统一入口)
`/mobile/order/pay/notify/wechat/refund`(商城退款) | 第三方异步通知,无 Token | | **首页基础** | `/mobile/home/**`
`/mobile/setting/homeBanner/**`
`/mobile/setting/homeGridIntro/**` | 壳层 / 轮播 / 宫格介绍 | | **公开内容 / 资讯** | `/mobile/setting/travelNews/**`
`/mobile/setting/travelStrategy/**`
`/mobile/setting/aboutUs/**`
`/mobile/setting/helpCenter/**`
`/mobile/setting/privacyPolicy/**`
`/mobile/notice/**`
`/mobile/marketing/**` | 资讯 / 攻略 / 关于我们 / 帮助中心 / 协议 / 公告 / 推广 | | **公开浏览类业务** | `/mobile/village/**`
`/mobile/heritage/**`
`/mobile/culture/**`
`/mobile/hotel/**`
`/mobile/food/**`
`/mobile/leisure/**`
`/mobile/study/**`
`/mobile/yearcard/**`
`/mobile/explain/**`
`/mobile/guide/**`
`/mobile/scenic/**` | 仅展示用,下单/收藏等写操作走前端登录拦截 | ### 3. 仍需登录的接口(务必保留鉴权) | 业务 | 路径 | 原因 | | --- | --- | --- | | 个人中心 | `/mobile/member/userCenter/**`
`/mobile/member/member/**`
`/mobile/member/coupon/**`
`/mobile/member/favorite/**`
`/mobile/member/vipIap/**`
`/mobile/member/message/**` | 与当前登录会员强绑定 | | 订单 / 交易 | `/mobile/mallOrder/**`
`/mobile/tradeOrder/**`
`/mobile/order/**`(除支付回调)
`/mobile/address/**` | 写操作,必须实名/实人 | | 评价 / 反馈 | `/mobile/review/review/**` | 防垃圾评论 | | 各业务下单接口 | `*/booking/create`、`*/enroll` 等 | 业务侧用 `@SaCheckLogin` 控制 | ### 4. 前端协同:`skipAuth: true` [uni-app 请求拦截器](../../../xinghuacun_travel_mini_app/src/utils/request.ts) 默认会带上本地 Token,当 Token 过期时即便后端放行,starter 解析失败仍会抛 `code:201`。前端**所有免登录接口**必须显式声明 `skipAuth: true`,请求时不带 Authorization 头: ```ts // 示例:splashAd.ts return get(path, undefined, { showLoading: false, showErrorToast: false, skipAuth: true // ← 不带 Authorization 头 }) ``` `responseInterceptor` 在 `skipAuth: true` 时遇到 201 也**不会强制 reLaunch 登录页**,由调用方静默兜底。 已加 `skipAuth: true` 的模块清单: | 文件 | 接口 | | --- | --- | | splashAd.ts | getSplashAdCurrent | | homeShell.ts / homeBanners.ts | fetchHomeShell / fetchHomeBanners | | homeGridIntro.ts | list / detail | | homeEntryPopup.ts | fetchHomeEntryPopup | | notice.ts | list / detail | | privacyPolicy.ts | fetchPrivacyPolicyByCode | | cultureActivity.ts | activities / activity detail | | heritage.ts | culture-products / projects(列表 + 详情) | | village.ts | destinations 列表 + 详情 | | hotel.ts | stays 列表 + 详情 | | food.ts | restaurants 列表 + 详情 | | leisure.ts | venues 列表 + 详情 | | yearcard.ts | products 列表 + 详情(仅商品浏览) | | study.ts | programs 列表 + 详情 | | explain.ts | spots 列表 + 详情 + byGuidePoi | | travelStrategy.ts | hotList / page / detail | | marketing.ts | activity list / activity detail | | guidePois.ts | fetchGuidePois / fetchGuidePoiById | | aboutUs.ts | fetchAboutUsInfo | ### 5. 未来约定(强制) 凡新建移动端免登录接口,**必须**遵循: 1. 后端路径以 `/mobile/noAuth/` 开头: ```java @RequestMapping("${jeesharp.web.mobilePath}/noAuth/{业务模块}/{方法}") ``` 2. 前端请求 `skipAuth: true`: ```ts get('/noAuth/...', params, { skipAuth: true }) ``` 3. 后端通配 `/mobile/noAuth/**` 已永久放行,**无需改 yaml**。 这是项目"零配置免登录通道",避免每次添加白名单都要改 starter 或 yaml,规避路径打错、yaml 缩进错、热加载不生效等坑。