mall商城项目搭建过程记录
这是一个我在github上看到的开源项目,采用的技术都是较新的技术
技术选型
Vue
SpringBoot
mybatis
MybatisGenerator
Redis
rabbitMQ
Docker
Linux(CenOS7)
开发工具
IDEA
HbuilderX
Navicat15
RedisDesktopManager
VirtualBox(开源虚拟机软件)
ITerm2(远程连接Linux命令行工具(mac上))
搭建项目过程:
安装Vue
上vue官网https://vuejs.org/下载vue.js,并且将他复制到项目目录下,并在script标签引用
创建SpringBoot项目
首先安装maven然后在idea创建web项目,并在pom.xml中引入下列依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> </parent> <dependencies> <!--引入springboot的web支持,帮你封装好了很多个依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot中集成jsp,下面三个 注意scope属性影响打war包--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--springboot整合mybatis,阿里的数据源,mysql或者Oracle--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!--<dependency>--> <!--<groupId>com.oracle</groupId>--> <!--<artifactId>ojdbc6</artifactId>--> <!--<version>6.0</version>--> <!--</dependency>--> <!--<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>--> <!-- fastjson格式转换 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> <!--引入springboot测试依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency> <!--引入devtools全局热部署,谨慎使用,和redis反序列化有缓存冲突,反序列化时报错--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!--引入jedis--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- 引入一个工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies>
然后启动项目即可,
安装Linux:
现在十点半,全部弄完。趁热打铁把这片博客的烂尾写一下。
这篇博客把liunx从下载CenOS7到VirtualBox创建虚拟机并分区写得非常详细清楚,只不过我的系统是OS系统,Xshell没有OS的开源版本,所以找了ITerm2作为替代
但是连接步骤基本一致,没什么可说的
https://github.com/macrozheng/mall-learning/blob/master/docs/reference/linux_install.md
关键是在连接过程中遇到的几个问题
一,IP地址
一开始还没有发现,但是后来发现虚拟机一启动就会ip自动+1,但是ITerm2的连接信息是写死在配置文件中的,所以就考虑能不能固定ip,必然是可以的
1.查看自己的配置文件名:
$ cd /etc/sysconfig/network-scripts $ ls //展示文件夹下所有文件名
然后选择第一个,名字会不一样,选第一个打开编辑
2.修改配置文件
vim ifcfg-enp0s3
3.修改配置文件信息
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" //改为static静态 dync是动态 NM_CONTROLLED="no" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="enp0s3" UUID="73df0aff-e60c-4907-ba9c-9faf3a444a17" DEVICE="enp0s3" ONBOOT="yes" IPADDR=192.168.3.24 //固定ip地址 NETMASK=255.255.255.0 //子网掩码 GATEWAY=192.168.0.1 //网关
然后 按esc 再输入:wq保存编辑
4.重启网络服务
service network restart
检查一下,就完成了
还有一个问题是用户的,因为root账号存在安全隐患所以一般都是禁用的,所以创建自己的用户并禁用root
sudoers这个文件好像一个令牌,只要普通用户在必要操作时,前面加上sudo 就相当于使用了root账号的权限,前提是需要在sudoers上登记留下大名
1.首先查看sudoers文件的路径
# whereis /etc/sudoers
2.查看文件的读写权限
# ls -l /etc/sudoers
一般是只有读的权限rr
3.授权
# chmod -v u+w /etc/sudoers
这样就变成了读写权限
4.编辑文件
# vim /etc/sudoers
找到“root ALL=(ALL) ALL ”这一行,在他下面加上“username ALL=(ALL) ALL”,这样就算留下大名了
5.回收权限
# chmod -v u-w /etc/sudoers
这下就可以在命令行前加上sudo和使用root是一样的效果
中途还有一点小插曲,因为是第一次用Linux,在我第一次键入密码时,发现怎么打也打不上,结果发现是不显示的。。记录一下,我还头疼了好一会。。
还有
$ su root
# su username
这是切换用户操作,$代表当前用户是普通用户,切换到root需要键入密码
#代表当前用户是root用户,切换到普通用户不需要键入密码,就是这么霸道
安装 Docker
昨天晚上把docker在虚拟机上安装了一下,今早趁热打铁来写一下博客
docker的安装并不难,cenOS以及就集成了yum,首先看一下用指令看一下工具是否齐全
rpm -qa|grep yum
rpm -qa|grep lvm2
docker首先需要yum-utils来提供yum-config-manager 然后 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
如果工具不齐全,则下载即可
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
然后添加源仓库,可以选择官方的或阿里的都可以,我一不小心添加了两个,然后下载的时候阿里的死活下载不下来,网上查询也查不到。
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
添加完后可能需要建立一下元数据缓存
$ sudo yum makecache
$ sudo yum install docker-ce
启动docker,然后使用docker version查看版本,安装完毕
$ systemctl start docker
$ docker version
最后说一说安装过程中遇到的问题,首先因为我是第一次使用这个虚拟机,在我下载docker的时候,下载报错,提示尚未安装GPG密钥
$ sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
添加完密钥后再安装阿里云的死活拉不下来,也没去找为什么拉不下来,因为我添加了两个源仓库,所以直接打算删掉阿里的
yum repolist查看所有的源,发现有阿里的
yum repolist
至于怎么删除,百度了一下怎么删除源,也没有找到,都说用yum remove <包名> 我这个也不是包,压根没下载下来
一开始我用yum-config-manager展示所有的仓库,里面有一条属性base_persistdir = /var/lib/yum/repos/x86_64/7这是存储地址
找到阿里云的仓库,把对应的存储地址删掉,没用,也对,这应该是下载下来之后的保存地址,我还没下载下来。
后来我灵机一动,这玩意估计是写在配置文件里的,只要找到配置文件应该就可以改了。
$ cd /etc
$ ls
下面有
yum yum.conf yum.repos.d
yum.conf是yum的配置文件,另外两个是文件夹,一看yum.repos.d就很可疑,进去把阿里云的删掉
然后再重建元数据缓存,再下载,果然就成功了~~~·
SpringBoot项目创建Docker镜像
创建镜像,首先搭建镜像
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
有时候遇到镜像下载不下来的情况,可以采用下面这篇博客,使用阿里云的加速器,亲测有效
https://blog.csdn.net/weixin_43569697/article/details/89279225
镜像下载完毕后我要们开启远程API
vi /usr/lib/systemd/system/docker.service
需要修改的部分
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的样子
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
让Docker支持http上传镜像
echo '{ "insecure-registries":["192.168.3.101:5000"] }' > /etc/docker/daemon.json
修改配置后需要使用如下命令使配置生效
systemctl daemon-reload
重新启动Docker服务
systemctl stop docker
systemctl start docker
开启防火墙的Docker构建端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
再在pom.xml文件中添加以下依赖
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imageName>mall-tiny/${project.artifactId}:${project.version}</imageName> <dockerHost>http://192.168.3.101:2375</dockerHost> <baseImage>java:8</baseImage> <entryPoint>["java", "-jar","/${project.build.finalName}.jar"] </entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
然后点击maven中的package等跳出success就可以了,可以使用docker images查看镜像,会发现项目已经添加到镜像中了
SpringBoot项目在Docker容器中部署
运行项目
docker run -p 8080:8080 --name mall\ --link mysql:db \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/admin/logs:/var/logs \ -d mall-tiny/mall:1.0-SNAPSHOT
可以通过
sudo docker logs f4c6bf7d7b2a8079ff85147a63d1efb4214d2f6c33acb05db3c107ceae592bf5
命令查看日志,f4c6bf7d7b2a8079ff85147a63d1efb4214d2f6c33acb05db3c107ceae592bf5是run之后返回id
这里,我多次打包后,images中出现了<none>镜像,网上查了一下说是不占用存储空间,但是基于我的强迫症,一定想要给他弄掉,所以记录几个docker常用的命令
因为删除镜像需要先把镜像的运行容器关闭并删除,列出运行中的容器,后面加上 -a 代表列出所有容器,包括结束的
# docker container ls
然后关闭容器
# docker container stop <name>
移除容器/镜像
# docker rm <容器名>
# docker rmi <镜像名>
完成
mybatisGenerator自动生成代码,集成Mybatis
首相在pom.xml文件中Mybatis的依赖关联,springboot集成了Mybatis,直接引入即可
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
接下来关联mybatisGenerator,需要关联连接驱动,创建生成的文件信息
在pom.xml中添加
<!-- mysql连接驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency>
以及
<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <executions> <execution> <id>Generate MyBatis Artifacts</id> <goals> <goal>generate</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> </dependencies> </plugin>
然后在application.properties同级目录下创建generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包--> <!-- <classPathEntry location="C:\Users\Administrator\Downloads\mysql-connector-java-8.0.13.jar"/>--> <classPathEntry location="/Users/jinsheng/maven/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库链接URL,用户名、密码 1.一般jdbc数据库的版本6.x以上,都是com.mysql.cj.jdbc.Driver 其他的低版本就是com.mysql.cj.jdbc.Driver --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mall?serverTimezone=GMT" userId="root" password="js818157"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置--> <javaModelGenerator targetPackage="com.modal" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成映射文件的包名和位置--> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名--> <table tableName="tbluser" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> </context> </generatorConfiguration>
这个文件有几处地方需要根据需要修改
在application.properties中添加
spring.datasource.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=xxxxxx spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml
等配置信息
这里记录一下几个比较坑的地方,首先的包的版本冲突,我使用的mybatis是8.0版本,mysql-connection-java.jar的版本如果太低就会报错
还有驱动名称:
低版本的驱动名称是:com.mysql.jdbc.Driver
高版本的驱动名称是:com.mysql.cj.jdbc.Driver
不过这个你在application.properties中配置了‘spring.datasource.driver-class-name’,springboot会友好的提示你
第二个,@Mapper和@MapperScan注解,@MapperScan放在Springboot的启动类上告诉springboot到哪里找mapper接口,如果配了这个就不需要再配置@Mapper了
然后扫描不要为了偷懒只写一个('com'),我就偷懒结果扫描了所有com下的类,注入出现了同名冲突
第三个,扫描mapper.xml不到,出现报错Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required,这需要在application.properties中加上
mybatis.mapper-locations=classpath:mapper/*.xml,告诉springboot需要到哪里去找xml文件,