基于VScode和idea开发
效果如下
后端开发
idea中的项目结构
config配置跨域文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//1) 允许的域,不要写*,否则cookie就无法使用了
config.addAllowedOrigin("*");
//2) 是否发送Cookie信息
config.setAllowCredentials(false);
//3) 允许的请求方式
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
// 4)允许的头信息
config.addAllowedHeader("*");
//2.添加映射路径,我们拦截一切请求
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}
controller控制器
BookController
import com.czxy.domain.Book;
import com.czxy.service.BookService;
import com.czxy.vo.BaseResult;
import com.czxy.vo.BookVo;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName BookController
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:38
*/
@RestController
@RequestMapping("/book")
public class BookController {
@Resource
BookService bookService;
@PostMapping("/{pageNum}/{pageSize}")
public BaseResult<List<Book>> searchBook(
@PathVariable("pageNum") Integer pageNum,
@PathVariable("pageSize") Integer pageSize,
@RequestBody BookVo bookVo
){
PageInfo<Book> list = bookService.searchBook(pageNum,pageSize,bookVo);
return BaseResult.ok("成功",list);
}
@PostMapping("/{id}")
public BaseResult findByIdBook(@PathVariable("id") Integer id){
Book book = bookService.findByIdBook(id);
return BaseResult.ok("成功",book);
}
@PutMapping
public BaseResult updateBook(@RequestBody Book book){
Boolean flag = bookService.updateBook(book);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
@PostMapping
public BaseResult insertBook(@RequestBody Book book){
Boolean flag = bookService.insertBook(book);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
@DeleteMapping("/{ids}")
public BaseResult deleteBook(@PathVariable("ids") String ids){
Boolean flag = bookService.deleteBook(ids);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
}
CategoryController
import com.czxy.domain.Category;
import com.czxy.service.CategoryService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName CategoryController
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:39
*/
@RestController
@RequestMapping("/category")
public class CategoryController {
@Resource
CategoryService categoryService;
@GetMapping
public BaseResult searchAll() {
List<Category> list = categoryService.searchAll();
return BaseResult.ok("成功", list);
}
@PostMapping
public BaseResult insetCategory(@RequestBody Category category) {
Boolean flag = categoryService.insertCategory(category);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
@PostMapping("/{cid}")
public BaseResult findByCid(@PathVariable("cid") Integer cid) {
Category category = categoryService.findByCid(cid);
return BaseResult.ok("成功", category);
}
@PutMapping
public BaseResult updateCategory(@RequestBody Category category) {
Boolean flag = categoryService.updateCategory(category);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
@DeleteMapping("/{cid}")
public BaseResult deleteCategory(@PathVariable("cid") Integer cid){
Boolean flag = categoryService.deleteCategory(cid);
if (flag) {
return BaseResult.ok("成功");
} else {
return BaseResult.error("失败");
}
}
}
dao持久层
此处我使用的是通用Mapper,所以代码很少
domain实体类
Book实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* @ClassName Book
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:34
*/
@Table(name = "book")
@Data
@ToString
public class Book {
@Id
private Integer id;
private String name;
private Double price;
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private Date publishTime;
private Integer cid;
private Category category;
}
Category实体类
import lombok.Data;
import lombok.ToString;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @ClassName Category
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:33
*/
@Data
@ToString
@Table(name = "category")
public class Category {
@Id
private Integer cid;
private String cname;
private String cdesc;
}
service业务层
接口
BookService
import com.czxy.domain.Book;
import com.czxy.vo.BookVo;
import com.github.pagehelper.PageInfo;
/**
* @ClassName BookService
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:37
*/
public interface BookService {
PageInfo<Book> searchBook(Integer pageNum, Integer pageSize, BookVo bookVo);
Book findByIdBook(Integer id);
Boolean insertBook(Book book);
Boolean updateBook(Book book);
Boolean deleteBook(String ids);
}
CategoryService
import com.czxy.domain.Category;
import java.util.List;
/**
* @ClassName BookService
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:37
*/
public interface CategoryService {
List<Category> searchAll();
Boolean insertCategory(Category category);
Category findByCid(Integer cid);
Boolean updateCategory(Category category);
Boolean deleteCategory(Integer cid);
}
实现类
BookServiceImpl
import com.czxy.dao.BookDao;
import com.czxy.dao.CategoryDao;
import com.czxy.domain.Book;
import com.czxy.service.BookService;
import com.czxy.vo.BookVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName BookServiceImpl
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:37
*/
@Transactional
@Service
public class BookServiceImpl implements BookService {
@Resource
BookDao bookDao;
@Resource
CategoryDao categoryDao;
@Override
public PageInfo<Book> searchBook(Integer pageNum, Integer pageSize, BookVo bookVo) {
Example example = new Example(Book.class);
Example.Criteria criteria = example.createCriteria();
if (bookVo.getCid() != null && !"".equals(bookVo.getCid())) {
criteria.andEqualTo("cid", bookVo.getCid());
}
if (bookVo.getName() != null && !"".equals(bookVo.getName())) {
criteria.andLike("name", "%" + bookVo.getName() + "%");
}
if (bookVo.getMinPrice() != null && !"".equals(bookVo.getMinPrice())) {
criteria.andGreaterThanOrEqualTo("price", bookVo.getMinPrice());
}
if (bookVo.getMaxPrice() != null && !"".equals(bookVo.getMaxPrice())) {
criteria.andLessThanOrEqualTo("price", bookVo.getMaxPrice());
}
PageHelper.startPage(pageNum, pageSize);
List<Book> list = bookDao.selectByExample(example);
for (Book book : list) {
book.setCategory(categoryDao.selectByPrimaryKey(book.getCid()));
}
return new PageInfo<>(list);
}
@Override
public Book findByIdBook(Integer id) {
return bookDao.selectByPrimaryKey(id);
}
@Override
public Boolean insertBook(Book book) {
return bookDao.insert(book) == 1;
}
@Override
public Boolean updateBook(Book book) {
return bookDao.updateByPrimaryKey(book) == 1;
}
@Override
public Boolean deleteBook(String ids) {
String[] split = ids.split(",");
int i=0;
for (String s : split) {
i+= bookDao.deleteByPrimaryKey(Integer.parseInt(s));
}
return i ==split.length;
}
}
CategoryServiceImpl
import com.czxy.dao.CategoryDao;
import com.czxy.domain.Category;
import com.czxy.service.CategoryService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName BookServiceImpl
* @Description TODO
* @Author Administrator
* @date 2021-11-05 14:37
*/
@Transactional
@Service
public class CategoryServiceImpl implements CategoryService {
@Resource
CategoryDao categoryDao;
@Override
public List<Category> searchAll() {
return categoryDao.selectAll();
}
@Override
public Boolean insertCategory(Category category) {
return categoryDao.insert(category) == 1;
}
@Override
public Category findByCid(Integer cid) {
return categoryDao.selectByPrimaryKey(cid);
}
@Override
public Boolean updateCategory(Category category) {
return categoryDao.updateByPrimaryKey(category) == 1;
}
@Override
public Boolean deleteCategory(Integer cid) {
return categoryDao.deleteByPrimaryKey(cid) == 1;
}
}
Vo
结果数据封装
import java.util.HashMap;
import java.util.Map;
/**
* @author Administrator
*/
public class BaseResult<T> {
//成功状态码
public static final int OK = 1;
//失败状态码
public static final int ERROR = 0;
//返回码
private Integer code;
//返回消息
private String message;
//存放数据
private T data;
//其他数据
private Map<String,Object> other = new HashMap<>();
public BaseResult() {
}
public BaseResult(Integer code, String message) {
this.code = code;
this.message = message;
}
public BaseResult(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
/**
* 快捷成功BaseResult对象
* @param message
* @return
*/
public static BaseResult ok(String message){
return new BaseResult(BaseResult.OK , message);
}
public static BaseResult ok(String message, Object data){
return new BaseResult(BaseResult.OK , message, data );
}
/**
* 快捷失败BaseResult对象
* @param message
* @return
*/
public static BaseResult error(String message){
return new BaseResult(BaseResult.ERROR , message);
}
/**
* 自定义数据区域
* @param key
* @param msg
* @return
*/
public BaseResult append(String key , Object msg){
other.put(key , msg);
return this;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
public T getData() {
return data;
}
public Map<String, Object> getOther() {
return other;
}
}
模糊查询所需的临时实体类
import lombok.Data;
/**
* @ClassName BookVo
* @Description TODO
* @Author Administrator
* @date 2021-11-05 15:23
*/
@Data
public class BookVo {
private Integer cid;
private String name;
private Double minPrice;
private Double maxPrice;
}
resource配置文件
#端口号
server.port=8080
#数据库基本配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/数据库?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
#druid 连接池配置
#驱动
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#初始化连接池大小
spring.datasource.druid.initial-size=1
#最小连接数
spring.datasource.druid.min-idle=1
#最大连接数
spring.datasource.druid.max-active=20
#获取连接时候验证,会影响性能
spring.datasource.druid.test-on-borrow=true
# mybatis
# mybatis.type-aliases-package=com.czxy.domain.base
# mybatis.mapper-locations=classpath:mappers/*.xml
#mapper
mapper.not-empty=false
mapper.identity=MYSQL
#开启驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath*:dao/*.xml
#开启log4j打印SQL语句
logging.level.com.czxy.dao=debug
pom文件
<!-- 父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 统一版本维护 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mybatis.starter.version>1.3.2</mybatis.starter.version>
<mapper.starter.version>2.0.2</mapper.starter.version>
<mysql.version>5.1.32</mysql.version>
<pageHelper.starter.version>1.2.5</pageHelper.starter.version>
<durid.starter.version>1.1.10</durid.starter.version>
<lombok.version>1.18.16</lombok.version>
</properties>
<dependencies>
<!-- SpringBoot整合SpringMVC的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合jdbc和事务的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mybatis启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.starter.version}</version>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!-- 分页助手启动器 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pageHelper.starter.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${durid.starter.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
前端开发
https://blog.csdn.net/v3424/article/details/121388269
效果如下