JAVA商城源码三端联调实战:Spring Boot后端与安卓iOS小程序从部署到避坑

发布时间:2026/10/6 3:04:05
JAVA商城源码三端联调实战:Spring Boot后端与安卓iOS小程序从部署到避坑 简介一套新版JAVA开发的成人用品零售商城多端源码包含安卓、iOS双端原生组件与微信小程序端面向具备一定移动端开发经验的Java/安卓工程师可用于学习商城类App的架构设计、订单链路及优惠促销玩法。压缩包共2021个文件容量约346MB其中java/h/m文件对应安卓与iOS原生代码js/json支撑小程序逻辑与配置html/css用于管理界面或静态页面另有sql、xml、md等文件辅助数据库、资源配置与说明阅读整体代码量充足便于分模块拆解学习。已有558人学习/下载。虽然未附带搭建教程但商城业务闭环完整从商品分类、单品展示到下单结算均有实现可重点研读订单状态、优惠券发放、促销逻辑等核心模块也可参考双端原生与小程序共存的工程组织方式为自己的电商项目提供迁移或二次开发基础。1. 拿到这套JAVA商城源码先搞清楚它到底能给什么这套标题里写着JAVA开源、安卓IOS双端原生源码和小程序源码说白了就是一个垂直类目电商的完整三端方案。成人用品只是业务分类代码层面大部分还是商品、购物车、订单、支付、物流这些老几样。适合谁有Java基础、想快速起一个商城APP的小团队或外包开发者。不适合谁没跑过Spring Boot、以为解压就能直接用的人。我见过太多人卡在第一步解压后不知道先看哪个更不知道数据库、端口、AppID这些都要改。反直觉的是这种源码并不是拿来即用的黑匣子。它更像一套毛坯房水电图给你了但你要自己接水管。后端的数据库密码、前端的接口地址、小程序的AppID全部都要改不改的话连登录都跑不通。另有隐藏成本双端原生的证书签名、小程序域名白名单任何一个都没法靠删代码绕过。2. 用Java后端撑起双端商城从目录结构到第一个接口跑通2.1 先认目录别急着点开安卓工程无论你是Windows还是macOS拿到压缩包的第一步都是解压。我一般会先扔到Linux服务器上用命令行解压因为重复解压和权限处理更方便# 安装解压工具多数Linux默认没有unrar sudo apt-get install unrar -y # 解压到当前目录保留原目录结构 unrar x 新版JAVA开源成人用品零售商城APP源码.rarunrar x后面的x是“extract with full path”的意思如果你漏了x所有文件会一股脑摊在当前目录到时候找错文件会很抓狂。解压完成后先别双击安卓工程先在根目录里看一遍文件夹和README。一个规范的商城源码包根目录通常长这样目录名作用server/ 或 backend/Java后端工程Maven结构android/安卓原生工程Gradle结构ios/iOS原生工程Xcode工程miniprogram/微信小程序源码database/数据库初始化SQL脚本docs/接口文档或部署说明你可能会看到shop-server、shop-android、shop-ios这种带业务前缀的名字认准带pom.xml、build.gradle、Package.swift这些特征文件的目录就行。我先看database和docs因为要先把数据库建起来。有一点要提醒在公司电脑上解压后杀毒软件报毒不一定是真有病毒。开源源码里经常带授权验证逻辑调用了外部网络接口做机器码校验容易被AV误判。别急着删先打开对应的类看看做了哪些网络请求再决定留哪些。2.2 数据库脚本与核心表订单、SPU、SKU怎么设计打开database目录里面的.sql文件一般按数字序号命名比如00_create_db.sql、01_tables.sql、02_init_data.sql。先执行00创建数据库再执行01建表最后执行02灌初始数据。在MySQL命令行中操作mysql -uroot -p source /path/to/database/00_create_db.sql; source /path/to/database/01_tables.sql; source /path/to/database/02_init_data.sql;source是一条MySQL命令执行顺序不能乱。不先建库直接建表会报1046跳过初始数据后台管理员账号不存在你后面连后台都进不去。如果你的脚本文件路径带空格MySQL的source命令会解析失败把文件放到全英文路径下再执行。核心表结构大致是这样表名作用关键字段sys_user后台管理员与会员id, username, password, rolespu商品主表id, category_id, name, status, audit_statussku商品规格库存id, spu_id, spec, price, stockcart购物车id, user_id, sku_id, countorders订单主表id, order_no, user_id, total_fee, statuspay_log支付流水id, order_id, trade_no, channel成人用品零售商城和普通商城相比业务上主要多了两块一是这类商品的标题和图片通常需要人工审核所以spu表里会有audit_status字段二是配送默认要保密发货所以orders表通常会带buyer_note或自定义发货名称字段。这些在你改业务前先保留别当成无用字段删掉。密码字段一般不是明文常见的是MD5加盐或bcrypt。初始SQL里如果直接写入了一个“123456”的MD5值你登录成功后应该马上改掉并且后端登录逻辑要能兼容你下次设置的新密码。提示在执行SQL前先去application.yml里看后端工程配置的数据库库名和账号如果跟脚本里的不一致建出来的库连不上返工成本高。2.3 启动Spring Boot后端的最小命令与参数说明后端工程十有八九是Spring Boot Maven偶尔配MyBatis-Plus。打开backend目录的pom.xml确认依赖里有没有spring-boot-starter-web、mysql-connector-java、jedis或spring-boot-starter-data-redis。然后在application.yml里改数据库连接、Redis连接和上传路径。典型配置spring: datasource: url: jdbc:mysql://localhost:3306/shop_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 database: 0 mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml configuration: map-underscore-to-camel-case: true app: upload-dir: /data/shop/upload base-url: http://localhost:8080/uploadurl里的useUnicodetrue和characterEncodingutf8是固定组合少了中文乱码serverTimezoneAsia/Shanghai是MySQL 8.0系列必须的否则报时区异常。Redis如果本地没起后端启动时可能卡在连接缓存或者启动后登录接口报redis连接失败所以先redis-server把Redis跑起来。确认配置无误后在backend目录下执行打包和启动mvn clean package -DskipTests java -jar target/shop-backend-1.0.0.jar --spring.profiles.activedev-DskipTests是跳过测试用例因为源码里的单元测试连的可能是作者本地数据库你直接跑大概率失败。--spring.profiles.activedev是加载application-dev.yml如果这个工程没有dev profile带上这个参数会报“No active profile”去掉即可。启动日志出现“Started ShopApplication in xx seconds”后用curl验一个最基础的接口curl -X POST http://localhost:8080/api/user/login \ -H Content-Type: application/json \ -d {username:admin,password:admin123}返回JSON里有token或access_token说明后端已经活过来了。如果返回404先查Controller类的RequestMapping前缀返回500八成是数据库连接、Redis连接或Mapper XML路径不对。这一步别急着追源码先把外部依赖排查完。3. 安卓端原生源码替换服务地址、编译APK、跑通登录下单3.1 原生安卓工程结构与SDK版本坑用Android Studio打开android目录时会自动触发Gradle同步。不要点Run先让右下角进度条跑完。如果项目里有多个module先确认app模块是动态的。标准结构是app/src/main/java/com.xxx.shop/下面分activity、adapter、model、network等包。app级别的build.gradle里能看到sdk配置android { compileSdk 34 defaultConfig { applicationId com.xxx.shop minSdk 21 targetSdk 33 versionCode 1 versionName 1.0 } }compileSdk和目标SDK最好和本地一致。如果本机SDK没有34Android Studio会提示“SDK component missing”直接点安装即可。targetSdk不要乱降因为权限申请逻辑按targetSdk分支比如Android 6.0以上的运行时权限、Android 13的通知权限。降到23以下反而会出现适配问题。网络请求层一般用OkHttp或Retrofit封装在network包下找RetrofitClient.java或ApiService.java。BASE_URL的存放位置不固定有的直接在常量类里有的通过BuildConfig注入还有的读gradle.properties。你要做的是把所有硬编码的地方都找出来统一改。3.2 把后端地址从本地改成你的服务器安卓开发里最容易搞混的是访问地址模拟器访问宿主机要用10.0.2.2真机要填电脑局域网IP线上要填域名。这三种环境我用一个常量类来控制// AppConfig.java public class AppConfig { // 生产环境https://api.yourdomain.com/api // 真机调试http://192.168.1.100:8080/api // 模拟器调试http://10.0.2.2:8080/api public static final String BASE_URL http://10.0.2.2:8080/api; public static final String IMG_URL http://10.0.2.2:8080/upload; }BASE_URL后面要不要带/api取决于后端Controller的全局前缀不是固定的。改完这个常量后所有Retrofit注解的相对路径都会自动拼上。改完记得在Android Studio里执行Build - Clean Project防止BuildConfig或R类缓存导致改动不生效。有些源码把BASE_URL写在gradle.properties里通过BuildConfig引用那么你要改的是properties文件API_URLhttp://10.0.2.2:8080/api IMG_URLhttp://10.0.2.2:8080/upload然后重新Sync一次项目。不要只改Java文件而忘了改gradle.properties两者不一致是常见的低级翻车现场。3.3 Gradle构建与模拟器/真机验证开发阶段先用debug包验证不着急签名。命令行构建比IDE界面能看更多报错信息cd android ./gradlew assembleDebug下载依赖慢是常见问题。如果卡在maven在build.gradle中加阿里云镜像Gradle同步速度会快很多buildscript { repositories { maven { url https://maven.aliyun.com/repository/public/ } maven { url https://maven.aliyun.com/repository/google/ } mavenCentral() google() } }构建成功后APK在app/build/outputs/apk/debug/app-debug.apk。安装到模拟器最简单的办法是把APK拖到模拟器窗口也可以用命令行adb install -r app/build/outputs/apk/debug/app-debug.apk-r表示覆盖安装重新构建后重复安装不用先卸载。安装完打开APP如果登录能成功说明后端、网络、数据库链路全通了。如果一直转圈加载不出数据先看日志adb logcat | grep -i retrofit\|okhttp\|E/常见报错是“CLEARTEXT communication to 10.0.2.2 not permitted”这是高版本安卓默认禁止明文HTTP流量避坑章节会详细处理。你先确认后端地址、后端进程、数据库都没问题再看这层安全限制。真机验证时手机要开启“开发者选项”里的“USB调试”连接电脑后第一次弹出的RSA指纹对话框要点允许。部分国产手机还需要额外开启“USB安装”权限否则adb install会提示install fail。安装完后在真机里打开同样的登录流程确认你的局域网IP没有被防火墙拦住。如果连不上检查电脑防火墙对8080端口的入站规则很多情况是后端能跑但局域网根本不让你访问。4. iOS与小程序双端源码从Xcode到微信开发者工具4.1 确认iOS工程用的语言与最低版本iOS目录下如果是.xcworkspace说明有CocoaPods依赖。先进入目录执行pod installcd ios pod install open YourApp.xcworkspace如果没装CocoaPods先sudo gem install cocoapods然后记得用.xcworkspace打开工程不要打开同名.xcodeproj否则你写的改动不生效。现在很多iOS工程也改用Swift Package Manager如果你看到Package.swift直接用Xcode打开.xcodeproj即可它会自动解析包。先看Info.plist里的MinimumOSVersion一般是12.0或13.0。再看工程里的源码是Swift还是OC这决定了你改baseURL的位置。Swift网络层通常叫APIManager.swift或NetworkService.swiftOC则是NetworkTool.m。两种语言里都会有个baseURL字符串改它后端地址和安卓对齐。iOS的ATS限制很严格本地调试先临时放开真机上再收紧这点避坑章节再展开。4.2 小程序工程结构与AppID配置微信开发者工具里选择“导入项目”选中miniprogram目录。导入时填自己的AppID比如“wx1234567890abcdef”没有AppID就选“测试号”。project.config.json里的关键字段{ appid: wx1234567890abcdef, compileType: miniprogram, libVersion: 3.0.0, setting: { urlCheck: false, es6: true, minified: true, postcss: true } }urlCheck: false 表示不校验合法域名本地开发连http接口就靠它。如果这个开关是truewx.request直接报“域名不合法”即使你用的是HTTPS也需要在小程序后台配置请求合法域名才能真机预览。小程序通常把请求封装在utils/request.js或api.js里。找到baseUrl并改成后端地址// utils/config.js module.exports { baseUrl: http://10.0.2.2:8080/api, imgBase: http://10.0.2.2:8080/upload }这里有一个特别容易踩的坑微信开发者工具里跑的时候localhost指向开发者电脑没问题但如果你用手机扫码预览localhost指向你的手机根本连不上电脑。这个时候要把baseUrl改成电脑的局域网IP比如192.168.1.100。安卓模拟器用的10.0.2.2在小程序手机预览里也不适用换成局域网IP才通。小程序商品列表会用到上拉加载更多页面逻辑一般在IndexPage的onReachBottom里写Page({ data: { list: [], page: 1, loading: false, finished: false }, onReachBottom() { if (this.data.finished || this.data.loading) return; this.setData({ page: this.data.page 1 }); this.fetchGoods(); }, fetchGoods() { // 请求 /api/goods?page${this.data.page}size10 } })这里的page从1开始返回结果里通常有total或hasNext用来判断finished。分页参数名在后端接口文档里确认常见的是page/pageSize也有pageNum/pageSize。如果接口返回的total是总数你要自己计算有没有下一页别硬编码一个“加载完”状态。4.3 双端调Java接口的共同准备安卓、iOS、小程序同时对接一个Java后端要保证三项一致返回格式、Token存放位置、分页参数。返回格式一般是{code:200,data:{...},msg:success}code为200表示成功401表示登录失效。安卓端在Retrofit的Callback里判断codeiOS在请求完成的block里统一剥离data小程序在wx.request的success回调里先看code。三端都要有统一处理否则后端换了个错误码你要改三处。Token存放安卓存SharedPreferences、iOS存UserDefaults、小程序用wx.setStorageSync。请求头里的字段名要一致例如都叫Authorization值为Bearer eyJxxx。后端才能用一个拦截器统一读取。注意大小写和空格加不加建议用一个常量字符串三端从同一个后端错误码表里抄。分页参数三端请求商品列表都统一发page和pageSize后端用PageHelper或MyBatis-Plus的Page对象接收。如果后端用的是pageNum和pageStart前端也跟着改。不要在一个端用page、另一个端用pageNo这样前端联调时改来改去最后还会漏掉一个。4.4 模拟器编译与真机签名要注意的固定步骤iOS模拟器最简单的做法是Xcode顶部选择iPhone模拟器直接Run。如果报“No such module”先查看Podfile里是否组件没装全再检查Build Settings里的Other Linker Flags是否包含$(inherited)。真机调试需要Apple ID。在Signing Capabilities里选你的Team把Bundle Identifier改成唯一名称比如com.yourname.shop。首次连接真机要在手机“设置-通用-设备管理”里信任开发者App否则刚装上去的App秒退。个人免费账号一个Bundle ID最多用3天调试没问题上架必须换付费开发者账号。如果真机报“Unable to provision”常见原因是设备UDID没注册到描述文件。个人免费账号会自动注册管理员账号如果是手动描述文件要把手机连上Xcode重新生成。不要拔着数据线重新插Xcode对设备状态很敏感先让设备被识别再点Run。5. 双端商城源码联调避坑支付回调、图片上传与账号体系5.1 坑1图片上传接口返回403三端都传不上图现象安卓、iOS、小程序上传商品图片时请求还没到Controller就返回403 Forbidden。原因后端有统一鉴权拦截器把上传接口也拦了或者静态资源路径没有放行。解决在后端Security配置或拦截器中放行/upload/**并给上传接口加白名单。如果是Spring Securityconfigure方法里加一行Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(/upload/**, /doc.html, /webjars/**); }如果是Spring Boot 3.xSecurity的写法变了用requestMatchers代替antMatchers。判断依据是pom里spring-boot-starter-security的版本2.x用antMatchers3.x用requestMatchers。坑的特征很明显GET接口正常带POST或文件上传就403基本就是拦截器问题。改完重启后端再试。5.2 坑2微信登录回调没接上APP直接闪退现象点击“微信登录”APP黑屏或直接闪退系统日志里没有异常堆栈。原因安卓包名、应用签名在微信开放平台注册的不一致iOS的Universal Links没有配置可访问的json文件。解决安卓源码里必须存在WXEntryActivity它所在的包名必须是applicationId后追加.wxapi比如applicationId是com.shop.app那么完整路径是com.shop.app.wxapi.WXEntryActivity。包名不对微信SDK回调就找不到Activity表现为闪退。应用签名用微信开放平台工具生成MD5注意要和生产签名的keystore一致。调试时如果你用debug.keystore签名微信开放平台也要登记debug版本的MD5两套MD5都要登记。iOS微信登录依赖Universal Links要求域名可访问apple-app-site-association文件且文件里必须包含你的appid和teamid。本地联调如果只是测登录逻辑可以先关掉微信SDK用一个模拟登录按钮跳过等证书和域名都上线后再接。5.3 坑3金额单位不统一订单金额差100倍现象商品价格显示9.9结算却变成990或者订单里显示0.1元但实际上支付了0.01元。原因后端以分为单位存金额前端展示需要除以100但某几个页面忘了除或者支付接口直接传了元。解决三端各写一个金额工具函数所有展示一律走函数。安卓端Javapublic static String fenToYuan(long fen) { BigDecimal yuan BigDecimal.valueOf(fen) .divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); return yuan.toPlainString(); }iOS的Swift对应写法是String(format: %.2f, Double(fen)/100)小程序端用(fen/100).toFixed(2)。统一之后金额在一端显示对其他端也不会差。还要注意后端下单接口的入参单位如果orders表total_fee是int存分你就传分如果传了元会直接翻车。看后端实体类的类型就知道单位别靠猜。5.4 坑4高版本Android禁止HTTP明文流量现象targetSdk 28以上APK一访问http地址就抛IOException: Cleartext HTTP traffic not permitted to 10.0.2.2。原因从Android 9.0开始默认不允许明文HTTP协议必须在配置里显式放行。解决调试阶段最直接的方法是在AndroidManifest.xml的application节点加application android:usesCleartextTraffictrue ... 这样全局放行HTTP联调方便。但上线要收回去改用网络安全配置在res/xml下创建network_security_config.xmlnetwork-security-config domain-config cleartextTrafficPermittedtrue domain includeSubdomainstrue10.0.2.2/domain domain includeSubdomainstrue192.168.1.100/domain domain includeSubdomainstrueapi.yourdomain.com/domain /domain-config /network-security-config然后在application节点中使用这个文件。这样只放行指定域名比全局放行安全。注意小程序端不受安卓这个限制影响小程序官方本来就有域名校验是另一个问题。5.5 坑5iOS的ATS限制导致请求直接失败现象iOS真机或模拟器访问http接口时报“The resource could not be loaded because the App Transport Security policy requires the use of a secure connection”。原因App Transport SecurityATS强制要求HTTPS协议。解决开发阶段可以在Info.plist里临时加keyNSAppTransportSecurity/key dict keyNSAllowsArbitraryLoads/key true/ /dict这是最粗暴的写法只适合本地联调。上线前必须删除或改为按域名放行。和安卓的network_security_config是一个思路正式环境建议用HTTPS本地调试才开明文。如果后端用的是自签名证书即使域名配了HTTPSATS也可能不认需要在真机安装证书或用正式证书。6. 从源码到可发版会话安全与多端验证技巧6.1 用同一个Token体系串起三端的登录态后端的登录接口一般会返回JWT或UUID token三端拿到后各自存储安卓存SharedPreferencesiOS存UserDefaults小程序存wx.setStorageSync。之后的请求统一在Header里带Authorization。不要在三个端各自写一套登录判断逻辑否则后端改一次你得改三处。把接口返回code401统一当成登录失效跳回登录页。这看起来简单但在实际项目里三端各写各的最后code字段值不一致排查异常痛苦。6.2 用一套接口文档快速对齐三端联调时不要靠翻源码找接口参数直接让后端把已有接口导成OpenAPI格式三端对着同一份文档改。常见做法是后端加springdoc依赖启动后访问/swagger-ui.html有接口列表。如果你不想加依赖直接用curl做冒烟测试curl -X POST http://localhost:8080/api/user/login \ -H Content-Type: application/json \ -d {username:admin,password:admin123} | jq .code把登录取token、加购、下单、支付回调这几个核心链路各写成一段shell脚本每次后端改完跑一遍能提前拦住大部分接口回归问题。6.3 上线前的发版检查清单我会把这几项贴在工位上管理员默认密码是否修改数据库备份是否开启图片上传目录是否做了磁盘监控支付回调是否验签小程序域名白名单是否换成正式HTTPS域名安卓和iOS的签名证书是否过期。成人用品零售商城还要额外注意保密发货订单详情和快递单模板里不要把商品名称直接暴露出来这个要在后端打印逻辑里改三端源码反倒不用动。我之前接过一个类似项目花了三个晚上才解决双端都登录失败最后发现是后端数据库的user表密码字段是varchar(50)存进去的bcrypt哈希有60位被截断了。从那以后我拿到源码第一件事不是急着跑而是先看关键表的字段长度。希望这次讲的三端跑通顺序和这些坑让你少熬几个夜希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询