diff --git a/src/main/java/com/pt5/pthouduan/controller/CategoryController.java b/src/main/java/com/pt5/pthouduan/controller/CategoryController.java
new file mode 100644
index 0000000..ec013c3
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/CategoryController.java
@@ -0,0 +1,24 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Category;
+import com.pt5.pthouduan.service.CategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/categories")
+@CrossOrigin
+public class CategoryController {
+    @Autowired
+    private CategoryService categoryService;
+
+    @GetMapping
+    public List<Category> getAllCategories() {
+        return categoryService.getAllCategories();
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Category.java b/src/main/java/com/pt5/pthouduan/entity/Category.java
index c338fbb..e134092 100644
--- a/src/main/java/com/pt5/pthouduan/entity/Category.java
+++ b/src/main/java/com/pt5/pthouduan/entity/Category.java
@@ -7,7 +7,7 @@
 
 /**
  * <p>
- * 
+ * 分类表
  * </p>
  *
  * @author ljx
@@ -21,10 +21,20 @@
     @TableId("categoryid")
     private Integer categoryid;
 
-    private Integer categorytype;
+    private String category_name;  // 数据库列名
 
-    private String categoryName;
+    private String category_description;  // 数据库列名
 
+    // 构造方法
+    public Category() {}
+
+    public Category(Integer categoryid, String category_name, String category_description) {
+        this.categoryid = categoryid;
+        this.category_name = category_name;
+        this.category_description = category_description;
+    }
+
+    // Getter 和 Setter 方法（遵循JavaBean规范）
     public Integer getCategoryid() {
         return categoryid;
     }
@@ -33,28 +43,28 @@
         this.categoryid = categoryid;
     }
 
-    public Integer getCategorytype() {
-        return categorytype;
+    public String getCategory_name() {  // 注意方法名必须和属性名一致
+        return category_name;
     }
 
-    public void setCategorytype(Integer categorytype) {
-        this.categorytype = categorytype;
+    public void setCategory_name(String category_name) {  // 注意方法名必须和属性名一致
+        this.category_name = category_name;
     }
 
-    public String getCategoryName() {
-        return categoryName;
+    public String getCategory_description() {
+        return category_description;
     }
 
-    public void setCategoryName(String categoryName) {
-        this.categoryName = categoryName;
+    public void setCategory_description(String category_description) {
+        this.category_description = category_description;
     }
 
     @Override
     public String toString() {
         return "Category{" +
-        "categoryid = " + categoryid +
-        ", categorytype = " + categorytype +
-        ", categoryName = " + categoryName +
-        "}";
+                "categoryid=" + categoryid +
+                ", category_name='" + category_name + '\'' +  // 修正拼写错误
+                ", category_description='" + category_description + '\'' +  // 修正字段名
+                '}';
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/mapper/CategoryMapper.java b/src/main/java/com/pt5/pthouduan/mapper/CategoryMapper.java
index fac2a81..5aba81d 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/CategoryMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/CategoryMapper.java
@@ -4,6 +4,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -14,5 +16,5 @@
  */
 @Mapper
 public interface CategoryMapper extends BaseMapper<Category> {
-
+    List<Category> getAllCategories();
 }
diff --git a/src/main/java/com/pt5/pthouduan/service/CategoryService.java b/src/main/java/com/pt5/pthouduan/service/CategoryService.java
new file mode 100644
index 0000000..6eb2efe
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/CategoryService.java
@@ -0,0 +1,9 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Category;
+
+import java.util.List;
+
+public interface CategoryService {
+    List<Category> getAllCategories();
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/CategoryServiceImp.java b/src/main/java/com/pt5/pthouduan/service/impl/CategoryServiceImp.java
new file mode 100644
index 0000000..a98507b
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/CategoryServiceImp.java
@@ -0,0 +1,19 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.pt5.pthouduan.entity.Category;
+import com.pt5.pthouduan.mapper.CategoryMapper;
+import com.pt5.pthouduan.service.CategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CategoryServiceImp implements CategoryService {
+    @Autowired
+    private CategoryMapper categoryMapper;
+    @Override
+    public List<Category> getAllCategories() {
+        return categoryMapper.getAllCategories();
+    }
+}
diff --git a/src/main/resources/mapper/xml/CategoryMapper.xml b/src/main/resources/mapper/xml/CategoryMapper.xml
new file mode 100644
index 0000000..7793c47
--- /dev/null
+++ b/src/main/resources/mapper/xml/CategoryMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.pt5.pthouduan.mapper.CategoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <!-- 定义结果映射 -->
+    <resultMap id="CategoryResultMap" type="com.pt5.pthouduan.entity.Category">
+        <id property="categoryid" column="categoryid"/>
+        <result property="category_name" column="category_name"/>
+        <result property="category_description" column="category_description"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        categoryid, category_name, category_description
+    </sql>
+    <!-- 查询所有分类 -->
+    <select id="getAllCategories" resultMap="CategoryResultMap">
+        SELECT
+            categoryid,
+            category_name,
+            category_description
+        FROM
+            category
+    </select>
+
+</mapper>
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/CategoryControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/CategoryControllerTest.java
index 2c375db..002cfdb 100644
--- a/src/test/java/com/pt5/pthouduan/ControllerTest/CategoryControllerTest.java
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/CategoryControllerTest.java
@@ -1,2 +1,58 @@
-package com.pt5.pthouduan.ControllerTest;public class CategoryControllerTest {
+package com.pt5.pthouduan.ControllerTest;
+
+import com.pt5.pthouduan.controller.CategoryController;
+import com.pt5.pthouduan.entity.Category;
+import com.pt5.pthouduan.service.CategoryService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class CategoryControllerTest {
+
+    private MockMvc mockMvc;
+
+    @Mock
+    private CategoryService categoryService;
+
+    @InjectMocks
+    private CategoryController categoryController;
+
+    @BeforeEach
+    public void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(categoryController).build();
+    }
+
+    @Test
+    public void testGetAllCategories() throws Exception {
+        // 准备模拟数据
+        Category category1 = new Category();
+        category1.setCategoryid(1);
+        category1.setCategory_name("电子产品");
+
+        Category category2 = new Category();
+        category2.setCategoryid(2);
+        category2.setCategory_name("服装");
+
+        List<Category> categories = Arrays.asList(category1, category2);
+
+        // 模拟 service 行为
+        when(categoryService.getAllCategories()).thenReturn(categories);
+
+        // 执行请求并验证结果
+        mockMvc.perform(get("/categories"))
+                .andExpect(status().isOk());
+    }
 }
