项目介绍
通过Spring boot构建一个简单的理发预约系统,主要功能包括:用户注册、用户登录、查看理发师列表、预约理发师、管理理发师、查看订单。本文主要介绍项目搭建和开发流程,为节省篇幅,部分业务逻辑代码不做详细解释。完整项目可以在GitHub中下载,链接:简易理发预约系统
软件与开发环境
- 操作系统:Windows10
- 开发软件: IntelliJ IDEA 2021.2.3,Navicat Premium 15.0.23
- 编程语言:JDK 1.8,MySQL 8.0.27
- 浏览器:Firefox 98.0.2
创建项目
maven-archetype-quickstart
过程中注意保持网络稳定,若出现错误,可以参考成功解决Failure to transfer org.apache.maven:maven-archiver:jar:x.x from https://repo.maven.apache.org/m
项目搭建
添加resource目录
选择Haircut/src/main/java/com/haircut/App.java后Run->Run ‘App’
可以看到成功运行
修改pom.xml后更新maven(Reload All Maven Projects)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.haircut</groupId>
<artifactId>haircut</artifactId>
<version>1.0-SNAPSHOT</version>
<name>haircut</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>mybatis generator</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件-->
<verbose>true</verbose>
<!--允许自动覆盖文件-->
<overwrite>false</overwrite>
<configurationFile>
src/main/resources/mybatis-generator.xml
</configurationFile>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
在haircut/src/main/resources下创建application.properties文件,其中可以修改端口号和添加mybatis路径
server.port = 8092
mybatis.mapperLocations = classpath:mapping/*.xml
spring.datasource.name = haircut
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/haircut
spring.datasource.username = alpha
spring.datasource.password = 123456
#druid
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
在haircut/src/main/resources下创建mapping目录
新建数据库
创建user_info表,设置id为自动递增
创建user_password表,设置id为自动递增
在haircut/src/main/resources下创建mapping目录
在haircut/src/main/java/com.haircut下创建dataobject目录
在haircut/src/main/java/com.haircut下创建dao目录
在haircut/src/main/resources下创建mybatis-generator.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>
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/haircut" userId="alpha" password="123456"></jdbcConnection>
<!--生成DataObject类存放位置-->
<javaModelGenerator targetPackage="com.haircut.dataobject" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.haircut.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<!-- <table tableName="sequence_info" domainObjectName="SequenceDO"></table>-->
<!-- <table tableName="order_info" domainObjectName="OrderDO"></table>-->
<table tableName="user_info" domainObjectName="UserDO"></table>
<table tableName="user_password" domainObjectName="UserPasswordDO"></table>
<!-- <table tableName="staff" domainObjectName="StaffDO"></table>-->
<!-- <table tableName="staff_stock" domainObjectName="StaffStockDO"></table>-->
</context>
</generatorConfiguration>
其中table标签中的内容为对应数据库的表名及生成的文件名,其他注释掉的table标签在之后生成表和类名时使用
使用mybatis的自动生成工具生成对应数据库文件的映射:
Run->haircut [mybatis-generator:generate]生成对应的类,可以看到在dao,dataobject和mapping目录下有生成的文件
用户模型
在haircut/src/main/java/com.haircut下创建controller目录
在haircut/src/main/java/com.haircut下创建service目录
在haircut/src/main/java/com.haircut/controller下创建UserController类
在haircut/src/main/java/com.haircut/service下创建UserService接口
在haircut/src/main/java/com.haircut/service下创建impl目录
在haircut/src/main/java/com.haircut/service/impl下创建UserServiceImpl类
在haircut/src/main/java/com.haircut/service下创建model目录
在haircut/src/main/java/com.haircut/service/model下创建UserModel目录
修改UserPasswordDOMapper.xml,为其添加selectByUserId语句
<select id="selectByUserId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user_password
where user_id = #{userId,jdbcType=INTEGER}
</select>
修改UserPasswordDOMapper.java,为其添加selectByUserId方法
UserPasswordDO selectByUserId(Integer userId);
在haircut/src/main/java/com.haircut/controller下创建viewobject目录
在haircut/src/main/java/com.haircut/controller/viewobject下创建UserVO类
通过UserVO传输给用户信息,隐藏密码等隐私信息
在haircut/src/main/java/com.haircut下创建response目录
在haircut/src/main/java/com.haircut/response下创建ComonReturnType类
在haircut/src/main/java/com.haircut下创建error目录
在haircut/src/main/java/com.haircut/error下创建CommonError接口
在haircut/src/main/java/com.haircut/error下创建EmBusinessError枚举
在haircut/src/main/java/com.haircut/error下创建BusinessException类
在haircut/src/main/java/com.haircut/controller下创建BaseController类
修改haircut/src/main/resources/mapping/UserDOMapper.xml的内容以实现数据库中user_id和id的绑定
为user_info表的telephone字段添加unique索引,将其作为登录时的账号
修改UserDOMapper.xml,为其添加selectByTelephone语句
<select id="selectByTelephone" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user_info
where telephone = #{telephone,jdbcType=VARCHAR}
</select>
修改UserDOMapper.java,为其添加selectByTelephone方法
UserDO selectByTelephone(String telephone);
理发师模型
在haircut/src/main/java/com.haircut/service/model下创建StaffModel类
创建staff表,设置id为自动递增
staff_stock表,设置id为自动递增,其中stock表示理发师的剩余预约名额
重新生成mybatis
分别修改StaffDOMapper.xml和StaffStockDOMapper.xml的insert和insertSelect语句(同用户模型中的操作)
在haircut/src/main/java/com.haircut/service下创建ItemService接口
在haircut/src/main/java/com.haircut/service/impl下创建ItemServiceImpl类
修改StaffStockDOMapper.xml,为其添加selectByStaffId语句
修改StaffStockDOMapper.java,为其添加selectByStaffId方法
在haircut/src/main/java/com.haircut/controller下创建StaffController类
修改StaffDOMapper.xml,为其添加listStaff语句,以遍历理发师列表
修改StaffDOMapper.java,为其添加listStaff方法
订单模型
在haircut/src/main/java/com.haircut/service/model下创建OrderModel类
创建order_info表,注意这里的id的类型为varchar
创建sequence_info表,用来生成上述order_info表中的id
为sequence_info表中添加数据,name=order_info, step=1
在haircut/src/main/java/com.haircut/service下创建OrderService接口
在haircut/src/main/java/com.haircut/service/impl下创建OrderServiceImpl类
修改StaffStockDOMapper.xml,为其添加decreaseStock语句,以下单减少理发师的stock
修改StaffStockDOMapper.java,为其添加decreaseStock方法
在haircut/src/main/java/com.haircut/controller下创建OrderController类
运行结果
登录界面
登录成功后进入系统选择理发师
点击列表中的理发师后,确认信息并预约
回到登录界面,可以添加理发师和查看订单