搜索
您的当前位置:首页正文

SpringBoot+MyBatisPlus+Vue前后端分离项目快速搭建过程(后端)

来源:好走旅游网
SpringBoot+MyBatisPlus+Vue前后端分离项⽬快速搭建过

程(后端)

⽬录

数据库准备后端搭建

1、快速创建个SpringBoot项⽬2、引⼊依赖3、编写代码快速⽣成代码4、运⾏代码⽣成器⽣成代码5、编写application.properties6、在启动类上添加@MapperScan7、编写测试代码测试数据库是否连接正确9、编写后端的增删改查代码前端搭建

数据库准备

data_test.sql:

/*

SQLyog Enterprise v12.08 (64 bit)

MySQL - 5.7.31 : Database - data_test

**********************************************************************/

/*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

CREATE DATABASE /*!32312 IF NOT EXISTS*/`data_test` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `data_test`;

/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`user_id` int(11) NOT NULL AUTO_INCREMENT,

`user_name` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '账号', `password` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '密码',

`user_state` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '状态,逻辑删除', PRIMARY KEY (`user_id`)

) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;/*Data for the table `user` */LOCK TABLES `user` WRITE;

insert into `user`(`user_id`,`user_name`,`password`,`user_state`) values (1,'keafmd','keafmd','1'),(3,'21312321','123','0'),(11,'213','213','1'),(12,'keafmd','666','0');UNLOCK TABLES;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

后端搭建

1、快速创建个SpringBoot项⽬

第⼀步:Spring Initializr

第⼆步:Spring Initializr Project Settings

第三步:添加个Lombok⼯具

第四步:Finish

初始化的样⼦:

2、引⼊依赖

此处贴上整个pom.xml,部分依赖可能对于简单需求⽽⾔是多余的,可以⾃⾏舍弃。pom.xml代码:

4.0.0

org.springframework.boot spring-boot-starter-parent 2.4.5

com.keafmd

springboot-server 0.0.1-SNAPSHOT springboot-server

Demo project for Spring Boot

1.8

org.springframework.boot spring-boot-starter-web

org.springframework.boot spring-boot-starter-test test

org.springframework.boot spring-boot-devtools

org.projectlombok lombok

org.apache.commons commons-lang3

com.google.guava guava

20.0

com.baomidou

mybatis-plus-boot-starter 3.3.2

mysql

mysql-connector-java 5.1.49

com.baomidou

mybatis-plus-generator 3.3.2 test

org.freemarker freemarker 2.3.31 test

io.github.yedaxia japidocs 1.4.3 test

com.google.code.gson gson 2.8.6 test

com.alibaba fastjson 1.2.73

commons-beanutils commons-beanutils 1.9.4

org.bouncycastle bcprov-jdk15on 1.68

com.auth0 java-jwt 3.4.0

org.springframework.boot spring-boot-maven-plugin

org.projectlombok lombok

3、编写代码快速⽣成代码

因为此代码为辅助代码,放在test包下即可,相关的数据库信息以及包信息需要和你们⾃⼰的保持⼀致,⾃⾏修改,如何包命名和我⼀致,只需要修改数据库相关信息即可。CodeGenerator:

package com.keafmd.mp;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.core.toolkit.StringUtils;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;

import com.baomidou.mybatisplus.generator.config.po.TableInfo;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.ArrayList;import java.util.List;

import java.util.Scanner;

/**

* Keafmd *

* @ClassName: CodeGenerator * @Description: 代码⽣成器 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 17:06

* @Blog: https://keafmd.blog.csdn.net/ */

public class CodeGenerator {

/** *

* 读取控制台内容 *

*/

public static String scanner(String tip) {

Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append(\"请输⼊\" + tip + \":\"); System.out.println(help.toString()); if (scanner.hasNext()) {

String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } }

throw new MybatisPlusException(\"请输⼊正确的\" + tip + \"!\"); }

public static void main(String[] args) { // 代码⽣成器

AutoGenerator mpg = new AutoGenerator(); // 全局配置

GlobalConfig gc = new GlobalConfig();

String projectPath = System.getProperty(\"user.dir\");// System.out.println(\"projectPath = \" + projectPath);

gc.setOutputDir(projectPath + \"/src/main/java\");// gc.setOutputDir(\"D:\\\est\");

gc.setAuthor(\"关注公众号:⽜哄哄的柯南\"); gc.setOpen(false);

// gc.setSwagger2(true); 实体属性 Swagger2 注解 gc.setServiceName(\"%sService\"); mpg.setGlobalConfig(gc);

// 数据源配置

DataSourceConfig dsc = new DataSourceConfig();

dsc.setUrl(\"jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC\"); // dsc.setSchemaName(\"public\");

dsc.setDriverName(\"com.mysql.jdbc.Driver\"); dsc.setUsername(\"root\");

dsc.setPassword(\"18044229\"); mpg.setDataSource(dsc);

// 包配置

PackageConfig pc = new PackageConfig(); pc.setModuleName(null); pc.setParent(\"com.keafmd\"); mpg.setPackageInfo(pc);

// ⾃定义配置

InjectionConfig cfg = new InjectionConfig() { @Override

public void initMap() { // to do nothing } };

// 如果模板引擎是 freemarker

String templatePath = \"/templates/mapper.xml.ftl\"; // 如果模板引擎是 velocity

// String templatePath = \"/templates/mapper.xml.vm\";

// ⾃定义输出配置

List focList = new ArrayList<>(); // ⾃定义配置会被优先输出

focList.add(new FileOutConfig(templatePath) { @Override

public String outputFile(TableInfo tableInfo) {

// ⾃定义输出⽂件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发⽣变化!!

return projectPath + \"/src/main/resources/com/keafmd/mapper/\" + tableInfo.getEntityName() + \"Mapper\" + StringPool.DOT_XML; } });

cfg.setFileOutConfigList(focList); mpg.setCfg(cfg);

// 配置模板

TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null);

mpg.setTemplate(templateConfig);

// 策略配置

StrategyConfig strategy = new StrategyConfig();

strategy.setNaming(NamingStrategy.underline_to_camel);

strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true);

strategy.setInclude(scanner(\"表名,多个英⽂逗号分割\").split(\ strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(\"m_\"); mpg.setStrategy(strategy);

mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); }}

4、运⾏代码⽣成器⽣成代码

在控制台输⼊user(表名)

红框内为⾃动⽣成的代码:

5、编写application.properties

个⼈习惯把application.properties改为application.yml,修改端⼝为80

server: port: 80

spring:

datasource:

url: jdbc:mysql://127.0.0.1/data_test?useSSL=false&&characterEncoding=UTF-8 driver-class-name: com.mysql.jdbc.Driver username: root

password: 18044229

jackson:

date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 mvc:

throw-exception-if-no-handler-found: true web:

resources:

add-mappings: false

6、在启动类上添加@MapperScan

SpringbootServerApplication:

package com.keafmd;

import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication

@MapperScan(\"com.keafmd.mapper\")public class SpringbootServerApplication {

public static void main(String[] args) {

SpringApplication.run(SpringbootServerApplication.class, args); }}

7、编写测试代码测试数据库是否连接正确

1、在 UserMapper代码页⼤括号内,按下Alt+Insert,选择Test

2、Ok

3、⾃动⽣成了测试类

4、编写测试代码UserMapperTest :

package com.keafmd.mapper;

import com.keafmd.SpringbootServerApplication;import com.keafmd.entity.User;

import com.keafmd.service.UserService;import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest(classes = SpringbootServerApplication.class)class UserMapperTest { @Resource

UserService userService;

@Test

public void test1(){

List userList = userService.list(); for (User user : userList) { System.out.println(user); } }

}

5、测试结果

⾄此,后端和数据库连接没问题。

8、编写后端的⼯具类代码(封装结果集、⽇期处理、解决跨域请求)

1、CommonResult

package com.keafmd.common;import lombok.Getter;

/**

* Keafmd *

* @ClassName: CommonResult * @Description: 封装结果集 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@Getter

public class CommonResult { private Integer code; private String message; private Object obj;

private CommonResult(Integer code, String message, Object obj) { this.code = code;

this.message = message; this.obj = obj; }

public static CommonResult nohandler() {

return new CommonResult(ResultCode.NOHANDLER.getCode(), ResultCode.NOHANDLER.getMessage(),null); }

public static CommonResult success(Object data) {

return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(),data); }

public static CommonResult failed() {

return new CommonResult(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMessage(),null); }

public static CommonResult failed(String message) {

return new CommonResult(ResultCode.FAILED.getCode(),message,null); }

public static CommonResult notoken() {

return new CommonResult(ResultCode.NOTOKEN.getCode(), ResultCode.NOTOKEN.getMessage(),null); }

public static CommonResult nopremiss() {

return new CommonResult(ResultCode.NOPERMISS.getCode(), ResultCode.NOPERMISS.getMessage(),null); }}

2、DateConverter

package com.keafmd.common;

import org.springframework.context.annotation.Configuration;import org.springframework.core.convert.converter.Converter;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;

import java.util.regex.Pattern;

/**

* Keafmd *

* @ClassName: DateConverter * @Description: ⽇期处理 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@Configuration

public class DateConverter implements Converter { public DateConverter() {

// System.out.println(\"初始化........\"); }

static List sdfs = new ArrayList();

static {

sdfs.add(new SimpleDateFormat(\"yyyy/MM/dd HH:mm:ss\")); sdfs.add(new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\")); sdfs.add(new SimpleDateFormat(\"yyyy-MM-dd\")); sdfs.add(new SimpleDateFormat(\"yyyy/MM/dd\")); }

@Override

public Date convert(String s) { SimpleDateFormat sdf = null;

if (Pattern.matches(\"^\\\\d{4}-\\\\d{2}-\\\\d{2} \\\\d{2}:\\\\d{2}:\\\\d{2}$\ sdf = sdfs.get(1); }

else if (Pattern.matches(\"^\\\\d{4}/\\\\d{2}/\\\\d{2} \\\\d{2}:\\\\d{2}:\\\\d{2}$\ sdf = sdfs.get(0); }

else if (Pattern.matches(\"^\\\\d{4}/\\\\d{2}/\\\\d{2}$\ sdf = sdfs.get(3); }

else if (Pattern.matches(\"^\\\\d{4}-\\\\d{2}/-\\\\d{2}}$\ sdf = sdfs.get(2); }

Date date = null; try {

date = sdf.parse(s);

} catch (ParseException e) { e.printStackTrace(); }

return date; }}

3、LocalDateTimeConverter

package com.keafmd.common;

import org.springframework.core.convert.converter.Converter;import org.springframework.stereotype.Component;import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;/**

* Keafmd *

* @ClassName: LocalDateTimeConverter * @Description: ⽇期处理 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@Component

public class LocalDateTimeConverter implements Converter { //2021-04-29%2001:02:03 @Override

public LocalDateTime convert(String s) {

return LocalDateTime.parse(s, DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")); }}

4、ResultCode

package com.keafmd.common;import lombok.Getter;

/**

* Keafmd *

* @ClassName: ResultCode * @Description: 结果代码 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@Getter

public enum ResultCode {

NOHANDLER(404,\"请求地址错误\"), SUCCESS(200,\"操作成功\"), FAILED(500,\"操作失败\"),

NOTOKEN(401,\"未登录或登录已超时\"), NOPERMISS(403,\"⽆操作权限\"), ;

private Integer code; private String message;

ResultCode(Integer code, String message) { this.code = code;

this.message = message; }

}

5、AppConfig

package com.keafmd.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;

import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MySqlDialect;

import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;import com.fasterxml.jackson.annotation.JsonInclude;

import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;import com.keafmd.common.DateConverter;

import com.keafmd.common.LocalDateTimeConverter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;import org.springframework.format.FormatterRegistry;

import org.springframework.http.converter.HttpMessageConverter;

import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.cors.CorsConfiguration;

import org.springframework.web.cors.UrlBasedCorsConfigurationSource;import org.springframework.web.filter.CorsFilter;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import java.time.LocalDate;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;import java.util.List;

/**

* Keafmd *

* @ClassName: AppConfig * @Description: 解决跨域请求 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@Configuration

public class AppConfig extends WebMvcConfigurationSupport {

/**

* 分页插件 * @return */

@Bean

public PaginationInterceptor paginationInterceptor() {

PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDialect(new MySqlDialect());

paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; }

@Bean

FilterRegistrationBean cors(){

FilterRegistrationBean registrationBean = new FilterRegistrationBean(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true);

config.addAllowedOrigin(\"http://127.0.0.1:81\"); config.addAllowedHeader(\"*\"); config.addAllowedMethod(\"*\");

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(\"/**\ CorsFilter filter = new CorsFilter(source); registrationBean.setFilter(filter);

registrationBean.addUrlPatterns(\"/*\"); return registrationBean; }

/**

* curl http://127.0.0.1/user/getById?id=31 * @param converters */

@Override

protected void configureMessageConverters(List> converters) { ObjectMapper objectMapper = new ObjectMapper();

objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);// objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //忽略 null 字段 JavaTimeModule javaTimeModule = new JavaTimeModule();

javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\")));

// javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")));// javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\"))); objectMapper.registerModule(javaTimeModule);

converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); }

@Override

protected void addFormatters(FormatterRegistry registry) { super.addFormatters(registry);

registry.addConverter(new DateConverter());

registry.addConverter(new LocalDateTimeConverter()); }}

6、DefaultExceptionHandler

package com.keafmd.config;

import com.keafmd.common.CommonResult;

import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import org.springframework.web.servlet.NoHandlerFoundException;import javax.servlet.http.HttpServletRequest;/**

* Keafmd *

* @ClassName: DefaultExceptionHandler * @Description:

* @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11

* @Blog: https://keafmd.blog.csdn.net/ */

@RestControllerAdvice

public class DefaultExceptionHandler {

@ExceptionHandler

public CommonResult exceptionHandler(HttpServletRequest request, Exception ex) { ex.printStackTrace();

if(ex instanceof NoHandlerFoundException) { return CommonResult.nohandler(); }

return CommonResult.failed(ex.getMessage()); }

}

9、编写后端的增删改查代码

1、在UserService接⼝中编写分页查询代码

package com.keafmd.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.keafmd.entity.User;

import com.baomidou.mybatisplus.extension.service.IService;/** *

* 服务类 *

*

* @author 关注公众号:⽜哄哄的柯南 * @since 2021-04-29 */

public interface UserService extends IService { Page pageList(Page page, User user);}

2、在UserServiceImpl实现类中实现分页查询和模糊查找

package com.keafmd.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.keafmd.entity.User;

import com.keafmd.mapper.UserMapper;import com.keafmd.service.UserService;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.stereotype.Service;

/** *

* 服务实现类 *

*

* @author 关注公众号:⽜哄哄的柯南 * @since 2021-04-29 */

@Service

public class UserServiceImpl extends ServiceImpl implements UserService { @Override

public Page pageList(Page page, User user) { if(page == null){

page = new Page(); }

QueryWrapper wrapper = new QueryWrapper();

if(user!=null && StringUtils.isNotEmpty(user.getUserName())){ //根据user_name字段模糊查找

wrapper.like(\"user_name\ }

return super.page(page,wrapper); }}

3、在UserController中编写增删改查代码

package com.keafmd.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.keafmd.common.CommonResult;import com.keafmd.entity.User;

import com.keafmd.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;

/** *

* 前端控制器 *

*

* @author 关注公众号:⽜哄哄的柯南 * @since 2021-04-29 */

@RestController

@RequestMapping(\"/user\")public class UserController {

@Autowired

UserService userService;

/** * 查找 * @return */

@RequestMapping(\"/list\")

CommonResult list(ModelMap modelMap, Page page, @ModelAttribute(\"user\") User user) { page = userService.pageList(page, user); modelMap.addAttribute(\"page\ return CommonResult.success(page); }

@RequestMapping(\"/save\")

CommonResult save(User user){

return CommonResult.success(userService.saveOrUpdate(user)); }

/**

* 根据id查 * @param id * @return */

@RequestMapping(\"/getById\")

CommonResult getById(Integer id) {

return CommonResult.success(userService.getById(id)); }

/**

* 删除,逻辑删除 * @param id * @return */

@RequestMapping(\"/del\")

CommonResult del(Integer id ) {

User user = userService.getById(id); user.setUserState(\"0\");

return CommonResult.success(userService.updateById(user)); }

/**

* 批量删除 * @param id * @return */

@RequestMapping(\"/delByIds\")

CommonResult delByIds(Integer[] id) { /*for (Integer integer : id) { System.out.println(integer); }*/

return CommonResult.success(userService.removeByIds(Arrays.asList(id))); }}

前端搭建

由于篇幅有限,前端搭建单独再写⼀篇

以上就是SpringBoot+MyBatisPlus+Vue 前后端分离项⽬快速搭建【后端篇】【快速⽣成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】的全部内容

到此这篇关于SpringBoot+MyBatisPlus+Vue 前后端分离项⽬快速搭建过程(后端)的⽂章就介绍到这了,更多相关

SpringBoot+MyBatisPlus+Vue 前后端分离搭建内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容

Top