javascript
Springboot后台管理(CRUD)
一:前言
這個(gè)就是用springboot實(shí)現(xiàn)后臺(tái)管理(CRUD)的小demo,相比于SSM的配置地獄,springboot的自動(dòng)配置確實(shí)很牛,tomcat都內(nèi)置,我們想要修改相關(guān)的信息只要在yaml配置文件修改就行了,關(guān)于Dao層,這個(gè)mybatis-plus,quo實(shí)是很牛逼,這個(gè)連sql都是省略了,但也僅限于單表的sql,復(fù)雜的sql語句還得靠mapper.xml中進(jìn)行書寫。總之一句話,你不學(xué)SSM,springboot里面很多原理不理解,但是學(xué)了springboot,SSM配置起來是真麻煩。
二:用到的相關(guān)技術(shù)
spingboot(2.6.3)+Mybatis-Plus+Maven+thmeleaf+Mysql
環(huán)境是JDK1.8,maven是3.4.1,mysql5.7
三:實(shí)現(xiàn)功能流程
- 在springboot官方文檔中找到對(duì)應(yīng)的 場(chǎng)景啟動(dòng)器(starter)
- 分析其–xxxautoConfigration
- 然后找到xxxxProperties綁定了配置文件有哪些。
- 哪些需要修改 還是自定義
四:功能展示
1:登錄首頁
2:主頁面
3:展示表單(select)
4:刪除一條記錄(delete)
點(diǎn)擊刪除 會(huì)自動(dòng)刪除,同時(shí)的話,在那頁刪除還會(huì)自動(dòng)回到那頁,這里就是點(diǎn)擊刪除 發(fā)送這個(gè)請(qǐng)求的時(shí)候,把當(dāng)前頁的信息也給發(fā)送處理的請(qǐng)求的,所以請(qǐng)求里信息會(huì)被Controller層處理,處理完請(qǐng)求在把該頁信息用到反應(yīng)請(qǐng)求的路徑上。
5:修改一條記錄(Update)
修改頁面:
6:增加一條記錄信息(insert)
五:上碼
1:導(dǎo)入相關(guān)場(chǎng)景啟動(dòng)器
<?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.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.wyj</groupId><artifactId>springboot-05-web02</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-05-web02</name><description>springboot-05-web02</description><properties><java.version>11</java.version><repackage.classifier/><spring-native.version>0.11.2</spring-native.version><kotlin.version>1.6.20-M1</kotlin.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--導(dǎo)入jdbc的場(chǎng)景啟動(dòng)器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--導(dǎo)入數(shù)據(jù)庫的驅(qū)動(dòng)包 因?yàn)槲覀儾恢赖降资悄膫€(gè)驅(qū)動(dòng)器 mysql 還是其他的 --><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--導(dǎo)入Mybatis-Plus的場(chǎng)景--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib-jdk8</artifactId><version>${kotlin.version}</version></dependency><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-test</artifactId><version>${kotlin.version}</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes><classifier>${repackage.classifier}</classifier><image><builder>paketobuildpacks/builder:tiny</builder><env><BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE></env></image></configuration></plugin><plugin><groupId>org.springframework.experimental</groupId><artifactId>spring-aot-maven-plugin</artifactId><version>${spring-native.version}</version><executions><execution><id>test-generate</id><goals><goal>test-generate</goal></goals></execution><execution><id>generate</id><goals><goal>generate</goal></goals></execution></executions></plugin><plugin><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-maven-plugin</artifactId><version>${kotlin.version}</version><executions><execution><id>compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>test-compile</id><phase>test-compile</phase><goals><goal>test-compile</goal></goals></execution></executions><configuration><jvmTarget>1.8</jvmTarget></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><executions><execution><id>compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>testCompile</id><phase>test-compile</phase><goals><goal>testCompile</goal></goals></execution></executions></plugin></plugins></build><repositories><repository><id>spring-releases</id><name>Spring Releases</name><url>https://repo.spring.io/release</url><snapshots><enabled>false</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>spring-releases</id><name>Spring Releases</name><url>https://repo.spring.io/release</url><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories><profiles><profile><id>native</id><properties><repackage.classifier>exec</repackage.classifier><native-buildtools.version>0.9.9</native-buildtools.version></properties><dependencies><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-launcher</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>${native-buildtools.version}</version><extensions>true</extensions><executions><execution><id>test-native</id><phase>test</phase><goals><goal>test</goal></goals></execution><execution><id>build-native</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions></plugin></plugins></build></profile></profiles></project>2:yaml配置文件
spring:datasource:url: jdbc:mysql://localhost:3306/smbms?useSSL=trueusername: rootpassword: wyjdriver-class-name: com.mysql.jdbc.Driver#Mybatis-plus配置 mybatis-plus:#全局配置文件的路徑config-location: classpath:mybatis/mybatis-config.xml#指明.xml文件的路徑mapper-locations: classpath:mybatis/mapper/*.xml3:Pojo
(1):admin
package com.wyj.Pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString;@Data @AllArgsConstructor @NoArgsConstructor @ToString public class Admin {private String userName;private String passWord; }(2):User
package com.wyj.Pojo;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor @TableName(value = "userTO") public class User {//Mybatis-Plus的測(cè)試數(shù)據(jù)private Integer id;private String name;private Integer age;private String email;}4:mapper
這里繼承了BaseMapper,很多sql就不用寫了,這里還需要注意 的是,默認(rèn)的表明是和類名一致的,如過類名和表名不一致的話,需要用注解@TableName 把表名注上
package com.wyj.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.wyj.Pojo.User; import org.apache.ibatis.annotations.Mapper;import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map;@Mapper public interface UserMapper extends BaseMapper<User> {}5:Service層
(1)Service接口
package com.wyj.Service;import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wyj.Pojo.User; import com.wyj.mapper.UserMapper;import java.util.List;public interface UserService extends IService<User> {}(2):Service的實(shí)現(xiàn)類
package com.wyj.Service.imp;import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wyj.Pojo.User; import com.wyj.Service.UserService; import com.wyj.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service public class UserServiceImp extends ServiceImpl<UserMapper,User> implements UserService {}6:Controller層
(1):IndexController
package com.wyj.Controller;import com.wyj.Pojo.Admin; import com.wyj.Pojo.TextUser; import com.wyj.Pojo.User; import com.wyj.Service.imp.TextUserServiceImp; 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.servlet.http.HttpSession;@Controller public class IndexController {//設(shè)置首頁 只要請(qǐng)求是'/'或者是'/login' 我們就會(huì)返回首頁@RequestMapping(value = {"/","/login"})public String loginPage() {return "login";}@RequestMapping("/let")public String loginPage(Admin admin, HttpSession session, Model model) {if ("wyj".equals(admin.getUserName()) && "123".equals(admin.getPassWord())) {session.setAttribute("loginUser",admin);return "redirect:main.html";//這里重定向的是一個(gè)請(qǐng)求所以得重新寫一個(gè)}else{ //一般我們r(jià)eturn的是一個(gè) html 頁面//視圖解析器自動(dòng)給我們加上前綴和后綴model.addAttribute("msg","請(qǐng)輸入正確的密碼和用戶名");return "login";}}@RequestMapping("/main.html")public String showPage() {return "main";}}(2):TableController
package com.wyj.Controller;import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wyj.Pojo.User; import com.wyj.Service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes;import java.util.List;@Controller public class TableController {@Autowiredprivate UserService userService;@GetMapping("/basic_table")public String basic_table() {return "table/basic_table";}@GetMapping("/dynamic_table")public String dynamic_table(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model) {//List<User> list = userService.getUserList();//構(gòu)造分頁參數(shù)Page<User> page = new Page<>(pn, 2);//調(diào)用page進(jìn)行分頁Page<User> userPage = userService.page(page, null);long current = userPage.getCurrent();//當(dāng)前是幾頁long pages = userPage.getPages();//當(dāng)前總共的頁數(shù)long total = userPage.getTotal();//總共的記錄數(shù)目/條數(shù)//獲取表當(dāng)中的數(shù)據(jù)List<User> records = userPage.getRecords();//這個(gè)userPage里面有我們存著的當(dāng)前頁和我們的表中的數(shù)據(jù)(但這個(gè)數(shù)據(jù)得靠我們自己取出來)model.addAttribute("users",userPage);return "table/dynamic_table";}//刪除功能// @ResponseBody@GetMapping("/delete")public String deleteTable(@RequestParam("id") Integer id,@RequestParam(value = "pn",defaultValue = "1") Integer pn,RedirectAttributes ra) {userService.removeById(id);//這個(gè)相當(dāng)于從前端獲取到一個(gè)參數(shù) 然后就將其加到我們新的重定向的路徑上ra.addAttribute("pn",pn);return "redirect:dynamic_table";}//修改一個(gè)用戶的信息@GetMapping("/update")public String updateTable(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age,@RequestParam("email") String email,Model model) {User user = new User();//獲取到我們要修改用戶的信息的id信息user.setId(id);if(name != null) user.setName(name);if(age != null) user.setAge(age);if(email != null) user.setEmail(email);userService.updateById(user);model.addAttribute("msg","修改用戶信息成功");return "redirect:dynamic_table";}//增加一個(gè)用戶@GetMapping("/add_table")public String addTable(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age,@RequestParam("email") String email) {User user = new User(id, name, age, email);userService.save(user);return "redirect:dynamic_table";}@GetMapping("/editable_table")public String editable_table() {return "table/editable_table";}@GetMapping("/responsive_table")public String responsive_table() {return "table/responsive_table";}@GetMapping("/update_table.html")public String getUpdateTable (Model model,Integer id) {User user = userService.getById(id);model.addAttribute("user",user);return "table/update_table";}//轉(zhuǎn)發(fā)到增加用戶頁面@GetMapping("add_table.html")public String addTable() {return "table/add_table";}}7:攔截器
package com.wyj.MyLanJie;import lombok.extern.log4j.Log4j; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;@Slf4j public class loginInterceptor implements HandlerInterceptor {/**** 方法處理前:如果返回true 那么就繼續(xù)往下執(zhí)行 返回false就不往下執(zhí)行了** @param request* @param response* @param handler* @return* @throws Exception*//*** preHandle方法是進(jìn)行處理器攔截用的,顧名思義,該方法將在Controller處理之前進(jìn)行調(diào)用,SpringMVC中的Interceptor攔截器是鏈?zhǔn)降?#xff0c;可以同時(shí)存在* 多個(gè)Interceptor,然后SpringMVC會(huì)根據(jù)聲明的前后順序一個(gè)接一個(gè)的執(zhí)行,而且所有的Interceptor中的preHandle方法都會(huì)在* Controller方法調(diào)用之前調(diào)用。SpringMVC的這種Interceptor鏈?zhǔn)浇Y(jié)構(gòu)也是可以進(jìn)行中斷的,這種中斷方式是令preHandle的返* 回值為false,當(dāng)preHandle的返回值為false的時(shí)候整個(gè)請(qǐng)求就結(jié)束了。*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();Object loginUser = session.getAttribute("loginUser");if(loginUser != null) {return true;//放行}request.setAttribute("msg","請(qǐng)先登錄");request.getRequestDispatcher("/login").forward(request,response);return false;}@Override//方法執(zhí)行后public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }這個(gè)需要我們自動(dòng)配置一下,有些頁面是放行的有些頁面是攔截的
package com.wyj.Config;import com.wyj.MyLanJie.loginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class interceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new loginInterceptor())//將攔截器注冊(cè)到容器中.addPathPatterns("/**")//設(shè)置攔截要求.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**","/aa/**","/let");//放行的要求}}總結(jié)
以上是生活随笔為你收集整理的Springboot后台管理(CRUD)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iQOO 12系列燃途版11月24日开售
- 下一篇: Stellantis 集团从东风集团回购