引言
通过这段时间的学习和自己对springboot这些知识点的掌握情况,自己springboot+mybatis+thymeleaf写了一个简单的后台管理系统,并部署到腾讯云上了,下面的这篇博客就是我简答的描述一下这个项目的操作流程及其涉及的有关的技术和感想等细节,最主要的是给大家展示一下功能实现的一个模块,其他的类似的功能就不再多絮叨,话不多说,小刘就开始给大家讲解该系统的大概流程
准备工作
1.引入相关的坐标
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zzuli</groupId>
<artifactId>springboot-mabatis-thymeleaf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mabatis-thymeleaf</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入springBoot的模板引擎thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--引入jQuery的webjars文件-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
<!--引入bootstrap-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0</version>
</dependency>
<!--mybatis对应的的连接springboot的驱动-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--数据库连接的驱动mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--引入数据源-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>
<!--配置日志的相关的信息-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--配置逆向工程所对应的依赖-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--maven插件-->
<!--mybatis-generator插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<!--指定资源文件的路径-->
<configuration>
<configurationFile>src\main\resources\generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<!--此插件需要依赖的jar包资源-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2.引入相关的配置文件
我这里是分开写了以一个yml文件和一个properties文件分开写的
2.1:properties文件主要写的是对springboot的一些基本的配置,比如端口号,国际化,缓存这些设置
#如何修改服务器的内部的配置信息
server.port=8080
server.servlet.context-path=/xmsms
server.tomcat.uri-encoding=UTF-8
#ResourceBundleMessage Sourceͳһ springboot的国际化
spring.messages.basename=i18n.login
#禁用thymeleaf的缓存
spring.thymeleaf.cache=false
#指定日期的格式
spring.mvc.date-format=yyyy-MM-dd
#开启delete的请求的支持
spring.mvc.hiddenmethod.filter.enabled=true
2.2主要写对数据源相关的配置和mybatis的相关的整合的配置
#如何修改数据库的配置信息
spring:
datasource:
#数据源基本配置
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#已经修改过的数据库连接源 from qzf
# 15点24分
url: jdbc:mysql://localhost:3306/xmsms?serverTimezone=UTC
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#创建自动配置的建表语句 自动配置的写法
# schema:
# - classpath:sql/department.sql
# - classpath:sql/employee.sql
#springboot中配置mybatis的相关的配置信息
#config-location指的的全局变量
#mapper-locations指的是相关的配置文件
#mapper-locations指的是相关的配置文件
mybatis:
config-location: classpath:com/zzuli/springboot/mybatis-config.xml
#配置mapper.xml文件所在的路径
mapper-locations: classpath:com/zzuli/springboot/mapper/*.xml
#配置映射类所在的包名
#type-aliases-package: com.zzuli.springboot.mapper
#你好2019年12月25日15:27:33
3.项目的目录结构
具体代码实现
1.首先写一个配置文件的监控信息,这里配置的是druid监控中心,让我们能够监视出其访问的相关的信息
package com.zzuli.springboot.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @author liugang
* @version 1.0
* @date 2019/12/22 9:28
* 配置数据源信息
*/
@Configuration
public class DruidConfig {
//设置我们自制的数据的连接池
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid的监控
//1.配置一个管理后台的servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
initParams.put("allow",""); //默认可以可以的都可以来访问
initParams.put("deny","19.128.3.26");
//配置很多的初始化参数
bean.setInitParameters(initParams);
return bean;
}
//2.配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
2.写一个服务器有关的配置类的有关的配置类,在这里面来书写我们常用的基本的配置信息
package com.zzuli.springboot.config;
import com.zzuli.springboot.filter.MyFilter;
import com.zzuli.springboot.listener.MyListener;
import com.zzuli.springboot.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
/**
* @author liugang
* @version 1.0
* @date 2019/12/21 9:56
* 创建的是与服务器有关的配置类
*/
@Configuration
public class MyServerConfig {
//注册三大组件 这是servlet
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
registrationBean.setLoadOnStartup(1); //设置项目的启动的顺序 其相关的组件的配置信息都可以设置
return registrationBean;
}
//注册filter
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
//过滤器加载其过滤的条件和其过滤的路径
registrationBean.setFilter(new MyFilter());
registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return registrationBean;
}
//注册监听器listener
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean listenerRegistrationBean = new ServletListenerRegistrationBean(new MyListener());
return listenerRegistrationBean;
}
}
3.这里主力讲解用户登录的模块的信息,这是其controller
package com.zzuli.springboot.controller;
import com.zzuli.springboot.bean.User;
import com.zzuli.springboot.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
/**
* @author liugang
* @version 1.0
* @date 2019/12/23 10:55
* 用户的Controller的管理的业务
*/
@Controller
public class UserController {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private UserService userService;
/**
* 登录方法,匹配账号和密码
* @param username 接收账户名
* @param password 接收密码
* @param map 通过map实现信息回显
* @param session session域对象实现提示信息的显示
* @return 成功返回主页面,失败返回登陆页面
*/
@PostMapping(value = "/user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String,Object> map, HttpSession session){
logger.info("第一次打印日志");
//添加登录的方法进行数据库的匹配数据
User user = userService.UserLogin(username,password);
if(user != null){
//登录成功,防止表单重复提交,可以重定向到主页
//将数据储存到域对象中去
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}
//登录失败
map.put("msg","用户名或者密码错误");
return "login";
}
/**
* 查询到所有的员工到列表页面
* @param model 通过model来进行域对象信息共享实现信息回显
* @return 返回员工列表
*/
@GetMapping("/users")
public String userList(Model model){
List<User> users = userService.getAll();
model.addAttribute("users",users);
return "user/list";
}
/**
* 来到添加页面并展示是否是管理员
* @param model 通过model来进行域对象信息共享实现信息回显
* @return 返回添加页面
*/
@GetMapping("/user")
public String showUser(Model model){
List<User> users = userService.getAll();
model.addAttribute("users",users);
return "user/add";
}
/**
* 添加用户
* @param user 传入用户的实体信息
* @return 返回用户界面
*/
@PostMapping("/user")
public String addUser(User user){
userService.insertUser(user);
return "redirect:/users";
}
/**
* 根据id来查询想要查询的用户的信息
* @param uid 传入用户的id
* @return 返回添加页面
*/
@GetMapping("/user/{uid}")
public String getUserById(@PathVariable("uid") Integer uid,Model model){
//根据id来查询出对应的员工的信息
User user = userService.getUserById(uid);
model.addAttribute("user",user);
//来到员工添加页面,在页面上显示,页面上查询出所有的的员工的权限信息
List<User> users = userService.getAll();
model.addAttribute("users",users);
return "user/add";
}
/**
* 更新用户的方法
* @param user 传入用户的实体类信息
* @return 返回用户界面
*/
@PutMapping("/user")
public String updateUser(User user){
userService.updateUser(user);
return "redirect:/users";
}
/**
* 删除用户的方法
* @param uid 传入用户的id
* @return 返回users列表
*/
@DeleteMapping("/user/{uid}")
public String deleteUser(@PathVariable("uid") Integer uid){
userService.deleteUser(uid);
return "redirect:/users";
}
}
4.service用来处理其相关的业务逻辑
package com.zzuli.springboot.service.impl;
import com.zzuli.springboot.bean.User;
import com.zzuli.springboot.bean.UserExample;
import com.zzuli.springboot.mapper.UserMapper;
import com.zzuli.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author liugang
* @version 1.0
* @date 2019/12/23 10:53
* 设置用的服务层业务
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(Integer uid) {
return userMapper.selectByPrimaryKey(uid);
}
@Override
public User UserLogin(String username, String password) {
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andUnameEqualTo(username);
criteria.andUpwdEqualTo(password);
List<User> users = userMapper.selectByExample(userExample);
try {
return users.get(0);
} catch (Exception e) {
return null;
}
}
@Override
public List<User> getAll() {
return userMapper.selectByExample(null);
}
@Override
public void insertUser(User user) {
userMapper.insertSelective(user);
}
@Override
public void updateUser(User user) {
userMapper.updateByPrimaryKeySelective(user);
}
@Override
public void deleteUser(Integer uid) {
userMapper.deleteByPrimaryKey(uid);
}
}
运行结果
感想
通过这个项目的实现和过程知识的学习,让我能够明白了很多的知识不是咱们不会,只是不懂其之所以流程,我给朋友搭了一个环境利用svn条件3天就让这个项目上线了,部署到腾讯云服务器上了,我们应该多接触新的知识,能够让我们以后的开发才能更加便利,有需要源码的小伙伴可以私聊我哟