diff --git a/backend/ruoyi-manage/pom.xml b/backend/ruoyi-manage/pom.xml
index 0e733c4..ab0a1c2 100644
--- a/backend/ruoyi-manage/pom.xml
+++ b/backend/ruoyi-manage/pom.xml
@@ -16,5 +16,11 @@
21
UTF-8
+
+
+ com.ruoyi
+ ruoyi-common
+
+
\ No newline at end of file
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/BookController.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/BookController.java
new file mode 100644
index 0000000..adcfab6
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/BookController.java
@@ -0,0 +1,104 @@
+package com.ruoyi.manage.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.manage.domain.Book;
+import com.ruoyi.manage.service.IBookService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 书籍Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@RestController
+@RequestMapping("/manage/book")
+public class BookController extends BaseController
+{
+ @Autowired
+ private IBookService bookService;
+
+ /**
+ * 查询书籍列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(Book book)
+ {
+ startPage();
+ List list = bookService.selectBookList(book);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出书籍列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:export')")
+ @Log(title = "书籍", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, Book book)
+ {
+ List list = bookService.selectBookList(book);
+ ExcelUtil util = new ExcelUtil(Book.class);
+ util.exportExcel(response, list, "书籍数据");
+ }
+
+ /**
+ * 获取书籍详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bookService.selectBookById(id));
+ }
+
+ /**
+ * 新增书籍
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:add')")
+ @Log(title = "书籍", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody Book book)
+ {
+ return toAjax(bookService.insertBook(book));
+ }
+
+ /**
+ * 修改书籍
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:edit')")
+ @Log(title = "书籍", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody Book book)
+ {
+ return toAjax(bookService.updateBook(book));
+ }
+
+ /**
+ * 删除书籍
+ */
+ @PreAuthorize("@ss.hasPermi('manage:book:remove')")
+ @Log(title = "书籍", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bookService.deleteBookByIds(ids));
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/CategoryController.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/CategoryController.java
new file mode 100644
index 0000000..ae78aba
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/CategoryController.java
@@ -0,0 +1,104 @@
+package com.ruoyi.manage.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.manage.domain.Category;
+import com.ruoyi.manage.service.ICategoryService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 类别Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@RestController
+@RequestMapping("/manage/category")
+public class CategoryController extends BaseController
+{
+ @Autowired
+ private ICategoryService categoryService;
+
+ /**
+ * 查询类别列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(Category category)
+ {
+ startPage();
+ List list = categoryService.selectCategoryList(category);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出类别列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:export')")
+ @Log(title = "类别", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, Category category)
+ {
+ List list = categoryService.selectCategoryList(category);
+ ExcelUtil util = new ExcelUtil(Category.class);
+ util.exportExcel(response, list, "类别数据");
+ }
+
+ /**
+ * 获取类别详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(categoryService.selectCategoryById(id));
+ }
+
+ /**
+ * 新增类别
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:add')")
+ @Log(title = "类别", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody Category category)
+ {
+ return toAjax(categoryService.insertCategory(category));
+ }
+
+ /**
+ * 修改类别
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:edit')")
+ @Log(title = "类别", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody Category category)
+ {
+ return toAjax(categoryService.updateCategory(category));
+ }
+
+ /**
+ * 删除类别
+ */
+ @PreAuthorize("@ss.hasPermi('manage:category:remove')")
+ @Log(title = "类别", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(categoryService.deleteCategoryByIds(ids));
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/RegionController.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/RegionController.java
new file mode 100644
index 0000000..a275aec
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/controller/RegionController.java
@@ -0,0 +1,104 @@
+package com.ruoyi.manage.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.manage.domain.Region;
+import com.ruoyi.manage.service.IRegionService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 区域Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@RestController
+@RequestMapping("/manage/region")
+public class RegionController extends BaseController
+{
+ @Autowired
+ private IRegionService regionService;
+
+ /**
+ * 查询区域列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(Region region)
+ {
+ startPage();
+ List list = regionService.selectRegionList(region);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出区域列表
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:export')")
+ @Log(title = "区域", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, Region region)
+ {
+ List list = regionService.selectRegionList(region);
+ ExcelUtil util = new ExcelUtil(Region.class);
+ util.exportExcel(response, list, "区域数据");
+ }
+
+ /**
+ * 获取区域详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(regionService.selectRegionById(id));
+ }
+
+ /**
+ * 新增区域
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:add')")
+ @Log(title = "区域", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody Region region)
+ {
+ return toAjax(regionService.insertRegion(region));
+ }
+
+ /**
+ * 修改区域
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:edit')")
+ @Log(title = "区域", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody Region region)
+ {
+ return toAjax(regionService.updateRegion(region));
+ }
+
+ /**
+ * 删除区域
+ */
+ @PreAuthorize("@ss.hasPermi('manage:region:remove')")
+ @Log(title = "区域", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(regionService.deleteRegionByIds(ids));
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Book.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Book.java
new file mode 100644
index 0000000..afa59d6
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Book.java
@@ -0,0 +1,181 @@
+package com.ruoyi.manage.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 书籍对象 lb_book
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public class Book extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 书籍ID */
+ private Long id;
+
+ /** 书籍名称 */
+ @Excel(name = "书籍名称")
+ private String bookName;
+
+ /** 封面 */
+ @Excel(name = "封面")
+ private String cover;
+
+ /** 作者 */
+ @Excel(name = "作者")
+ private String author;
+
+ /** 出版社 */
+ @Excel(name = "出版社")
+ private String publisher;
+
+ /** 出版日期 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "出版日期", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date publishDate;
+
+ /** 价格 */
+ @Excel(name = "价格")
+ private BigDecimal price;
+
+ /** 数量 */
+ @Excel(name = "数量")
+ private Long quantity;
+
+ /** 区域ID */
+ @Excel(name = "区域ID")
+ private Long regionId;
+
+ /** 类别ID */
+ @Excel(name = "类别ID")
+ private Long categoryId;
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setBookName(String bookName)
+ {
+ this.bookName = bookName;
+ }
+
+ public String getBookName()
+ {
+ return bookName;
+ }
+
+ public void setCover(String cover)
+ {
+ this.cover = cover;
+ }
+
+ public String getCover()
+ {
+ return cover;
+ }
+
+ public void setAuthor(String author)
+ {
+ this.author = author;
+ }
+
+ public String getAuthor()
+ {
+ return author;
+ }
+
+ public void setPublisher(String publisher)
+ {
+ this.publisher = publisher;
+ }
+
+ public String getPublisher()
+ {
+ return publisher;
+ }
+
+ public void setPublishDate(Date publishDate)
+ {
+ this.publishDate = publishDate;
+ }
+
+ public Date getPublishDate()
+ {
+ return publishDate;
+ }
+
+ public void setPrice(BigDecimal price)
+ {
+ this.price = price;
+ }
+
+ public BigDecimal getPrice()
+ {
+ return price;
+ }
+
+ public void setQuantity(Long quantity)
+ {
+ this.quantity = quantity;
+ }
+
+ public Long getQuantity()
+ {
+ return quantity;
+ }
+
+ public void setRegionId(Long regionId)
+ {
+ this.regionId = regionId;
+ }
+
+ public Long getRegionId()
+ {
+ return regionId;
+ }
+
+ public void setCategoryId(Long categoryId)
+ {
+ this.categoryId = categoryId;
+ }
+
+ public Long getCategoryId()
+ {
+ return categoryId;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("bookName", getBookName())
+ .append("cover", getCover())
+ .append("author", getAuthor())
+ .append("publisher", getPublisher())
+ .append("publishDate", getPublishDate())
+ .append("price", getPrice())
+ .append("quantity", getQuantity())
+ .append("regionId", getRegionId())
+ .append("categoryId", getCategoryId())
+ .append("createTime", getCreateTime())
+ .append("updateTime", getUpdateTime())
+ .append("createBy", getCreateBy())
+ .append("updateBy", getUpdateBy())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Category.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Category.java
new file mode 100644
index 0000000..b10e02b
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Category.java
@@ -0,0 +1,57 @@
+package com.ruoyi.manage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 类别对象 lb_category
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public class Category extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 类别ID */
+ private Long id;
+
+ /** 类别名称 */
+ @Excel(name = "类别名称")
+ private String categoryName;
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setCategoryName(String categoryName)
+ {
+ this.categoryName = categoryName;
+ }
+
+ public String getCategoryName()
+ {
+ return categoryName;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("categoryName", getCategoryName())
+ .append("createTime", getCreateTime())
+ .append("updateTime", getUpdateTime())
+ .append("createBy", getCreateBy())
+ .append("updateBy", getUpdateBy())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Region.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Region.java
new file mode 100644
index 0000000..b53cc55
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/domain/Region.java
@@ -0,0 +1,57 @@
+package com.ruoyi.manage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 区域对象 lb_region
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public class Region extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 区域ID */
+ private Long id;
+
+ /** 区域名称 */
+ @Excel(name = "区域名称")
+ private String regionName;
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setRegionName(String regionName)
+ {
+ this.regionName = regionName;
+ }
+
+ public String getRegionName()
+ {
+ return regionName;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("regionName", getRegionName())
+ .append("createTime", getCreateTime())
+ .append("updateTime", getUpdateTime())
+ .append("createBy", getCreateBy())
+ .append("updateBy", getUpdateBy())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/BookMapper.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/BookMapper.java
new file mode 100644
index 0000000..bb71338
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/BookMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.mapper;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Book;
+
+/**
+ * 书籍Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface BookMapper
+{
+ /**
+ * 查询书籍
+ *
+ * @param id 书籍主键
+ * @return 书籍
+ */
+ public Book selectBookById(Long id);
+
+ /**
+ * 查询书籍列表
+ *
+ * @param book 书籍
+ * @return 书籍集合
+ */
+ public List selectBookList(Book book);
+
+ /**
+ * 新增书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ public int insertBook(Book book);
+
+ /**
+ * 修改书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ public int updateBook(Book book);
+
+ /**
+ * 删除书籍
+ *
+ * @param id 书籍主键
+ * @return 结果
+ */
+ public int deleteBookById(Long id);
+
+ /**
+ * 批量删除书籍
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBookByIds(Long[] ids);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/CategoryMapper.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/CategoryMapper.java
new file mode 100644
index 0000000..663684e
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/CategoryMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.mapper;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Category;
+
+/**
+ * 类别Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface CategoryMapper
+{
+ /**
+ * 查询类别
+ *
+ * @param id 类别主键
+ * @return 类别
+ */
+ public Category selectCategoryById(Long id);
+
+ /**
+ * 查询类别列表
+ *
+ * @param category 类别
+ * @return 类别集合
+ */
+ public List selectCategoryList(Category category);
+
+ /**
+ * 新增类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ public int insertCategory(Category category);
+
+ /**
+ * 修改类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ public int updateCategory(Category category);
+
+ /**
+ * 删除类别
+ *
+ * @param id 类别主键
+ * @return 结果
+ */
+ public int deleteCategoryById(Long id);
+
+ /**
+ * 批量删除类别
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteCategoryByIds(Long[] ids);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/RegionMapper.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/RegionMapper.java
new file mode 100644
index 0000000..d4466a5
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/mapper/RegionMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.mapper;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Region;
+
+/**
+ * 区域Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface RegionMapper
+{
+ /**
+ * 查询区域
+ *
+ * @param id 区域主键
+ * @return 区域
+ */
+ public Region selectRegionById(Long id);
+
+ /**
+ * 查询区域列表
+ *
+ * @param region 区域
+ * @return 区域集合
+ */
+ public List selectRegionList(Region region);
+
+ /**
+ * 新增区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ public int insertRegion(Region region);
+
+ /**
+ * 修改区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ public int updateRegion(Region region);
+
+ /**
+ * 删除区域
+ *
+ * @param id 区域主键
+ * @return 结果
+ */
+ public int deleteRegionById(Long id);
+
+ /**
+ * 批量删除区域
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteRegionByIds(Long[] ids);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IBookService.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IBookService.java
new file mode 100644
index 0000000..2cd43dd
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IBookService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.service;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Book;
+
+/**
+ * 书籍Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface IBookService
+{
+ /**
+ * 查询书籍
+ *
+ * @param id 书籍主键
+ * @return 书籍
+ */
+ public Book selectBookById(Long id);
+
+ /**
+ * 查询书籍列表
+ *
+ * @param book 书籍
+ * @return 书籍集合
+ */
+ public List selectBookList(Book book);
+
+ /**
+ * 新增书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ public int insertBook(Book book);
+
+ /**
+ * 修改书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ public int updateBook(Book book);
+
+ /**
+ * 批量删除书籍
+ *
+ * @param ids 需要删除的书籍主键集合
+ * @return 结果
+ */
+ public int deleteBookByIds(Long[] ids);
+
+ /**
+ * 删除书籍信息
+ *
+ * @param id 书籍主键
+ * @return 结果
+ */
+ public int deleteBookById(Long id);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/ICategoryService.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/ICategoryService.java
new file mode 100644
index 0000000..a5af39e
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/ICategoryService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.service;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Category;
+
+/**
+ * 类别Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface ICategoryService
+{
+ /**
+ * 查询类别
+ *
+ * @param id 类别主键
+ * @return 类别
+ */
+ public Category selectCategoryById(Long id);
+
+ /**
+ * 查询类别列表
+ *
+ * @param category 类别
+ * @return 类别集合
+ */
+ public List selectCategoryList(Category category);
+
+ /**
+ * 新增类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ public int insertCategory(Category category);
+
+ /**
+ * 修改类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ public int updateCategory(Category category);
+
+ /**
+ * 批量删除类别
+ *
+ * @param ids 需要删除的类别主键集合
+ * @return 结果
+ */
+ public int deleteCategoryByIds(Long[] ids);
+
+ /**
+ * 删除类别信息
+ *
+ * @param id 类别主键
+ * @return 结果
+ */
+ public int deleteCategoryById(Long id);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IRegionService.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IRegionService.java
new file mode 100644
index 0000000..f28501b
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/IRegionService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.manage.service;
+
+import java.util.List;
+import com.ruoyi.manage.domain.Region;
+
+/**
+ * 区域Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+public interface IRegionService
+{
+ /**
+ * 查询区域
+ *
+ * @param id 区域主键
+ * @return 区域
+ */
+ public Region selectRegionById(Long id);
+
+ /**
+ * 查询区域列表
+ *
+ * @param region 区域
+ * @return 区域集合
+ */
+ public List selectRegionList(Region region);
+
+ /**
+ * 新增区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ public int insertRegion(Region region);
+
+ /**
+ * 修改区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ public int updateRegion(Region region);
+
+ /**
+ * 批量删除区域
+ *
+ * @param ids 需要删除的区域主键集合
+ * @return 结果
+ */
+ public int deleteRegionByIds(Long[] ids);
+
+ /**
+ * 删除区域信息
+ *
+ * @param id 区域主键
+ * @return 结果
+ */
+ public int deleteRegionById(Long id);
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/BookServiceImpl.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/BookServiceImpl.java
new file mode 100644
index 0000000..c135a30
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/BookServiceImpl.java
@@ -0,0 +1,96 @@
+package com.ruoyi.manage.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.manage.mapper.BookMapper;
+import com.ruoyi.manage.domain.Book;
+import com.ruoyi.manage.service.IBookService;
+
+/**
+ * 书籍Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@Service
+public class BookServiceImpl implements IBookService
+{
+ @Autowired
+ private BookMapper bookMapper;
+
+ /**
+ * 查询书籍
+ *
+ * @param id 书籍主键
+ * @return 书籍
+ */
+ @Override
+ public Book selectBookById(Long id)
+ {
+ return bookMapper.selectBookById(id);
+ }
+
+ /**
+ * 查询书籍列表
+ *
+ * @param book 书籍
+ * @return 书籍
+ */
+ @Override
+ public List selectBookList(Book book)
+ {
+ return bookMapper.selectBookList(book);
+ }
+
+ /**
+ * 新增书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ @Override
+ public int insertBook(Book book)
+ {
+ book.setCreateTime(DateUtils.getNowDate());
+ return bookMapper.insertBook(book);
+ }
+
+ /**
+ * 修改书籍
+ *
+ * @param book 书籍
+ * @return 结果
+ */
+ @Override
+ public int updateBook(Book book)
+ {
+ book.setUpdateTime(DateUtils.getNowDate());
+ return bookMapper.updateBook(book);
+ }
+
+ /**
+ * 批量删除书籍
+ *
+ * @param ids 需要删除的书籍主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBookByIds(Long[] ids)
+ {
+ return bookMapper.deleteBookByIds(ids);
+ }
+
+ /**
+ * 删除书籍信息
+ *
+ * @param id 书籍主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBookById(Long id)
+ {
+ return bookMapper.deleteBookById(id);
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/CategoryServiceImpl.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/CategoryServiceImpl.java
new file mode 100644
index 0000000..072a622
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/CategoryServiceImpl.java
@@ -0,0 +1,96 @@
+package com.ruoyi.manage.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.manage.mapper.CategoryMapper;
+import com.ruoyi.manage.domain.Category;
+import com.ruoyi.manage.service.ICategoryService;
+
+/**
+ * 类别Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@Service
+public class CategoryServiceImpl implements ICategoryService
+{
+ @Autowired
+ private CategoryMapper categoryMapper;
+
+ /**
+ * 查询类别
+ *
+ * @param id 类别主键
+ * @return 类别
+ */
+ @Override
+ public Category selectCategoryById(Long id)
+ {
+ return categoryMapper.selectCategoryById(id);
+ }
+
+ /**
+ * 查询类别列表
+ *
+ * @param category 类别
+ * @return 类别
+ */
+ @Override
+ public List selectCategoryList(Category category)
+ {
+ return categoryMapper.selectCategoryList(category);
+ }
+
+ /**
+ * 新增类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ @Override
+ public int insertCategory(Category category)
+ {
+ category.setCreateTime(DateUtils.getNowDate());
+ return categoryMapper.insertCategory(category);
+ }
+
+ /**
+ * 修改类别
+ *
+ * @param category 类别
+ * @return 结果
+ */
+ @Override
+ public int updateCategory(Category category)
+ {
+ category.setUpdateTime(DateUtils.getNowDate());
+ return categoryMapper.updateCategory(category);
+ }
+
+ /**
+ * 批量删除类别
+ *
+ * @param ids 需要删除的类别主键
+ * @return 结果
+ */
+ @Override
+ public int deleteCategoryByIds(Long[] ids)
+ {
+ return categoryMapper.deleteCategoryByIds(ids);
+ }
+
+ /**
+ * 删除类别信息
+ *
+ * @param id 类别主键
+ * @return 结果
+ */
+ @Override
+ public int deleteCategoryById(Long id)
+ {
+ return categoryMapper.deleteCategoryById(id);
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/RegionServiceImpl.java b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/RegionServiceImpl.java
new file mode 100644
index 0000000..3ba8d6f
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/java/com/ruoyi/manage/service/impl/RegionServiceImpl.java
@@ -0,0 +1,96 @@
+package com.ruoyi.manage.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.manage.mapper.RegionMapper;
+import com.ruoyi.manage.domain.Region;
+import com.ruoyi.manage.service.IRegionService;
+
+/**
+ * 区域Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-17
+ */
+@Service
+public class RegionServiceImpl implements IRegionService
+{
+ @Autowired
+ private RegionMapper regionMapper;
+
+ /**
+ * 查询区域
+ *
+ * @param id 区域主键
+ * @return 区域
+ */
+ @Override
+ public Region selectRegionById(Long id)
+ {
+ return regionMapper.selectRegionById(id);
+ }
+
+ /**
+ * 查询区域列表
+ *
+ * @param region 区域
+ * @return 区域
+ */
+ @Override
+ public List selectRegionList(Region region)
+ {
+ return regionMapper.selectRegionList(region);
+ }
+
+ /**
+ * 新增区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ @Override
+ public int insertRegion(Region region)
+ {
+ region.setCreateTime(DateUtils.getNowDate());
+ return regionMapper.insertRegion(region);
+ }
+
+ /**
+ * 修改区域
+ *
+ * @param region 区域
+ * @return 结果
+ */
+ @Override
+ public int updateRegion(Region region)
+ {
+ region.setUpdateTime(DateUtils.getNowDate());
+ return regionMapper.updateRegion(region);
+ }
+
+ /**
+ * 批量删除区域
+ *
+ * @param ids 需要删除的区域主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRegionByIds(Long[] ids)
+ {
+ return regionMapper.deleteRegionByIds(ids);
+ }
+
+ /**
+ * 删除区域信息
+ *
+ * @param id 区域主键
+ * @return 结果
+ */
+ @Override
+ public int deleteRegionById(Long id)
+ {
+ return regionMapper.deleteRegionById(id);
+ }
+}
diff --git a/backend/ruoyi-manage/src/main/resources/mapper/manage/BookMapper.xml b/backend/ruoyi-manage/src/main/resources/mapper/manage/BookMapper.xml
new file mode 100644
index 0000000..e67fd2a
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/resources/mapper/manage/BookMapper.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, book_name, cover, author, publisher, publish_date, price, quantity, region_id, category_id, create_time, update_time, create_by, update_by, remark from lb_book
+
+
+
+
+
+
+
+ insert into lb_book
+
+ book_name,
+ cover,
+ author,
+ publisher,
+ publish_date,
+ price,
+ quantity,
+ region_id,
+ category_id,
+ create_time,
+ update_time,
+ create_by,
+ update_by,
+ remark,
+
+
+ #{bookName},
+ #{cover},
+ #{author},
+ #{publisher},
+ #{publishDate},
+ #{price},
+ #{quantity},
+ #{regionId},
+ #{categoryId},
+ #{createTime},
+ #{updateTime},
+ #{createBy},
+ #{updateBy},
+ #{remark},
+
+
+
+
+ update lb_book
+
+ book_name = #{bookName},
+ cover = #{cover},
+ author = #{author},
+ publisher = #{publisher},
+ publish_date = #{publishDate},
+ price = #{price},
+ quantity = #{quantity},
+ region_id = #{regionId},
+ category_id = #{categoryId},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ remark = #{remark},
+
+ where id = #{id}
+
+
+
+ delete from lb_book where id = #{id}
+
+
+
+ delete from lb_book where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/backend/ruoyi-manage/src/main/resources/mapper/manage/CategoryMapper.xml b/backend/ruoyi-manage/src/main/resources/mapper/manage/CategoryMapper.xml
new file mode 100644
index 0000000..070d8dc
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/resources/mapper/manage/CategoryMapper.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, category_name, create_time, update_time, create_by, update_by, remark from lb_category
+
+
+
+
+
+
+
+ insert into lb_category
+
+ category_name,
+ create_time,
+ update_time,
+ create_by,
+ update_by,
+ remark,
+
+
+ #{categoryName},
+ #{createTime},
+ #{updateTime},
+ #{createBy},
+ #{updateBy},
+ #{remark},
+
+
+
+
+ update lb_category
+
+ category_name = #{categoryName},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ remark = #{remark},
+
+ where id = #{id}
+
+
+
+ delete from lb_category where id = #{id}
+
+
+
+ delete from lb_category where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/backend/ruoyi-manage/src/main/resources/mapper/manage/RegionMapper.xml b/backend/ruoyi-manage/src/main/resources/mapper/manage/RegionMapper.xml
new file mode 100644
index 0000000..5653201
--- /dev/null
+++ b/backend/ruoyi-manage/src/main/resources/mapper/manage/RegionMapper.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, region_name, create_time, update_time, create_by, update_by, remark from lb_region
+
+
+
+
+
+
+
+ insert into lb_region
+
+ region_name,
+ create_time,
+ update_time,
+ create_by,
+ update_by,
+ remark,
+
+
+ #{regionName},
+ #{createTime},
+ #{updateTime},
+ #{createBy},
+ #{updateBy},
+ #{remark},
+
+
+
+
+ update lb_region
+
+ region_name = #{regionName},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ remark = #{remark},
+
+ where id = #{id}
+
+
+
+ delete from lb_region where id = #{id}
+
+
+
+ delete from lb_region where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/backend/sql/build/bookMenu.sql b/backend/sql/build/bookMenu.sql
new file mode 100644
index 0000000..6f330ec
--- /dev/null
+++ b/backend/sql/build/bookMenu.sql
@@ -0,0 +1,22 @@
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍', '2000', '1', 'book', 'manage/book/index', 1, 0, 'C', '0', '0', 'manage:book:list', '#', 'admin', sysdate(), '', null, '书籍菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'manage:book:query', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'manage:book:add', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'manage:book:edit', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'manage:book:remove', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('书籍导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'manage:book:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
diff --git a/backend/sql/build/categoryMenu.sql b/backend/sql/build/categoryMenu.sql
new file mode 100644
index 0000000..8014d79
--- /dev/null
+++ b/backend/sql/build/categoryMenu.sql
@@ -0,0 +1,22 @@
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别', '2000', '1', 'category', 'manage/category/index', 1, 0, 'C', '0', '0', 'manage:category:list', '#', 'admin', sysdate(), '', null, '类别菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'manage:category:query', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'manage:category:add', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'manage:category:edit', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'manage:category:remove', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('类别导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'manage:category:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
diff --git a/backend/sql/build/regionMenu.sql b/backend/sql/build/regionMenu.sql
new file mode 100644
index 0000000..3cf5873
--- /dev/null
+++ b/backend/sql/build/regionMenu.sql
@@ -0,0 +1,22 @@
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域', '2000', '1', 'region', 'manage/region/index', 1, 0, 'C', '0', '0', 'manage:region:list', '#', 'admin', sysdate(), '', null, '区域菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'manage:region:query', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'manage:region:add', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'manage:region:edit', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'manage:region:remove', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('区域导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'manage:region:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
diff --git a/frontend/src/api/manage/book.js b/frontend/src/api/manage/book.js
new file mode 100644
index 0000000..4dc9fde
--- /dev/null
+++ b/frontend/src/api/manage/book.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询书籍列表
+export function listBook(query) {
+ return request({
+ url: '/manage/book/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询书籍详细
+export function getBook(id) {
+ return request({
+ url: '/manage/book/' + id,
+ method: 'get'
+ })
+}
+
+// 新增书籍
+export function addBook(data) {
+ return request({
+ url: '/manage/book',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改书籍
+export function updateBook(data) {
+ return request({
+ url: '/manage/book',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除书籍
+export function delBook(id) {
+ return request({
+ url: '/manage/book/' + id,
+ method: 'delete'
+ })
+}
diff --git a/frontend/src/api/manage/category.js b/frontend/src/api/manage/category.js
new file mode 100644
index 0000000..f401379
--- /dev/null
+++ b/frontend/src/api/manage/category.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询类别列表
+export function listCategory(query) {
+ return request({
+ url: '/manage/category/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询类别详细
+export function getCategory(id) {
+ return request({
+ url: '/manage/category/' + id,
+ method: 'get'
+ })
+}
+
+// 新增类别
+export function addCategory(data) {
+ return request({
+ url: '/manage/category',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改类别
+export function updateCategory(data) {
+ return request({
+ url: '/manage/category',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除类别
+export function delCategory(id) {
+ return request({
+ url: '/manage/category/' + id,
+ method: 'delete'
+ })
+}
diff --git a/frontend/src/api/manage/region.js b/frontend/src/api/manage/region.js
new file mode 100644
index 0000000..a82ac2f
--- /dev/null
+++ b/frontend/src/api/manage/region.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询区域列表
+export function listRegion(query) {
+ return request({
+ url: '/manage/region/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询区域详细
+export function getRegion(id) {
+ return request({
+ url: '/manage/region/' + id,
+ method: 'get'
+ })
+}
+
+// 新增区域
+export function addRegion(data) {
+ return request({
+ url: '/manage/region',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改区域
+export function updateRegion(data) {
+ return request({
+ url: '/manage/region',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除区域
+export function delRegion(id) {
+ return request({
+ url: '/manage/region/' + id,
+ method: 'delete'
+ })
+}
diff --git a/frontend/src/views/manage/book/index.vue b/frontend/src/views/manage/book/index.vue
new file mode 100644
index 0000000..d854c42
--- /dev/null
+++ b/frontend/src/views/manage/book/index.vue
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.publishDate, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/manage/category/index.vue b/frontend/src/views/manage/category/index.vue
new file mode 100644
index 0000000..68c3d9d
--- /dev/null
+++ b/frontend/src/views/manage/category/index.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/manage/region/index.vue b/frontend/src/views/manage/region/index.vue
new file mode 100644
index 0000000..f7aa0bf
--- /dev/null
+++ b/frontend/src/views/manage/region/index.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+