# oomall
**Repository Path**: mingqcn/oomall
## Basic Information
- **Project Name**: oomall
- **Description**: 厦门大学信息学院软件工程专业-软件工程导论、软件设计方法和JavaEE平台技术三门课程的课程设计
- **Primary Language**: Java
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 18
- **Forks**: 10
- **Created**: 2025-12-08
- **Last Updated**: 2026-09-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OOMALL
2026 Tutorial Project for course "Object-Oriented Analysis and Design“ and "JavaEE Platform Technologies"
2025-10-15:[API 1.5.1版](https://qbcgzddsjf.apifox.cn) 2025年第一版API
## 测试结果
系统每天**5:00 21:00**会自动进行一次单元测试,这是[历史测试结果](http://116.205.123.125/unit-test/)
系统每天**2:00**会自动进行一次集成测试,这是[测试结果](http://116.205.123.125/integration-test/required/), 目录是按照测试时间产生的,在目录下存在public.log文件,可以看到测试时的完整输出
[各模块的日志](http://116.205.123.125/logs/)会在**4:00**收集到服务器上
## 工程编译,调试的顺序
所有module都依赖于core模块,先要将core安装到maven的本地仓库,才能编译运行其他模块。方法如下:
1. 首先将OOMALL下的pom.xml文件中除·core·以外的module注释掉,
2. 在maven的中跑install phase,将core和oomall安装到maven的本地仓库
3. 将OOMALL下的pom.xml文件中注释掉的部分修改回来
4. 编译打包其他部分
5. 以后修改了core的代码,只需要单独install core到maven本地仓库,无需重复上述步骤
## 环境安装
### 安装docker
如果没有安装docker需要先安装docker
`apt-get update`
`apt-get install docker.io`
## docker swarm环境下项目的安装指南
### docker swarm安装
如果在docker swarm上部署,需要先安装docker swarm,参考以下网页
[https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/
](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/)
### 创建docker swarm overlay network
`docker network create --driver overlay javaee-proxy`
### 配置标签
为了让系统服务部署在特定的节点上,需要给服务器打上标签,方便docker swarm在创建Service时,将Service部署在目标节点上。需要定义以下标签
| 服务(service) | 标签(label)|
| --- | --- |
| mysql | mysql=yes |
| minio | minio = yes |
#### 定义节点标签
以下我们在node6上定义了一个label `mysql=yes`
`docker node update --label-add mysql=yes node6`
#### 去除节点标签
采用下面的命令去除节点上的mysql标签
`docker node update --label-rm mysql node6`
### 在docker swarm中创建服务
服务的部署文件定义在conf/docker的sys-service-compose.yml和service-compose.yml文件中。其中sys-service-compose.yml中描述的是系统服务,包括文件服务-Minio,关系数据库-MySQL,服务登记和配置管理的Nacos、缓存服务器Redis,三台mongo服务器(构成monogo集群)、RocketMQ服务器等。
service-compose.yml描述的OOMALL定义的服务。分别用以下两个命令部署将系统服务和OOMALL的服务部署在两个stack里。
`docker stack deploy -c sys-service-compose.yaml --with-registry-auth system`
`docker stack deploy -c service-compose.yaml --with-registry-auth oomall`
### MySQL服务的配置要求
在sys-service-compose.yml的mysql服务中定义了以下目录绑定到操作系统目录。
```
volumes:
- /root/mysql/sql:/sql:ro
- /root/mysql/conf.d:/etc/mysql/conf.d:ro
- /root/mysql/log:/var/log/mysql
- /root/mysql/data:/var/lib/mysql
```
对应关系如下表所示:
| 操作系统中目录 | 容器中的目录 | 权限 | 用途 |
| --- | --- | --- | --- |
| /root/mysql/sql | /sql | ro 只读 | 用于存放sql文件,在容器中可以访问 |
| /root/mysql/conf.d | /etc/mysql/conf.d | ro 只读 | mysql的配置文件 |
| /root/mysql/log | /var/log/mysql | 读写 | mysql的日志 |
| /root/mysql/data | /var/lib/mysql | 读写 | mysql数据库的数据 |
需在打了标签的节点上建立这些目录,并将需要在容器中运行的sql,mysql的配置文件拷贝到节点的这些目录下。
#### 在运行mysql服务的节点上运行sql脚本
看一下mysql的服务运行在哪台节点
`docker service ps system_mysql`
切换到运行mysql服务的机器,看一下mysql容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行mysql的命令
`docker exec -it [CONTAINER ID] mysql -uroot -p`
用root账号登录mysql服务器,在运行起来的mysql命令行中用`source /sql/database.sql`建立oomall各模块数据库
#### 分别初始化各模块的数据
以product模块为例,用`use product`切换数据库
用`source /sql/product.sql`插入初始数据
其他模块数据库的安装类似
### Minio
在sys-service-compose.yml的minio服务中定义了minio的数据目录绑定到操作系统目录。
```
volumes:
- /root/minio/data:/data
```
### 带布隆过滤器的Redis
在sys-service-compose.yml的redis服务中定义了redis的配置文件目录绑定到操作系统目录。
其中`CONFFILE=/etc/redis/redis.conf`是指定redis的配置文件,在配置文件中我们设定了redis的连接密码为123456, redis的配置文件目录redis映射到容器中,建议自行修改密码
redis/redis-stack-server:latest为官方docker镜像,swr.cn-north-4.myhuaweicloud.com/oomall-javaee/redis/redis-stack-server:latest为课程用私服镜像
#### 在运行redis服务的节点上查看redis的服务是否正常运行
看一下redis的服务运行在哪台服务器
`docker service ps system_redis`
切换到运行redis服务的机器,看一下redis容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行redis的命令行工具redis-cli
`docker exec -it [CONTAINER ID] redis-cli`
进入redis-cli后,先运行下面的命令输入密码
`auth 123456`
再测试Bloom过滤器是否正常
`BF.ADD testFilter hello`
`BF.EXISTS testFilter hello`
如果均返回(integer) 1则可以正常使用redis了
如果需要将redis的端口暴露出来 加上--publish published=6379,target=6379
### 安装Mongo镜像
如果需要mongo支持事务,则需要安装至少3台mongo服务器,形成mongo的副本集。具体可以参考[https://www.mongodb.com/docs/manual/administration/replica-set-deployment/](https://www.mongodb.com/docs/manual/administration/replica-set-deployment/)
其中`--replSet rs0`定义了副本集的名称 `--oplogSize 128`定义了副本日志的大小
如果需要将mongo的端口暴露出来 加上- 27017:27017
redis/redis-stack-server:latest为官方docker镜像,swr.cn-north-4.myhuaweicloud.com/oomall-javaee/mongo:latest为课程用私服镜像,如果用私有镜像需要加--with-registry-auth,官方镜像去掉此选项
mongo2和mongo3做为副本
#### 在primary上创建副本
看一下mongo1的服务运行在哪台服务器
`docker service ps system_mongo1`
切换到运行mongo1服务的机器,看一下mongo1容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行mongo的命令行工具mongosh
`docker exec -it [CONTAINER ID] mongosh`
进入mongosh后,先运行以下命令初始化副本集,其中`priority: 2`表示该节点优先成为主节点
`rsconf = {_id: "rs0",members: [{_id: 0, host: "mongo1:27017",priority: 2},{_id: 1,host: "mongo2:27017",priority: 1},{_id: 2,host: "mongo3:27017",priority: 1}]}`
`rs.initiate( rsconf )`
用`rs.conf()`即可以查看配置情况
用`rs.status()`即可以查看哪个mongo是primary,目前的设置是mongo1是primary
在primary mongo上用相同的步骤[创建mongo用户]和[restore mongo的数据库]
在工程中将配置指向primary的mongo服务器
#### 创建mongo的用户
在运行mongo1服务的节点上查看mongo的服务是否正常运行
`docker exec -it [CONTAINER ID] mongosh`
进入mongosh后,先运行下面的命令切换database
`use oomall`
再在oomall建立demouser用户,给用户赋予读写和数据库管理员的角色
`db.createUser({user:"demouser",pwd:"123456",roles:[{role:"readWrite",db:"oomall"},{role:"dbAdmin",db:"oomall"}]})`
如果均返回{ok:1}则可以用demouser用户正常使用mongo的oomall数据库了
`docker exec -it [CONTAINER ID] mongosh -u demouser -p 123456 --authenticationDatabase oomall`
#### restore mongo的数据库
`docker exec -it [CONTAINER ID] mongorestore -u demouser -p 123456 --authenticationDatabase oomall -d oomall --dir /mongo/oomall --drop --preserveUUID`
此命令会先删除所有数据再用户mongo/oomall下的数据恢复数据库
### 安装Rocketmq
#### 在node2 安装rocketmq的nameserver和dashboard,在node3安装rocketmq的broker
在管理机上执行以下命令
`docker node update --label-add server=rocketmq-namesrv node2`
`docker node update --label-add server=rocketmq-broker node3`
在node2上pull docker镜像
`docker pull apache/rocketmq`
`docker pull apacherocketmq/rocketmq-dashboard:latest`
在node3上pull docker镜像
`docker pull apache/rocketmq`
#### 创建RocketMQ的NameServer 服务
`docker service create --name rocketmq-namesrv --with-registry-auth --constraint node.labels.server==rocketmq-namesrv --publish published=9876,target=9876 --network my-net -d swr.cn-north-4.myhuaweicloud.com/oomall-javaee/apache/rocketmq:latest ./mqnamesrv`
#### 创建RocketMQ的Broker 服务
`docker service create --name rocketmq-broker --with-registry-auth --constraint node.labels.server==rocketmq-broker -p 10911:10911 --mount type=bind,source=/root/oomall-2023/conf/rocketmq,destination=/rocketmq --network my-net -e "HEAP_OPTS=-Xms512m -Xmx512m -Xmn256m -XX:MaxDirectMemorySize=512m" -d swr.cn-north-4.myhuaweicloud.com/oomall-javaee/apache/rocketmq:latest ./mqbroker -n rocketmq-namesrv:9876 -c /rocketmq/broker.conf`
其中`-e "HEAP_OPTS=-Xms1g -Xmx1g -Xmn512m -XX:MaxDirectMemorySize=1g"`限制了内存最大使用1G,建议服务器内存为2G
#### 安装Rocket Dashboard
`docker service create --name rocketmq-dashboard --with-registry-auth --constraint node.labels.server==rocketmq-namesrv --network my-net -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rocketmq-namesrv:9876" -p 8100:8080 -d swr.cn-north-4.myhuaweicloud.com/oomall-javaee/apacherocketmq/rocketmq-dashboard:latest`
然后访问集群的任何的8100端口就可以看到服务器了
### 安装oomall的模块
在此节点上需要安装JDK-17和Maven,才能编译工程
Maven可以从[https://repo.huaweicloud.com/apache/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz](https://repo.huaweicloud.com/apache/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz)下载
用`apt-get install git openjdk-17-jdk`安装git和jdk17
选择一个节点安装打包OOMALL,例如node2
`git clone `
修改OOMALL下的pom文件,将除core以外的模块注释掉
在OOMALL目录用以下命令安装core和oomall的pom
`mvn clean install`
如果第二次打包不用重复上述过程,直接在core目录下运行
`mvn clean install`
在OOMALL目录下运行
`git checkout pom.xml`
将pom.xml恢复原样,
在模块目录下运行
`mvn clean pre-integration-test -Dmaven.test.skip=true`
在node2的/root/上建立logs目录
将模块的docker push到华为swr服务中
在管理机上创建服务
`docker node update --label-add server=product node2`
`docker service create --name product --with-registry-auth --network my-net --constraint node.labels.server==goods --publish published=8080,target=8080 --mount type=bind,source=/root/logs,destination=/app/logs -d [华为swr私服镜像]`
### 安装nacos
#### 设定在node2 安装nacos
在管理机上执行
`docker node update --label-add server=nacos node2`
在node2上pull docker镜像
`docker pull swr.cn-north-4.myhuaweicloud.com/oomall-javaee/nacos/nacos-server:latest`
#### 启动nacos
`docker service create --name nacos --with-registry-auth --constraint node.labels.server==nacos --network my-net --publish published=8848,target=8848 --publish published=9848,target=9848 --publish published=9849,target=9849 -e MODE=standalone -e PREFER_HOST_MODE=hostname -d swr.cn-north-4.myhuaweicloud.com/oomall-javaee/nacos/nacos-server:latest`
其中MODE表示用standalone模式启动, PREFER_HOST_MODE表示支持hostname方式,因为用的是swarn,需要用服务名查询
设置集中配置的application.yaml
8848为nacos访问端口, 9848为客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求, 9849为服务端gRPC请求服务端端口,用于服务间同步等
在浏览器中访问http://[IP]:8848/nacos, IP为集群中任意一台服务器ip
输入默认用户名/密码: nacos/nacos
即可进入nacos的控制台
在ConfigurationManagement->Configurations中增加一项配置Create Configuration
Data Id的格式为 ${spring.application.name}.yaml, 如商品模块为goods-service.yaml,商铺模块为shop-service.yaml,支付模块为payment-service.yaml
Group:为默认的DEFAULT_GROUP
Format:选Yaml
Configuration Content:将对应模块的application.yaml内容拷贝进来,注意不能有中文注释
按publish即可
### 安装ElasticSearch服务器
#### **更新服务器节点标签**
将 Elasticsearch 服务指定运行在 `OOMALL-Search` 节点:
```shell
docker node update --label-add server=es OOMALL-Search
```
#### **部署 Elasticsearch 服务**
运行以下命令启动 Elasticsearch 容器:
```shell
docker service create \
--name es \
--with-registry-auth \
--constraint 'node.labels.server==es' \
--env "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
--env "discovery.type=single-node" \
--mount type=bind,source=/root/elastic/data,target=/usr/share/elasticsearch/data \
--mount type=bind,source=/root/elastic/log,target=/usr/share/elasticsearch/logs \
--mount type=bind,source=/root/oomall-2023/conf/es/conf/elasticsearch.yml,target=/usr/share/elasticsearch/config/elasticsearch.yml \
--mount type=bind,source=/root/oomall-2023/conf/es/plugins,target=/usr/share/elasticsearch/plugins \
--network my-net \
--publish 9200:9200 \
-d \
swr.cn-north-4.myhuaweicloud.com/oomall-javaee/elasticsearch:8.5.3
```
- **参数说明**:
- `--env "ES_JAVA_OPTS=-Xms1g -Xmx1g"`:限制 Elasticsearch JVM 最小和最大内存为 1GB。
- `--mount`:
- `source=/root/elastic/data`:挂载数据目录。
- `source=/root/elastic/log`: 日志文件目录
- `source=/root/oomall-2023/conf/es/conf/elasticsearch.yml`:指定自定义配置文件。
- `source=/root/oomall-2023/conf/es/plugins`:挂载插件目录。
- `--network my-net`:加入自定义 Docker 网络。
- `--publish`:映射 9200。