diff --git a/src/main/java/com/qf/backend/BackendApplication.java b/src/main/java/com/qf/backend/BackendApplication.java index 3063f53..6637c2e 100644 --- a/src/main/java/com/qf/backend/BackendApplication.java +++ b/src/main/java/com/qf/backend/BackendApplication.java @@ -3,9 +3,11 @@ package com.qf.backend; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @MapperScan("com.qf.backend.mapper") +@ComponentScan(basePackages = "com.qf.backend") // 确保扫描范围包含 config 包 public class BackendApplication { public static void main(String[] args) { diff --git a/src/main/java/com/qf/backend/config/SecurityConfig.java b/src/main/java/com/qf/backend/config/SecurityConfig.java index 42f922b..72cd3d0 100644 --- a/src/main/java/com/qf/backend/config/SecurityConfig.java +++ b/src/main/java/com/qf/backend/config/SecurityConfig.java @@ -69,6 +69,8 @@ public class SecurityConfig { .authorizeHttpRequests(auth -> auth // 登录接口公开访问,不需要认证 .requestMatchers("/api/auth/login").permitAll() + // 公开注册接口,不需要认证 + .requestMatchers("/api/user/**").permitAll() // 其他所有请求都需要认证 .anyRequest().authenticated() ) diff --git a/src/main/java/com/qf/backend/controller/AdminUserControoler.java b/src/main/java/com/qf/backend/controller/AdminUserControoler.java new file mode 100644 index 0000000..0b1281a --- /dev/null +++ b/src/main/java/com/qf/backend/controller/AdminUserControoler.java @@ -0,0 +1,42 @@ +package com.qf.backend.controller; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.qf.backend.dto.Result; +import com.qf.backend.dto.request.PageRequest; +import com.qf.backend.dto.response.Userresponse; +import com.qf.backend.service.UsersService; + +/** + * 管理员用户控制器 + * 处理管理员用户相关的HTTP请求 + * 遵循RESTful API设计规范 + * @author 30803 + */ +@RestController +@RequestMapping("/api/admin") +public class AdminUserControoler { + private static final Logger logger = LoggerFactory.getLogger(AdminUserControoler.class); + @Autowired + private UsersService usersService; + + /** + * 分页获取所有用户信息 + * @param page 当前页码 + * @param size 每页数量 + * @return 所有用户信息 + */ + @PostMapping("/getuserinfo") + public Result> getAllUserInfo(@PathVariable PageRequest pageRequest ) { + logger.info("获取所有用户信息请求"); + return usersService.listUsersByPage(pageRequest); + } +} diff --git a/src/main/java/com/qf/backend/controller/AuthController.java b/src/main/java/com/qf/backend/controller/AuthController.java index 9882a39..3a4a532 100644 --- a/src/main/java/com/qf/backend/controller/AuthController.java +++ b/src/main/java/com/qf/backend/controller/AuthController.java @@ -26,58 +26,62 @@ import com.qf.backend.util.ResultUtils; @RestController @RequestMapping("/api/auth") public class AuthController { - + /** * 注入AuthenticationManager,用于处理认证请求 * AuthenticationManager是Spring Security的核心组件,负责协调认证过程 */ @Autowired private AuthenticationManager authenticationManager; - + /** * 注入JWT工具类,用于生成和验证JWT */ @Autowired private JwtUtils jwtUtils; - + /** * 用户登录接口 + * * @param loginRequest 登录请求体,包含用户名和密码 * @return ResponseEntity 包含JWT令牌的响应 * - * 登录流程: - * 1. 前端发送POST请求到/api/auth/login,携带用户名和密码 - * 2. 该方法被调用,创建UsernamePasswordAuthenticationToken对象 - * 3. 调用AuthenticationManager.authenticate()方法进行认证 - * 4. 认证成功后,从Authentication对象中获取UserDetails - * 5. 使用JwtUtils生成JWT令牌 - * 6. 返回包含JWT令牌的响应 + * 登录流程: + * 1. 前端发送POST请求到/api/auth/login,携带用户名和密码 + * 2. 该方法被调用,创建UsernamePasswordAuthenticationToken对象 + * 3. 调用AuthenticationManager.authenticate()方法进行认证 + * 4. 认证成功后,从Authentication对象中获取UserDetails + * 5. 使用JwtUtils生成JWT令牌 + * 6. 返回包含JWT令牌的响应 */ @PostMapping("/login") - public Result> login(@RequestBody LoginRequest loginRequest) { + public Result> login(@RequestBody LoginRequest loginRequest) { try { // 1. 创建认证令牌,将用户名和密码封装到UsernamePasswordAuthenticationToken中 // 这里的令牌是未认证状态的,因为还没有验证密码是否正确 - UsernamePasswordAuthenticationToken authenticationToken = - new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()); - + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginRequest.getUsername(), loginRequest.getPassword()); + // 2. 调用AuthenticationManager.authenticate()方法进行认证 // 这个方法会触发以下流程: // a. 调用UserDetailsService.loadUserByUsername()方法,从数据库加载用户信息 // b. 使用PasswordEncoder验证密码是否匹配 // c. 认证成功后,返回一个已认证的Authentication对象 Authentication authentication = authenticationManager.authenticate(authenticationToken); - + System.out.println(authentication); // 3. 从已认证的Authentication对象中获取UserDetails - // UserDetails包含了用户的基本信息和权限列表 + // UserDetails是Spring Security的核心接口,包含了用户的基本信息和权限列表 UserDetails userDetails = (UserDetails) authentication.getPrincipal(); - + // 4. 使用JwtUtils生成JWT令牌 // 令牌中包含了用户名、权限等信息,以及过期时间 String jwt = jwtUtils.generateToken(userDetails); // 5. 创建LoginResponse对象,封装JWT令牌和令牌类型 LoginResponse loginResponse = new LoginResponse(); + loginResponse.setUsername(userDetails.getUsername()); + // loginResponse.setRoles(userDetails.getAuthorities().stream().map(grantedAuthority -> grantedAuthority.getAuthority()).collect(Collectors.toList())); + // loginResponse.setPermissions(jwtUtils.getPermissions(userDetails)); loginResponse.setToken(jwt); loginResponse.setTokenType(jwtUtils.getTokenPrefix()); // 5. 返回包含JWT令牌的响应 diff --git a/src/main/java/com/qf/backend/controller/OrderItemsController.java b/src/main/java/com/qf/backend/controller/OrderItemsController.java deleted file mode 100644 index fd89aef..0000000 --- a/src/main/java/com/qf/backend/controller/OrderItemsController.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.OrderItems; -import com.qf.backend.service.OrderItemsService; -import java.util.List; - -/** - * 订单项控制器 - * 处理订单项相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/order-items") -@RestController -public class OrderItemsController { - private static final Logger logger = LoggerFactory.getLogger(OrderItemsController.class); - - @Autowired - private OrderItemsService orderItemsService; - - /** - * 根据订单ID查询订单项 - * @param orderId 订单ID - * @return 订单项列表 - */ - @GetMapping("/order/{orderId}") - public Result> getOrderItemsByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID查询订单项,订单ID:{}", orderId); - return orderItemsService.getOrderItemsByOrderId(orderId); - } - - /** - * 根据商品ID查询订单项 - * @param productId 商品ID - * @return 订单项列表 - */ - @GetMapping("/product/{productId}") - public Result> getOrderItemsByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询订单项,商品ID:{}", productId); - return orderItemsService.getOrderItemsByProductId(productId); - } - - /** - * 创建订单项 - * @param orderItems 订单项信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createOrderItem(@RequestBody OrderItems orderItems) { - logger.info("创建订单项,订单项信息:{}", orderItems); - return orderItemsService.createOrderItem(orderItems); - } - - /** - * 更新订单项信息 - * @param orderItems 订单项信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateOrderItem(@RequestBody OrderItems orderItems) { - logger.info("更新订单项信息,订单项信息:{}", orderItems); - return orderItemsService.updateOrderItem(orderItems); - } - - /** - * 删除订单项 - * @param id 订单项ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteOrderItem(@PathVariable Long id) { - logger.info("删除订单项,订单项ID:{}", id); - return orderItemsService.deleteOrderItem(id); - } - - /** - * 根据订单项ID查询订单项 - * @param id 订单项ID - * @return 订单项信息 - */ - @GetMapping("/{id}") - public Result getOrderItemById(@PathVariable Long id) { - logger.info("根据订单项ID查询订单项,订单项ID:{}", id); - return orderItemsService.getOrderItemById(id); - } - - /** - * 批量创建订单项 - * @param orderItemsList 订单项列表 - * @return 是否成功 - */ - @PostMapping("/batch-create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result batchCreateOrderItems(@RequestBody List orderItemsList) { - logger.info("批量创建订单项,订单项数量:{}", orderItemsList.size()); - return orderItemsService.batchCreateOrderItems(orderItemsList); - } - - /** - * 根据订单ID删除所有订单项 - * @param orderId 订单ID - * @return 是否成功 - */ - @DeleteMapping("/delete-by-order/{orderId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteOrderItemsByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID删除所有订单项,订单ID:{}", orderId); - return orderItemsService.deleteOrderItemsByOrderId(orderId); - } - - /** - * 计算订单总金额 - * @param orderId 订单ID - * @return 订单总金额 - */ - @GetMapping("/calculate-total/{orderId}") - public Result calculateOrderTotal(@PathVariable Long orderId) { - logger.info("计算订单总金额,订单ID:{}", orderId); - return orderItemsService.calculateOrderTotal(orderId); - } - - /** - * 根据SKU ID查询订单项 - * @param skuId SKU ID - * @return 订单项列表 - */ - @GetMapping("/sku/{skuId}") - public Result> getOrderItemsBySkuId(@PathVariable Long skuId) { - logger.info("根据SKU ID查询订单项,SKU ID:{}", skuId); - return orderItemsService.getOrderItemsBySkuId(skuId); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/OrderStatusHistoryController.java b/src/main/java/com/qf/backend/controller/OrderStatusHistoryController.java deleted file mode 100644 index 9675fb6..0000000 --- a/src/main/java/com/qf/backend/controller/OrderStatusHistoryController.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.OrderStatusHistory; -import com.qf.backend.service.OrderStatusHistoryService; -import java.util.List; - -/** - * 订单状态历史控制器 - * 处理订单状态历史相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/order-status-history") -@RestController -public class OrderStatusHistoryController { - private static final Logger logger = LoggerFactory.getLogger(OrderStatusHistoryController.class); - - @Autowired - private OrderStatusHistoryService orderStatusHistoryService; - - /** - * 根据订单ID查询状态历史 - * @param orderId 订单ID - * @return 订单状态历史列表 - */ - @GetMapping("/order/{orderId}") - public Result> getHistoryByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID查询状态历史,订单ID:{}", orderId); - return orderStatusHistoryService.getHistoryByOrderId(orderId); - } - - /** - * 创建订单状态历史记录 - * @param orderStatusHistory 订单状态历史信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createStatusHistory(@RequestBody OrderStatusHistory orderStatusHistory) { - logger.info("创建订单状态历史记录,订单状态历史信息:{}", orderStatusHistory); - return orderStatusHistoryService.createStatusHistory(orderStatusHistory); - } - - /** - * 更新订单状态历史信息 - * @param orderStatusHistory 订单状态历史信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateStatusHistory(@RequestBody OrderStatusHistory orderStatusHistory) { - logger.info("更新订单状态历史信息,订单状态历史信息:{}", orderStatusHistory); - return orderStatusHistoryService.updateStatusHistory(orderStatusHistory); - } - - /** - * 删除订单状态历史记录 - * @param id 记录ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteStatusHistory(@PathVariable Long id) { - logger.info("删除订单状态历史记录,记录ID:{}", id); - return orderStatusHistoryService.deleteStatusHistory(id); - } - - /** - * 根据记录ID查询订单状态历史 - * @param id 记录ID - * @return 订单状态历史信息 - */ - @GetMapping("/{id}") - public Result getStatusHistoryById(@PathVariable Long id) { - logger.info("根据记录ID查询订单状态历史,记录ID:{}", id); - return orderStatusHistoryService.getStatusHistoryById(id); - } - - /** - * 批量创建订单状态历史记录 - * @param historyList 订单状态历史列表 - * @return 是否成功 - */ - @PostMapping("/batch-create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchCreateStatusHistory(@RequestBody List historyList) { - logger.info("批量创建订单状态历史记录,记录数量:{}", historyList.size()); - return orderStatusHistoryService.batchCreateStatusHistory(historyList); - } - - /** - * 根据订单ID和状态查询历史记录 - * @param orderId 订单ID - * @param status 订单状态 - * @return 订单状态历史列表 - */ - @GetMapping("/order/{orderId}/status/{status}") - public Result> getHistoryByOrderIdAndStatus(@PathVariable Long orderId, @PathVariable Integer status) { - logger.info("根据订单ID和状态查询历史记录,订单ID:{},状态:{}", orderId, status); - return orderStatusHistoryService.getHistoryByOrderIdAndStatus(orderId, status); - } - - /** - * 获取订单最新状态 - * @param orderId 订单ID - * @return 最新订单状态历史信息 - */ - @GetMapping("/order/{orderId}/latest") - public Result getLatestStatusHistory(@PathVariable Long orderId) { - logger.info("获取订单最新状态,订单ID:{}", orderId); - return orderStatusHistoryService.getLatestStatusHistory(orderId); - } - - /** - * 根据订单ID删除所有状态历史 - * @param orderId 订单ID - * @return 是否成功 - */ - @DeleteMapping("/delete-by-order/{orderId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteHistoryByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID删除所有状态历史,订单ID:{}", orderId); - return orderStatusHistoryService.deleteHistoryByOrderId(orderId); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/OrdersController.java b/src/main/java/com/qf/backend/controller/OrdersController.java index 76ee8d8..388a9de 100644 --- a/src/main/java/com/qf/backend/controller/OrdersController.java +++ b/src/main/java/com/qf/backend/controller/OrdersController.java @@ -1,149 +1,176 @@ package com.qf.backend.controller; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; import com.qf.backend.dto.Result; +import com.qf.backend.dto.request.OrderRequest; +import com.qf.backend.dto.request.PageRequest; import com.qf.backend.entity.Orders; +import com.qf.backend.service.OrderItemsService; import com.qf.backend.service.OrdersService; -import java.util.List; /** - * 订单控制器 + * 订单控制器 (订单接口) * 处理订单相关的HTTP请求 * 遵循RESTful API设计规范 + * + * @author 30803 */ -@RequestMapping("/api/orders") @RestController +@RequestMapping("/api/orders") public class OrdersController { private static final Logger logger = LoggerFactory.getLogger(OrdersController.class); - @Autowired private OrdersService ordersService; - + @Autowired + private OrderItemsService orderItemsService; + /** - * 根据订单号查询订单 - * @param orderNumber 订单号 + * 获取订单详情 + * @param orderRequest 订单ID请求 * @return 订单信息 */ - @GetMapping("/number/{orderNumber}") - public Result getOrderByNumber(@PathVariable String orderNumber) { - logger.info("根据订单号查询订单,订单号:{}", orderNumber); - return ordersService.getOrderByNumber(orderNumber); + @PostMapping("/getorderinfo") + // 只有用户本人或管理员才能获取订单信息 + @PreAuthorize("#userId == authentication.principal.userId or hasRole('ROLE_ADMIN')") + public Result getOrderInfo(@RequestBody OrderRequest orderRequest) { + logger.info("获取订单信息请求,订单ID:{}", orderRequest.getId()); + return ordersService.getOrderById(orderRequest.getId()); } - - /** - * 根据用户ID查询订单列表 - * @param userId 用户ID - * @return 订单列表 - */ - @GetMapping("/user/{userId}") - public Result> getOrdersByUserId(@PathVariable Long userId) { - logger.info("根据用户ID查询订单列表,用户ID:{}", userId); - return ordersService.getOrdersByUserId(userId); - } - + /** * 创建订单 - * @param orders 订单信息 - * @return 是否成功 + * @param orderRequest 订单信息 + * @return 创建结果 */ @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createOrder(@RequestBody Orders orders) { - logger.info("创建订单,订单信息:{}", orders); - return ordersService.createOrder(orders); + // 只有登录用户才能创建订单 + @PreAuthorize("isAuthenticated()") + public Result createOrder(@RequestBody OrderRequest orderRequest) { + logger.info("创建订单请求,订单信息:{}", orderRequest); + Orders orders = new Orders(null, orderRequest.getOrderNo(), orderRequest.getUserId(), + orderRequest.getShopId(), orderRequest.getTotalAmount(), orderRequest.getActualAmount(), + orderRequest.getShippingFee(), 0, orderRequest.getShippingAddress(), + orderRequest.getReceiverName(), orderRequest.getReceiverPhone(), orderRequest.getPaymentMethod(), + null, null, null, null, orderRequest.getRemark(), null, null); + // 1. 创建订单主表 + Result createOrderResult = ordersService.createOrder(orders); + if (createOrderResult.getCode() != 200) { + return createOrderResult; + } + // 2. 创建订单项 + if (orderRequest.getOrderItems() != null && !orderRequest.getOrderItems().isEmpty()) { + for (var item : orderRequest.getOrderItems()) { + item.setOrderId(orders.getId()); + } + return orderItemsService.batchCreateOrderItems(orderRequest.getOrderItems()); + } + return createOrderResult; } - + /** * 更新订单信息 - * @param orders 订单信息 - * @return 是否成功 + * @param orderRequest 订单信息 + * @return 更新结果 */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateOrder(@RequestBody Orders orders) { - logger.info("更新订单信息,订单信息:{}", orders); + @PostMapping("/update") + // 只有管理员或店铺所有者才能更新订单 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result updateOrder(@RequestBody OrderRequest orderRequest) { + logger.info("更新订单信息请求,订单信息:{}", orderRequest); + Orders orders = new Orders(orderRequest.getId(), orderRequest.getOrderNo(), orderRequest.getUserId(), + orderRequest.getShopId(), orderRequest.getTotalAmount(), orderRequest.getActualAmount(), + orderRequest.getShippingFee(), orderRequest.getOrderStatus(), orderRequest.getShippingAddress(), + orderRequest.getReceiverName(), orderRequest.getReceiverPhone(), orderRequest.getPaymentMethod(), + orderRequest.getPaymentTime(), orderRequest.getShippingTime(), orderRequest.getDeliveryTime(), + orderRequest.getCompleteTime(), orderRequest.getRemark(), null, null); return ordersService.updateOrder(orders); } - + /** * 删除订单 - * @param id 订单ID - * @return 是否成功 + * @param orderRequest 订单ID请求 + * @return 删除结果 */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteOrder(@PathVariable Long id) { - logger.info("删除订单,订单ID:{}", id); - return ordersService.deleteOrder(id); + @PostMapping("/delete") + // 只有管理员或店铺所有者才能删除订单 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result deleteOrder(@RequestBody OrderRequest orderRequest) { + logger.info("删除订单请求,订单ID:{}", orderRequest.getId()); + return ordersService.deleteOrder(orderRequest.getId()); } - - /** - * 根据订单ID查询订单 - * @param id 订单ID - * @return 订单信息 - */ - @GetMapping("/{id}") - public Result getOrderById(@PathVariable Long id) { - logger.info("根据订单ID查询订单,订单ID:{}", id); - return ordersService.getOrderById(id); - } - + /** * 分页查询订单 - * @param page 当前页码 - * @param size 每页数量 + * @param pageRequest 分页请求 * @return 订单列表 */ - @GetMapping("/page/{page}/{size}") - public Result> listOrdersByPage(@PathVariable int page, @PathVariable int size) { - logger.info("分页查询订单,页码:{},每页数量:{}", page, size); - return ordersService.listOrdersByPage(page, size); + @PostMapping("/list") + // 只有管理员或店铺所有者才能查询所有订单 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result> listOrdersByPage(@RequestBody PageRequest pageRequest) { + logger.info("分页查询订单请求,页码:{},每页大小:{}", pageRequest.getPage(), pageRequest.getSize()); + return ordersService.listOrdersByPage(pageRequest.getPage(), pageRequest.getSize()); } - + + /** + * 根据用户ID查询订单 + * @param orderRequest 用户ID请求 + * @return 订单列表 + */ + @PostMapping("/byuser") + // 只有用户本人或管理员才能查询用户订单 + @PreAuthorize("#userId == authentication.principal.userId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByUser(@RequestBody OrderRequest orderRequest) { + logger.info("根据用户ID查询订单请求,用户ID:{}", orderRequest.getUserId()); + return ordersService.getOrdersByUserId(orderRequest.getUserId()); + } + /** * 根据店铺ID查询订单 - * @param shopId 店铺ID + * @param orderRequest 店铺ID请求 * @return 订单列表 */ - @GetMapping("/shop/{shopId}") - public Result> getOrdersByShopId(@PathVariable Long shopId) { - logger.info("根据店铺ID查询订单,店铺ID:{}", shopId); - return ordersService.getOrdersByShopId(shopId); + @PostMapping("/byshop") + // 只有店铺所有者或管理员才能查询店铺订单 + @PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByShop(@RequestBody OrderRequest orderRequest) { + logger.info("根据店铺ID查询订单请求,店铺ID:{}", orderRequest.getShopId()); + return ordersService.getOrdersByShopId(orderRequest.getShopId()); } - - /** - * 更新订单状态 - * @param orderId 订单ID - * @param status 订单状态 - * @return 是否成功 - */ - @PutMapping("/update-status/{orderId}/{status}") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result updateOrderStatus(@PathVariable Long orderId, @PathVariable Integer status) { - logger.info("更新订单状态,订单ID:{},状态:{}", orderId, status); - return ordersService.updateOrderStatus(orderId, status); - } - + /** * 根据订单状态查询订单 - * @param status 订单状态 + * @param orderRequest 订单状态请求 * @return 订单列表 */ - @GetMapping("/status/{status}") - public Result> getOrdersByStatus(@PathVariable Integer status) { - logger.info("根据订单状态查询订单,状态:{}", status); - return ordersService.getOrdersByStatus(status); + @PostMapping("/bystatus") + // 只有店铺所有者或管理员才能查询特定状态的订单 + @PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByStatus(@RequestBody OrderRequest orderRequest) { + logger.info("根据订单状态查询订单请求,状态:{}", orderRequest.getOrderStatus()); + return ordersService.getOrdersByStatus(orderRequest.getOrderStatus()); } -} \ No newline at end of file + + /** + * 更新订单状态 + * @param orderRequest 订单状态请求 + * @return 更新结果 + */ + @PostMapping("/updatestatus") + // 只有店铺所有者或管理员才能更新订单状态 + @PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + public Result updateOrderStatus(@RequestBody OrderRequest orderRequest) { + logger.info("更新订单状态请求,订单ID:{},状态:{}", orderRequest.getId(), orderRequest.getOrderStatus()); + return ordersService.updateOrderStatus(orderRequest.getId(), orderRequest.getOrderStatus()); + } +} diff --git a/src/main/java/com/qf/backend/controller/PaymentsController.java b/src/main/java/com/qf/backend/controller/PaymentsController.java deleted file mode 100644 index 4449b0a..0000000 --- a/src/main/java/com/qf/backend/controller/PaymentsController.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.Payments; -import com.qf.backend.service.PaymentsService; -import java.util.List; - -/** - * 支付控制器 - * 处理支付相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/payments") -@RestController -public class PaymentsController { - private static final Logger logger = LoggerFactory.getLogger(PaymentsController.class); - - @Autowired - private PaymentsService paymentsService; - - /** - * 根据订单ID查询支付记录 - * @param orderId 订单ID - * @return 支付记录 - */ - @GetMapping("/order/{orderId}") - public Result getPaymentByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID查询支付记录,订单ID:{}", orderId); - Payments payment = paymentsService.getPaymentByOrderId(orderId); - return Result.success(payment); - } - - /** - * 根据支付流水号查询支付记录 - * @param transactionId 支付流水号 - * @return 支付记录 - */ - @GetMapping("/transaction/{transactionId}") - public Result getPaymentByTransactionId(@PathVariable String transactionId) { - logger.info("根据支付流水号查询支付记录,支付流水号:{}", transactionId); - Payments payment = paymentsService.getPaymentByTransactionId(transactionId); - return Result.success(payment); - } - - /** - * 创建支付记录 - * @param payments 支付信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createPayment(@RequestBody Payments payments) { - logger.info("创建支付记录,支付信息:{}", payments); - boolean result = paymentsService.createPayment(payments); - return Result.success(result); - } - - /** - * 更新支付信息 - * @param payments 支付信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updatePayment(@RequestBody Payments payments) { - logger.info("更新支付信息,支付信息:{}", payments); - boolean result = paymentsService.updatePayment(payments); - return Result.success(result); - } - - /** - * 删除支付记录 - * @param id 支付ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deletePayment(@PathVariable Long id) { - logger.info("删除支付记录,支付ID:{}", id); - boolean result = paymentsService.deletePayment(id); - return Result.success(result); - } - - /** - * 根据支付ID查询支付记录 - * @param id 支付ID - * @return 支付记录 - */ - @GetMapping("/{id}") - public Result getPaymentById(@PathVariable Long id) { - logger.info("根据支付ID查询支付记录,支付ID:{}", id); - Payments payment = paymentsService.getPaymentById(id); - return Result.success(payment); - } - - /** - * 根据用户ID查询支付记录 - * @param userId 用户ID - * @return 支付记录列表 - */ - @GetMapping("/user/{userId}") - public Result> getPaymentsByUserId(@PathVariable Long userId) { - logger.info("根据用户ID查询支付记录,用户ID:{}", userId); - List payments = paymentsService.getPaymentsByUserId(userId); - return Result.success(payments); - } - - /** - * 根据支付状态查询支付记录 - * @param status 支付状态 - * @return 支付记录列表 - */ - @GetMapping("/status/{status}") - public Result> getPaymentsByStatus(@PathVariable Integer status) { - logger.info("根据支付状态查询支付记录,状态:{}", status); - List payments = paymentsService.getPaymentsByStatus(status); - return Result.success(payments); - } - - /** - * 更新支付状态 - * @param paymentId 支付ID - * @param status 支付状态 - * @return 是否成功 - */ - @PutMapping("/update-status/{paymentId}/{status}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updatePaymentStatus(@PathVariable Long paymentId, @PathVariable Integer status) { - logger.info("更新支付状态,支付ID:{},状态:{}", paymentId, status); - boolean result = paymentsService.updatePaymentStatus(paymentId, status); - return Result.success(result); - } - - /** - * 分页查询支付记录 - * @param page 当前页码 - * @param size 每页数量 - * @return 支付记录列表 - */ - @GetMapping("/page/{page}/{size}") - public Result> listPaymentsByPage(@PathVariable int page, @PathVariable int size) { - logger.info("分页查询支付记录,页码:{},每页数量:{}", page, size); - List payments = paymentsService.listPaymentsByPage(page, size); - return Result.success(payments); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/PermissionsController.java b/src/main/java/com/qf/backend/controller/PermissionsController.java deleted file mode 100644 index a644d00..0000000 --- a/src/main/java/com/qf/backend/controller/PermissionsController.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ - -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.Permissions; -import com.qf.backend.service.PermissionsService; -import java.util.List; - -/** - * 权限管理控制器 - * 处理权限相关的HTTP请求 - * 遵循RESTful API设计规范 - * @author 30803 - */ -@RequestMapping("/api/permissions") -@RestController -public class PermissionsController { - private static final Logger logger = LoggerFactory.getLogger(PermissionsController.class); - - @Autowired - private PermissionsService permissionsService; - - /** - * 查询所有权限 - * @return 权限列表 - */ - @GetMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listAllPermissions() { - logger.info("管理员查询所有权限"); - return permissionsService.listAllPermissions(); - } - - /** - * 根据权限ID查询权限 - * @param id 权限ID - * @return 权限信息 - */ - @GetMapping("/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getPermissionById(@PathVariable Long id) { - logger.info("管理员根据ID查询权限,ID:{}", id); - return permissionsService.getPermissionById(id); - } - - /** - * 根据权限编码查询权限 - * @param permissionCode 权限编码 - * @return 权限信息 - */ - @GetMapping("/code/{permissionCode}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getPermissionByCode(@PathVariable String permissionCode) { - logger.info("管理员根据权限编码查询权限,权限编码:{}", permissionCode); - return permissionsService.getPermissionByCode(permissionCode); - } - - /** - * 创建权限 - * @param permissions 权限信息 - * @return 是否成功 - */ - @PostMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createPermission(@RequestBody Permissions permissions) { - logger.info("管理员创建权限:{}", permissions); - return permissionsService.createPermission(permissions); - } - - /** - * 更新权限信息 - * @param permissions 权限信息 - * @return 是否成功 - */ - @PutMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updatePermission(@RequestBody Permissions permissions) { - logger.info("管理员更新权限:{}", permissions); - return permissionsService.updatePermission(permissions); - } - - /** - * 删除权限 - * @param id 权限ID - * @return 是否成功 - */ - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deletePermission(@PathVariable Long id) { - logger.info("管理员删除权限,ID:{}", id); - return permissionsService.deletePermission(id); - } - - /** - * 批量删除权限 - * @param ids 权限ID列表 - * @return 是否成功 - */ - @DeleteMapping("/batch") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchDeletePermissions(@RequestBody List ids) { - logger.info("管理员批量删除权限,IDs:{}", ids); - return permissionsService.batchDeletePermissions(ids); - } - - /** - * 根据菜单ID查询权限 - * @param menuId 菜单ID - * @return 权限列表 - */ - @GetMapping("/menu/{menuId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listPermissionsByMenuId(@PathVariable Long menuId) { - logger.info("管理员根据菜单ID查询权限,菜单ID:{}", menuId); - return permissionsService.listPermissionsByMenuId(menuId); - } - - /** - * 根据权限类型查询权限 - * @param permissionType 权限类型 - * @return 权限列表 - */ - @GetMapping("/type/{permissionType}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listPermissionsByType(@PathVariable String permissionType) { - logger.info("管理员根据权限类型查询权限,权限类型:{}", permissionType); - return permissionsService.listPermissionsByType(permissionType); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductAttributeValuesController.java b/src/main/java/com/qf/backend/controller/ProductAttributeValuesController.java deleted file mode 100644 index 03fdd6d..0000000 --- a/src/main/java/com/qf/backend/controller/ProductAttributeValuesController.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductAttributeValues; -import com.qf.backend.service.ProductAttributeValuesService; -import java.util.List; - -/** - * 商品属性值控制器 - * 处理商品属性值相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-attribute-values") -@RestController -public class ProductAttributeValuesController { - private static final Logger logger = LoggerFactory.getLogger(ProductAttributeValuesController.class); - - @Autowired - private ProductAttributeValuesService productAttributeValuesService; - - /** - * 根据商品ID查询属性值 - * @param productId 商品ID - * @return 属性值列表 - */ - @GetMapping("/product/{productId}") - public Result> getAttributeValuesByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询属性值,商品ID:{}", productId); - return productAttributeValuesService.getAttributeValuesByProductId(productId); - } - - /** - * 根据属性ID查询属性值 - * @param attributeId 属性ID - * @return 属性值列表 - */ - @GetMapping("/attribute/{attributeId}") - public Result> getAttributeValuesByAttributeId(@PathVariable Long attributeId) { - logger.info("根据属性ID查询属性值,属性ID:{}", attributeId); - return productAttributeValuesService.getAttributeValuesByAttributeId(attributeId); - } - - /** - * 创建属性值 - * @param productAttributeValues 属性值信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createAttributeValue(@RequestBody ProductAttributeValues productAttributeValues) { - logger.info("创建属性值,属性值信息:{}", productAttributeValues); - return productAttributeValuesService.createAttributeValue(productAttributeValues); - } - - /** - * 更新属性值信息 - * @param productAttributeValues 属性值信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateAttributeValue(@RequestBody ProductAttributeValues productAttributeValues) { - logger.info("更新属性值信息,属性值信息:{}", productAttributeValues); - return productAttributeValuesService.updateAttributeValue(productAttributeValues); - } - - /** - * 删除属性值 - * @param id 属性值ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteAttributeValue(@PathVariable Long id) { - logger.info("删除属性值,属性值ID:{}", id); - return productAttributeValuesService.deleteAttributeValue(id); - } - - /** - * 根据属性值ID查询属性值 - * @param id 属性值ID - * @return 属性值信息 - */ - @GetMapping("/{id}") - public Result getAttributeValueById(@PathVariable Long id) { - logger.info("根据属性值ID查询属性值,属性值ID:{}", id); - return productAttributeValuesService.getAttributeValueById(id); - } - - /** - * 批量创建商品属性值 - * @param attributeValues 属性值列表 - * @return 是否成功 - */ - @PostMapping("/batch-create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchCreateAttributeValues(@RequestBody List attributeValues) { - logger.info("批量创建商品属性值,属性值数量:{}", attributeValues.size()); - return productAttributeValuesService.batchCreateAttributeValues(attributeValues); - } - - /** - * 根据商品ID和属性ID查询属性值 - * @param productId 商品ID - * @param attributeId 属性ID - * @return 属性值信息 - */ - @GetMapping("/product/{productId}/attribute/{attributeId}") - public Result getAttributeValueByProductAndAttribute(@PathVariable Long productId, @PathVariable Long attributeId) { - logger.info("根据商品ID和属性ID查询属性值,商品ID:{},属性ID:{}", productId, attributeId); - return productAttributeValuesService.getAttributeValueByProductAndAttribute(productId, attributeId); - } - - /** - * 根据商品ID删除所有属性值 - * @param productId 商品ID - * @return 是否成功 - */ - @DeleteMapping("/delete-by-product/{productId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteAttributeValuesByProductId(@PathVariable Long productId) { - logger.info("根据商品ID删除所有属性值,商品ID:{}", productId); - return productAttributeValuesService.deleteAttributeValuesByProductId(productId); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductAttributesController.java b/src/main/java/com/qf/backend/controller/ProductAttributesController.java deleted file mode 100644 index 6ba0999..0000000 --- a/src/main/java/com/qf/backend/controller/ProductAttributesController.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductAttributes; -import com.qf.backend.service.ProductAttributesService; -import java.util.List; - -/** - * 商品属性控制器 - * 处理商品属性相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-attributes") -@RestController -public class ProductAttributesController { - private static final Logger logger = LoggerFactory.getLogger(ProductAttributesController.class); - - @Autowired - private ProductAttributesService productAttributesService; - - /** - * 根据分类ID查询属性 - * @param categoryId 分类ID - * @return 属性列表 - */ - @GetMapping("/category/{categoryId}") - public Result> getAttributesByCategoryId(@PathVariable Long categoryId) { - logger.info("根据分类ID查询属性,分类ID:{}", categoryId); - return productAttributesService.getAttributesByCategoryId(categoryId); - } - - /** - * 根据属性名称查询属性 - * @param attributeName 属性名称 - * @return 属性列表 - */ - @GetMapping("/name/{attributeName}") - public Result> getAttributesByName(@PathVariable String attributeName) { - logger.info("根据属性名称查询属性,属性名称:{}", attributeName); - return productAttributesService.getAttributesByName(attributeName); - } - - /** - * 创建属性 - * @param productAttributes 属性信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createAttribute(@RequestBody ProductAttributes productAttributes) { - logger.info("创建属性,属性信息:{}", productAttributes); - return productAttributesService.createAttribute(productAttributes); - } - - /** - * 更新属性信息 - * @param productAttributes 属性信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateAttribute(@RequestBody ProductAttributes productAttributes) { - logger.info("更新属性信息,属性信息:{}", productAttributes); - return productAttributesService.updateAttribute(productAttributes); - } - - /** - * 删除属性 - * @param id 属性ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteAttribute(@PathVariable Long id) { - logger.info("删除属性,属性ID:{}", id); - return productAttributesService.deleteAttribute(id); - } - - /** - * 根据属性ID查询属性 - * @param id 属性ID - * @return 属性信息 - */ - @GetMapping("/{id}") - public Result getAttributeById(@PathVariable Long id) { - logger.info("根据属性ID查询属性,属性ID:{}", id); - return productAttributesService.getAttributeById(id); - } - - /** - * 批量删除属性 - * @param ids 属性ID列表 - * @return 是否成功 - */ - @DeleteMapping("/batch-delete") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchDeleteAttributes(@RequestBody List ids) { - logger.info("批量删除属性,属性ID数量:{}", ids.size()); - return productAttributesService.batchDeleteAttributes(ids); - } - - /** - * 根据属性类型查询属性 - * @param attributeType 属性类型 - * @return 属性列表 - */ - @GetMapping("/type/{attributeType}") - public Result> getAttributesByType(@PathVariable String attributeType) { - logger.info("根据属性类型查询属性,属性类型:{}", attributeType); - return productAttributesService.getAttributesByType(attributeType); - } - - /** - * 查询是否可搜索的属性 - * @param searchable 是否可搜索 - * @return 属性列表 - */ - @GetMapping("/searchable") - public Result> getAttributesBySearchable(@RequestParam Boolean searchable) { - logger.info("查询是否可搜索的属性,可搜索:{}", searchable); - return productAttributesService.getAttributesBySearchable(searchable); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductCategoriesController.java b/src/main/java/com/qf/backend/controller/ProductCategoriesController.java deleted file mode 100644 index 2f45705..0000000 --- a/src/main/java/com/qf/backend/controller/ProductCategoriesController.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductCategories; -import com.qf.backend.service.ProductCategoriesService; -import java.util.List; - -/** - * 商品分类控制器 - * 处理商品分类相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-categories") -@RestController -public class ProductCategoriesController { - private static final Logger logger = LoggerFactory.getLogger(ProductCategoriesController.class); - - @Autowired - private ProductCategoriesService productCategoriesService; - - /** - * 根据分类名称查询分类 - * @param categoryName 分类名称 - * @return 分类信息 - */ - @GetMapping("/name/{categoryName}") - public Result getCategoryByName(@PathVariable String categoryName) { - logger.info("根据分类名称查询分类,分类名称:{}", categoryName); - return productCategoriesService.getCategoryByName(categoryName); - } - - /** - * 根据父分类ID查询子分类 - * @param parentId 父分类ID - * @return 子分类列表 - */ - @GetMapping("/parent/{parentId}") - public Result> getSubCategoriesByParentId(@PathVariable Long parentId) { - logger.info("根据父分类ID查询子分类,父分类ID:{}", parentId); - return productCategoriesService.getSubCategoriesByParentId(parentId); - } - - /** - * 创建分类 - * @param productCategories 分类信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createCategory(@RequestBody ProductCategories productCategories) { - logger.info("创建分类,分类信息:{}", productCategories); - return productCategoriesService.createCategory(productCategories); - } - - /** - * 更新分类信息 - * @param productCategories 分类信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateCategory(@RequestBody ProductCategories productCategories) { - logger.info("更新分类信息,分类信息:{}", productCategories); - return productCategoriesService.updateCategory(productCategories); - } - - /** - * 删除分类 - * @param id 分类ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteCategory(@PathVariable Long id) { - logger.info("删除分类,分类ID:{}", id); - return productCategoriesService.deleteCategory(id); - } - - /** - * 查询所有根分类(父分类ID为0或null的分类) - * @return 根分类列表 - */ - @GetMapping("/root") - public Result> listRootCategories() { - logger.info("查询所有根分类"); - return productCategoriesService.listRootCategories(); - } - - /** - * 根据分类ID查询分类 - * @param id 分类ID - * @return 分类信息 - */ - @GetMapping("/{id}") - public Result getCategoryById(@PathVariable Long id) { - logger.info("根据分类ID查询分类,分类ID:{}", id); - return productCategoriesService.getCategoryById(id); - } - - /** - * 批量删除分类 - * @param ids 分类ID列表 - * @return 是否成功 - */ - @DeleteMapping("/batch-delete") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchDeleteCategories(@RequestBody List ids) { - logger.info("批量删除分类,分类ID数量:{}", ids.size()); - return productCategoriesService.batchDeleteCategories(ids); - } - - /** - * 查询所有分类(树形结构) - * @return 分类树形列表 - */ - @GetMapping("/tree") - public Result> listAllCategoriesWithTree() { - logger.info("查询所有分类(树形结构)"); - return productCategoriesService.listAllCategoriesWithTree(); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductImagesController.java b/src/main/java/com/qf/backend/controller/ProductImagesController.java deleted file mode 100644 index 268dc46..0000000 --- a/src/main/java/com/qf/backend/controller/ProductImagesController.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductImages; -import com.qf.backend.service.ProductImagesService; -import java.util.List; - -/** - * 商品图片控制器 - * 处理商品图片相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-images") -@RestController -public class ProductImagesController { - private static final Logger logger = LoggerFactory.getLogger(ProductImagesController.class); - - @Autowired - private ProductImagesService productImagesService; - - /** - * 根据商品ID查询图片 - * @param productId 商品ID - * @return 图片列表 - */ - @GetMapping("/product/{productId}") - public Result> getImagesByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询图片,商品ID:{}", productId); - return productImagesService.getImagesByProductId(productId); - } - - /** - * 根据商品ID查询主图 - * @param productId 商品ID - * @return 主图信息 - */ - @GetMapping("/product/{productId}/main") - public Result getMainImageByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询主图,商品ID:{}", productId); - return productImagesService.getMainImageByProductId(productId); - } - - /** - * 创建商品图片 - * @param productImages 图片信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createImage(@RequestBody ProductImages productImages) { - logger.info("创建商品图片,图片信息:{}", productImages); - return productImagesService.createImage(productImages); - } - - /** - * 更新图片信息 - * @param productImages 图片信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateImage(@RequestBody ProductImages productImages) { - logger.info("更新图片信息,图片信息:{}", productImages); - return productImagesService.updateImage(productImages); - } - - /** - * 删除图片 - * @param id 图片ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteImage(@PathVariable Long id) { - logger.info("删除图片,图片ID:{}", id); - return productImagesService.deleteImage(id); - } - - /** - * 根据图片ID查询图片 - * @param id 图片ID - * @return 图片信息 - */ - @GetMapping("/{id}") - public Result getImageById(@PathVariable Long id) { - logger.info("根据图片ID查询图片,图片ID:{}", id); - return productImagesService.getImageById(id); - } - - /** - * 批量创建商品图片 - * @param images 图片列表 - * @return 是否成功 - */ - @PostMapping("/batch-create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchCreateImages(@RequestBody List images) { - logger.info("批量创建商品图片,图片数量:{}", images.size()); - return productImagesService.batchCreateImages(images); - } - - /** - * 根据商品ID删除所有图片 - * @param productId 商品ID - * @return 是否成功 - */ - @DeleteMapping("/delete-by-product/{productId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteImagesByProductId(@PathVariable Long productId) { - logger.info("根据商品ID删除所有图片,商品ID:{}", productId); - return productImagesService.deleteImagesByProductId(productId); - } - - /** - * 设置主图 - * @param productId 商品ID - * @param imageId 图片ID - * @return 是否成功 - */ - @PutMapping("/set-main/{productId}/{imageId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result setMainImage(@PathVariable Long productId, @PathVariable Long imageId) { - logger.info("设置主图,商品ID:{},图片ID:{}", productId, imageId); - return productImagesService.setMainImage(productId, imageId); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductInventoriesController.java b/src/main/java/com/qf/backend/controller/ProductInventoriesController.java deleted file mode 100644 index 2d0b621..0000000 --- a/src/main/java/com/qf/backend/controller/ProductInventoriesController.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductInventories; -import com.qf.backend.service.ProductInventoriesService; -import java.util.List; - -/** - * 商品库存控制器 - * 处理商品库存相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-inventories") -@RestController -public class ProductInventoriesController { - private static final Logger logger = LoggerFactory.getLogger(ProductInventoriesController.class); - - @Autowired - private ProductInventoriesService productInventoriesService; - - /** - * 根据商品ID查询库存 - * @param productId 商品ID - * @return 库存列表 - */ - @GetMapping("/product/{productId}") - public Result> getInventoriesByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询库存,商品ID:{}", productId); - return productInventoriesService.getInventoriesByProductId(productId); - } - - /** - * 根据SKU ID查询库存 - * @param skuId SKU ID - * @return 库存信息 - */ - @GetMapping("/sku/{skuId}") - public Result getInventoryBySkuId(@PathVariable Long skuId) { - logger.info("根据SKU ID查询库存,SKU ID:{}", skuId); - return productInventoriesService.getInventoryBySkuId(skuId); - } - - /** - * 创建库存记录 - * @param productInventories 库存信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createInventory(@RequestBody ProductInventories productInventories) { - logger.info("创建库存记录,库存信息:{}", productInventories); - return productInventoriesService.createInventory(productInventories); - } - - /** - * 更新库存信息 - * @param productInventories 库存信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateInventory(@RequestBody ProductInventories productInventories) { - logger.info("更新库存信息,库存信息:{}", productInventories); - return productInventoriesService.updateInventory(productInventories); - } - - /** - * 删除库存记录 - * @param id 库存ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteInventory(@PathVariable Long id) { - logger.info("删除库存记录,库存ID:{}", id); - return productInventoriesService.deleteInventory(id); - } - - /** - * 根据库存ID查询库存 - * @param id 库存ID - * @return 库存信息 - */ - @GetMapping("/{id}") - public Result getInventoryById(@PathVariable Long id) { - logger.info("根据库存ID查询库存,库存ID:{}", id); - return productInventoriesService.getInventoryById(id); - } - - /** - * 增加库存 - * @param skuId SKU ID - * @param quantity 增加数量 - * @return 是否成功 - */ - @PutMapping("/increase/{skuId}/{quantity}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result increaseInventory(@PathVariable Long skuId, @PathVariable Integer quantity) { - logger.info("增加库存,SKU ID:{},增加数量:{}", skuId, quantity); - return productInventoriesService.increaseInventory(skuId, quantity); - } - - /** - * 减少库存 - * @param skuId SKU ID - * @param quantity 减少数量 - * @return 是否成功 - */ - @PutMapping("/decrease/{skuId}/{quantity}") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result decreaseInventory(@PathVariable Long skuId, @PathVariable Integer quantity) { - logger.info("减少库存,SKU ID:{},减少数量:{}", skuId, quantity); - return productInventoriesService.decreaseInventory(skuId, quantity); - } - - /** - * 检查库存是否充足 - * @param skuId SKU ID - * @param quantity 需要的数量 - * @return 是否充足 - */ - @GetMapping("/check/{skuId}/{quantity}") - public Result checkInventorySufficient(@PathVariable Long skuId, @PathVariable Integer quantity) { - logger.info("检查库存是否充足,SKU ID:{},需要数量:{}", skuId, quantity); - return productInventoriesService.checkInventorySufficient(skuId, quantity); - } - - /** - * 批量更新库存 - * @param inventoryUpdates 库存更新列表 - * @return 是否成功 - */ - @PutMapping("/batch-update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchUpdateInventory(@RequestBody List inventoryUpdates) { - logger.info("批量更新库存,更新数量:{}", inventoryUpdates.size()); - return productInventoriesService.batchUpdateInventory(inventoryUpdates); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductSkusController.java b/src/main/java/com/qf/backend/controller/ProductSkusController.java deleted file mode 100644 index 75a1019..0000000 --- a/src/main/java/com/qf/backend/controller/ProductSkusController.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductSkus; -import com.qf.backend.service.ProductSkusService; -import java.util.List; - -/** - * 商品SKU控制器 - * 处理商品SKU相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/product-skus") -@RestController -public class ProductSkusController { - private static final Logger logger = LoggerFactory.getLogger(ProductSkusController.class); - - @Autowired - private ProductSkusService productSkusService; - - /** - * 根据商品ID查询SKU - * @param productId 商品ID - * @return SKU列表 - */ - @GetMapping("/product/{productId}") - public Result> getSkusByProductId(@PathVariable Long productId) { - logger.info("根据商品ID查询SKU,商品ID:{}", productId); - return productSkusService.getSkusByProductId(productId); - } - - /** - * 根据SKU编码查询SKU - * @param skuCode SKU编码 - * @return SKU信息 - */ - @GetMapping("/code/{skuCode}") - public Result getSkuByCode(@PathVariable String skuCode) { - logger.info("根据SKU编码查询SKU,SKU编码:{}", skuCode); - return productSkusService.getSkuByCode(skuCode); - } - - /** - * 创建SKU - * @param productSkus SKU信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createSku(@RequestBody ProductSkus productSkus) { - logger.info("创建SKU,SKU信息:{}", productSkus); - return productSkusService.createSku(productSkus); - } - - /** - * 更新SKU信息 - * @param productSkus SKU信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateSku(@RequestBody ProductSkus productSkus) { - logger.info("更新SKU信息,SKU信息:{}", productSkus); - return productSkusService.updateSku(productSkus); - } - - /** - * 删除SKU - * @param id SKU ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteSku(@PathVariable Long id) { - logger.info("删除SKU,SKU ID:{}", id); - return productSkusService.deleteSku(id); - } - - /** - * 根据SKU ID查询SKU - * @param id SKU ID - * @return SKU信息 - */ - @GetMapping("/{id}") - public Result getSkuById(@PathVariable Long id) { - logger.info("根据SKU ID查询SKU,SKU ID:{}", id); - return productSkusService.getSkuById(id); - } - - /** - * 批量创建SKU - * @param skus SKU列表 - * @return 是否成功 - */ - @PostMapping("/batch-create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchCreateSkus(@RequestBody List skus) { - logger.info("批量创建SKU,SKU数量:{}", skus.size()); - return productSkusService.batchCreateSkus(skus); - } - - /** - * 根据商品ID删除所有SKU - * @param productId 商品ID - * @return 是否成功 - */ - @DeleteMapping("/delete-by-product/{productId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteSkusByProductId(@PathVariable Long productId) { - logger.info("根据商品ID删除所有SKU,商品ID:{}", productId); - return productSkusService.deleteSkusByProductId(productId); - } - - /** - * 更新SKU库存 - * @param skuId SKU ID - * @param quantity 库存数量 - * @return 是否成功 - */ - @PutMapping("/update-stock/{skuId}/{quantity}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateSkuStock(@PathVariable Long skuId, @PathVariable Integer quantity) { - logger.info("更新SKU库存,SKU ID:{},库存数量:{}", skuId, quantity); - return productSkusService.updateSkuStock(skuId, quantity); - } - - /** - * 批量查询SKU - * @param skuIds SKU ID列表 - * @return SKU列表 - */ - @PostMapping("/batch-get") - public Result> batchGetSkus(@RequestBody List skuIds) { - logger.info("批量查询SKU,SKU ID数量:{}", skuIds.size()); - return productSkusService.batchGetSkus(skuIds); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ProductsController.java b/src/main/java/com/qf/backend/controller/ProductsController.java index 685709e..986a7c1 100644 --- a/src/main/java/com/qf/backend/controller/ProductsController.java +++ b/src/main/java/com/qf/backend/controller/ProductsController.java @@ -1,151 +1,147 @@ package com.qf.backend.controller; + +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.security.access.prepost.PreAuthorize; import com.qf.backend.dto.Result; +import com.qf.backend.dto.request.PageRequest; +import com.qf.backend.dto.request.ProductRequest; import com.qf.backend.entity.Products; import com.qf.backend.service.ProductsService; -import java.util.List; /** - * 商品控制器 + * 商品控制器 (商品接口) * 处理商品相关的HTTP请求 * 遵循RESTful API设计规范 + * + * @author 30803 */ -@RequestMapping("/api/products") @RestController +@RequestMapping("/api/products") public class ProductsController { private static final Logger logger = LoggerFactory.getLogger(ProductsController.class); - @Autowired private ProductsService productsService; - + /** - * 根据商品名称查询商品 - * @param productName 商品名称 - * @return 商品列表 - */ - @GetMapping("/name/{productName}") - public Result> getProductsByName(@PathVariable String productName) { - logger.info("根据商品名称查询商品,商品名称:{}", productName); - return productsService.getProductsByName(productName); - } - - /** - * 根据分类ID查询商品 - * @param categoryId 分类ID - * @return 商品列表 - */ - @GetMapping("/category/{categoryId}") - public Result> getProductsByCategoryId(@PathVariable Long categoryId) { - logger.info("根据分类ID查询商品,分类ID:{}", categoryId); - return productsService.getProductsByCategoryId(categoryId); - } - - /** - * 创建商品 - * @param products 商品信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createProduct(@RequestBody Products products) { - logger.info("创建商品,商品信息:{}", products); - return productsService.createProduct(products); - } - - /** - * 更新商品信息 - * @param products 商品信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateProduct(@RequestBody Products products) { - logger.info("更新商品信息,商品信息:{}", products); - return productsService.updateProduct(products); - } - - /** - * 删除商品 - * @param id 商品ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteProduct(@PathVariable Long id) { - logger.info("删除商品,商品ID:{}", id); - return productsService.deleteProduct(id); - } - - /** - * 根据商品ID查询商品 - * @param id 商品ID + * 获取商品详情 + * @param productRequest 商品ID请求 * @return 商品信息 */ - @GetMapping("/{id}") - public Result getProductById(@PathVariable Long id) { - logger.info("根据商品ID查询商品,商品ID:{}", id); - return productsService.getProductById(id); + @PostMapping("/getproductinfo") + public Result getProductInfo(@RequestBody ProductRequest productRequest) { + logger.info("获取商品信息请求,商品ID:{}", productRequest.getId()); + return productsService.getProductById(productRequest.getId()); } - + + /** + * 创建商品 + * @param productRequest 商品信息 + * @return 创建结果 + */ + @PostMapping("/create") + // 只有管理员或店铺所有者才能创建商品 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result createProduct(@RequestBody ProductRequest productRequest) { + logger.info("创建商品请求,商品信息:{}", productRequest); + Products products = new Products(null, productRequest.getProductName(), productRequest.getShopId(), + productRequest.getCategoryId(), productRequest.getDescription(), productRequest.getOriginalPrice(), + productRequest.getCurrentPrice(), 0, 1, productRequest.getMainImage(), 0, null, null); + return productsService.createProduct(products); + } + + /** + * 更新商品信息 + * @param productRequest 商品信息 + * @return 更新结果 + */ + @PostMapping("/update") + // 只有管理员或店铺所有者才能更新商品 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result updateProduct(@RequestBody ProductRequest productRequest) { + logger.info("更新商品信息请求,更新信息:{}", productRequest); + Products products = new Products(productRequest.getId(), productRequest.getProductName(), productRequest.getShopId(), + productRequest.getCategoryId(), productRequest.getDescription(), productRequest.getOriginalPrice(), + productRequest.getCurrentPrice(), null, productRequest.getStatus(), productRequest.getMainImage(), null, null, null); + return productsService.updateProduct(products); + } + + /** + * 删除商品 + * @param productRequest 商品ID请求 + * @return 删除结果 + */ + @PostMapping("/delete") + // 只有管理员或店铺所有者才能删除商品 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result deleteProduct(@RequestBody ProductRequest productRequest) { + logger.info("删除商品请求,商品ID:{}", productRequest.getId()); + return productsService.deleteProduct(productRequest.getId()); + } + /** * 分页查询商品 - * @param page 当前页码 - * @param size 每页数量 + * @param pageRequest 分页请求 * @return 商品列表 */ - @GetMapping("/page/{page}/{size}") - public Result> listProductsByPage(@PathVariable int page, @PathVariable int size) { - logger.info("分页查询商品,页码:{},每页数量:{}", page, size); - return productsService.listProductsByPage(page, size); + @PostMapping("/list") + public Result> listProductsByPage(@RequestBody PageRequest pageRequest) { + logger.info("分页查询商品请求,页码:{},每页大小:{}", pageRequest.getPage(), pageRequest.getSize()); + return productsService.listProductsByPage(pageRequest.getPage(), pageRequest.getSize()); } - + + /** + * 根据分类ID查询商品 + * @param productRequest 分类ID请求 + * @return 商品列表 + */ + @PostMapping("/bycategory") + public Result> getProductsByCategory(@RequestBody ProductRequest productRequest) { + logger.info("根据分类ID查询商品请求,分类ID:{}", productRequest.getCategoryId()); + return productsService.getProductsByCategoryId(productRequest.getCategoryId()); + } + /** * 根据店铺ID查询商品 - * @param shopId 店铺ID + * @param productRequest 店铺ID请求 * @return 商品列表 */ - @GetMapping("/shop/{shopId}") - public Result> getProductsByShopId(@PathVariable Long shopId) { - logger.info("根据店铺ID查询商品,店铺ID:{}", shopId); - return productsService.getProductsByShopId(shopId); + @PostMapping("/byshop") + public Result> getProductsByShop(@RequestBody ProductRequest productRequest) { + logger.info("根据店铺ID查询商品请求,店铺ID:{}", productRequest.getShopId()); + return productsService.getProductsByShopId(productRequest.getShopId()); } - - /** - * 批量上下架商品 - * @param ids 商品ID列表 - * @param status 状态(上架/下架) - * @return 是否成功 - */ - @PutMapping("/batch-status") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchUpdateProductStatus(@RequestBody List ids, @RequestParam Integer status) { - logger.info("批量上下架商品,商品ID数量:{},状态:{}", ids.size(), status); - return productsService.batchUpdateProductStatus(ids, status); - } - + /** * 搜索商品 - * @param keyword 关键词 - * @param page 当前页码 - * @param size 每页数量 + * @param productRequest 搜索请求 * @return 商品列表 */ - @GetMapping("/search") - public Result> searchProducts(@RequestParam String keyword, @RequestParam int page, @RequestParam int size) { - logger.info("搜索商品,关键词:{},页码:{},每页数量:{}", keyword, page, size); - return productsService.searchProducts(keyword, page, size); + @PostMapping("/search") + public Result> searchProducts(@RequestBody ProductRequest productRequest) { + logger.info("搜索商品请求,关键词:{},页码:{},每页大小:{}", + productRequest.getKeyword(), productRequest.getPage(), productRequest.getSize()); + return productsService.searchProducts(productRequest.getKeyword(), productRequest.getPage(), productRequest.getSize()); } -} \ No newline at end of file + + /** + * 批量上下架商品 + * @param productRequest 批量操作请求 + * @return 操作结果 + */ + @PostMapping("/batchupdate") + // 只有管理员或店铺所有者才能批量操作商品 + @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + public Result batchUpdateProductStatus(@RequestBody ProductRequest productRequest) { + logger.info("批量上下架商品请求,商品ID列表:{},状态:{}", productRequest.getIds(), productRequest.getStatus()); + return productsService.batchUpdateProductStatus(productRequest.getIds(), productRequest.getStatus()); + } +} diff --git a/src/main/java/com/qf/backend/controller/RefundsController.java b/src/main/java/com/qf/backend/controller/RefundsController.java deleted file mode 100644 index cb2e058..0000000 --- a/src/main/java/com/qf/backend/controller/RefundsController.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.Refunds; -import com.qf.backend.service.RefundsService; -import java.util.List; - -/** - * 退款控制器 - * 处理退款相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/refunds") -@RestController -public class RefundsController { - private static final Logger logger = LoggerFactory.getLogger(RefundsController.class); - - @Autowired - private RefundsService refundsService; - - /** - * 根据订单ID查询退款记录 - * @param orderId 订单ID - * @return 退款记录列表 - */ - @GetMapping("/order/{orderId}") - public Result> getRefundsByOrderId(@PathVariable Long orderId) { - logger.info("根据订单ID查询退款记录,订单ID:{}", orderId); - List refunds = refundsService.getRefundsByOrderId(orderId); - return Result.success(refunds); - } - - /** - * 根据退款单号查询退款记录 - * @param refundNumber 退款单号 - * @return 退款记录 - */ - @GetMapping("/number/{refundNumber}") - public Result getRefundByNumber(@PathVariable String refundNumber) { - logger.info("根据退款单号查询退款记录,退款单号:{}", refundNumber); - Refunds refund = refundsService.getRefundByNumber(refundNumber); - return Result.success(refund); - } - - /** - * 创建退款记录 - * @param refunds 退款信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createRefund(@RequestBody Refunds refunds) { - logger.info("创建退款记录,退款信息:{}", refunds); - boolean result = refundsService.createRefund(refunds); - return Result.success(result); - } - - /** - * 更新退款信息 - * @param refunds 退款信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateRefund(@RequestBody Refunds refunds) { - logger.info("更新退款信息,退款信息:{}", refunds); - boolean result = refundsService.updateRefund(refunds); - return Result.success(result); - } - - /** - * 删除退款记录 - * @param id 退款ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteRefund(@PathVariable Long id) { - logger.info("删除退款记录,退款ID:{}", id); - boolean result = refundsService.deleteRefund(id); - return Result.success(result); - } - - /** - * 根据退款ID查询退款记录 - * @param id 退款ID - * @return 退款记录 - */ - @GetMapping("/{id}") - public Result getRefundById(@PathVariable Long id) { - logger.info("根据退款ID查询退款记录,退款ID:{}", id); - Refunds refund = refundsService.getRefundById(id); - return Result.success(refund); - } - - /** - * 根据用户ID查询退款记录 - * @param userId 用户ID - * @return 退款记录列表 - */ - @GetMapping("/user/{userId}") - public Result> getRefundsByUserId(@PathVariable Long userId) { - logger.info("根据用户ID查询退款记录,用户ID:{}", userId); - List refunds = refundsService.getRefundsByUserId(userId); - return Result.success(refunds); - } - - /** - * 根据退款状态查询退款记录 - * @param status 退款状态 - * @return 退款记录列表 - */ - @GetMapping("/status/{status}") - public Result> getRefundsByStatus(@PathVariable Integer status) { - logger.info("根据退款状态查询退款记录,状态:{}", status); - List refunds = refundsService.getRefundsByStatus(status); - return Result.success(refunds); - } - - /** - * 更新退款状态 - * @param refundId 退款ID - * @param status 退款状态 - * @return 是否成功 - */ - @PutMapping("/update-status/{refundId}/{status}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateRefundStatus(@PathVariable Long refundId, @PathVariable Integer status) { - logger.info("更新退款状态,退款ID:{},状态:{}", refundId, status); - boolean result = refundsService.updateRefundStatus(refundId, status); - return Result.success(result); - } - - /** - * 分页查询退款记录 - * @param page 当前页码 - * @param size 每页数量 - * @return 退款记录列表 - */ - @GetMapping("/page/{page}/{size}") - public Result> listRefundsByPage(@PathVariable int page, @PathVariable int size) { - logger.info("分页查询退款记录,页码:{},每页数量:{}", page, size); - List refunds = refundsService.listRefundsByPage(page, size); - return Result.success(refunds); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/RolePermissionsController.java b/src/main/java/com/qf/backend/controller/RolePermissionsController.java deleted file mode 100644 index 6d5687c..0000000 --- a/src/main/java/com/qf/backend/controller/RolePermissionsController.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.RolePermissions; -import com.qf.backend.service.RolePermissionsService; -import java.util.List; - -/** - * 角色权限关联控制器 - * 处理角色与权限关联相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/role-permissions") -@RestController -public class RolePermissionsController { - private static final Logger logger = LoggerFactory.getLogger(RolePermissionsController.class); - - @Autowired - private RolePermissionsService rolePermissionsService; - - /** - * 根据角色ID查询角色权限关联 - * @param roleId 角色ID - * @return 角色权限关联列表 - */ - @GetMapping("/role/{roleId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> getRolePermissionsByRoleId(@PathVariable Long roleId) { - logger.info("管理员根据角色ID查询角色权限关联,角色ID:{}", roleId); - List rolePermissions = rolePermissionsService.getRolePermissionsByRoleId(roleId); - return Result.success(rolePermissions); - } - - /** - * 根据权限ID查询角色权限关联 - * @param permissionId 权限ID - * @return 角色权限关联列表 - */ - @GetMapping("/permission/{permissionId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> getRolePermissionsByPermissionId(@PathVariable Long permissionId) { - logger.info("管理员根据权限ID查询角色权限关联,权限ID:{}", permissionId); - List rolePermissions = rolePermissionsService.getRolePermissionsByPermissionId(permissionId); - return Result.success(rolePermissions); - } - - /** - * 为角色添加权限 - * @param request 角色权限关联请求体 - * @return 是否成功 - */ - @PostMapping("/add") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result addPermissionToRole(@RequestBody RolePermissionRequest request) { - logger.info("管理员为角色添加权限,角色ID:{},权限ID:{}", request.getRoleId(), request.getPermissionId()); - boolean result = rolePermissionsService.addPermissionToRole(request.getRoleId(), request.getPermissionId()); - return Result.success(result); - } - - /** - * 从角色移除权限 - * @param request 角色权限关联请求体 - * @return 是否成功 - */ - @DeleteMapping("/remove") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result removePermissionFromRole(@RequestBody RolePermissionRequest request) { - logger.info("管理员从角色移除权限,角色ID:{},权限ID:{}", request.getRoleId(), request.getPermissionId()); - boolean result = rolePermissionsService.removePermissionFromRole(request.getRoleId(), request.getPermissionId()); - return Result.success(result); - } - - /** - * 批量为角色添加权限 - * @param request 批量角色权限关联请求体 - * @return 是否成功 - */ - @PostMapping("/batch-add") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchAddPermissionsToRole(@RequestBody BatchRolePermissionRequest request) { - logger.info("管理员批量为角色添加权限,角色ID:{},权限ID列表:{}", request.getRoleId(), request.getPermissionIds()); - boolean result = rolePermissionsService.batchAddPermissionsToRole(request.getRoleId(), request.getPermissionIds()); - return Result.success(result); - } - - /** - * 清空角色的所有权限 - * @param roleId 角色ID - * @return 是否成功 - */ - @DeleteMapping("/clear/{roleId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result clearRolePermissions(@PathVariable Long roleId) { - logger.info("管理员清空角色的所有权限,角色ID:{}", roleId); - boolean result = rolePermissionsService.clearRolePermissions(roleId); - return Result.success(result); - } - - /** - * 检查角色是否拥有指定权限 - * @param roleId 角色ID - * @param permissionId 权限ID - * @return 是否拥有 - */ - @GetMapping("/check") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result checkRoleHasPermission(Long roleId, Long permissionId) { - logger.info("管理员检查角色是否拥有指定权限,角色ID:{},权限ID:{}", roleId, permissionId); - boolean result = rolePermissionsService.checkRoleHasPermission(roleId, permissionId); - return Result.success(result); - } - - /** - * 根据角色ID查询其拥有的权限ID列表 - * @param roleId 角色ID - * @return 权限ID列表 - */ - @GetMapping("/permission-ids/{roleId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listPermissionIdsByRoleId(@PathVariable Long roleId) { - logger.info("管理员根据角色ID查询其拥有的权限ID列表,角色ID:{}", roleId); - List permissionIds = rolePermissionsService.listPermissionIdsByRoleId(roleId); - return Result.success(permissionIds); - } - - /** - * 角色权限关联请求体 - */ - public static class RolePermissionRequest { - private Long roleId; - private Long permissionId; - - // getter和setter - public Long getRoleId() { - return roleId; - } - public void setRoleId(Long roleId) { - this.roleId = roleId; - } - public Long getPermissionId() { - return permissionId; - } - public void setPermissionId(Long permissionId) { - this.permissionId = permissionId; - } - } - - /** - * 批量角色权限关联请求体 - */ - public static class BatchRolePermissionRequest { - private Long roleId; - private List permissionIds; - - // getter和setter - public Long getRoleId() { - return roleId; - } - public void setRoleId(Long roleId) { - this.roleId = roleId; - } - public List getPermissionIds() { - return permissionIds; - } - public void setPermissionIds(List permissionIds) { - this.permissionIds = permissionIds; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/RolesController.java b/src/main/java/com/qf/backend/controller/RolesController.java deleted file mode 100644 index 666c7b0..0000000 --- a/src/main/java/com/qf/backend/controller/RolesController.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ - -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.Roles; -import com.qf.backend.service.RolesService; -import java.util.List; - -/** - * 角色管理控制器 - * 处理角色相关的HTTP请求 - * 遵循RESTful API设计规范 - * @author 30803 - */ -@RequestMapping("/api/roles") -@RestController -public class RolesController { - private static final Logger logger = LoggerFactory.getLogger(RolesController.class); - - @Autowired - private RolesService rolesService; - - /** - * 查询所有角色 - * @return 角色列表 - */ - @GetMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listAllRoles() { - logger.info("管理员查询所有角色"); - return rolesService.listAllRoles(); - } - - /** - * 根据角色ID查询角色 - * @param id 角色ID - * @return 角色信息 - */ - @GetMapping("/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getRoleById(@PathVariable Long id) { - logger.info("管理员根据ID查询角色,ID:{}", id); - return rolesService.getRoleById(id); - } - - /** - * 根据角色名称查询角色 - * @param roleName 角色名称 - * @return 角色信息 - */ - @GetMapping("/name/{roleName}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getRoleByName(@PathVariable String roleName) { - logger.info("管理员根据名称查询角色,名称:{}", roleName); - return rolesService.getRoleByName(roleName); - } - - /** - * 根据用户ID查询其拥有的角色列表 - * @param userId 用户ID - * @return 角色列表 - */ - @GetMapping("/user/{userId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listRolesByUserId(@PathVariable Long userId) { - logger.info("管理员根据用户ID查询角色列表,用户ID:{}", userId); - return rolesService.listRolesByUserId(userId); - } - - /** - * 创建角色 - * @param roles 角色信息 - * @return 是否成功 - */ - @PostMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createRole(@RequestBody Roles roles) { - logger.info("管理员创建角色:{}", roles); - return rolesService.createRole(roles); - } - - /** - * 更新角色信息 - * @param roles 角色信息 - * @return 是否成功 - */ - @PutMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateRole(@RequestBody Roles roles) { - logger.info("管理员更新角色:{}", roles); - return rolesService.updateRole(roles); - } - - /** - * 删除角色 - * @param id 角色ID - * @return 是否成功 - */ - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteRole(@PathVariable Long id) { - logger.info("管理员删除角色,ID:{}", id); - return rolesService.deleteRole(id); - } - - /** - * 批量删除角色 - * @param ids 角色ID列表 - * @return 是否成功 - */ - @DeleteMapping("/batch") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchDeleteRoles(@RequestBody List ids) { - logger.info("管理员批量删除角色,IDs:{}", ids); - return rolesService.batchDeleteRoles(ids); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ShopCategoriesController.java b/src/main/java/com/qf/backend/controller/ShopCategoriesController.java deleted file mode 100644 index 633739a..0000000 --- a/src/main/java/com/qf/backend/controller/ShopCategoriesController.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ShopCategories; -import com.qf.backend.service.ShopCategoriesService; -import java.util.List; - -/** - * 店铺分类控制器 - * 处理店铺分类相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/shop-categories") -@RestController -public class ShopCategoriesController { - private static final Logger logger = LoggerFactory.getLogger(ShopCategoriesController.class); - - @Autowired - private ShopCategoriesService shopCategoriesService; - - /** - * 根据分类名称查询分类 - * @param categoryName 分类名称 - * @return 分类信息 - */ - @GetMapping("/name/{categoryName}") - public Result getCategoryByName(@PathVariable String categoryName) { - logger.info("根据分类名称查询分类,分类名称:{}", categoryName); - return shopCategoriesService.getCategoryByName(categoryName); - } - - /** - * 根据父分类ID查询子分类 - * @param parentId 父分类ID - * @return 子分类列表 - */ - @GetMapping("/parent/{parentId}") - public Result> getSubCategoriesByParentId(@PathVariable Long parentId) { - logger.info("根据父分类ID查询子分类,父分类ID:{}", parentId); - return shopCategoriesService.getSubCategoriesByParentId(parentId); - } - - /** - * 创建分类 - * @param shopCategories 分类信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result createCategory(@RequestBody ShopCategories shopCategories) { - logger.info("创建分类,分类信息:{}", shopCategories); - return shopCategoriesService.createCategory(shopCategories); - } - - /** - * 更新分类信息 - * @param shopCategories 分类信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateCategory(@RequestBody ShopCategories shopCategories) { - logger.info("更新分类信息,分类信息:{}", shopCategories); - return shopCategoriesService.updateCategory(shopCategories); - } - - /** - * 删除分类 - * @param id 分类ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteCategory(@PathVariable Long id) { - logger.info("删除分类,分类ID:{}", id); - return shopCategoriesService.deleteCategory(id); - } - - /** - * 查询所有根分类(父分类ID为0或null的分类) - * @return 根分类列表 - */ - @GetMapping("/root") - public Result> listRootCategories() { - logger.info("查询所有根分类"); - return shopCategoriesService.listRootCategories(); - } - - /** - * 根据分类ID查询分类 - * @param id 分类ID - * @return 分类信息 - */ - @GetMapping("/{id}") - public Result getCategoryById(@PathVariable Long id) { - logger.info("根据分类ID查询分类,分类ID:{}", id); - return shopCategoriesService.getCategoryById(id); - } - - /** - * 批量删除分类 - * @param ids 分类ID列表 - * @return 是否成功 - */ - @DeleteMapping("/batch-delete") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchDeleteCategories(@RequestBody List ids) { - logger.info("批量删除分类,分类ID数量:{}", ids.size()); - return shopCategoriesService.batchDeleteCategories(ids); - } - - /** - * 查询所有分类(树形结构) - * @return 分类树形列表 - */ - @GetMapping("/tree") - public Result> listAllCategoriesWithTree() { - logger.info("查询所有分类(树形结构)"); - return shopCategoriesService.listAllCategoriesWithTree(); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ShopRatingsController.java b/src/main/java/com/qf/backend/controller/ShopRatingsController.java deleted file mode 100644 index ee1a23f..0000000 --- a/src/main/java/com/qf/backend/controller/ShopRatingsController.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.ShopRatings; -import com.qf.backend.service.ShopRatingsService; -import java.util.List; - -/** - * 店铺评分控制器 - * 处理店铺评分相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/shop-ratings") -@RestController -public class ShopRatingsController { - private static final Logger logger = LoggerFactory.getLogger(ShopRatingsController.class); - - @Autowired - private ShopRatingsService shopRatingsService; - - /** - * 根据店铺ID查询评分 - * @param shopId 店铺ID - * @return 评分列表 - */ - @GetMapping("/shop/{shopId}") - public Result> getRatingsByShopId(@PathVariable Long shopId) { - logger.info("根据店铺ID查询评分,店铺ID:{}", shopId); - return shopRatingsService.getRatingsByShopId(shopId); - } - - /** - * 根据用户ID查询评分 - * @param userId 用户ID - * @return 评分列表 - */ - @GetMapping("/user/{userId}") - public Result> getRatingsByUserId(@PathVariable Long userId) { - logger.info("根据用户ID查询评分,用户ID:{}", userId); - return shopRatingsService.getRatingsByUserId(userId); - } - - /** - * 创建评分 - * @param shopRatings 评分信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createRating(@RequestBody ShopRatings shopRatings) { - logger.info("创建评分,评分信息:{}", shopRatings); - return shopRatingsService.createRating(shopRatings); - } - - /** - * 更新评分信息 - * @param shopRatings 评分信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result updateRating(@RequestBody ShopRatings shopRatings) { - logger.info("更新评分信息,评分信息:{}", shopRatings); - return shopRatingsService.updateRating(shopRatings); - } - - /** - * 删除评分 - * @param id 评分ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteRating(@PathVariable Long id) { - logger.info("删除评分,评分ID:{}", id); - return shopRatingsService.deleteRating(id); - } - - /** - * 根据评分ID查询评分 - * @param id 评分ID - * @return 评分信息 - */ - @GetMapping("/{id}") - public Result getRatingById(@PathVariable Long id) { - logger.info("根据评分ID查询评分,评分ID:{}", id); - return shopRatingsService.getRatingById(id); - } - - /** - * 获取店铺平均评分 - * @param shopId 店铺ID - * @return 平均评分 - */ - @GetMapping("/shop/{shopId}/average") - public Result getAverageRatingByShopId(@PathVariable Long shopId) { - logger.info("获取店铺平均评分,店铺ID:{}", shopId); - return shopRatingsService.getAverageRatingByShopId(shopId); - } - - /** - * 获取店铺评分数量 - * @param shopId 店铺ID - * @return 评分数量 - */ - @GetMapping("/shop/{shopId}/count") - public Result getRatingCountByShopId(@PathVariable Long shopId) { - logger.info("获取店铺评分数量,店铺ID:{}", shopId); - return shopRatingsService.getRatingCountByShopId(shopId); - } - - /** - * 根据评分星级查询店铺评分 - * @param shopId 店铺ID - * @param rating 评分星级 - * @return 评分列表 - */ - @GetMapping("/shop/{shopId}/rating/{rating}") - public Result> getRatingsByShopIdAndRating(@PathVariable Long shopId, @PathVariable Integer rating) { - logger.info("根据评分星级查询店铺评分,店铺ID:{},评分星级:{}", shopId, rating); - return shopRatingsService.getRatingsByShopIdAndRating(shopId, rating); - } - - /** - * 检查用户是否已对店铺评分 - * @param shopId 店铺ID - * @param userId 用户ID - * @return 是否已评分 - */ - @GetMapping("/check") - public Result checkUserHasRated(@RequestParam Long shopId, @RequestParam Long userId) { - logger.info("检查用户是否已对店铺评分,店铺ID:{},用户ID:{}", shopId, userId); - return shopRatingsService.checkUserHasRated(shopId, userId); - } - - /** - * 分页查询店铺评分 - * @param shopId 店铺ID - * @param page 当前页码 - * @param size 每页数量 - * @return 评分列表 - */ - @GetMapping("/shop/{shopId}/page/{page}/{size}") - public Result> listRatingsByShopIdAndPage(@PathVariable Long shopId, @PathVariable int page, @PathVariable int size) { - logger.info("分页查询店铺评分,店铺ID:{},页码:{},每页数量:{}", shopId, page, size); - return shopRatingsService.listRatingsByShopIdAndPage(shopId, page, size); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/ShopsController.java b/src/main/java/com/qf/backend/controller/ShopsController.java deleted file mode 100644 index 701dfe8..0000000 --- a/src/main/java/com/qf/backend/controller/ShopsController.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.qf.backend.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.security.access.prepost.PreAuthorize; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.Shops; -import com.qf.backend.service.ShopsService; -import java.util.List; - -/** - * 店铺控制器 - * 处理店铺相关的HTTP请求 - * 遵循RESTful API设计规范 - */ -@RequestMapping("/api/shops") -@RestController -public class ShopsController { - private static final Logger logger = LoggerFactory.getLogger(ShopsController.class); - - @Autowired - private ShopsService shopsService; - - /** - * 根据店铺名称查询店铺 - * @param shopName 店铺名称 - * @return 店铺列表 - */ - @GetMapping("/name/{shopName}") - public Result> getShopsByName(@PathVariable String shopName) { - logger.info("根据店铺名称查询店铺,店铺名称:{}", shopName); - return shopsService.getShopsByName(shopName); - } - - /** - * 根据用户ID查询店铺 - * @param userId 用户ID - * @return 店铺信息 - */ - @GetMapping("/user/{userId}") - public Result getShopByUserId(@PathVariable Long userId) { - logger.info("根据用户ID查询店铺,用户ID:{}", userId); - return shopsService.getShopByUserId(userId); - } - - /** - * 创建店铺 - * @param shops 店铺信息 - * @return 是否成功 - */ - @PostMapping("/create") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result createShop(@RequestBody Shops shops) { - logger.info("创建店铺,店铺信息:{}", shops); - return shopsService.createShop(shops); - } - - /** - * 更新店铺信息 - * @param shops 店铺信息 - * @return 是否成功 - */ - @PutMapping("/update") - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") - public Result updateShop(@RequestBody Shops shops) { - logger.info("更新店铺信息,店铺信息:{}", shops); - return shopsService.updateShop(shops); - } - - /** - * 删除店铺 - * @param id 店铺ID - * @return 是否成功 - */ - @DeleteMapping("/delete/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result deleteShop(@PathVariable Long id) { - logger.info("删除店铺,店铺ID:{}", id); - return shopsService.deleteShop(id); - } - - /** - * 根据店铺ID查询店铺 - * @param id 店铺ID - * @return 店铺信息 - */ - @GetMapping("/{id}") - public Result getShopById(@PathVariable Long id) { - logger.info("根据店铺ID查询店铺,店铺ID:{}", id); - return shopsService.getShopById(id); - } - - /** - * 分页查询店铺 - * @param page 当前页码 - * @param size 每页数量 - * @return 店铺列表 - */ - @GetMapping("/page/{page}/{size}") - public Result> listShopsByPage(@PathVariable int page, @PathVariable int size) { - logger.info("分页查询店铺,页码:{},每页数量:{}", page, size); - return shopsService.listShopsByPage(page, size); - } - - /** - * 根据店铺分类ID查询店铺 - * @param categoryId 分类ID - * @return 店铺列表 - */ - @GetMapping("/category/{categoryId}") - public Result> getShopsByCategoryId(@PathVariable Long categoryId) { - logger.info("根据店铺分类ID查询店铺,分类ID:{}", categoryId); - return shopsService.getShopsByCategoryId(categoryId); - } - - /** - * 更新店铺状态 - * @param shopId 店铺ID - * @param status 店铺状态 - * @return 是否成功 - */ - @PutMapping("/update-status/{shopId}/{status}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result updateShopStatus(@PathVariable Long shopId, @PathVariable Integer status) { - logger.info("更新店铺状态,店铺ID:{},状态:{}", shopId, status); - return shopsService.updateShopStatus(shopId, status); - } - - /** - * 搜索店铺 - * @param keyword 关键词 - * @param page 当前页码 - * @param size 每页数量 - * @return 店铺列表 - */ - @GetMapping("/search") - public Result> searchShops(@RequestParam String keyword, @RequestParam int page, @RequestParam int size) { - logger.info("搜索店铺,关键词:{},页码:{},每页数量:{}", keyword, page, size); - return shopsService.searchShops(keyword, page, size); - } -} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/UserRolesController.java b/src/main/java/com/qf/backend/controller/UserRolesController.java index 07be758..3ae4933 100644 --- a/src/main/java/com/qf/backend/controller/UserRolesController.java +++ b/src/main/java/com/qf/backend/controller/UserRolesController.java @@ -4,22 +4,20 @@ */ package com.qf.backend.controller; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; import com.qf.backend.dto.Result; -import com.qf.backend.entity.UserRoles; +import com.qf.backend.entity.User.UserRoles; import com.qf.backend.service.UserRolesService; -import java.util.List; /** * 用户角色关联控制器 @@ -59,111 +57,6 @@ public class UserRolesController { return userRolesService.getUserRolesByRoleId(roleId); } - /** - * 为用户添加角色 - * @param userId 用户ID - * @param roleId 角色ID - * @return 是否成功 - */ - @PostMapping("/add") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result addRoleToUser(@RequestBody UserRolesRequest request) { - logger.info("管理员为用户添加角色,用户ID:{},角色ID:{}", request.getUserId(), request.getRoleId()); - return userRolesService.addRoleToUser(request.getUserId(), request.getRoleId()); - } - /** - * 从用户移除角色 - * @param userId 用户ID - * @param roleId 角色ID - * @return 是否成功 - */ - @DeleteMapping("/remove") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result removeRoleFromUser(@RequestBody UserRolesRequest request) { - logger.info("管理员从用户移除角色,用户ID:{},角色ID:{}", request.getUserId(), request.getRoleId()); - return userRolesService.removeRoleFromUser(request.getUserId(), request.getRoleId()); - } - /** - * 批量为用户添加角色 - * @param userId 用户ID - * @param roleIds 角色ID列表 - * @return 是否成功 - */ - @PostMapping("/batch-add") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result batchAddRolesToUser(@RequestBody BatchUserRolesRequest request) { - logger.info("管理员批量为用户添加角色,用户ID:{},角色ID列表:{}", request.getUserId(), request.getRoleIds()); - return userRolesService.batchAddRolesToUser(request.getUserId(), request.getRoleIds()); - } - - /** - * 清空用户的所有角色 - * @param userId 用户ID - * @return 是否成功 - */ - @DeleteMapping("/clear/{userId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result clearUserRoles(@PathVariable Long userId) { - logger.info("管理员清空用户的所有角色,用户ID:{}", userId); - return userRolesService.clearUserRoles(userId); - } - - /** - * 检查用户是否拥有指定角色 - * @param userId 用户ID - * @param roleId 角色ID - * @return 是否拥有 - */ - @GetMapping("/check") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result checkUserHasRole(Long userId, Long roleId) { - logger.info("管理员检查用户是否拥有指定角色,用户ID:{},角色ID:{}", userId, roleId); - return userRolesService.checkUserHasRole(userId, roleId); - } - - /** - * 用户角色关联请求体 - */ - public static class UserRolesRequest { - private Long userId; - private Long roleId; - - // getter和setter - public Long getUserId() { - return userId; - } - public void setUserId(Long userId) { - this.userId = userId; - } - public Long getRoleId() { - return roleId; - } - public void setRoleId(Long roleId) { - this.roleId = roleId; - } - } - - /** - * 批量用户角色关联请求体 - */ - public static class BatchUserRolesRequest { - private Long userId; - private List roleIds; - - // getter和setter - public Long getUserId() { - return userId; - } - public void setUserId(Long userId) { - this.userId = userId; - } - public List getRoleIds() { - return roleIds; - } - public void setRoleIds(List roleIds) { - this.roleIds = roleIds; - } - } } \ No newline at end of file diff --git a/src/main/java/com/qf/backend/controller/UsersController.java b/src/main/java/com/qf/backend/controller/UsersController.java index 9eb940c..a427fd3 100644 --- a/src/main/java/com/qf/backend/controller/UsersController.java +++ b/src/main/java/com/qf/backend/controller/UsersController.java @@ -1,94 +1,101 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ - package com.qf.backend.controller; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.security.access.prepost.PreAuthorize; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Users; +import com.qf.backend.dto.request.UsersRequest; +import com.qf.backend.entity.User.Users; import com.qf.backend.service.UsersService; -import java.util.List; /** - * 用户管理控制器 + * 用户控制器 (用户接口) * 处理用户相关的HTTP请求 * 遵循RESTful API设计规范 + * * @author 30803 */ -@RequestMapping("/api/users") @RestController +@RequestMapping("/api/user") public class UsersController { private static final Logger logger = LoggerFactory.getLogger(UsersController.class); @Autowired private UsersService usersService; - + /** - * 分页获取用户列表 仅管理员角色 - * @param pageNum 页码 - * @param pageSize 每页数量 - * @return 用户列表 - */ - @GetMapping("/page") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listUsersByPage(int pageNum, int pageSize) { - logger.info("管理员获取用户列表,页码:{},每页数量:{}", pageNum, pageSize); - return usersService.listUsersByPage(pageNum, pageSize); - } - - /** - * 根据id查询用户 仅管理员角色 - * @param id 用户ID + * 获取用户信息 + * @param usersRequest 用户ID请求 * @return 用户信息 */ - @GetMapping("/{id}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getUserById(@PathVariable Long id) { - logger.info("管理员根据id查询用户,id:{}", id); - return usersService.getUserById(id); + @PostMapping("/getuserinfo") + // 只有用户本人或管理员才能获取用户信息 + @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + public Result getUserInfo(@RequestBody UsersRequest usersRequest) { + logger.info("获取用户信息请求,用户ID:{}", usersRequest.getId()); + return usersService.getUserById(usersRequest.getId()); } - + /** - * 根据用户名查询用户 用户可以查询自己的信息 - * @param username 用户名 - * @return 用户信息 + * 更新用户信息 + * @param usersRequest 用户信息 + * @return 更新结果 */ - @GetMapping("/username/{username}") - // @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getUserByUsername(@PathVariable String username) { - logger.info("管理员根据用户名查询用户,用户名:{}", username); - return usersService.getUserByUsername(username); + @PostMapping("/info") + // 只有用户本人或管理员才能更新用户信息 + @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + public Result updateUserInfo(@RequestBody UsersRequest usersRequest) { + logger.info("更新用户信息请求,更新信息:{}", usersRequest); + Users users = new Users(usersRequest.getId(), usersRequest.getUsername(), usersRequest.getPassword(), + usersRequest.getEmail(), usersRequest.getPhone(), usersRequest.getAvatar(), null, 1, null, null); + return usersService.updateUser(users); } - + /** - * 根据邮箱查询用户 仅管理员角色 - * @param email 邮箱 - * @return 用户信息 + * 注销登录 + * 修改用户状态为2(删除) + * @param usersRequest 注销请求 + * @return 注销结果 */ - @GetMapping("/email/{email}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result getUserByEmail(@PathVariable String email) { - logger.info("管理员根据邮箱查询用户,邮箱:{}", email); - return usersService.getUserByEmail(email); + @PostMapping("/logout") + // 只有用户本人或管理员才能注销登录 + @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + public Result logout(@RequestBody UsersRequest usersRequest) { + logger.info("注销登录请求,用户ID:{}", usersRequest.getId()); + return usersService.deleteUser(usersRequest.getId(),usersRequest.getStatus() ); } - + /** - * 查询所有用户 仅管理员角色 - * @return 用户列表 + * 重置密码 + * + * @param usersRequest 重置密码请求 + * @return 重置结果 */ - @GetMapping - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> listAllUsers() { - logger.info("管理员查询所有用户"); - return usersService.listAllUsers(); + @PostMapping("/resetpassword") + // 只有用户本人或管理员才能重置密码 + @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + public Result resetPassword(@RequestBody UsersRequest usersRequest) { + logger.info("重置密码请求,用户ID:{}", usersRequest.getId()); + return usersService.updatePassword(usersRequest.getId(), usersRequest.getPassword()); } - + + /** + * 注册用户 + * 默认为1,启用状态 + * @param usersRequest 注册请求 + * @return 注册结果 + */ + @PostMapping("/register") + public Result registerUser(@RequestBody UsersRequest usersRequest) { + logger.info("用户注册请求,注册信息:{}", usersRequest); + Users users = new Users(null, usersRequest.getUsername(), usersRequest.getPassword(), usersRequest.getEmail(), + usersRequest.getPhone(), usersRequest.getAvatar(), null, 1, null, null); + return usersService.createUser(users); + } + } diff --git a/src/main/java/com/qf/backend/dto/UserDataList.java b/src/main/java/com/qf/backend/dto/UserDataList.java deleted file mode 100644 index d0efe01..0000000 --- a/src/main/java/com/qf/backend/dto/UserDataList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.qf.backend.dto; - -import java.util.List; - -import com.qf.backend.entity.Users; - -public class UserDataList { - private List userDataList; -} diff --git a/src/main/java/com/qf/backend/dto/UserDto.java b/src/main/java/com/qf/backend/dto/UserDto.java deleted file mode 100644 index 4605615..0000000 --- a/src/main/java/com/qf/backend/dto/UserDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.qf.backend.dto; - -import java.util.Date; - -/** - * 用户DTO 用于表示用户结构(包含用户的基本信息 和 角色信息) - * @author 30803 - * @date 2023-12-12 - * @description 用户DTO 用于表示用户结构 - * - */ -public class UserDto { - private Long id; // 用户ID,主键,自增 - private String username; // 用户名 - private String email; // 邮箱 - private String phone; // 手机号 - private Integer status; // 状态:0:禁用, 1:启用 - private Long roleId; // 角色ID - private String roleName; // 角色名称 - private String description; // 角色描述 - private Integer roleType; // 角色类型:0:默认用户,1:店主,2:管理员 - private Date createdAt; // 创建时间 - private Date updatedAt; // 更新时间 - -} diff --git a/src/main/java/com/qf/backend/dto/request/OrderRequest.java b/src/main/java/com/qf/backend/dto/request/OrderRequest.java new file mode 100644 index 0000000..5130d9f --- /dev/null +++ b/src/main/java/com/qf/backend/dto/request/OrderRequest.java @@ -0,0 +1,36 @@ +package com.qf.backend.dto.request; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import com.qf.backend.entity.OrderItems; + +import lombok.Data; + +/** + * 订单请求DTO + */ +@Data +public class OrderRequest { + private Long id; // 订单ID + private String orderNo; // 订单号 + private Long userId; // 用户ID + private Long shopId; // 店铺ID + private BigDecimal totalAmount; // 总金额 + private BigDecimal actualAmount; // 实际支付金额 + private BigDecimal shippingFee; // 运费 + private Integer orderStatus; // 订单状态:0:待付款, 1:待发货, 2:待收货, 3:已完成, 4:已取消, 5:已退款 + private String shippingAddress; // 收货地址 + private String receiverName; // 收件人姓名 + private String receiverPhone; // 收件人电话 + private String paymentMethod; // 支付方式 + private Date paymentTime; // 支付时间 + private Date shippingTime; // 发货时间 + private Date deliveryTime; // 送达时间 + private Date completeTime; // 完成时间 + private String remark; // 备注 + private List orderItems; // 订单项列表 + private Integer page; // 页码,用于分页查询 + private Integer size; // 每页大小,用于分页查询 +} diff --git a/src/main/java/com/qf/backend/dto/request/PageRequest.java b/src/main/java/com/qf/backend/dto/request/PageRequest.java new file mode 100644 index 0000000..de8d5b8 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/request/PageRequest.java @@ -0,0 +1,10 @@ +package com.qf.backend.dto.request; + +import lombok.Data; + +@Data +public class PageRequest { + private Integer page; // 当前页码 + private Integer size; // 每页数量 + +} diff --git a/src/main/java/com/qf/backend/dto/request/ProductRequest.java b/src/main/java/com/qf/backend/dto/request/ProductRequest.java new file mode 100644 index 0000000..bea059e --- /dev/null +++ b/src/main/java/com/qf/backend/dto/request/ProductRequest.java @@ -0,0 +1,26 @@ +package com.qf.backend.dto.request; + +import java.math.BigDecimal; +import java.util.List; + +import lombok.Data; + +/** + * 商品请求DTO + */ +@Data +public class ProductRequest { + private Long id; // 商品ID + private String productName; // 商品名称 + private Long shopId; // 店铺ID + private Long categoryId; // 商品分类ID + private String description; // 商品描述 + private BigDecimal originalPrice; // 原价 + private BigDecimal currentPrice; // 当前价格 + private Integer status; // 状态:0:下架, 1:上架 + private String mainImage; // 主图URL + private String keyword; // 搜索关键词 + private Integer page; // 页码 + private Integer size; // 每页大小 + private List ids; // 商品ID列表,用于批量操作 +} diff --git a/src/main/java/com/qf/backend/dto/request/UsersRequest.java b/src/main/java/com/qf/backend/dto/request/UsersRequest.java new file mode 100644 index 0000000..f5d2830 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/request/UsersRequest.java @@ -0,0 +1,16 @@ +package com.qf.backend.dto.request; + +import lombok.Data; + +@Data +public class UsersRequest { + private Long id; // 用户ID + private String username; // 用户名,唯一 + private String password; // 密码,加密存储 + private String email; // 邮箱,唯一 + private String phone; // 手机号,唯一 + private String avatar; // 头像URL + // 默认为1,启用状态 + private Integer status; // 状态:0:禁用, 1:启用, 2:删除 + +} diff --git a/src/main/java/com/qf/backend/dto/response/Userresponse.java b/src/main/java/com/qf/backend/dto/response/Userresponse.java new file mode 100644 index 0000000..88c1922 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/response/Userresponse.java @@ -0,0 +1,24 @@ +package com.qf.backend.dto.response; + +import java.util.List; + +import com.qf.backend.entity.User.Roles; +import com.qf.backend.entity.User.Users; + +public class Userresponse { + private Users users; + private List roles; + // getters and setters + public Users getUsers() { + return users; + } + public void setUsers(Users users) { + this.users = users; + } + public List getRoles() { + return roles; + } + public void setRoles(List roles) { + this.roles = roles; + } +} diff --git a/src/main/java/com/qf/backend/entity/Permissions.java b/src/main/java/com/qf/backend/entity/User/Permissions.java similarity index 96% rename from src/main/java/com/qf/backend/entity/Permissions.java rename to src/main/java/com/qf/backend/entity/User/Permissions.java index fc1050f..5ced21f 100644 --- a/src/main/java/com/qf/backend/entity/Permissions.java +++ b/src/main/java/com/qf/backend/entity/User/Permissions.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/RolePermissions.java b/src/main/java/com/qf/backend/entity/User/RolePermissions.java similarity index 96% rename from src/main/java/com/qf/backend/entity/RolePermissions.java rename to src/main/java/com/qf/backend/entity/User/RolePermissions.java index 7e489fd..4ffc0e9 100644 --- a/src/main/java/com/qf/backend/entity/RolePermissions.java +++ b/src/main/java/com/qf/backend/entity/User/RolePermissions.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/Roles.java b/src/main/java/com/qf/backend/entity/User/Roles.java similarity index 96% rename from src/main/java/com/qf/backend/entity/Roles.java rename to src/main/java/com/qf/backend/entity/User/Roles.java index 8699a02..6241d9b 100644 --- a/src/main/java/com/qf/backend/entity/Roles.java +++ b/src/main/java/com/qf/backend/entity/User/Roles.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/UserDetails.java b/src/main/java/com/qf/backend/entity/User/UserDetails.java similarity index 97% rename from src/main/java/com/qf/backend/entity/UserDetails.java rename to src/main/java/com/qf/backend/entity/User/UserDetails.java index 3a740ab..f74943f 100644 --- a/src/main/java/com/qf/backend/entity/UserDetails.java +++ b/src/main/java/com/qf/backend/entity/User/UserDetails.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/UserRoles.java b/src/main/java/com/qf/backend/entity/User/UserRoles.java similarity index 96% rename from src/main/java/com/qf/backend/entity/UserRoles.java rename to src/main/java/com/qf/backend/entity/User/UserRoles.java index 0b24886..f2a35d3 100644 --- a/src/main/java/com/qf/backend/entity/UserRoles.java +++ b/src/main/java/com/qf/backend/entity/User/UserRoles.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/Users.java b/src/main/java/com/qf/backend/entity/User/Users.java similarity index 71% rename from src/main/java/com/qf/backend/entity/Users.java rename to src/main/java/com/qf/backend/entity/User/Users.java index d8cf461..fbf62ff 100644 --- a/src/main/java/com/qf/backend/entity/Users.java +++ b/src/main/java/com/qf/backend/entity/User/Users.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.User; import java.util.Date; @@ -15,13 +15,12 @@ import lombok.NoArgsConstructor; /** * 用户基本信息表 */ -@Data // 自动生成getter、setter、toString、equals、hashCode方法 -@Builder // 自动生成builder模式的构造器 -@NoArgsConstructor // 自动生成无参构造器 -@AllArgsConstructor // 自动生成全参构造器 +@Data // 自动生成getter、setter、toString、equals、hashCode方法 +@Builder // 自动生成builder模式的构造器 +@NoArgsConstructor // 自动生成无参构造器 +@AllArgsConstructor // 自动生成全参构造器 @TableName("users") public class Users { - @TableId(type = IdType.AUTO) private Long id; // 用户ID,主键,自增 private String username; // 用户名,唯一 @@ -31,7 +30,7 @@ public class Users { private String avatar; // 头像URL @TableField(exist = false) // 标记该字段在数据库中不存在 private Date lastLoginTime; // 最后登录时间 - private Integer status; // 状态:0:禁用, 1:启用 + private Integer status; // 状态:0:禁用, 1:启用 ,2:冻结 ,默认1 private Date createdAt; // 创建时间 private Date updatedAt; // 更新时间 } diff --git a/src/main/java/com/qf/backend/inti/RoleInitializer.java b/src/main/java/com/qf/backend/inti/RoleInitializer.java index 26ca4c0..4afd446 100644 --- a/src/main/java/com/qf/backend/inti/RoleInitializer.java +++ b/src/main/java/com/qf/backend/inti/RoleInitializer.java @@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.qf.backend.entity.Roles; +import com.qf.backend.entity.User.Roles; import com.qf.backend.service.RolesService; /** diff --git a/src/main/java/com/qf/backend/inti/UserInitializer.java b/src/main/java/com/qf/backend/inti/UserInitializer.java index c00755b..f182834 100644 --- a/src/main/java/com/qf/backend/inti/UserInitializer.java +++ b/src/main/java/com/qf/backend/inti/UserInitializer.java @@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.qf.backend.entity.Users; +import com.qf.backend.entity.User.Users; import com.qf.backend.service.UsersService; /** diff --git a/src/main/java/com/qf/backend/mapper/PermissionsMapper.java b/src/main/java/com/qf/backend/mapper/PermissionsMapper.java index 4803e45..0a2a7f1 100644 --- a/src/main/java/com/qf/backend/mapper/PermissionsMapper.java +++ b/src/main/java/com/qf/backend/mapper/PermissionsMapper.java @@ -3,7 +3,7 @@ package com.qf.backend.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.Permissions; +import com.qf.backend.entity.User.Permissions; /** * 权限信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java b/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java index e460524..1406553 100644 --- a/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java +++ b/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java @@ -3,7 +3,7 @@ package com.qf.backend.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.RolePermissions; +import com.qf.backend.entity.User.RolePermissions; /** * 角色权限关联表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/RolesMapper.java b/src/main/java/com/qf/backend/mapper/RolesMapper.java index b26abd2..0a8e960 100644 --- a/src/main/java/com/qf/backend/mapper/RolesMapper.java +++ b/src/main/java/com/qf/backend/mapper/RolesMapper.java @@ -3,7 +3,7 @@ package com.qf.backend.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.Roles; +import com.qf.backend.entity.User.Roles; /** * 角色信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java b/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java index 8e390e4..1770e9c 100644 --- a/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java +++ b/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java @@ -3,7 +3,7 @@ package com.qf.backend.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.UserDetails; +import com.qf.backend.entity.User.UserDetails; /** * 用户详细信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/UserRolesMapper.java b/src/main/java/com/qf/backend/mapper/UserRolesMapper.java index c1ff125..f81bbca 100644 --- a/src/main/java/com/qf/backend/mapper/UserRolesMapper.java +++ b/src/main/java/com/qf/backend/mapper/UserRolesMapper.java @@ -3,7 +3,7 @@ package com.qf.backend.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.UserRoles; +import com.qf.backend.entity.User.UserRoles; /** * 用户角色关联表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/UsersMapper.java b/src/main/java/com/qf/backend/mapper/UsersMapper.java index b2faa7f..dcadc3b 100644 --- a/src/main/java/com/qf/backend/mapper/UsersMapper.java +++ b/src/main/java/com/qf/backend/mapper/UsersMapper.java @@ -5,7 +5,7 @@ import org.apache.ibatis.annotations.Select; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.qf.backend.entity.Users; +import com.qf.backend.entity.User.Users; /** * 用户基本信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/service/PermissionsService.java b/src/main/java/com/qf/backend/service/PermissionsService.java index 1e4928e..12d2778 100644 --- a/src/main/java/com/qf/backend/service/PermissionsService.java +++ b/src/main/java/com/qf/backend/service/PermissionsService.java @@ -2,7 +2,7 @@ package com.qf.backend.service; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Permissions; +import com.qf.backend.entity.User.Permissions; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/RolePermissionsService.java b/src/main/java/com/qf/backend/service/RolePermissionsService.java index 6c9419a..2a5adff 100644 --- a/src/main/java/com/qf/backend/service/RolePermissionsService.java +++ b/src/main/java/com/qf/backend/service/RolePermissionsService.java @@ -1,7 +1,7 @@ package com.qf.backend.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.qf.backend.entity.RolePermissions; +import com.qf.backend.entity.User.RolePermissions; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/RolesService.java b/src/main/java/com/qf/backend/service/RolesService.java index d133d76..f8b291a 100644 --- a/src/main/java/com/qf/backend/service/RolesService.java +++ b/src/main/java/com/qf/backend/service/RolesService.java @@ -4,7 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Roles; +import com.qf.backend.entity.User.Roles; /** * 角色服务接口 diff --git a/src/main/java/com/qf/backend/service/UserDetailsService.java b/src/main/java/com/qf/backend/service/UserDetailsService.java index 7b50d5d..02b165c 100644 --- a/src/main/java/com/qf/backend/service/UserDetailsService.java +++ b/src/main/java/com/qf/backend/service/UserDetailsService.java @@ -2,7 +2,7 @@ package com.qf.backend.service; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.UserDetails; +import com.qf.backend.entity.User.UserDetails; /** * 用户详情服务接口 diff --git a/src/main/java/com/qf/backend/service/UserRolesService.java b/src/main/java/com/qf/backend/service/UserRolesService.java index e184872..3f9a941 100644 --- a/src/main/java/com/qf/backend/service/UserRolesService.java +++ b/src/main/java/com/qf/backend/service/UserRolesService.java @@ -4,7 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.UserRoles; +import com.qf.backend.entity.User.UserRoles; /** * 用户角色关联服务接口 @@ -26,20 +26,19 @@ public interface UserRolesService extends IService { Result> getUserRolesByRoleId(Long roleId); /** - * 为用户添加角色 + * 更新用户ID关联的角色 * @param userId 用户ID * @param roleId 角色ID * @return 是否成功 */ - Result addRoleToUser(Long userId, Long roleId); - + Result updateUserRoleByUserId(Long userId, Long roleId); /** - * 从用户移除角色 + * 创建用户角色关联 * @param userId 用户ID * @param roleId 角色ID * @return 是否成功 */ - Result removeRoleFromUser(Long userId, Long roleId); + Result createUserRole(Long userId, Long roleId); /** * 批量为用户添加角色 @@ -48,19 +47,4 @@ public interface UserRolesService extends IService { * @return 是否成功 */ Result batchAddRolesToUser(Long userId, List roleIds); - - /** - * 清空用户的所有角色 - * @param userId 用户ID - * @return 是否成功 - */ - Result clearUserRoles(Long userId); - - /** - * 检查用户是否拥有指定角色 - * @param userId 用户ID - * @param roleId 角色ID - * @return 是否拥有 - */ - Result checkUserHasRole(Long userId, Long roleId); } diff --git a/src/main/java/com/qf/backend/service/UsersService.java b/src/main/java/com/qf/backend/service/UsersService.java index 819275d..905de13 100644 --- a/src/main/java/com/qf/backend/service/UsersService.java +++ b/src/main/java/com/qf/backend/service/UsersService.java @@ -4,13 +4,25 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Users; +import com.qf.backend.dto.request.PageRequest; +import com.qf.backend.dto.response.Userresponse; +import com.qf.backend.entity.User.Users; + + /** * 用户服务接口 */ public interface UsersService extends IService { + /** + * 根据用户名或邮箱查询用户 + * @param identifier 标识符,可以是用户名或邮箱 + * @param isUsername 是否为用户名标识(true为用户名,false为邮箱) + * @return 用户信息 + */ + Result getUserByIdentifier(String identifier, boolean isUsername); + /** * 根据用户名查询用户 * @param username 用户名 @@ -52,13 +64,7 @@ public interface UsersService extends IService { * @param id 用户ID * @return 是否成功 */ - Result deleteUser(Long id); - - /** - * 查询所有用户 - * @return 用户列表 - */ - Result> listAllUsers(); + Result deleteUser(Long id, Integer status); /** * 分页查询用户 @@ -66,7 +72,7 @@ public interface UsersService extends IService { * @param size 每页数量 * @return 用户列表 */ - Result> listUsersByPage(int page, int size); + Result> listUsersByPage(PageRequest pageRequest); /** * 根据用户ID查询用户 diff --git a/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java index d70f21b..d5c7b66 100644 --- a/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Permissions; +import com.qf.backend.entity.User.Permissions; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; import com.qf.backend.mapper.PermissionsMapper; diff --git a/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java index 0e6514c..71c3982 100644 --- a/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java @@ -2,7 +2,7 @@ package com.qf.backend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.qf.backend.entity.RolePermissions; +import com.qf.backend.entity.User.RolePermissions; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; import com.qf.backend.mapper.RolePermissionsMapper; diff --git a/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java index ba6d29f..00b001d 100644 --- a/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java @@ -16,7 +16,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Roles; +import com.qf.backend.entity.User.Roles; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; import com.qf.backend.mapper.RolesMapper; diff --git a/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java index 4b932ef..b34a37d 100644 --- a/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java @@ -13,9 +13,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Roles; -import com.qf.backend.entity.UserRoles; -import com.qf.backend.entity.Users; +import com.qf.backend.entity.User.Roles; +import com.qf.backend.entity.User.UserRoles; +import com.qf.backend.entity.User.Users; import com.qf.backend.service.RolesService; import com.qf.backend.service.UserRolesService; import com.qf.backend.service.UsersService; diff --git a/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java b/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java index 5e9a48d..be27a6c 100644 --- a/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java @@ -17,10 +17,10 @@ import org.springframework.stereotype.Service; import com.qf.backend.dto.LoginResponse; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Permissions; -import com.qf.backend.entity.Roles; -import com.qf.backend.entity.UserRoles; -import com.qf.backend.entity.Users; +import com.qf.backend.entity.User.Permissions; +import com.qf.backend.entity.User.Roles; +import com.qf.backend.entity.User.UserRoles; +import com.qf.backend.entity.User.Users; import com.qf.backend.exception.ErrorCode; import com.qf.backend.service.PermissionsService; import com.qf.backend.service.RolePermissionsService; diff --git a/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java index a410237..1cac0c4 100644 --- a/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java @@ -5,6 +5,7 @@ package com.qf.backend.service.impl; +import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +14,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qf.backend.dto.Result; -import com.qf.backend.entity.UserRoles; +import com.qf.backend.entity.User.UserRoles; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; import com.qf.backend.mapper.UserRolesMapper; @@ -61,9 +62,38 @@ public class UsersRolesServiceImpl extends ServiceImpl addRoleToUser(Long userId, Long roleId) { + public Result createUserRole(Long userId, Long roleId){ + if (userId == null || roleId == null) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空"); + } + // 检查是否已经存在该关联关系 + UserRoles existing = userRolesMapper.selectOne(new QueryWrapper().eq("user_id", userId).eq("role_id", roleId)); + if (existing != null) { + throw new BusinessException(ErrorCode.BUSINESS_ERROR, "用户已拥有该角色"); + } + // 创建用户角色关联 + UserRoles userRoles = new UserRoles(); + userRoles.setUserId(userId); + userRoles.setRoleId(roleId); + userRoles.setCreatedAt(new Date()); + int result = userRolesMapper.insert(userRoles); + return ResultUtils.success(result > 0); + } + /** + * 更新用户ID关联的角色 + * @param userId 用户ID + * @param roleId 角色ID + * @return 是否成功 + */ + @Override + public Result updateUserRoleByUserId(Long userId, Long roleId) { if (userId == null || roleId == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空"); } @@ -84,27 +114,12 @@ public class UsersRolesServiceImpl extends ServiceImpl removeRoleFromUser(Long userId, Long roleId) { - if (userId == null || roleId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空"); - } - try { - // 检查关联关系是否存在 - UserRoles existing = userRolesMapper.selectOne(new QueryWrapper().eq("user_id", userId).eq("role_id", roleId)); - if (existing == null) { - throw new BusinessException(ErrorCode.BUSINESS_ERROR, "用户与角色的关联关系不存在"); - } - int result = userRolesMapper.delete(new QueryWrapper().eq("user_id", userId).eq("role_id", roleId)); - return ResultUtils.success(result > 0); - } catch (BusinessException e) { - throw e; - } catch (Exception e) { - throw new BusinessException(ErrorCode.DATABASE_ERROR, "移除用户角色关联失败", e); - } - } - + /** + * 批量为用户添加角色 + * @param userId 用户ID + * @param roleIds 角色ID列表 + * @return 是否成功 + */ @Override public Result batchAddRolesToUser(Long userId, List roleIds) { if (userId == null) { @@ -135,40 +150,5 @@ public class UsersRolesServiceImpl extends ServiceImpl clearUserRoles(Long userId) { - if (userId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); - } - try { - // 检查用户是否有角色关联 - List existingRoles = userRolesMapper.selectList(new QueryWrapper().eq("user_id", userId)); - if (existingRoles.isEmpty()) { - throw new BusinessException(ErrorCode.BUSINESS_ERROR, "该用户没有关联的角色"); - } - int result = userRolesMapper.delete(new QueryWrapper().eq("user_id", userId)); - return ResultUtils.success(result > 0); - } catch (BusinessException e) { - throw e; - } catch (Exception e) { - throw new BusinessException(ErrorCode.DATABASE_ERROR, "清除用户角色关联失败", e); - } - } - - @Override - public Result checkUserHasRole(Long userId, Long roleId) { - if (userId == null || roleId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空"); - } - try { - // 修改selectInfo为selectOne,因为selectInfo方法可能不存在 - UserRoles userRoles = userRolesMapper.selectOne(new QueryWrapper().eq("user_id", userId).eq("role_id", roleId)); - return ResultUtils.success(userRoles != null); - } catch (BusinessException e) { - throw e; - } catch (Exception e) { - throw new BusinessException(ErrorCode.DATABASE_ERROR, "检查用户角色关系失败", e); - } - } } diff --git a/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java b/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java index f1bd982..61df09c 100644 --- a/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java @@ -1,6 +1,12 @@ package com.qf.backend.service.impl; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,10 +19,16 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Users; +import com.qf.backend.dto.request.PageRequest; +import com.qf.backend.dto.response.Userresponse; +import com.qf.backend.entity.User.Roles; +import com.qf.backend.entity.User.UserRoles; +import com.qf.backend.entity.User.Users; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; +import com.qf.backend.mapper.RolesMapper; import com.qf.backend.mapper.UsersMapper; +import com.qf.backend.service.UserRolesService; import com.qf.backend.service.UsersService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; @@ -25,23 +37,38 @@ import com.qf.backend.util.ValidateUtil; public class UsersServiceImpl extends ServiceImpl implements UsersService { private static final Logger logger = LoggerFactory.getLogger(UsersServiceImpl.class); - + @Autowired private UsersMapper usersMapper; + @Autowired + private UserRolesService userRolesService; + @Autowired + private RolesMapper rolesMapper; - // 根据用户名查询用户 + + + // 根据用户名或邮箱查询用户(通用方法) @Override - public Result getUserByUsername(String username) { - logger.info("根据用户名查询用户: {}", username); - + public Result getUserByIdentifier(String identifier, boolean isUsername) { + logger.info(isUsername ? "根据用户名查询用户: {}" : "根据邮箱查询用户: {}", identifier); + try { - if (ValidateUtil.isEmpty(username)) { - throw new BusinessException(ErrorCode.INVALID_PARAM, "用户名不能为空"); + if (ValidateUtil.isEmpty(identifier)) { + throw new BusinessException(ErrorCode.INVALID_PARAM, isUsername ? "用户名不能为空" : "邮箱不能为空"); } - - Users users = usersMapper.selectByUsername(username); + + // 邮箱格式校验(仅当标识符为邮箱时) + if (!isUsername && !ValidateUtil.isValidEmail(identifier)) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱格式不正确"); + } + + // 根据标识符类型调用不同的查询方法 + Users users = isUsername + ? usersMapper.selectByUsername(identifier) + : usersMapper.selectByEmail(identifier); + if (users == null) { - throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + username); + throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + identifier); } return ResultUtils.success(users); } catch (BusinessException e) { @@ -52,54 +79,39 @@ public class UsersServiceImpl extends ServiceImpl implements } } + // 根据用户名查询用户 + @Override + public Result getUserByUsername(String username) { + return getUserByIdentifier(username, true); + } + // 根据邮箱查询用户 @Override public Result getUserByEmail(String email) { - logger.info("根据邮箱查询用户: {}", email); - - try { - if (ValidateUtil.isEmpty(email)) { - throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱不能为空"); - } - - // 使用ValidateUtil进行邮箱格式校验 - if (!ValidateUtil.isValidEmail(email)) { - throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱格式不正确"); - } - - Users users = usersMapper.selectByEmail(email); - if (users == null) { - throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + email); - } - return ResultUtils.success(users); - } catch (BusinessException e) { - throw e; - } catch (Exception e) { - logger.error("查询用户失败: {}", e.getMessage(), e); - throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询用户失败: " + e.getMessage(), e); - } + return getUserByIdentifier(email, false); } + // 登录 @Override - public Result login(String username, String password) { + public Result login(String username, String password) { logger.info("登录: 用户名 = {}", username); try { if (ValidateUtil.isEmpty(username) || ValidateUtil.isEmpty(password)) { throw new BusinessException(ErrorCode.INVALID_PARAM, "用户名或密码不能为空"); } - + // 根据用户名查询用户 Users user = usersMapper.selectByUsername(username); if (user == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户名不存在或密码错误"); } - + // 使用BCryptPasswordEncoder验证密码 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); if (!passwordEncoder.matches(password, user.getPassword())) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户名不存在或密码错误"); } - + return ResultUtils.success(user); } catch (BusinessException e) { throw e; @@ -108,24 +120,32 @@ public class UsersServiceImpl extends ServiceImpl implements throw new BusinessException(ErrorCode.DATABASE_ERROR, "登录失败: " + e.getMessage(), e); } } - //创建用户 + + // 创建用户 @Override public Result createUser(Users users) { logger.info("创建用户: 用户对象"); - + try { // 使用ValidateUtil进行实体验证 ValidateUtil.validateEntity(users, "username", "email", "password"); - + // 加密密码 users.setPassword(new BCryptPasswordEncoder().encode(users.getPassword())); - + // 添加创建时间 + users.setCreatedAt(new Date()); + // 添加更新时间 + users.setUpdatedAt(new Date()); + + // 插入数据库 int result = usersMapper.insert(users); if (result <= 0) { throw new BusinessException(ErrorCode.BUSINESS_ERROR, "创建用户失败"); } - logger.info("用户创建成功"); + // 创建成功同步创建用户角色关联 + userRolesService.createUserRole(users.getId(), Long.valueOf(1L)); + return ResultUtils.success(true); } catch (IllegalArgumentException e) { // 转换为业务异常 @@ -145,33 +165,37 @@ public class UsersServiceImpl extends ServiceImpl implements @Override public Result updateUser(Users users) { logger.info("更新用户信息: 用户ID = {}", users.getId()); - + try { if (users == null || users.getId() == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "用户信息或用户ID不能为空"); } - + // 检查用户是否存在 Users existingUser = getUserByIdAndCheckExist(users.getId()); if (existingUser == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在"); } - + // 使用ValidateUtil进行实体验证 ValidateUtil.validateEntity(users, "username", "email"); - + + // 添加更新时间 + users.setUpdatedAt(new Date()); + // 更新用户信息,不包含密码更新 + // 更新数据库 int result = usersMapper.updateInfo(users, new UpdateWrapper() - .set("username", users.getUsername()) - .set("email", users.getEmail()) - .set("phone", users.getPhone()) - .set("avatar", users.getAvatar()) - .eq("id", users.getId())); - + .set("username", users.getUsername()) + .set("email", users.getEmail()) + .set("phone", users.getPhone()) + .set("avatar", users.getAvatar()) + .set("updated_at", users.getUpdatedAt()) + .eq("id", users.getId())); + if (result <= 0) { throw new BusinessException(ErrorCode.BUSINESS_ERROR, "更新用户信息失败"); } - logger.info("用户信息更新成功: 用户ID = {}", users.getId()); return ResultUtils.success(true); } catch (IllegalArgumentException e) { @@ -190,9 +214,9 @@ public class UsersServiceImpl extends ServiceImpl implements // 删除用户 @Override - public Result deleteUser(Long id) { + public Result deleteUser(Long id, Integer status) { logger.info("删除用户: 用户ID = {}", id); - + try { if (id == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); @@ -202,12 +226,16 @@ public class UsersServiceImpl extends ServiceImpl implements if (users == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在"); } - - int result = usersMapper.deleteById(id); + // 伪删除用户,设置状态为0 + int result = usersMapper.updateInfo(users, new UpdateWrapper() + .set("status", status) + .set("updated_at", new Date()) + .eq("id", users.getId())); + if (result <= 0) { throw new BusinessException(ErrorCode.BUSINESS_ERROR, "删除用户失败"); } - + logger.info("用户删除成功: 用户ID = {}", id); return ResultUtils.success(true); } catch (BusinessException e) { @@ -218,41 +246,63 @@ public class UsersServiceImpl extends ServiceImpl implements } } - // 查询所有用户 - @Override - public Result> listAllUsers() { - logger.info("查询所有用户列表"); - - try { - List usersList = usersMapper.selectList(null); - logger.info("查询到 {} 个用户", usersList.size()); - return ResultUtils.success(usersList); - } catch (Exception e) { - logger.error("查询用户列表失败: {}", e.getMessage(), e); - throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询用户列表失败: " + e.getMessage(), e); - } - } - // 分页查询用户 @Override - public Result> listUsersByPage(int page, int size) { - logger.info("分页查询用户: 页码 = {}, 每页大小 = {}", page, size); - + public Result> listUsersByPage(PageRequest pageRequest) { + logger.info("分页查询用户: 页码 = {}, 每页大小 = {}", pageRequest.getPage(), pageRequest.getSize()); try { // 参数校验 - if (page < 1) { + if (pageRequest.getPage() < 1) { throw new BusinessException(ErrorCode.INVALID_PARAM, "页码不能小于1"); } - if (size < 1 || size > 100) { + if (pageRequest.getSize() < 1 || pageRequest.getSize() > 100) { throw new BusinessException(ErrorCode.INVALID_PARAM, "每页大小必须在1-100之间"); } - // 使用MyBatis-Plus的分页功能 - Page userPage = new Page<>(page, size); + Page userPage = new Page<>(pageRequest.getPage(), pageRequest.getSize()); Page resultPage = usersMapper.selectPage(userPage, null); + // 1. 获取当前页所有用户 + List userList = resultPage.getRecords(); + // 2. 提取所有用户ID + List userIds = userList.stream().map(Users::getId).collect(Collectors.toList()); - logger.info("分页查询成功: 共 {} 条记录, 第 {} 页", resultPage.getTotal(), page); - return ResultUtils.success(resultPage.getRecords()); + // 3. 一次性查询所有用户-角色关联 + List userRolesList = userRolesService.list(new QueryWrapper() + .in("user_id", userIds)); + + // 4. 提取所有角色ID + List roleIds = userRolesList.stream().map(UserRoles::getRoleId).collect(Collectors.toList()); + + // 5. 一次性查询所有角色信息 + List rolesList = rolesMapper.selectList(new QueryWrapper() + .in("id", roleIds)); + + // 6. 构建角色映射,按角色ID分组 + Map roleMap = rolesList.stream() + .collect(Collectors.toMap(Roles::getId, role -> role)); + + // 7. 构建用户-角色列表映射 + Map> userRoleMap = new HashMap<>(); + for (UserRoles userRole : userRolesList) { + Long userId = userRole.getUserId(); + Roles role = roleMap.get(userRole.getRoleId()); + if (role != null) { + userRoleMap.computeIfAbsent(userId, k -> new ArrayList<>()) + .add(role); + } + } + + // 8. 构建响应DTO + List userResponseList = userList.stream().map(user -> { + Userresponse response = new Userresponse(); + response.setUsers(user); + // 从Map中取角色,避免空指针 + response.setRoles(userRoleMap.getOrDefault(user.getId(), Collections.emptyList())); + return response; + }).collect(Collectors.toList()); + + logger.info("分页查询成功: 共 {} 条记录, 第 {} 页", resultPage.getTotal(), pageRequest.getPage()); + return ResultUtils.success(userResponseList); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -265,17 +315,17 @@ public class UsersServiceImpl extends ServiceImpl implements @Override public Result getUserById(Long id) { logger.info("根据ID查询用户: 用户ID = {}", id); - + try { if (id == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); } - + Users users = getUserByIdAndCheckExist(id); if (users == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在"); } - + return ResultUtils.success(users); } catch (BusinessException e) { throw e; @@ -289,7 +339,7 @@ public class UsersServiceImpl extends ServiceImpl implements @Override public Result updatePassword(Long id, String newPassword) { logger.info("更新用户密码: 用户ID = {}", id); - + try { if (id == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); @@ -297,29 +347,29 @@ public class UsersServiceImpl extends ServiceImpl implements if (ValidateUtil.isEmpty(newPassword)) { throw new BusinessException(ErrorCode.MISSING_PARAM, "新密码不能为空"); } - + // 密码强度校验 if (newPassword.length() < 6) { throw new BusinessException(ErrorCode.INVALID_PARAM, "密码长度不能少于6个字符"); } - + Users users = getUserByIdAndCheckExist(id); if (users == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在"); } - + // 加密新密码 users.setPassword(new BCryptPasswordEncoder().encode(newPassword)); - + // 更新密码 int result = usersMapper.updateInfo(users, new UpdateWrapper() - .set("password", users.getPassword()) - .eq("id", id)); - + .set("password", users.getPassword()) + .eq("id", id)); + if (result <= 0) { throw new BusinessException(ErrorCode.BUSINESS_ERROR, "更新密码失败"); } - + logger.info("用户密码更新成功: 用户ID = {}", id); return ResultUtils.success(true); } catch (BusinessException e) { @@ -332,6 +382,7 @@ public class UsersServiceImpl extends ServiceImpl implements /** * 根据用户ID查询用户并检查是否存在 + * * @param id 用户ID * @return 用户对象,如果用户不存在则返回null */ diff --git a/src/main/java/com/qf/backend/service/impl/rolesMapper.java b/src/main/java/com/qf/backend/service/impl/rolesMapper.java new file mode 100644 index 0000000..918097e --- /dev/null +++ b/src/main/java/com/qf/backend/service/impl/rolesMapper.java @@ -0,0 +1,11 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +package com.qf.backend.service.impl; + + +class rolesMapper { + +} diff --git a/src/main/java/com/qf/backend/util/ValidateUtil.java b/src/main/java/com/qf/backend/util/ValidateUtil.java index 8ee6560..cc3a6b7 100644 --- a/src/main/java/com/qf/backend/util/ValidateUtil.java +++ b/src/main/java/com/qf/backend/util/ValidateUtil.java @@ -28,8 +28,8 @@ public class ValidateUtil { } /** * 验证数据是否为空 - * @param str 待验证的字符串 - * @return 如果字符串为null或空字符串或只包含空白字符,则返回true;否则返回false + * @param obj 待验证的对象 + * @return 如果对象为null或空字符串或只包含空白字符,则返回true;否则返回false */ public static boolean isEmpty(Object obj) { if (obj == null) { diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 63c95bb..5a46736 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -3,7 +3,9 @@ jwt.secret=your_very_strong_secret_key_that_is_at_least_32_characters_long! jwt.expiration=3600000 jwt.token-prefix=Bearer # CORS 配置 - 开发用(允许所有来源) -cors.allowed-origins=* +cors.allowed-origins=http://localhost:3000,http://localhost:7071,http://localhost:8080,http://localhost:8081,http://localhost:5176,http://localhost:5175,http://localhost:5174,http://localhost:5173,http://localhost:5172,http://localhost:5171 cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS,PATCH cors.allowed-headers=* -cors.exposed-headers=Authorization \ No newline at end of file +cors.exposed-headers=Authorization +cors.allow-credentials=true +cors.max-age=3600 \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 79a023d..c9a4aa8 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -3,7 +3,7 @@ jwt.secret=${JWT_SECRET:defaultSecret} jwt.expiration=${JWT_EXPIRATION:3600000} jwt.token-prefix=${JWT_TOKEN_PREFIX:Bearer} # CORS 配置 - 生产用(允许所有来源) -cors.allowed-origins=* +cors.allowed-origins= cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS,PATCH cors.allowed-headers=* cors.exposed-headers=Authorization diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0ae3fa7..375c450 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,5 @@ spring.application.name=backend +spring.profiles.active=dev server.port=7071 # 数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/TaoTaoWang?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true