Bladeren bron

feat:完善openAPI相关的注解使用openAPI文档更语义化;修复获取所有分类会将禁用的分类返回的问题;

yangyi 4 maanden geleden
bovenliggende
commit
cd4e3a83c8

+ 5 - 5
src/main/java/com/campus/trade/controller/AuthController.java

@@ -23,7 +23,7 @@ public class AuthController {
     @Autowired
     private AuthService authService;
 
-    @Operation(summary = "用户注册", description = "学号+姓名+密码+校园卡照片,提交后进入待审核状态")
+    @Operation(summary = "用户注册", operationId = "register", description = "学号+姓名+密码+校园卡照片,提交后进入待审核状态")
     @ApiResponse(responseCode = "200", description = "注册成功")
     @ApiResponse(responseCode = "409", description = "学号已注册")
     @PostMapping(value = "/register", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@@ -32,20 +32,20 @@ public class AuthController {
         return Result.success(userId);
     }
 
-    @Operation(summary = "用户登录", description = "学号+密码登录,创建 Session 会话")
+    @Operation(summary = "用户登录", operationId = "login", description = "学号+密码登录,创建 Session 会话")
     @PostMapping("/login")
     public Result<UserProfileVO> login(@Valid @RequestBody LoginRequest req, HttpSession session) {
         return Result.success(authService.login(req, session));
     }
 
-    @Operation(summary = "用户登出", description = "销毁当前 Session")
+    @Operation(summary = "用户登出", operationId = "logout", description = "销毁当前 Session")
     @PostMapping("/logout")
     public Result<Void> logout(HttpSession session) {
         session.invalidate();
         return Result.success();
     }
 
-    @Operation(summary = "提交实名认证", description = "上传校园卡照片进行实名审核;被拒后可重新提交")
+    @Operation(summary = "提交实名认证", operationId = "submitAuth", description = "上传校园卡照片进行实名审核;被拒后可重新提交")
     @PostMapping(value = "/submit-auth", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result<Void> submitAuth(@RequestParam("campusCardImage") org.springframework.web.multipart.MultipartFile campusCardImage,
                                    HttpSession session) {
@@ -53,7 +53,7 @@ public class AuthController {
         return Result.success();
     }
 
-    @Operation(summary = "修改密码", description = "需提供旧密码验证")
+    @Operation(summary = "修改密码", operationId = "changePassword", description = "需提供旧密码验证")
     @PostMapping("/change-password")
     public Result<Void> changePassword(@Valid @RequestBody ChangePasswordRequest req, HttpSession session) {
         authService.changePassword(req, session);

+ 8 - 8
src/main/java/com/campus/trade/controller/ItemController.java

@@ -24,14 +24,14 @@ public class ItemController {
     @Autowired
     private ItemService itemService;
 
-    @Operation(summary = "首页物品列表", description = "按发布时间倒序,分页返回")
+    @Operation(summary = "首页物品列表", operationId = "listItems", description = "按发布时间倒序,分页返回")
     @GetMapping
     public Result<PageResult<ItemVO>> list(@RequestParam(defaultValue = "1") int pageNum,
                                             @RequestParam(defaultValue = "10") int pageSize) {
         return Result.success(PageResult.of(itemService.list(pageNum, pageSize)));
     }
 
-    @Operation(summary = "搜索物品", description = "按标题/描述模糊匹配")
+    @Operation(summary = "搜索物品", operationId = "searchItems", description = "按标题/描述模糊匹配")
     @GetMapping("/search")
     public Result<PageResult<ItemVO>> search(@RequestParam String keyword,
                                               @RequestParam(defaultValue = "1") int pageNum,
@@ -39,7 +39,7 @@ public class ItemController {
         return Result.success(PageResult.of(itemService.search(keyword, pageNum, pageSize)));
     }
 
-    @Operation(summary = "按分类筛选")
+    @Operation(summary = "按分类筛选", operationId = "listItemsByCategory")
     @GetMapping("/category/{id}")
     public Result<PageResult<ItemVO>> byCategory(@Parameter(description = "分类ID") @PathVariable Long id,
                                                   @RequestParam(defaultValue = "1") int pageNum,
@@ -47,32 +47,32 @@ public class ItemController {
         return Result.success(PageResult.of(itemService.byCategory(id, pageNum, pageSize)));
     }
 
-    @Operation(summary = "物品详情")
+    @Operation(summary = "物品详情", operationId = "getItemDetail")
     @GetMapping("/{id}")
     public Result<ItemVO> detail(@Parameter(description = "物品ID") @PathVariable Long id) {
         return Result.success(itemService.detail(id));
     }
 
-    @Operation(summary = "发布物品", description = "需要实名认证,图片以 multipart 上传")
+    @Operation(summary = "发布物品", operationId = "publishItem", description = "需要实名认证,图片以 multipart 上传")
     @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result<Long> publish(@Valid ItemPublishRequest req, HttpSession session) {
         return Result.success(itemService.publish(req, session));
     }
 
-    @Operation(summary = "我的发布列表")
+    @Operation(summary = "我的发布列表", operationId = "listMyItems")
     @GetMapping("/my")
     public Result<List<ItemVO>> myItems(HttpSession session) {
         return Result.success(itemService.myItems(session));
     }
 
-    @Operation(summary = "下架物品", description = "卖家下架自己的物品")
+    @Operation(summary = "下架物品", operationId = "offlineItem", description = "卖家下架自己的物品")
     @PutMapping("/{id}/offline")
     public Result<Void> offline(@Parameter(description = "物品ID") @PathVariable Long id, HttpSession session) {
         itemService.offline(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "删除物品", description = "卖家删除自己的物品")
+    @Operation(summary = "删除物品", operationId = "deleteItem", description = "卖家删除自己的物品")
     @DeleteMapping("/{id}")
     public Result<Void> delete(@Parameter(description = "物品ID") @PathVariable Long id, HttpSession session) {
         itemService.delete(id, session);

+ 3 - 3
src/main/java/com/campus/trade/controller/MessageController.java

@@ -24,13 +24,13 @@ public class MessageController {
     @Autowired
     private MessageService messageService;
 
-    @Operation(summary = "会话列表", description = "返回当前用户的所有会话及最后一条消息")
+    @Operation(summary = "会话列表", operationId = "listConversations", description = "返回当前用户的所有会话及最后一条消息")
     @GetMapping("/conversations")
     public Result<List<ConversationVO>> conversations(HttpSession session) {
         return Result.success(messageService.conversations(session));
     }
 
-    @Operation(summary = "聊天记录", description = "与指定用户的聊天记录,分页")
+    @Operation(summary = "聊天记录", operationId = "getMessageHistory", description = "与指定用户的聊天记录,分页")
     @GetMapping("/{userId}")
     public Result<PageResult<MessageVO>> history(@Parameter(description = "对方用户ID") @PathVariable Long userId,
                                                   @RequestParam(defaultValue = "1") int pageNum,
@@ -39,7 +39,7 @@ public class MessageController {
         return Result.success(PageResult.of(messageService.history(userId, pageNum, pageSize, session)));
     }
 
-    @Operation(summary = "发送消息")
+    @Operation(summary = "发送消息", operationId = "sendMessage")
     @PostMapping
     public Result<Long> send(@Valid @RequestBody SendMessageRequest req, HttpSession session) {
         return Result.success(messageService.send(req, session));

+ 7 - 7
src/main/java/com/campus/trade/controller/OrderController.java

@@ -21,13 +21,13 @@ public class OrderController {
     @Autowired
     private OrderService orderService;
 
-    @Operation(summary = "生成订单", description = "买家点击『我想要』生成订单")
+    @Operation(summary = "生成订单", operationId = "createOrder", description = "买家点击『我想要』生成订单")
     @PostMapping
     public Result<Long> create(@Valid @RequestBody CreateOrderRequest req, HttpSession session) {
         return Result.success(orderService.create(req.getItemId(), session));
     }
 
-    @Operation(summary = "我买到的订单")
+    @Operation(summary = "我买到的订单", operationId = "listBoughtOrders")
     @GetMapping("/bought")
     public Result<PageResult<OrderVO>> bought(@RequestParam(defaultValue = "1") int pageNum,
                                                @RequestParam(defaultValue = "10") int pageSize,
@@ -35,7 +35,7 @@ public class OrderController {
         return Result.success(PageResult.of(orderService.bought(pageNum, pageSize, session)));
     }
 
-    @Operation(summary = "我卖出的订单")
+    @Operation(summary = "我卖出的订单", operationId = "listSoldOrders")
     @GetMapping("/sold")
     public Result<PageResult<OrderVO>> sold(@RequestParam(defaultValue = "1") int pageNum,
                                              @RequestParam(defaultValue = "10") int pageSize,
@@ -43,28 +43,28 @@ public class OrderController {
         return Result.success(PageResult.of(orderService.sold(pageNum, pageSize, session)));
     }
 
-    @Operation(summary = "卖家接单")
+    @Operation(summary = "卖家接单", operationId = "acceptOrder")
     @PutMapping("/{id}/accept")
     public Result<Void> accept(@Parameter(description = "订单ID") @PathVariable Long id, HttpSession session) {
         orderService.accept(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "卖家拒单")
+    @Operation(summary = "卖家拒单", operationId = "rejectOrder")
     @PutMapping("/{id}/reject")
     public Result<Void> reject(@Parameter(description = "订单ID") @PathVariable Long id, HttpSession session) {
         orderService.reject(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "卖家确认交货")
+    @Operation(summary = "卖家确认交货", operationId = "deliverOrder")
     @PutMapping("/{id}/deliver")
     public Result<Void> deliver(@Parameter(description = "订单ID") @PathVariable Long id, HttpSession session) {
         orderService.deliver(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "买家确认收货")
+    @Operation(summary = "买家确认收货", operationId = "confirmOrder")
     @PutMapping("/{id}/confirm")
     public Result<Void> confirm(@Parameter(description = "订单ID") @PathVariable Long id, HttpSession session) {
         orderService.confirm(id, session);

+ 2 - 2
src/main/java/com/campus/trade/controller/UserController.java

@@ -20,13 +20,13 @@ public class UserController {
     @Autowired
     private UserService userService;
 
-    @Operation(summary = "获取个人资料")
+    @Operation(summary = "获取个人资料", operationId = "getUserProfile")
     @GetMapping("/profile")
     public Result<UserProfileVO> profile(HttpSession session) {
         return Result.success(userService.getProfile(session));
     }
 
-    @Operation(summary = "修改个人资料", description = "支持修改昵称、个性签名、头像")
+    @Operation(summary = "修改个人资料", operationId = "updateUserProfile", description = "支持修改昵称、个性签名、头像")
     @PutMapping(value = "/profile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result<UserProfileVO> updateProfile(@Valid UserProfileRequest req, HttpSession session) {
         return Result.success(userService.updateProfile(req, session));

+ 4 - 10
src/main/java/com/campus/trade/controller/admin/CategoryController.java

@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@RestController
+@RestController("adminCategory")
 @RequestMapping("/admin/categories")
 @Tag(name = "Categories", description = "物品分类的增删改查")
 public class CategoryController {
@@ -22,19 +22,13 @@ public class CategoryController {
     @Autowired
     private CategoryService categoryService;
 
-    @Operation(summary = "分类列表")
-    @GetMapping
-    public Result<List<Category>> list() {
-        return Result.success(categoryService.list());
-    }
-
-    @Operation(summary = "新增分类")
+    @Operation(summary = "新增分类", operationId = "createCategory")
     @PostMapping
     public Result<Long> create(@Valid @RequestBody CategoryRequest req) {
         return Result.success(categoryService.create(req));
     }
 
-    @Operation(summary = "修改分类")
+    @Operation(summary = "修改分类", operationId = "updateCategory")
     @PutMapping("/{id}")
     public Result<Void> update(@Parameter(description = "分类ID") @PathVariable Long id,
                                 @Valid @RequestBody CategoryRequest req) {
@@ -42,7 +36,7 @@ public class CategoryController {
         return Result.success();
     }
 
-    @Operation(summary = "启用/禁用分类")
+    @Operation(summary = "启用/禁用分类", operationId = "toggleCategoryStatus")
     @PutMapping("/{id}/status")
     public Result<Void> toggleStatus(@Parameter(description = "分类ID") @PathVariable Long id,
                                       @RequestBody StatusRequest req) {

+ 4 - 4
src/main/java/com/campus/trade/controller/admin/ReviewController.java

@@ -22,7 +22,7 @@ public class ReviewController {
     @Autowired
     private ReviewService reviewService;
 
-    @Operation(summary = "待审核用户列表")
+    @Operation(summary = "待审核用户列表", operationId = "listPendingUserReviews")
     @GetMapping("/review/users")
     public Result<PageResult<User>> pendingUsers(@RequestParam(defaultValue = "1") int pageNum,
                                                   @RequestParam(defaultValue = "10") int pageSize,
@@ -30,7 +30,7 @@ public class ReviewController {
         return Result.success(PageResult.of(reviewService.pendingUsers(pageNum, pageSize)));
     }
 
-    @Operation(summary = "审核用户实名认证")
+    @Operation(summary = "审核用户实名认证", operationId = "reviewUserAuth")
     @PostMapping("/review/user/{id}")
     public Result<Void> reviewUser(@Parameter(description = "用户ID") @PathVariable Long id,
                                     @Valid @RequestBody ReviewRequest req,
@@ -39,7 +39,7 @@ public class ReviewController {
         return Result.success();
     }
 
-    @Operation(summary = "待审核物品列表")
+    @Operation(summary = "待审核物品列表", operationId = "listPendingItemReviews")
     @GetMapping("/review/items")
     public Result<PageResult<ItemVO>> pendingItems(@RequestParam(defaultValue = "1") int pageNum,
                                                     @RequestParam(defaultValue = "10") int pageSize,
@@ -47,7 +47,7 @@ public class ReviewController {
         return Result.success(PageResult.of(reviewService.pendingItems(pageNum, pageSize)));
     }
 
-    @Operation(summary = "审核物品上架")
+    @Operation(summary = "审核物品上架", operationId = "reviewItemListing")
     @PostMapping("/review/item/{id}")
     public Result<Void> reviewItem(@Parameter(description = "物品ID") @PathVariable Long id,
                                     @Valid @RequestBody ReviewRequest req,

+ 6 - 5
src/main/java/com/campus/trade/controller/admin/UserManageController.java

@@ -19,29 +19,30 @@ public class UserManageController {
     @Autowired
     private UserManageService userManageService;
 
-    @Operation(summary = "用户列表")
+    @Operation(summary = "用户列表", operationId = "listUsers", description = "支持按用户名模糊搜索")
     @GetMapping("/users")
     public Result<PageResult<User>> list(@RequestParam(defaultValue = "1") int pageNum,
                                           @RequestParam(defaultValue = "10") int pageSize,
+                                          @RequestParam(required = false) String username,
                                           HttpSession session) {
-        return Result.success(PageResult.of(userManageService.list(pageNum, pageSize)));
+        return Result.success(PageResult.of(userManageService.list(pageNum, pageSize, username)));
     }
 
-    @Operation(summary = "封禁用户")
+    @Operation(summary = "封禁用户", operationId = "banUser")
     @PutMapping("/users/{id}/ban")
     public Result<Void> ban(@Parameter(description = "用户ID") @PathVariable Long id, HttpSession session) {
         userManageService.ban(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "解封用户")
+    @Operation(summary = "解封用户", operationId = "unbanUser")
     @PutMapping("/users/{id}/unban")
     public Result<Void> unban(@Parameter(description = "用户ID") @PathVariable Long id, HttpSession session) {
         userManageService.unban(id, session);
         return Result.success();
     }
 
-    @Operation(summary = "重置用户密码", description = "重置为默认密码 123456")
+    @Operation(summary = "重置用户密码", operationId = "resetUserPassword", description = "重置为默认密码 123456")
     @PostMapping("/users/{id}/reset-password")
     public Result<Void> resetPassword(@Parameter(description = "用户ID") @PathVariable Long id, HttpSession session) {
         userManageService.resetPassword(id, session);

+ 5 - 1
src/main/java/com/campus/trade/interceptor/AuthInterceptor.java

@@ -18,9 +18,9 @@ public class AuthInterceptor implements HandlerInterceptor {
     private static final List<String> WHITE_LIST = Arrays.asList(
             "/auth/register",
             "/auth/login",
-            "/items",
             "/items/search",
             "/items/category/",
+            "/categories",
             "/upload/",
             "/v3/api-docs",
             "/swagger-ui",
@@ -32,6 +32,10 @@ public class AuthInterceptor implements HandlerInterceptor {
                              HttpServletResponse response,
                              Object handler) throws Exception {
         String uri = request.getServletPath();
+        // GET 请求 /items 放行(物品列表)
+        if (uri.equals("/items") && "GET".equalsIgnoreCase(request.getMethod())) {
+            return true;
+        }
         // GET 请求 /items/{id} 放行(物品详情)
         if (uri.matches("/items/\\d+") && "GET".equalsIgnoreCase(request.getMethod())) {
             return true;

+ 1 - 0
src/main/java/com/campus/trade/mapper/UserMapper.java

@@ -14,4 +14,5 @@ public interface UserMapper {
     int updateProfile(User user);
     int updateStatus(User user);
     List<User> selectAll();
+    List<User> selectByName(String name);
 }

+ 2 - 2
src/main/java/com/campus/trade/service/admin/CategoryService.java

@@ -16,9 +16,9 @@ public class CategoryService {
     @Autowired
     private CategoryMapper categoryMapper;
 
-    // 分类列表
+    // 分类列表(只返回启用的分类)
     public List<Category> list() {
-        return categoryMapper.selectAll();
+        return categoryMapper.selectEnabled();
     }
 
     // 新增分类

+ 10 - 3
src/main/java/com/campus/trade/service/admin/UserManageService.java

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
 
 import java.nio.charset.StandardCharsets;
+import java.util.List;
 
 @Service
 public class UserManageService {
@@ -19,10 +20,16 @@ public class UserManageService {
     @Autowired
     private UserMapper userMapper;
 
-    // 用户列表
-    public PageInfo<User> list(int pageNum, int pageSize) {
+    // 用户列表(支持按用户名模糊搜索)
+    public PageInfo<User> list(int pageNum, int pageSize, String username) {
         PageHelper.startPage(pageNum, pageSize);
-        return new PageInfo<>(userMapper.selectAll());
+        List<User> users;
+        if (username != null && !username.isEmpty()) {
+            users = userMapper.selectByName(username);
+        } else {
+            users = userMapper.selectAll();
+        }
+        return new PageInfo<>(users);
     }
 
     // 封禁用户

+ 3 - 0
src/main/resources/mapper/UserMapper.xml

@@ -11,6 +11,9 @@
     <select id="selectById" resultType="User">
         SELECT * FROM user WHERE id = #{id}
     </select>
+    <select id="selectByName" resultType="User">
+        SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%') ORDER BY created_at DESC
+    </select>
     <select id="selectAll" resultType="User">
         SELECT * FROM user ORDER BY created_at DESC
     </select>