SuperMarket
设计精良的网上商城系统,包括前端、后端、数据库、负载均衡、数据库缓存、分库分表、读写分离、全文检索、消息队列等,使用SpringCloud框架,基于Java开发。该项目可部署到服务器上,不断完善中……
Install / Use
/learn @ZongXR/SuperMarketREADME
<html lang="zh">
<body>
<h1>网上商城</h1>
<h2>截图展示</h2>
<img src="./img/product.gif" alt="商品页面" /><br />
<img src="./img/regist.gif" alt="注册页面" /><br />
<img src="./img/login.gif" alt="登录页面" /><br />
<img src="./img/cart.gif" alt="购物车" /><br />
<img src="./img/order.gif" alt="订单" /><br />
<img src="./img/search.gif" alt="检索" /><br />
<img src="./img/manage_product.gif" alt="管理商品" /><br />
<img src="./img/add_product.gif" alt="新增商品" /><br />
<img src="./img/instantbuy.gif" alt="秒杀" /><br />
<h2>声明</h2>
<ul>
<li>未经许可不得将本项目商用,如需商用请联系作者<a href="mailto:zxr@tju.edu.cn">zxr@tju.edu.cn</a></li>
<li>欢迎各位看官向本项目提交代码,对提交的分支我将进行合并。提交时请务必保证能编译能运行</li>
</ul>
<h2>关键技术</h2>
<p>基于SpringCloud框架开发的商城系统,代码严格遵循MVC分层思想,可部署到服务器上,设计精良,不断完善</p>
<h2>包结构说明</h2>
<ul>
<li>com.supermarket.*.filter对应于微服务的过滤器</li>
<li>com.supermarket.*.listener对应于微服务的监听器</li>
<li>com.supermarket.*.controller对应于微服务的controller层</li>
<li>com.supermarket.*.aspect对应于微服务的切面类</li>
<li>com.supermarket.*.service对应于微服务的service层</li>
<li>com.supermarket.*.dao对应于微服务的持久层</li>
<li>com.supermarket.*.schedule对应于微服务的定时任务</li>
<li>com.supermarket.*.exception对应于微服务的自定义异常</li>
<li>com.supermarket.*.domain对应于微服务的JavaBean</li>
<li>com.supermarket.*.utils对应于微服务的工具类</li>
<li>com.supermarket.*.vo对应于微服务的ViewObject</li>
</ul>
<h2>系统架构</h2>
<img src="./img/架构图.png" alt="架构图" />
<h2>功能说明</h2>
<h3>用户微服务(com.supermarket.user)</h3>
<ul>
<li>用户登录</li>
<li>免验证码登录</li>
<li>用户注册</li>
<li>用户登出</li>
<li>用户名可用性校验</li>
<li>用户登录状态获取</li>
<li>查询用户权限等级</li>
</ul>
<h3>商品微服务(com.supermarket.product)</h3>
<ul>
<li>分页查询</li>
<li>单个商品查询</li>
<li>商品新增</li>
<li>商品修改</li>
<li>查询全部商品</li>
</ul>
<h3>公共资源微服务(com.supermarket.common)</h3>
<ul>
<li>公共资源微服务同时也是SpringCloud的Eureka模块</li>
<li>提供了常用的JavaBean, ViewObject, 工具类</li>
</ul>
<h3>zuul网关(com.supermarket.gateway)</h3>
<ul>
<li>SpringCloud的zuul网关模块</li>
<li>对敏感API调用进行后端鉴权</li>
</ul>
<h3>图片微服务(com.supermarket.image)</h3>
<ul>
<li>图片上传功能</li>
<li>生成验证码功能</li>
<li>清除验证码在redis中的缓存</li>
</ul>
<h3>购物车微服务(com.supermarket.cart)</h3>
<ul>
<li>购物车查询</li>
<li>购物车新增商品</li>
<li>购物车删除商品</li>
<li>购物车修改商品</li>
<li>购物车价格查询</li>
</ul>
<h3>订单微服务(com.supermarket.order)</h3>
<ul>
<li>新增订单</li>
<li>删除订单</li>
<li>查询订单</li>
</ul>
<h3>检索微服务(com.supermarket.search)</h3>
<ul>
<li>分页检索</li>
<li>新增商品</li>
<li>删除商品</li>
<li>建立索引</li>
</ul>
<h3>秒杀微服务(com.supermarket.instantbuy)</h3>
<ul>
<li>全部秒杀商品查询</li>
<li>单个秒杀商品查询</li>
<li>发起秒杀</li>
</ul>
<h2>新版本部署教程</h2>
<ol>
<li>环境准备<ol>
<li>开发环境准备:首先你需要有一台电脑、以及一个虚拟机(或服务器)。内存要大,不然跑不起来。假设你的虚拟机的ip地址是192.168.137.147在你的电脑中把hosts追加两行。<br />
<code>192.168.137.147 www.supermarket.com</code><br />
<code>192.168.137.147 image.supermarket.com</code><br />
然后添加环境变量<br />
<code>DOCKER_HOST=tcp://192.168.137.147:2375</code></li>
<li>部署环境准备:虚拟机装上centos7,再装上docker,然后依次拉取镜像<br />
<code>docker pull zongxr/redis:3.2.11</code><br />
<code>docker pull zongxr/mycat:1.15.1</code><br />
<code>docker pull zongxr/mysql:5.7.37</code><br />
<code>docker pull zongxr/elasticsearch:6.8.6</code><br />
<code>docker pull zongxr/supermarket-cart:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-user:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-gateway:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-eureka:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-image:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-search:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-instantbuy:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-product:1.0-SNAPSHOT</code><br />
<code>docker pull zongxr/supermarket-order:1.0-SNAPSHOT</code><br />
然后把start_up目录拷贝到/home目录下</li>
</ol></li>
<li>部署数据库<ol>
<li>参照<a href="./start_up/mysql/start_mysql.sh" target="_blank">数据库启动脚本</a>逐行执行,或直接运行该脚本。</li>
<li>由于官方的mysql镜像没有默认开启主从配置,也没设定UTF-8字符集,因此使用本项目专有镜像zongxr/mysql:5.7.37,可自动开启bin-log,并设定UTF-8字符集</li>
<li>该脚本制作了双向主从高可用的数据分片,节点分别为dn1_host1, dn1_host2, dn2_host1, dn2_host2。并且通过mycat实现了读写分离以及分库分表,最后灌入数据。如果上一步执行成功了,你将能够通过以下的JDBC连接上数据库
<code>jdbc:mysql://192.168.137.147:3306/supermarket</code>连接dn1_host1<br />
<code>jdbc:mysql://192.168.137.147:3307/supermarket</code>连接dn1_host2<br />
<code>jdbc:mysql://192.168.137.147:3308/supermarket</code>连接dn2_host1<br />
<code>jdbc:mysql://192.168.137.147:3309/supermarket</code>连接dn2_host2<br />
<code>jdbc:mysql://192.168.137.147:8066/supermarket</code>连接mycat<br />
</li>
</ol></li>
<li>部署redis集群<ol>
<li>参照<a href="./start_up/redis/start_redis.sh" target="_blank">redis启动脚本</a>逐行执行,或者直接运行该脚本</li>
<li>该脚本搭建了一个6节点的redis集群,从redis-1到redis-6。由于3.2.11版本的redis官方镜像没有预置ruby环境,而创建集群需要使用ruby环境。因此使用该项目的专用redis镜像zongxr/redis:3.2.11,该镜像已经集成了ruby环境可直接使用。</li>
<li>如果上一步redis集群部署成功了,那么可以通过6379端口连接该集群</li>
</ol></li>
<li>部署elasticsearch集群<ol>
<li>参照<a href="./start_up/elasticsearch/start_es.sh" target="_blank">elasticsearch启动脚本</a>逐行执行,或直接运行该脚本</li>
<li>该脚本搭建了3节点的elasticsearch集群,分别是es-1, es-2, es-3。如果部署成功了,可以使用<a href="https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm?hl=zh-CN" target="_blank">head插件</a>连接<a href="http://192.168.137.147:9200/" target="_blank">http://192.168.137.147:9200/</a>地址,集群状态应为green</li>
<li>官方默认的elasticsearch镜像不带JDBC连接功能,该项目通过技术手段集成了JDBC连接功能,可以像操作关系型数据库一样写SQL去操作elasticsearch。使用的driver是<code>org.elasticsearch.xpack.sql.jdbc.EsDriver</code><br />
<code>jdbc:es://192.168.137.147:9201</code>连接es-1<br />
<code>jdbc:es://192.168.137.147:9202</code>连接es-2<br />
<code>jdbc:es://192.168.137.147:9200</code>连接es-3<br />
</li>
</ol></li>
<li>部署微服务<ol>
<li>参照<a href="./start_up/app/start_app.sh" target="_blank">微服务启动脚本</a>逐行执行,或直接运行该脚本</li>
<li>每个微服务做了一个镜像,名为zongxr/supermarket-xxx:tag。如果所有微服务都启动成功了,那么将能够在<a href="http://192.168.137.147:10000/" target="_blank">注册中心</a>看到所有注册的微服务,并且在<a href="http://192.168.137.147:10002/swagger-ui/" target="_blank">http://192.168.137.147:APP_PORT/swagger-ui/</a>网址能够看到该微服务对应的接口文档</li>
<li>instant-buy微服务用到了消息队列rabbitmq。如果消息队列启动成功,将能够在<a href="http://192.168.137.147:15672" target="_blank">Web UI</a>管理界面看到传输的消息,用户名密码均为guest</li>
</ol></li>
<li>至此,所有服务都已经启动完成了。访问<a href="http://www.supermarket.com" target="_blank">www.supermarket.com</a>进行访问即可。</li>
</ol>
<h2>旧版本部署教程</h2>
<ul>
<li><a href="https://blog.csdn.net/sjdjjd6466446/article/details/110005937" target="_blank">0.4.x版本博客教程</a>(感谢<a href="https://github.com/BlackPeachLawn" target="_blank">BlackPeachLawn</a>)</li>
<li><a href="./部署教程/supermarket部署视频.txt" target="_blank">0.4.x版本视频教程</a>(感谢<a href="https://github.com/20427492" target="_blank">20427492</a>)</li>
<li><a href="./部署教程/ssm10月1号版本使用.txt" target="_blank">0.3.x版本文档教程</a>(感谢<a href="https://github.com/20427492" target="_blank">20427492</a>)</li>
</ul>
<h2>交流群</h2>
点击链接加入群聊【Supermarket项目交流群】:<a href="https://jq.qq.com/?_wv=1027&k=wlpUy5jo">https://jq.qq.com/?_wv=1027&k=wlpUy5jo</a><br />
<a href="https://jq.qq.com/?_wv=1027&k=wlpUy5jo"><img src="./img/交流群.png" alt="交流群二维码"/></a>
<h2>版本迭代</h2>
<table>
<tr>
<th>版本号</th>
<th>更新内容</th>
<th>上传时间</th>
</tr>
<tr>
<td>0.1</td>
<td>
<ul>
<li>初步完成项目方案确定</li>
<li>完成主页及注册页面的静态资源编写(包括js,css)</li>
<li>完成主页及注册页面的动态资源编写(包括jsp,servlet)</li>
<li>通过jdbc链接MySQL数据库</li>
<li>使用c3p0连接池</li>
</ul>
</td>
<td>2020年8月3日</td>
</tr>
<tr>
<td>0.1.1</td>
<td>
<ul>
<li>可以选择使用哪个连接池,并且在web.xml中指定,现在可以使用DBCP连接池</li>
<li>通过反射机制设置如果指定连接池调用失败,再调用哪个连接池</li>
<li>使用Ajax技术完成前端用户名校验</li>
<li>更改img标签的src属性,使浏览器异步发送GET请求,刷新验证码</li>
</ul>
</td>
<td>2020年8月7日</td>
</tr>
<tr>
<td>0.1.2</td>
<td>
<ul>
<li>使用JDBC.properties进行全局JDBC配置</li>
<li>去掉JDBC的反射调用</li>
<li>使用cookie完成记住用户名功能</li>
<li>新增登录功能:使用session完成会话级别的数据传递</li>
<li>新增注销功能:通过ajax请求销毁session</li>
<li>修改静态页面,使其实现对logo.png的单独依赖</li>
</ul>
</td>
<td>2020年8月9日</td>
</tr>
<tr>
<td>0.2</td>
<td>
<ul>
<li>使用EL表达式替换jsp页面中的脚本表达式</li>
<li>修改静态资源,主页增加右下角浮动项以及向上返回功能</li>
<li>新增错误页面提示</li>
<li>重构为JavaEE三层经典架构</li>
</ul>
</td>
<td>2020年8月20日</td>
</tr>
<tr>
<td>0.2.1</td>
<td>
<ul>
<li>使用过滤器完成全局请求参数拦截处理,包括全局中文乱码处理、全局password请求参数加密</li>
<li>通过过滤器实现全局连接池选定</li>
<li>通过过滤器实现自动登录功能</li>
<li>通过装饰者模式扩展request对象</li>
</ul>
</td>
<td>2020年8月22日</td>
</tr>
<tr>
<td>0.2.2</td>
<td>
<ul>
<li>使用log4j框架进行日志记录</li>
<li>修复重启服务器自动登录失效的bug</li>
<li>加入网页标题图标</li>
</ul>
</td>
<td>2020年8月
Related Skills
node-connect
339.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
prose
339.1kOpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.
frontend-design
83.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
sonoscli
339.1kControl Sonos speakers (discover/status/play/volume/group).
