简介:这是一份基于 Java 的轻量级单商户商城系统源码,面向中小企业和个人开发者,用于快速搭建可对接微信小程序的电商平台,也适合后端学习者系统掌握主流 Java 技术栈。项目采用微服务设计思路,将商品、订单、用户、支付等核心模块解耦,便于独立开发与横向扩展;同时配套数据库表结构、小程序对接接口以及 OAuth2 等安全认证实现。压缩包约 13.2MB,已有 166 人学习浏览。源码涵盖商城后端逻辑、前端渲染、Redis 缓存、Maven 构建、Docker 部署及 CI/CD 流水线等工程化内容,能够帮助读者从零梳理电商系统整体架构,理解从小程序客户端到服务端的完整链路,并在实际项目中复用模块划分与部署经验。对于希望从单体应用过渡到微服务架构、并掌握小程序商城完整研发流程的开发者而言,这份项目具有较高的参考价值,可作为毕业设计或商用系统二次开发的基础模板。
1. 它不是黑匣子:java 商城小程序到底是个什么项目
很多人第一次听到“java 商城小程序”这几个字,第一反应是:这一定很难吧?我得会 Spring Boot、会 Redis、会小程序开发,才敢碰它吧?其实它更像一套已经装好的样板间——墙刷好了、水电通了、家具摆好了,你不需要从零装修,只需要看懂每个房间是干嘛的,再动手改一改。这套源码是一个基于 Java 的轻量级单商户商城系统,后端用 Spring Boot 搭起来,数据库里有商品、订单、用户这些表,前端还能对接小程序端给顾客逛。它解决的问题特别具体:“我想让一个商家在网上开一间店”,而这份源码把开店要的商品管理、购物车、下单流程、用户登录这些事都提前做好了。适合那些 Java 刚学完语法、想看看真实项目长什么样,或者打算拿它当毕业设计和练手项目的人。
2. 先看懂技术底子:这个商城项目靠什么转起来
做任何项目之前,先别急着敲代码。你拿到手的是一份源码压缩包,打开后如果直接懵,很正常。我第一次打开类似项目时,眼里全是文件夹和配置文件,感觉自己在看天书。后来发现,只要抓住几个关键的技术点,整套系统的骨架就清楚了。
2.1 这五个技术栈分别干了什么活
下面这张表先给你一个全景,后面再逐一说人话。
| 技术 | 在商城里的角色 | 生活化类比 |
|---|---|---|
| Spring Boot | 总管一切:接收请求、调度模块 | 餐厅的排班制度 |
| MyBatis | 读写数据库 | 厨师和服务员之间传菜的流程单 |
| Thymeleaf | 渲染后台页面 | 把菜品信息翻译成顾客看得懂的菜单 |
| Redis | 缓存热点数据 | 收银台旁边备着常用零钱的小抽屉 |
| Maven | 管理依赖和打包 | 仓库的进货清单 |
Spring Boot 是整个项目的总管。浏览器里打开管理后台、小程序里拉取商品列表,所有请求先到它这里,再由它转发给对应的服务去处理。对新手最友好的地方是:它不需要你手动配置一大堆环境,写一个注解就能启动一个 Web 应用。比如你看到某个类上写着@Controller或@RestController,就说明这个类是管请求的入口。
MyBatis 是 Java 程序和数据库之间的翻译官。为什么这个项目不用其他数据库框架?因为 MyBatis 的 SQL 是你自己写的,商品查询、订单更新,每一步都看得见摸得着。对于刚刚接触真实项目的学习者,这一点价值非常大——你不会面对一个黑匣子,而是能清清楚楚看到数据库里发生了什么。
Thymeleaf 负责渲染后台页面。你打开管理后台,看到商品列表、订单列表那些页面,数据其实是动态的:商品名称、价格、图片地址都来自数据库。Thymeleaf 就在服务器端把数据填进 HTML 模板,返回给浏览器的已经是一个完整页面。对新手来说,理解起来比前后端分离那种模式简单。
Redis 是缓存数据库。商品分类、首页推荐位这类“很多人读、但不常变”的数据,放到 Redis 里能大幅提升访问速度。你在源码里看到redisTemplate或者@Cacheable之类的东西,就是在用这个“小抽屉”。
Maven 是项目管家。源码里有一个pom.xml文件,里面写满了项目需要哪些第三方库。Maven 会照着这张清单去下载对应的 jar 包,并帮你管理版本冲突。
另外说一句:项目名字里有“micro”,有些人会以为这是微服务架构。其实这类单商户商城源码,更多是单体应用或模块化单体,你暂时不需要被“微服务”三个字吓住。先把单体逻辑跑通,以后接触分布式再回头看,反而更容易理解。
2.2 拿到源码后:先看这两处,比乱翻代码效率高
很多人拿到源码第一件事,是到处点开 Java 文件看,结果越看越乱。我的建议是,先看pom.xml,再看包结构。
打开pom.xml,你大概率会看到这些依赖:
<!-- pom.xml 里通常会看到这些依赖 --> <dependencies> <!-- Spring Boot 的 Web 模块,负责处理浏览器和小程序发来的 HTTP 请求 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis 与 Spring Boot 的桥接包,让 Mapper 接口能被自动扫描 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- MySQL 驱动,让 Java 程序能连接上 MySQL 数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>你不需要背这些坐标,只需要看懂一件事:pom.xml 是项目的“进货单”。Maven 会照着这份清单去下载依赖,下载完成后才能编译运行。如果以后你想给项目加一个新功能,比如 Excel 导出,只要在这里加一条依赖,Maven 就会自动把对应的工具包拉进来。
看完依赖,再看项目结构。用 IDEA 打开源码后,左侧目录通常是这样的:
src/main/java/com/xxx/ ├── controller/ # 接收请求,接口入口 ├── service/ # 业务逻辑,核心代码 ├── mapper/ # 数据访问接口,对应 SQL ├── entity/ # 数据库表对应的实体类 ├── config/ # 配置类,比如拦截器、跨域配置 └── common/ # 通用工具类、统一返回结果controller是前厅,所有请求都先到这里;service是后厨,真正处理业务;mapper是仓库管理员,负责跟数据库打交道;entity相当于仓库里的货架模型,一张表对应一个 Java 类。
看代码的时候,建议从 controller 进入,而不是从 entity 开始。因为 controller 里写清了“这个商城对外提供了哪些能力”,顺着它往下点,你能很快摸清一条完整的业务线。
2.3 数据是商城的心跳:商品、订单、用户三张核心表
商城系统的本质,是围绕三张核心表在转:商品表、订单表、用户表。
你想象一下,商城就是一间超市:货架上的每件商品,是商品表里的一行记录;每一个注册的顾客,是用户表里的一行记录;每一次结账小票,是订单表里的一行记录。商品和用户之间怎么产生联系?靠订单。而一笔订单可能买了多件商品,所以还会有一张订单明细表,记录“订单里具体包含哪些商品、每个多少钱”。
商品表通常长这样(简化版):
CREATE TABLE goods ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID', name VARCHAR(100) NOT NULL COMMENT '商品名称', price DECIMAL(10,2) NOT NULL COMMENT '售价', stock INT NOT NULL DEFAULT 0 COMMENT '库存', status TINYINT NOT NULL DEFAULT 1 COMMENT '1上架 0下架', cover_img VARCHAR(255) COMMENT '封面图', sort_order INT COMMENT '排序值,越大越靠前' );price用DECIMAL(10,2)而不是FLOAT,是因为金额计算不能有浮点误差;status用来控制商品上下架;sort_order控制展示顺序,在首页推荐里非常常用。
订单表里一般会有用户 ID、订单金额、订单状态、支付时间等字段。用户表里除了基本账号信息,还会有手机号、地址、积分这类跟交易相关的字段。这些表之间靠主键和外键关联,比如订单表里的user_id指向用户表的id。
到这里,你已经知道商城项目大概由什么组成了:Spring Boot 管调度,MyBatis 管数据,Redis 管缓存,MySQL 存所有业务数据。下一步,就直接把它跑起来。
3. 把商城跑起来:你的第一个本地 Demo
看懂技术栈和目录结构之后,最有成就感的事情,就是让这套源码在你自己的电脑上运行起来。别担心,这一步不需要你写任何业务代码,只需要按顺序做好四件事。
3.1 准备四件套:JDK、Maven、MySQL、Redis
先检查电脑上有没有这四样东西。打开命令行,逐个运行:
java -version mvn -v mysql --version redis-server --version每个命令的效果分别是:java -version查看 Java 版本;mvn -v查看 Maven 版本;mysql --version查看数据库版本;redis-server --version查看缓存服务版本。哪一条提示“command not found”,就说明对应工具还没安装。
对于新手,版本选择建议如下:
| 工具 | 建议版本 | 主要作用 |
|---|---|---|
| JDK | 8 或 11 | 编译和运行 Java 代码 |
| Maven | 3.6 及以上 | 下载依赖、打包项目 |
| MySQL | 5.7 及以上 | 存储商品、订单、用户数据 |
| Redis | 任意稳定版 | 缓存热点数据 |
这四个工具,JDK 是基础中的基础,装完之后记得配置好环境变量;Maven 是给项目搬砖的,装好后会让你的依赖下载更顺利;MySQL 安装过程中会让你设置密码,这个密码一定要记住,后面配置里要用;Redis 在 Windows 上通常是免安装的,直接运行压缩包里的redis-server.exe就能启动。
如果你以前从来没装过这些,可以先去各自官网下载安装包,一步步默认安装就行。新手阶段不要折腾版本问题,用默认稳定版最省心。环境确认好之后,进入下一步。
3.2 导入数据库:把商城的“记忆”装进来
商城系统不能没有数据。源码压缩包里一般会带一个 SQL 文件,可能是shop.sql或者类似的名字,它里面写着所有表的建表语句和初始数据。导入过程分三步。
先打开 MySQL 命令行工具,创建一个数据库:
CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARSET utf8mb4; USE shop;建库时一定要用utf8mb4,它比老式的utf8更能兼容中文和特殊字符。如果不指定字符集,商品名称或者用户昵称很容易出现乱码——这是很多新手第一次跑项目时翻车的重灾区。
然后把源码里的 SQL 文件导入进来。在 MySQL 命令行里执行:
SOURCE /你的电脑路径/sql/xxx.sql;导入成功后,输入SHOW TABLES;,你会看到一批表名:商品表、订单表、订单明细表、用户表、购物车表、支付流水表等等。看到这些表,说明数据已经装进来了。
如果你导错了库,或者搞乱了数据,也没关系,数据库给了新手后悔药:直接执行DROP DATABASE shop;再重新建一遍就行。这种感觉很像搭乐高,拼错了就拆掉重来,代价非常低。
3.3 改配置、启动:等 20 秒,看到第一个页面
接下来要告诉项目:你的数据库在哪里,账号密码是多少。找到源码里的application.yml,它通常放在src/main/resources目录下。打开后,你会看到类似这样的一段配置:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8 username: root password: 你的数据库密码 redis: host: localhost port: 6379这里的每一项都有自己的含义。server.port表示项目运行后访问的端口,默认 8080,如果被占用可以改成 8081;datasource.url告诉项目连接哪个数据库,shop要跟刚才建的库名保持一致;username和password换成你自己的 MySQL 账号密码;redis.host和redis.port默认指向本地缓存服务,不需要改。
改完之后保存,然后在 IDEA 里找到启动类——就是名字里带Application的类,右键点击 Run。也可以用命令行启动:
mvn spring-boot:run第一次启动会比较慢,因为 Maven 可能还在下载依赖,你需要有点耐心。当控制台出现类似Tomcat started on port 8080的日志时,恭喜你,后端已经活了。
这时候打开浏览器,访问http://localhost:8080。这个地址就是你本地的商城入口。如果项目带管理后台,你会看到登录页;如果项目带商城首页,你会看到商品列表。只要页面能出来,就说明整套系统跑通了。
提示:启动如果失败,先不用急着看代码。把控制台最后 20 行日志截图,90% 的问题原因都写在日志里。
4. 读懂一条主线:从用户点商品到下单,代码是怎么流转的
项目跑起来之后,你会好奇:我在页面上点了一下按钮,后端的代码到底做了什么?这一章,我们跟着一条最核心的业务线走一遍:商品列表查询。
4.1 请求到了以后:Controller → Service → Mapper 三层接力
商城后端几乎都分成三层:Controller 负责接请求,Service 负责处理业务,Mapper 负责查数据库。以商品列表为例,Controller 层大概是这样的:
@RestController @RequestMapping("/api/goods") public class GoodsController { @Autowired private GoodsService goodsService; // 小程序端请求:GET /api/goods/list @GetMapping("/list") public Result list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { return Result.ok(goodsService.getGoodsList(page, size)); } }@RestController表示这个类是对外提供接口的,返回的是 JSON 数据,而不是页面。@RequestMapping("/api/goods")是接口的公共前缀,@GetMapping("/list")表示浏览器或小程序发送一个 GET 请求到/api/goods/list时,这个方法会被调用。page和size是分页参数,默认查第一页、每页十条。最后用Result.ok(...)包一层统一结构,是为了让前端能统一处理成功和失败的返回。
Service 层负责真正干活:
// Service 层:商品列表查询 public PageInfo<Goods> getGoodsList(Integer page, Integer size) { PageHelper.startPage(page, size); List<Goods> list = goodsMapper.selectGoodsList(); return new PageInfo<>(list); }这一层的样子很典型:先调用PageHelper.startPage(page, size)设置分页条件,然后调用goodsMapper.selectGoodsList()查数据库,最后把查询结果包成分页对象返回。Controller 里不应该写复杂的业务逻辑,那会让代码越来越难维护;业务逻辑放在 Service 里,将来想复用或者加缓存都更顺手。
最后是 Mapper 层,它负责和数据库对话。对应的 SQL 写在 XML 文件里:
<!-- Mapper 层:一条 SQL 查询商品 --> <select id="selectGoodsList" resultType="com.xxx.entity.Goods"> SELECT id, name, price, stock, cover_img FROM goods WHERE status = 1 ORDER BY sort_order DESC </select>id对应 Mapper 接口里的方法名;resultType表示查询结果要组装成哪个实体类;WHERE status = 1是只查上架的商品;ORDER BY sort_order DESC表示排序值越大的商品越靠前。整条链路其实非常清晰:小程序或浏览器发请求,Controller 接住,Service 处理,Mapper 查库,最后返回一组 JSON 数据。
这条链路,就是商城系统最核心的“血脉”。你以后看任何业务功能——购物车、订单、支付——都是同样的一套接力逻辑。
4.2 小程序商城接口:手机端怎么和后端对话
名字里有“商城小程序”,意味着这套项目预置了给小程序端用的接口。所谓小程序,本质上就是一个手机里的购物界面,它不直接连数据库,而是像浏览器一样,通过 HTTP 请求向后端要数据。后端接口是同一套,小程序只是多了一种客户端。
常见的小程序接口大概长这样:
| 接口路径 | 作用 |
|---|---|
| GET /api/goods/list | 获取商品列表 |
| GET /api/goods/{id} | 获取商品详情 |
| POST /api/cart/add | 加入购物车 |
| POST /api/order/create | 创建订单 |
| POST /api/pay/payOrder | 发起支付 |
这些路径只是典型设计,实际以源码里的为准。你可以在 controller 包里搜索@RequestMapping,把所有对外接口都找出来。找到之后你会发现,小程序端界面上的每一个按钮,几乎都能对应到后端的一个接口。这就是前后端配合的基本方式:前端负责展示和收集用户操作,后端负责处理数据和返回结果。
本地联调的时候,小程序端的请求地址通常需要指向本机后端。你只需要把小程序项目里的请求域名改成http://localhost:8080,就能让手机上的模拟器访问你电脑上跑着的商城后端。
4.3 第一个小改动:把商品列表的排序改成价格
只看代码不动手,永远少一点手感。这一节带你先做一个最小的改动。在 mapper 目录下找到商品查询的 XML 文件,找到刚才那段selectGoodsList,把排序改掉:
ORDER BY price ASC原来是按sort_order倒序,现在改成按价格从低到高。保存后重启项目,刷新商品列表页面,你会发现商品顺序变了,最便宜的商品跑到了最前面。
这个改动很小,但它让你真实地体会了一次“改代码 → 看效果”的循环。你在这一瞬间感受到的那个连接,就是无数程序员入门时最上头的时刻:一行代码,真的能改变世界。哪怕这个世界只是一个列表的排序。
5. 新手避坑:跑这份商城源码的 5 个高频翻车点
项目跑起来的过程中,你可能会遇到一些奇怪的问题。不要慌,几乎所有问题都有人踩过。下面这五个坑,是我见过的新手最高频的翻车点。
5.1 端口被占用:明明代码没错,就是启动不了
现象:控制台启动时报错,核心内容是Port 8080 was already in use.
原因:你的电脑上已经有别的程序占用了 8080 端口。可能是另一个 Java 项目没关掉,也可能是某个开发工具自带的服务占用了这个端口。
解决:两个办法。第一个是在application.yml里把端口改成 8081,然后访问http://localhost:8081。第二个是找到占用端口的进程并结束它。Windows 下可以执行:
netstat -ano | findstr 8080命令行会输出一个 PID 数字,然后执行:
taskkill /PID 你的PID数字 /F结束后重新启动项目即可。Mac 和 Linux 下可以用lsof -i:8080查看占用情况。
5.2 数据库连接失败:密码不对或者数据没导入
现象:项目启动成功,但一访问页面或接口,控制台报Access denied for user 'root'@'localhost',或者Table 'shop.goods' doesn't exist。
原因:前者是application.yml里的数据库密码跟实际 MySQL 密码不一致;后者是 SQL 文件根本没导入,或者导错到了另一个数据库。
解决:把application.yml里的username和password改成自己电脑上的真实账号密码。然后在 MySQL 里执行SHOW DATABASES;确认有一个名字跟配置一致的库,再执行USE 库名; SHOW TABLES;确认里面有商品表。如果表不存在,回到第三章重新导入一次 SQL 文件。
5.3 Redis 没启动:接口卡住或报连接错误
现象:启动时报错,控制台里看到Could not get a resource from the pool或者connect ECONNREFUSED 127.0.0.1:6379。
原因:项目启动时要连接 Redis,但本机的 Redis 服务没有运行。项目本身没问题,是后面那个“小抽屉”没开门。
解决:先启动 Redis。Windows 用户直接运行redis-server.exe,Mac 或 Linux 用户执行redis-server,或者用brew services start redis。看到命令行里出现端口号 6379 并且不再退出,就说明服务起来了。然后再重启项目。
5.4 Maven 依赖下载慢:项目一直卡在依赖阶段
现象:IDEA 右下角一直转圈,或者控制台报Could not resolve dependencies for project。
原因:Maven 默认去国外中央仓库下载依赖,网络不稳定或拉取速度慢,导致依赖迟迟不全。
解决:在 Maven 的settings.xml里配置国内镜像仓库。找到你本机 Maven 安装目录下的conf/settings.xml,在<mirrors>标签里加上:
<mirror> <id>aliyun</id> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/repository/central</url> </mirror>改完之后重启 IDEA,让它重新加载项目,下载速度会明显改善。这也是很多老手拿到新电脑后做的第一件事。
5.5 页面白屏:后端没报错,但前端就是不出东西
现象:页面打开是白的,或者一直转圈,后端控制台也没有明显的异常日志。
原因:新手往往只盯着后端控制台,忽略了一个最重要的调试工具——浏览器的开发者工具。很多时候接口报错了,但错误发生在前端网络层,控制台根本不会显示。
解决:打开浏览器按F12,切到Network面板,刷新页面。你会看到所有请求的列表,找到状态码不是 200 的请求,点开看它的状态码和响应内容。如果是 404,说明接口路径写错了;如果是 500,去后端控制台搜异常堆栈。记住一句话:前端看 Network,后端看控制台,两边对照着查,问题基本都能定位。
6. 下一步:怎么把这份源码变成你自己的项目
项目跑通,只是开始。这个商城源码最值钱的地方,是它把一个个真实电商模块摊开在你面前,让你从“学过 Java”走向“做过项目”。接下来按下面这张练习清单,一步步把它变成你自己的东西。
| 难度 | 练习 | 你会学到什么 |
|---|---|---|
| 入门 | 把商品列表改成按价格排序 | SQL 条件排序 |
| 入门 | 给商品增加“上架/下架”按钮 | 更新接口和字段状态 |
| 进阶 | 用 Redis 缓存商品分类 | 缓存更新策略 |
| 进阶 | 给下单流程增加库存预减 | 事务注解@Transactional |
| 挑战 | 给管理后台增加一个菜单入口 | 菜单表和权限校验 |
先从最简单的排序改动开始,再慢慢碰 Service 层的逻辑。你会发现,每一次改动都会逼你去读更多源码,而读源码这件事,做多了就越来越不害怕了。
之后再回头补一些更独立的知识点:拦截器怎么做登录校验、跨域配置是怎么回事、分页插件底层原理是什么、Docker 打包部署一套商城需要几步。有了真实项目当抓手,这些问题对你来说就不再是抽象概念,而是一个一个具体、可验证的工程问题。这也正是这类源码资源最大的价值——它不是用来背的,而是用来“拆”的。
我第一次跑通这类商城项目时,卡在 Redis 启动上整整一个下午,后来发现只是少开了一个窗口。从那以后,我每次拿到新项目,都会强制自己先走一遍环境检查清单再点启动:端口、数据库、缓存、依赖,四样确认完才动手。希望帮到你。
本文还有配套的精品资源,点击获取