From 17dcdf37547122d63a20975c18c0af3b901ca176 Mon Sep 17 00:00:00 2001 From: qingfeng1121 Date: Fri, 23 Jan 2026 15:02:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84):?= =?UTF-8?q?=20=E9=87=8D=E6=9E=84=E9=A1=B9=E7=9B=AE=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=84?= =?UTF-8?q?=E7=BB=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构项目包结构,将实体类、Mapper接口和服务类按功能模块分组 优化JwtUtils工具类,新增获取用户ID功能 调整SecurityConfig配置,增加公开访问接口 删除冗余DTO类,合并到相应模块 新增MyBatisPlus配置类,配置分页插件 --- .../qf/backend/config/MyBatisPlusConfig.java | 25 ++ .../com/qf/backend/config/SecurityConfig.java | 9 +- .../controller/AdminUserControoler.java | 42 --- .../qf/backend/controller/AuthController.java | 37 +- .../backend/controller/OrdersController.java | 40 +-- .../controller/ProductsController.java | 19 +- .../qf/backend/controller/ShopController.java | 96 +++++ .../controller/UserRolesController.java | 62 ---- .../backend/controller/UsersController.java | 11 +- .../com/qf/backend/dto/ProductsDataList.java | 5 - .../dto/{ => request}/LoginRequest.java | 8 +- .../qf/backend/dto/request/OrderRequest.java | 3 +- .../qf/backend/dto/request/ShopRequest.java | 33 ++ .../dto/{ => response}/LoginResponse.java | 10 +- .../backend/dto/response/OrdersResponse.java | 57 +++ .../dto/response/ProductsResponse.java | 103 ++++++ .../qf/backend/dto/response/ShopResponse.java | 32 ++ .../qf/backend/dto/response/Userresponse.java | 12 + .../entity/{ => Order}/OrderItems.java | 2 +- .../{ => Order}/OrderStatusHistory.java | 2 +- .../qf/backend/entity/{ => Order}/Orders.java | 2 +- .../{ => Product}/ProductAttributeValues.java | 2 +- .../{ => Product}/ProductAttributes.java | 2 +- .../{ => Product}/ProductCategories.java | 2 +- .../entity/{ => Product}/ProductImages.java | 2 +- .../{ => Product}/ProductInventories.java | 2 +- .../entity/{ => Product}/ProductSkus.java | 2 +- .../entity/{ => Product}/Products.java | 2 +- .../entity/{ => Shop}/ShopCategories.java | 4 +- .../entity/{ => Shop}/ShopRatings.java | 2 +- .../qf/backend/entity/{ => Shop}/Shops.java | 4 +- .../entity/User/CustomUserDetails.java | 79 ++++ .../inti/ProductDataDetailInitializer.java | 339 ++++++++++++++++++ .../backend/inti/ProductDataInitializer.java | 10 +- .../com/qf/backend/inti/RoleInitializer.java | 4 +- .../qf/backend/inti/ShopDataInitializer.java | 188 ++++++++++ .../backend/inti/ShopRatingsInitializer.java | 91 +++++ .../com/qf/backend/inti/UserInitializer.java | 4 +- .../mapper/{ => Orders}/OrderItemsMapper.java | 4 +- .../OrderStatusHistoryMapper.java | 4 +- .../mapper/{ => Orders}/OrdersMapper.java | 4 +- .../ProductAttributeValuesMapper.java | 4 +- .../ProductAttributesMapper.java | 4 +- .../ProductCategoriesMapper.java | 4 +- .../{ => Products}/ProductImagesMapper.java | 4 +- .../ProductInventoriesMapper.java | 4 +- .../{ => Products}/ProductSkusMapper.java | 4 +- .../mapper/{ => Products}/ProductsMapper.java | 4 +- .../{ => Shop}/ShopCategoriesMapper.java | 4 +- .../mapper/{ => Shop}/ShopRatingsMapper.java | 4 +- .../mapper/{ => Shop}/ShopsMapper.java | 4 +- .../mapper/{ => User}/PermissionsMapper.java | 2 +- .../{ => User}/RolePermissionsMapper.java | 2 +- .../mapper/{ => User}/RolesMapper.java | 2 +- .../mapper/{ => User}/UserDetailsMapper.java | 2 +- .../mapper/{ => User}/UserRolesMapper.java | 2 +- .../mapper/{ => User}/UsersMapper.java | 2 +- .../{ => Order}/OrderItemsService.java | 4 +- .../OrderStatusHistoryService.java | 4 +- .../service/{ => Order}/OrdersService.java | 22 +- .../ProductAttributeValuesService.java | 8 +- .../ProductAttributesService.java | 4 +- .../ProductCategoriesService.java | 4 +- .../{ => Products}/ProductImagesService.java | 4 +- .../ProductInventoriesService.java | 4 +- .../{ => Products}/ProductSkusService.java | 4 +- .../{ => Products}/ProductsService.java | 49 +-- .../{ => Shop}/ShopCategoriesService.java | 4 +- .../{ => Shop}/ShopRatingsService.java | 4 +- .../service/{ => Shop}/ShopsService.java | 10 +- .../{ => User}/PermissionsService.java | 2 +- .../{ => User}/RolePermissionsService.java | 2 +- .../service/{ => User}/RolesService.java | 2 +- .../{ => User}/UserDetailsService.java | 2 +- .../service/{ => User}/UserRolesService.java | 8 +- .../service/{ => User}/UsersService.java | 8 +- .../qf/backend/service/UserLoginService.java | 22 -- .../{ => Orders}/OrderItemsServiceImpl.java | 8 +- .../OrderStatusHistoryServiceImpl.java | 8 +- .../impl/{ => Orders}/OrdersServiceImpl.java | 65 ++-- .../ProductAttributeValuesServiceImpl.java | 8 +- .../ProductAttributesServiceImpl.java | 17 +- .../ProductCategoriesServiceImpl.java | 19 +- .../ProductImagesServiceImpl.java | 8 +- .../ProductInventoriesServiceImpl.java | 8 +- .../ProductSkusServiceImpl.java | 8 +- .../{ => Products}/ProductsServiceImpl.java | 223 ++++++++++-- .../{ => Shop}/ShopCategoriesServiceImpl.java | 8 +- .../{ => Shop}/ShopRatingsServiceImpl.java | 8 +- .../impl/{ => Shop}/ShopsServiceImpl.java | 39 +- .../{ => User}/PermissionsServiceImpl.java | 6 +- .../RolePermissionsServiceImpl.java | 17 +- .../impl/{ => User}/RolesServiceImpl.java | 6 +- .../{ => User}/UserDetailsServiceImpl.java | 40 +-- .../{ => User}/UsersRolesServiceImpl.java | 16 +- .../impl/{ => User}/UsersServiceImpl.java | 147 +++++--- .../service/impl/{ => User}/rolesMapper.java | 2 +- .../service/impl/UserLoginServiceImpl.java | 117 ------ .../java/com/qf/backend/util/JwtUtils.java | 7 + 99 files changed, 1737 insertions(+), 632 deletions(-) create mode 100644 src/main/java/com/qf/backend/config/MyBatisPlusConfig.java delete mode 100644 src/main/java/com/qf/backend/controller/AdminUserControoler.java create mode 100644 src/main/java/com/qf/backend/controller/ShopController.java delete mode 100644 src/main/java/com/qf/backend/controller/UserRolesController.java delete mode 100644 src/main/java/com/qf/backend/dto/ProductsDataList.java rename src/main/java/com/qf/backend/dto/{ => request}/LoginRequest.java (77%) create mode 100644 src/main/java/com/qf/backend/dto/request/ShopRequest.java rename src/main/java/com/qf/backend/dto/{ => response}/LoginResponse.java (71%) create mode 100644 src/main/java/com/qf/backend/dto/response/OrdersResponse.java create mode 100644 src/main/java/com/qf/backend/dto/response/ProductsResponse.java create mode 100644 src/main/java/com/qf/backend/dto/response/ShopResponse.java rename src/main/java/com/qf/backend/entity/{ => Order}/OrderItems.java (97%) rename src/main/java/com/qf/backend/entity/{ => Order}/OrderStatusHistory.java (96%) rename src/main/java/com/qf/backend/entity/{ => Order}/Orders.java (97%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductAttributeValues.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductAttributes.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductCategories.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductImages.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductInventories.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/ProductSkus.java (96%) rename src/main/java/com/qf/backend/entity/{ => Product}/Products.java (97%) rename src/main/java/com/qf/backend/entity/{ => Shop}/ShopCategories.java (93%) rename src/main/java/com/qf/backend/entity/{ => Shop}/ShopRatings.java (97%) rename src/main/java/com/qf/backend/entity/{ => Shop}/Shops.java (94%) create mode 100644 src/main/java/com/qf/backend/entity/User/CustomUserDetails.java create mode 100644 src/main/java/com/qf/backend/inti/ProductDataDetailInitializer.java create mode 100644 src/main/java/com/qf/backend/inti/ShopDataInitializer.java create mode 100644 src/main/java/com/qf/backend/inti/ShopRatingsInitializer.java rename src/main/java/com/qf/backend/mapper/{ => Orders}/OrderItemsMapper.java (94%) rename src/main/java/com/qf/backend/mapper/{ => Orders}/OrderStatusHistoryMapper.java (91%) rename src/main/java/com/qf/backend/mapper/{ => Orders}/OrdersMapper.java (91%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductAttributeValuesMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductAttributesMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductCategoriesMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductImagesMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductInventoriesMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductSkusMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Products}/ProductsMapper.java (89%) rename src/main/java/com/qf/backend/mapper/{ => Shop}/ShopCategoriesMapper.java (91%) rename src/main/java/com/qf/backend/mapper/{ => Shop}/ShopRatingsMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => Shop}/ShopsMapper.java (90%) rename src/main/java/com/qf/backend/mapper/{ => User}/PermissionsMapper.java (95%) rename src/main/java/com/qf/backend/mapper/{ => User}/RolePermissionsMapper.java (96%) rename src/main/java/com/qf/backend/mapper/{ => User}/RolesMapper.java (95%) rename src/main/java/com/qf/backend/mapper/{ => User}/UserDetailsMapper.java (96%) rename src/main/java/com/qf/backend/mapper/{ => User}/UserRolesMapper.java (96%) rename src/main/java/com/qf/backend/mapper/{ => User}/UsersMapper.java (97%) rename src/main/java/com/qf/backend/service/{ => Order}/OrderItemsService.java (95%) rename src/main/java/com/qf/backend/service/{ => Order}/OrderStatusHistoryService.java (95%) rename src/main/java/com/qf/backend/service/{ => Order}/OrdersService.java (75%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductAttributeValuesService.java (95%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductAttributesService.java (95%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductCategoriesService.java (94%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductImagesService.java (95%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductInventoriesService.java (95%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductSkusService.java (95%) rename src/main/java/com/qf/backend/service/{ => Products}/ProductsService.java (70%) rename src/main/java/com/qf/backend/service/{ => Shop}/ShopCategoriesService.java (95%) rename src/main/java/com/qf/backend/service/{ => Shop}/ShopRatingsService.java (96%) rename src/main/java/com/qf/backend/service/{ => Shop}/ShopsService.java (85%) rename src/main/java/com/qf/backend/service/{ => User}/PermissionsService.java (97%) rename src/main/java/com/qf/backend/service/{ => User}/RolePermissionsService.java (98%) rename src/main/java/com/qf/backend/service/{ => User}/RolesService.java (97%) rename src/main/java/com/qf/backend/service/{ => User}/UserDetailsService.java (96%) rename src/main/java/com/qf/backend/service/{ => User}/UserRolesService.java (86%) rename src/main/java/com/qf/backend/service/{ => User}/UsersService.java (89%) delete mode 100644 src/main/java/com/qf/backend/service/UserLoginService.java rename src/main/java/com/qf/backend/service/impl/{ => Orders}/OrderItemsServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Orders}/OrderStatusHistoryServiceImpl.java (97%) rename src/main/java/com/qf/backend/service/impl/{ => Orders}/OrdersServiceImpl.java (83%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductAttributeValuesServiceImpl.java (97%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductAttributesServiceImpl.java (97%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductCategoriesServiceImpl.java (97%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductImagesServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductInventoriesServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductSkusServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Products}/ProductsServiceImpl.java (53%) rename src/main/java/com/qf/backend/service/impl/{ => Shop}/ShopCategoriesServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Shop}/ShopRatingsServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => Shop}/ShopsServiceImpl.java (92%) rename src/main/java/com/qf/backend/service/impl/{ => User}/PermissionsServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => User}/RolePermissionsServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => User}/RolesServiceImpl.java (98%) rename src/main/java/com/qf/backend/service/impl/{ => User}/UserDetailsServiceImpl.java (70%) rename src/main/java/com/qf/backend/service/impl/{ => User}/UsersRolesServiceImpl.java (93%) rename src/main/java/com/qf/backend/service/impl/{ => User}/UsersServiceImpl.java (76%) rename src/main/java/com/qf/backend/service/impl/{ => User}/rolesMapper.java (84%) delete mode 100644 src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java diff --git a/src/main/java/com/qf/backend/config/MyBatisPlusConfig.java b/src/main/java/com/qf/backend/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..81b6863 --- /dev/null +++ b/src/main/java/com/qf/backend/config/MyBatisPlusConfig.java @@ -0,0 +1,25 @@ +package com.qf.backend.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis-Plus配置类 + */ +@Configuration +public class MyBatisPlusConfig { + + /** + * 配置MyBatis-Plus插件,主要是分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 添加分页插件,设置数据库类型为MySQL + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/config/SecurityConfig.java b/src/main/java/com/qf/backend/config/SecurityConfig.java index 72cd3d0..6e529bb 100644 --- a/src/main/java/com/qf/backend/config/SecurityConfig.java +++ b/src/main/java/com/qf/backend/config/SecurityConfig.java @@ -70,7 +70,14 @@ public class SecurityConfig { // 登录接口公开访问,不需要认证 .requestMatchers("/api/auth/login").permitAll() // 公开注册接口,不需要认证 - .requestMatchers("/api/user/**").permitAll() + .requestMatchers("/api/user/register").permitAll() + // 公开获取商品列表接口,不需要认证 + .requestMatchers("/api/products/list").permitAll() + // 公开获取商品详情接口,不需要认证 + .requestMatchers("/api/products/**").permitAll() + // 公开获取店铺商品列表接口,不需要认证 + .requestMatchers("/api/shop/**").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 deleted file mode 100644 index 0b1281a..0000000 --- a/src/main/java/com/qf/backend/controller/AdminUserControoler.java +++ /dev/null @@ -1,42 +0,0 @@ -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 3a4a532..be27225 100644 --- a/src/main/java/com/qf/backend/controller/AuthController.java +++ b/src/main/java/com/qf/backend/controller/AuthController.java @@ -1,7 +1,6 @@ package com.qf.backend.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -12,10 +11,12 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.qf.backend.dto.LoginRequest; -import com.qf.backend.dto.LoginResponse; import com.qf.backend.dto.Result; +import com.qf.backend.dto.request.LoginRequest; +import com.qf.backend.dto.response.LoginResponse; +import com.qf.backend.dto.response.Userresponse; import com.qf.backend.exception.ErrorCode; +import com.qf.backend.service.User.UsersService; import com.qf.backend.util.JwtUtils; import com.qf.backend.util.ResultUtils; @@ -39,6 +40,11 @@ public class AuthController { */ @Autowired private JwtUtils jwtUtils; + /** + * 注入用户服务,用于查询用户信息 + */ + @Autowired + private UsersService userService; /** * 用户登录接口 @@ -55,7 +61,7 @@ public class AuthController { * 6. 返回包含JWT令牌的响应 */ @PostMapping("/login") - public Result> login(@RequestBody LoginRequest loginRequest) { + public Result login(@RequestBody LoginRequest loginRequest) { try { // 1. 创建认证令牌,将用户名和密码封装到UsernamePasswordAuthenticationToken中 // 这里的令牌是未认证状态的,因为还没有验证密码是否正确 @@ -76,17 +82,20 @@ public class AuthController { // 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.从数据库重新查询用户信息 并获取role权限与permissions信息 + Userresponse user = userService.getUserByUsername(userDetails.getUsername()).getData(); + + // 6. 创建LoginResponse对象,封装JWT令牌和令牌类型 + LoginResponse loginResponse = new LoginResponse( + user.getUsers().getId(), + user.getUsers().getUsername(), + user.getRoles(), + user.getPermissions(), + jwt, + jwtUtils.getTokenPrefix() + ); // 5. 返回包含JWT令牌的响应 - // 响应格式为:{"token": "xxx", "tokenType": "Bearer"} - return ResultUtils.success(ResponseEntity.ok(loginResponse)); + return ResultUtils.success(loginResponse); } catch (BadCredentialsException e) { // 认证失败,通常是用户名不存在或密码错误 // 返回401 Unauthorized响应 diff --git a/src/main/java/com/qf/backend/controller/OrdersController.java b/src/main/java/com/qf/backend/controller/OrdersController.java index 388a9de..4f7c7e8 100644 --- a/src/main/java/com/qf/backend/controller/OrdersController.java +++ b/src/main/java/com/qf/backend/controller/OrdersController.java @@ -14,9 +14,9 @@ import org.springframework.web.bind.annotation.RestController; 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 com.qf.backend.entity.Order.Orders; +import com.qf.backend.service.Order.OrderItemsService; +import com.qf.backend.service.Order.OrdersService; /** * 订单控制器 (订单接口) @@ -41,7 +41,7 @@ public class OrdersController { */ @PostMapping("/getorderinfo") // 只有用户本人或管理员才能获取订单信息 - @PreAuthorize("#userId == authentication.principal.userId or hasRole('ROLE_ADMIN')") + @PreAuthorize("#orderRequest.getUserId() == authentication.principal.userId or hasRole('ROLE_ADMIN')") public Result getOrderInfo(@RequestBody OrderRequest orderRequest) { logger.info("获取订单信息请求,订单ID:{}", orderRequest.getId()); return ordersService.getOrderById(orderRequest.getId()); @@ -84,7 +84,7 @@ public class OrdersController { */ @PostMapping("/update") // 只有管理员或店铺所有者才能更新订单 - @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + @PreAuthorize("hasRole('ROLE_ADMIN') or #orderRequest.getShopId() == authentication.principal.shopId") public Result updateOrder(@RequestBody OrderRequest orderRequest) { logger.info("更新订单信息请求,订单信息:{}", orderRequest); Orders orders = new Orders(orderRequest.getId(), orderRequest.getOrderNo(), orderRequest.getUserId(), @@ -103,7 +103,7 @@ public class OrdersController { */ @PostMapping("/delete") // 只有管理员或店铺所有者才能删除订单 - @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + @PreAuthorize("hasRole('ROLE_ADMIN') or #orderRequest.getShopId() == authentication.principal.shopId") public Result deleteOrder(@RequestBody OrderRequest orderRequest) { logger.info("删除订单请求,订单ID:{}", orderRequest.getId()); return ordersService.deleteOrder(orderRequest.getId()); @@ -116,7 +116,7 @@ public class OrdersController { */ @PostMapping("/list") // 只有管理员或店铺所有者才能查询所有订单 - @PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId") + @PreAuthorize("hasRole('ROLE_ADMIN') or #orderRequest.getShopId() == authentication.principal.shopId") public Result> listOrdersByPage(@RequestBody PageRequest pageRequest) { logger.info("分页查询订单请求,页码:{},每页大小:{}", pageRequest.getPage(), pageRequest.getSize()); return ordersService.listOrdersByPage(pageRequest.getPage(), pageRequest.getSize()); @@ -129,10 +129,10 @@ public class OrdersController { */ @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()); + @PreAuthorize("#orderRequest.getUserId() == authentication.principal.userId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByUser(@RequestBody OrderRequest orderRequest ) { + logger.info("根据用户ID查询订单请求,用户ID:{},页码:{},每页大小:{}", orderRequest.getUserId(), orderRequest.getPage(), orderRequest.getSize()); + return ordersService.getOrdersByUserId(orderRequest.getUserId(), orderRequest.getPage(), orderRequest.getSize()); } /** @@ -142,10 +142,10 @@ public class OrdersController { */ @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()); + @PreAuthorize("#orderRequest.getShopId() == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByShop(@RequestBody OrderRequest orderRequest ) { + logger.info("根据店铺ID查询订单请求,店铺ID:{},页码:{},每页大小:{}", orderRequest.getShopId(), orderRequest.getPage(), orderRequest.getSize()); + return ordersService.getOrdersByShopId(orderRequest.getShopId(), orderRequest.getPage(), orderRequest.getSize()); } /** @@ -155,10 +155,10 @@ public class OrdersController { */ @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()); + @PreAuthorize("#orderRequest.getShopId() == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + public Result> getOrdersByStatus(@RequestBody OrderRequest orderRequest ) { + logger.info("根据订单状态查询订单请求,状态:{},页码:{},每页大小:{}", orderRequest.getOrderStatus(), orderRequest.getPage(), orderRequest.getSize()); + return ordersService.getOrdersByStatus(orderRequest.getOrderStatus(), orderRequest.getPage(), orderRequest.getSize()); } /** @@ -168,7 +168,7 @@ public class OrdersController { */ @PostMapping("/updatestatus") // 只有店铺所有者或管理员才能更新订单状态 - @PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')") + @PreAuthorize("#orderRequest.getShopId() == 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/ProductsController.java b/src/main/java/com/qf/backend/controller/ProductsController.java index 986a7c1..ccddfd7 100644 --- a/src/main/java/com/qf/backend/controller/ProductsController.java +++ b/src/main/java/com/qf/backend/controller/ProductsController.java @@ -14,8 +14,9 @@ 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.request.ProductRequest; -import com.qf.backend.entity.Products; -import com.qf.backend.service.ProductsService; +import com.qf.backend.dto.response.ProductsResponse; +import com.qf.backend.entity.Product.Products; +import com.qf.backend.service.Products.ProductsService; /** * 商品控制器 (商品接口) @@ -37,7 +38,7 @@ public class ProductsController { * @return 商品信息 */ @PostMapping("/getproductinfo") - public Result getProductInfo(@RequestBody ProductRequest productRequest) { + public Result getProductInfo(@RequestBody ProductRequest productRequest) { logger.info("获取商品信息请求,商品ID:{}", productRequest.getId()); return productsService.getProductById(productRequest.getId()); } @@ -104,9 +105,10 @@ public class ProductsController { * @return 商品列表 */ @PostMapping("/bycategory") - public Result> getProductsByCategory(@RequestBody ProductRequest productRequest) { - logger.info("根据分类ID查询商品请求,分类ID:{}", productRequest.getCategoryId()); - return productsService.getProductsByCategoryId(productRequest.getCategoryId()); + public Result> getProductsByCategory(@RequestBody ProductRequest productRequest ) { + logger.info("根据分类ID查询商品请求,分类ID:{},页码:{},每页大小:{}", + productRequest.getCategoryId(), productRequest.getPage(), productRequest.getSize()); + return productsService.getProductsByCategoryId(productRequest.getCategoryId(), productRequest.getPage(), productRequest.getSize()); } /** @@ -116,8 +118,9 @@ public class ProductsController { */ @PostMapping("/byshop") public Result> getProductsByShop(@RequestBody ProductRequest productRequest) { - logger.info("根据店铺ID查询商品请求,店铺ID:{}", productRequest.getShopId()); - return productsService.getProductsByShopId(productRequest.getShopId()); + logger.info("根据店铺ID查询商品请求,店铺ID:{},页码:{},每页大小:{}", + productRequest.getShopId(), productRequest.getPage(), productRequest.getSize()); + return productsService.getProductsByShopIds(List.of(productRequest.getShopId()), productRequest.getPage(), productRequest.getSize()); } /** diff --git a/src/main/java/com/qf/backend/controller/ShopController.java b/src/main/java/com/qf/backend/controller/ShopController.java new file mode 100644 index 0000000..c69dc76 --- /dev/null +++ b/src/main/java/com/qf/backend/controller/ShopController.java @@ -0,0 +1,96 @@ +package com.qf.backend.controller; + +import java.util.ArrayList; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.stream.Collectors; + +import com.qf.backend.entity.Product.Products; +import com.qf.backend.entity.Shop.Shops; +import com.qf.backend.service.Shop.ShopsService; +import com.qf.backend.dto.Result; +import com.qf.backend.dto.request.ShopRequest; +import com.qf.backend.entity.Shop.Shops; +import com.qf.backend.service.Shop.ShopsService; +import com.qf.backend.service.Products.ProductsService; +import com.qf.backend.dto.response.ShopResponse; +import com.qf.backend.dto.response.ProductsResponse; + +/** + * 获取店铺信息接口 + * @author 30803 + */ +@RestController +@RequestMapping("/api/shop") +public class ShopController { + private static final Logger logger = LoggerFactory.getLogger(ShopController.class); + @Autowired + private ShopsService shopsService; + @Autowired + private ProductsService productsService; + + /** + * 获取店铺信息 + * @param shopRequest 店铺请求 + * @return 店铺信息 + */ + @PostMapping("/info") + public Result getShopInfo(@RequestBody ShopRequest shopRequest) { + logger.info("获取店铺信息请求,店铺ID:{}", shopRequest.getId()); + return shopsService.getShopById(shopRequest.getId()); + } + /** + * 分页查询店铺 + * @param shopRequest 店铺请求 + * @return 店铺列表 + */ + @PostMapping("/page") + public Result> getShopsPage(@RequestBody ShopRequest shopRequest) { + logger.info("分页查询店铺请求,当前页码:{},每页数量:{}", shopRequest.getPage(), shopRequest.getSize()); + + // 1. 店铺查询 + List shops = shopsService.listShopsByPage(shopRequest.getPage(), shopRequest.getSize()).getData(); + + // 2. 提取店铺id + List shopIds = shops.stream().map(Shops::getId).collect(Collectors.toList()); + + // 3. 调用商品服务查询商品 + List products = productsService.getProductsByShopIds(shopIds, 1, 10).getData(); + + // 4. 转换商品为ProductsResponse + List productsResponses = products.stream() + .map(product -> { + ProductsResponse pr = new ProductsResponse(); + pr.setProducts(product); + return pr; + }) + .collect(Collectors.toList()); + + // 5. 创建ShopResponse列表 + List shopResponses = new ArrayList<>(); + + // 6. 为每个店铺创建ShopResponse + shops.forEach(shop -> { + ShopResponse shopResponse = new ShopResponse(); + shopResponse.setShop(shop); + + // 7. 提取当前店铺的商品 + List shopProducts = productsResponses.stream() + .filter(product -> product.getProducts().getShopId().equals(shop.getId())) + .collect(Collectors.toList()); + + shopResponse.setProducts(shopProducts); + shopResponses.add(shopResponse); + }); + + // 8. 返回结果 + return Result.success(shopResponses); + } +} \ 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 deleted file mode 100644 index 3ae4933..0000000 --- a/src/main/java/com/qf/backend/controller/UserRolesController.java +++ /dev/null @@ -1,62 +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 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.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.qf.backend.dto.Result; -import com.qf.backend.entity.User.UserRoles; -import com.qf.backend.service.UserRolesService; - -/** - * 用户角色关联控制器 - * 处理用户与角色关联相关的HTTP请求 - * 遵循RESTful API设计规范 - * @author 30803 - */ -@RequestMapping("/api/user-roles") -@RestController -public class UserRolesController { - private static final Logger logger = LoggerFactory.getLogger(UserRolesController.class); - - @Autowired - private UserRolesService userRolesService; - - /** - * 根据用户ID查询角色关联 - * @param userId 用户ID - * @return 用户角色关联列表 - */ - @GetMapping("/user/{userId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> getUserRolesByUserId(@PathVariable Long userId) { - logger.info("管理员根据用户ID查询角色关联,用户ID:{}", userId); - return userRolesService.getUserRolesByUserId(userId); - } - - /** - * 根据角色ID查询用户关联 - * @param roleId 角色ID - * @return 用户角色关联列表 - */ - @GetMapping("/role/{roleId}") - @PreAuthorize("hasRole('ROLE_ADMIN')") - public Result> getUserRolesByRoleId(@PathVariable Long roleId) { - logger.info("管理员根据角色ID查询用户关联,角色ID:{}", roleId); - return userRolesService.getUserRolesByRoleId(roleId); - } - - - -} \ 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 a427fd3..53baf2e 100644 --- a/src/main/java/com/qf/backend/controller/UsersController.java +++ b/src/main/java/com/qf/backend/controller/UsersController.java @@ -12,7 +12,8 @@ import org.springframework.web.bind.annotation.RestController; import com.qf.backend.dto.Result; import com.qf.backend.dto.request.UsersRequest; import com.qf.backend.entity.User.Users; -import com.qf.backend.service.UsersService; +import com.qf.backend.service.User.UsersService; + /** * 用户控制器 (用户接口) @@ -35,7 +36,7 @@ public class UsersController { */ @PostMapping("/getuserinfo") // 只有用户本人或管理员才能获取用户信息 - @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + @PreAuthorize("#usersRequest.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()); @@ -48,7 +49,7 @@ public class UsersController { */ @PostMapping("/info") // 只有用户本人或管理员才能更新用户信息 - @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + @PreAuthorize("#usersRequest.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(), @@ -64,7 +65,7 @@ public class UsersController { */ @PostMapping("/logout") // 只有用户本人或管理员才能注销登录 - @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + @PreAuthorize("#usersRequest.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() ); @@ -78,7 +79,7 @@ public class UsersController { */ @PostMapping("/resetpassword") // 只有用户本人或管理员才能重置密码 - @PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式 + @PreAuthorize("#usersRequest.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()); diff --git a/src/main/java/com/qf/backend/dto/ProductsDataList.java b/src/main/java/com/qf/backend/dto/ProductsDataList.java deleted file mode 100644 index 6f7a90c..0000000 --- a/src/main/java/com/qf/backend/dto/ProductsDataList.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.qf.backend.dto; - -public class ProductsDataList { - -} diff --git a/src/main/java/com/qf/backend/dto/LoginRequest.java b/src/main/java/com/qf/backend/dto/request/LoginRequest.java similarity index 77% rename from src/main/java/com/qf/backend/dto/LoginRequest.java rename to src/main/java/com/qf/backend/dto/request/LoginRequest.java index 7f44d92..fff55d6 100644 --- a/src/main/java/com/qf/backend/dto/LoginRequest.java +++ b/src/main/java/com/qf/backend/dto/request/LoginRequest.java @@ -3,14 +3,12 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.qf.backend.dto; +package com.qf.backend.dto.request; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; - - /** * 登录请求参数 * @author 30803 @@ -19,6 +17,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class LoginRequest { - private String username; - private String password; + private String username; // 用户名 + private String password; // 密码 } diff --git a/src/main/java/com/qf/backend/dto/request/OrderRequest.java b/src/main/java/com/qf/backend/dto/request/OrderRequest.java index 5130d9f..9811b39 100644 --- a/src/main/java/com/qf/backend/dto/request/OrderRequest.java +++ b/src/main/java/com/qf/backend/dto/request/OrderRequest.java @@ -4,7 +4,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; -import com.qf.backend.entity.OrderItems; +import com.qf.backend.entity.Order.OrderItems; import lombok.Data; @@ -31,6 +31,7 @@ public class OrderRequest { 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/ShopRequest.java b/src/main/java/com/qf/backend/dto/request/ShopRequest.java new file mode 100644 index 0000000..60acba9 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/request/ShopRequest.java @@ -0,0 +1,33 @@ +package com.qf.backend.dto.request; + +import java.math.BigDecimal; +import java.util.Date; + +import lombok.Data; + +/** + * 店铺请求DTO + */ +@Data +public class ShopRequest { + private Long id; // 店铺ID,主键,自增 + + private String shopName; // 店铺名称 + private Long userId; // 店主用户ID,外键,关联users表 + private Long categoryId; // 店铺分类ID,外键,关联shop_categories表 + private String shopLogo; // 店铺Logo + private String coverImage; // 店铺封面图 + private String description; // 店铺描述 + private String address; // 店铺地址 + private String contactPhone; // 联系人手机号 + private String contactPerson; // 联系人姓名 + private BigDecimal rating; // 店铺评分 + private Integer salesVolume; // 销量 + private Integer status; // 状态:0: 未审核, 1: 已审核, 2: 已关闭, 3: 审核失败 + private String businessLicense; // 营业执照URL + private Date businessStartTime; // 营业时间开始 + private Date businessEndTime; // 营业时间结束 + private Integer page; // 当前页码,用于分页查询 + private Integer size; // 每页数量,用于分页查询 + +} diff --git a/src/main/java/com/qf/backend/dto/LoginResponse.java b/src/main/java/com/qf/backend/dto/response/LoginResponse.java similarity index 71% rename from src/main/java/com/qf/backend/dto/LoginResponse.java rename to src/main/java/com/qf/backend/dto/response/LoginResponse.java index 60ce33b..2415e71 100644 --- a/src/main/java/com/qf/backend/dto/LoginResponse.java +++ b/src/main/java/com/qf/backend/dto/response/LoginResponse.java @@ -2,10 +2,13 @@ * 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.dto; +package com.qf.backend.dto.response; import java.util.List; +import com.qf.backend.entity.User.Permissions; +import com.qf.backend.entity.User.Roles; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -24,9 +27,10 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class LoginResponse { + private Long userId; // 用户id private String username; // 用户名 - private List roles; // 角色列表 暂时无用 - private List permissions; // 权限列表 暂时无用 + private List roles; // 角色列表 暂时无用 + private List permissions; // 权限列表 暂时无用 private String token; // JWT令牌 private String tokenType; // 令牌类型,通常为Bearer } diff --git a/src/main/java/com/qf/backend/dto/response/OrdersResponse.java b/src/main/java/com/qf/backend/dto/response/OrdersResponse.java new file mode 100644 index 0000000..0d67414 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/response/OrdersResponse.java @@ -0,0 +1,57 @@ +package com.qf.backend.dto.response; + +import java.util.List; + +import com.qf.backend.entity.Order.OrderItems; +import com.qf.backend.entity.Order.Orders; +import com.qf.backend.entity.Refunds; +import com.qf.backend.entity.Shop.Shops; +import com.qf.backend.entity.User.Users; + +/** + * 订单响应类 + * 返回订单详情信息 下单用户 订单所属店铺 订单商品列表 订单状态(Refunds支付状态 已退款、已取消) + * + * @author QF + * @version 1.0 + * @date 2023-12-15 + */ +public class OrdersResponse { + private Orders orders; // 订单信息 + private Users user; // 下单用户 + private Shops shop; // 订单所属店铺 + private List ordersItems; // 订单商品列表 包含商品详情 商品【数量、单价、小计】 + private Refunds refund; // 订单退款状态(0:正常, 1:已退款, 2:退款中) + public Orders getOrders() { + return orders; + } + public void setOrders(Orders orders) { + this.orders = orders; + } + public Users getUser() { + return user; + } + public void setUser(Users user) { + this.user = user; + } + public Shops getShop() { + return shop; + } + public void setShop(Shops shop) { + this.shop = shop; + } + public List getOrdersItems() { + return ordersItems; + } + public void setOrdersItems(List ordersItems) { + this.ordersItems = ordersItems; + } + public Refunds getRefund() { + return refund; + } + public void setRefund(Refunds refund) { + this.refund = refund; + } + + +} diff --git a/src/main/java/com/qf/backend/dto/response/ProductsResponse.java b/src/main/java/com/qf/backend/dto/response/ProductsResponse.java new file mode 100644 index 0000000..174ba7e --- /dev/null +++ b/src/main/java/com/qf/backend/dto/response/ProductsResponse.java @@ -0,0 +1,103 @@ +package com.qf.backend.dto.response; + +import java.util.List; + +import com.qf.backend.entity.Product.ProductAttributeValues; +import com.qf.backend.entity.Product.ProductAttributes; +import com.qf.backend.entity.Product.ProductCategories; +import com.qf.backend.entity.Product.ProductImages; +import com.qf.backend.entity.Product.ProductSkus; +import com.qf.backend.entity.Product.Products; +import com.qf.backend.entity.Shop.Shops; + +/** + * 商品响应类,用于商品详情和列表查询 + * 包含商品基本信息、分类信息和店铺信息 + * + * @author 30803 + */ +public class ProductsResponse { + private Products products; + /** + * 商品分类信息 + */ + private ProductCategories category; + /** + * 商品属性列表 + */ + private List Attributes; + /** + * 商品属性值列表 + */ + private List AttributeValuesList; + /** + * 商品SKU列表 + */ + private List productSkus; + /** + * 商品图片列表 + */ + private List productImages; + /** + * 商品店铺信息 + */ + private Shops shop; + + public Products getProducts() { + return products; + } + + public void setProducts(Products products) { + this.products = products; + } + + public ProductCategories getCategory() { + return category; + } + + public void setCategory(ProductCategories category) { + this.category = category; + } + + public Shops getShop() { + return shop; + } + + public void setShop(Shops shop) { + this.shop = shop; + } + + public List getAttributes() { + return Attributes; + } + + public void setAttributes(List attributes) { + Attributes = attributes; + } + + public List getAttributeValuesList() { + return AttributeValuesList; + } + + public void setAttributeValuesList(List attributeValuesList) { + AttributeValuesList = attributeValuesList; + } + + public List getProductSkus() { + return productSkus; + } + + public void setProductSkus(List productSkus) { + this.productSkus = productSkus; + } + + public List getProductImages() { + return productImages; + } + + public void setProductImages(List productImages) { + this.productImages = productImages; + } + + +} diff --git a/src/main/java/com/qf/backend/dto/response/ShopResponse.java b/src/main/java/com/qf/backend/dto/response/ShopResponse.java new file mode 100644 index 0000000..57bffd7 --- /dev/null +++ b/src/main/java/com/qf/backend/dto/response/ShopResponse.java @@ -0,0 +1,32 @@ +package com.qf.backend.dto.response; + +import java.util.List; + +import com.qf.backend.entity.Shop.Shops; + +/** + * 店铺响应类 + * 返回店铺详情信息 + * + * @author QF + * @version 1.0 + * @date 2023-12-15 + */ +public class ShopResponse { + private Shops shop; // 店铺信息 + + private List products; // 店铺商品列表 + + public Shops getShop() { + return shop; + } + public void setShop(Shops shop) { + this.shop = shop; + } + public List getProducts() { + return products; + } + public void setProducts(List products) { + this.products = products; + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/dto/response/Userresponse.java b/src/main/java/com/qf/backend/dto/response/Userresponse.java index 88c1922..37dc294 100644 --- a/src/main/java/com/qf/backend/dto/response/Userresponse.java +++ b/src/main/java/com/qf/backend/dto/response/Userresponse.java @@ -2,12 +2,17 @@ package com.qf.backend.dto.response; import java.util.List; +import com.qf.backend.entity.User.Permissions; import com.qf.backend.entity.User.Roles; import com.qf.backend.entity.User.Users; public class Userresponse { private Users users; + // 角色列表 private List roles; + // 权限列表 + private List permissions; + // getters and setters public Users getUsers() { return users; @@ -21,4 +26,11 @@ public class Userresponse { public void setRoles(List roles) { this.roles = roles; } + public List getPermissions() { + return permissions; + } + public void setPermissions(List permissions) { + this.permissions = permissions; + } + } diff --git a/src/main/java/com/qf/backend/entity/OrderItems.java b/src/main/java/com/qf/backend/entity/Order/OrderItems.java similarity index 97% rename from src/main/java/com/qf/backend/entity/OrderItems.java rename to src/main/java/com/qf/backend/entity/Order/OrderItems.java index f011a73..b8bd25c 100644 --- a/src/main/java/com/qf/backend/entity/OrderItems.java +++ b/src/main/java/com/qf/backend/entity/Order/OrderItems.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Order; import java.math.BigDecimal; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/OrderStatusHistory.java b/src/main/java/com/qf/backend/entity/Order/OrderStatusHistory.java similarity index 96% rename from src/main/java/com/qf/backend/entity/OrderStatusHistory.java rename to src/main/java/com/qf/backend/entity/Order/OrderStatusHistory.java index 7f96b4c..2343a08 100644 --- a/src/main/java/com/qf/backend/entity/OrderStatusHistory.java +++ b/src/main/java/com/qf/backend/entity/Order/OrderStatusHistory.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Order; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/Orders.java b/src/main/java/com/qf/backend/entity/Order/Orders.java similarity index 97% rename from src/main/java/com/qf/backend/entity/Orders.java rename to src/main/java/com/qf/backend/entity/Order/Orders.java index 5ca3666..2cba660 100644 --- a/src/main/java/com/qf/backend/entity/Orders.java +++ b/src/main/java/com/qf/backend/entity/Order/Orders.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Order; import java.math.BigDecimal; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/ProductAttributeValues.java b/src/main/java/com/qf/backend/entity/Product/ProductAttributeValues.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductAttributeValues.java rename to src/main/java/com/qf/backend/entity/Product/ProductAttributeValues.java index ce7925e..75781ab 100644 --- a/src/main/java/com/qf/backend/entity/ProductAttributeValues.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductAttributeValues.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/ProductAttributes.java b/src/main/java/com/qf/backend/entity/Product/ProductAttributes.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductAttributes.java rename to src/main/java/com/qf/backend/entity/Product/ProductAttributes.java index 1fb3a1a..d8832d8 100644 --- a/src/main/java/com/qf/backend/entity/ProductAttributes.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductAttributes.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/ProductCategories.java b/src/main/java/com/qf/backend/entity/Product/ProductCategories.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductCategories.java rename to src/main/java/com/qf/backend/entity/Product/ProductCategories.java index a80c79c..2210fa4 100644 --- a/src/main/java/com/qf/backend/entity/ProductCategories.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductCategories.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.util.Date; import java.util.List; diff --git a/src/main/java/com/qf/backend/entity/ProductImages.java b/src/main/java/com/qf/backend/entity/Product/ProductImages.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductImages.java rename to src/main/java/com/qf/backend/entity/Product/ProductImages.java index 6f9b0a8..02ce551 100644 --- a/src/main/java/com/qf/backend/entity/ProductImages.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductImages.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/qf/backend/entity/ProductInventories.java b/src/main/java/com/qf/backend/entity/Product/ProductInventories.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductInventories.java rename to src/main/java/com/qf/backend/entity/Product/ProductInventories.java index 197dfd9..45d8de8 100644 --- a/src/main/java/com/qf/backend/entity/ProductInventories.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductInventories.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/ProductSkus.java b/src/main/java/com/qf/backend/entity/Product/ProductSkus.java similarity index 96% rename from src/main/java/com/qf/backend/entity/ProductSkus.java rename to src/main/java/com/qf/backend/entity/Product/ProductSkus.java index fd12959..7b14967 100644 --- a/src/main/java/com/qf/backend/entity/ProductSkus.java +++ b/src/main/java/com/qf/backend/entity/Product/ProductSkus.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.math.BigDecimal; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/Products.java b/src/main/java/com/qf/backend/entity/Product/Products.java similarity index 97% rename from src/main/java/com/qf/backend/entity/Products.java rename to src/main/java/com/qf/backend/entity/Product/Products.java index 2e7f3b6..b5bc87a 100644 --- a/src/main/java/com/qf/backend/entity/Products.java +++ b/src/main/java/com/qf/backend/entity/Product/Products.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Product; import java.math.BigDecimal; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/ShopCategories.java b/src/main/java/com/qf/backend/entity/Shop/ShopCategories.java similarity index 93% rename from src/main/java/com/qf/backend/entity/ShopCategories.java rename to src/main/java/com/qf/backend/entity/Shop/ShopCategories.java index e7e2b19..1356535 100644 --- a/src/main/java/com/qf/backend/entity/ShopCategories.java +++ b/src/main/java/com/qf/backend/entity/Shop/ShopCategories.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Shop; import java.util.Date; @@ -27,7 +27,7 @@ public class ShopCategories { private String categoryName; // 分类名称 private Long parentId; // 父分类ID,顶级分类为0 private Integer level; // 分类级别 - private String icon; // 分类图标 + private String icon; // 分类图标URL private Integer sort; // 排序 private Integer status; // 状态:0:禁用, 1:启用 private Date createdAt; // 创建时间 diff --git a/src/main/java/com/qf/backend/entity/ShopRatings.java b/src/main/java/com/qf/backend/entity/Shop/ShopRatings.java similarity index 97% rename from src/main/java/com/qf/backend/entity/ShopRatings.java rename to src/main/java/com/qf/backend/entity/Shop/ShopRatings.java index 14b2019..2f1c666 100644 --- a/src/main/java/com/qf/backend/entity/ShopRatings.java +++ b/src/main/java/com/qf/backend/entity/Shop/ShopRatings.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Shop; import java.util.Date; diff --git a/src/main/java/com/qf/backend/entity/Shops.java b/src/main/java/com/qf/backend/entity/Shop/Shops.java similarity index 94% rename from src/main/java/com/qf/backend/entity/Shops.java rename to src/main/java/com/qf/backend/entity/Shop/Shops.java index 9f920af..f29cd41 100644 --- a/src/main/java/com/qf/backend/entity/Shops.java +++ b/src/main/java/com/qf/backend/entity/Shop/Shops.java @@ -1,4 +1,4 @@ -package com.qf.backend.entity; +package com.qf.backend.entity.Shop; import java.math.BigDecimal; import java.util.Date; @@ -37,7 +37,7 @@ public class Shops { private BigDecimal rating; // 店铺评分 private Integer salesVolume; // 销量 private Integer status; // 状态:0: 未审核, 1: 已审核, 2: 已关闭, 3: 审核失败 - private String businessLicense; // 营业执照 + private String businessLicense; // 营业执照URL private Date businessStartTime; // 营业时间开始 private Date businessEndTime; // 营业时间结束 private Date createdAt; // 创建时间 diff --git a/src/main/java/com/qf/backend/entity/User/CustomUserDetails.java b/src/main/java/com/qf/backend/entity/User/CustomUserDetails.java new file mode 100644 index 0000000..4a16810 --- /dev/null +++ b/src/main/java/com/qf/backend/entity/User/CustomUserDetails.java @@ -0,0 +1,79 @@ +package com.qf.backend.entity.User; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class CustomUserDetails implements UserDetails { + + private Long id; // 👈 新增用户ID + private String username; + private String password; + private boolean accountNonExpired; + private boolean accountNonLocked; + private boolean credentialsNonExpired; + private boolean enabled; + private Collection authorities; + + // 构造方法(推荐) + public CustomUserDetails(Long id, String username, String password, + Collection authorities, + boolean enabled, boolean accountNonExpired, + boolean accountNonLocked, boolean credentialsNonExpired) { + this.id = id; + this.username = username; + this.password = password; + this.authorities = authorities; + this.enabled = enabled; + this.accountNonExpired = accountNonExpired; + this.accountNonLocked = accountNonLocked; + this.credentialsNonExpired = credentialsNonExpired; + } + + // Getter(必须提供 id 的 getter) + public Long getId() { + return id; + } + + // Setter(可选,根据需要添加) + public void setId(Long id) { + this.id = id; + } + + // ========== 以下是 UserDetails 接口必须实现的方法 ========== + @Override + public Collection getAuthorities() { + return authorities; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public boolean isAccountNonExpired() { + return accountNonExpired; + } + + @Override + public boolean isAccountNonLocked() { + return accountNonLocked; + } + + @Override + public boolean isCredentialsNonExpired() { + return credentialsNonExpired; + } + + @Override + public boolean isEnabled() { + return enabled; + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/inti/ProductDataDetailInitializer.java b/src/main/java/com/qf/backend/inti/ProductDataDetailInitializer.java new file mode 100644 index 0000000..6f66c52 --- /dev/null +++ b/src/main/java/com/qf/backend/inti/ProductDataDetailInitializer.java @@ -0,0 +1,339 @@ +package com.qf.backend.inti; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.Product.ProductAttributes; +import com.qf.backend.entity.Product.ProductAttributeValues; +import com.qf.backend.entity.Product.ProductImages; +import com.qf.backend.entity.Product.ProductInventories; +import com.qf.backend.entity.Product.ProductSkus; +import com.qf.backend.entity.Product.Products; +import com.qf.backend.service.Products.ProductAttributeValuesService; +import com.qf.backend.service.Products.ProductAttributesService; +import com.qf.backend.service.Products.ProductImagesService; +import com.qf.backend.service.Products.ProductInventoriesService; +import com.qf.backend.service.Products.ProductSkusService; +import com.qf.backend.service.Products.ProductsService; + +import jakarta.annotation.PostConstruct; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品详细数据初始化配置类,用于在系统启动时创建商品的详细数据 + */ +@Component +public class ProductDataDetailInitializer { + private static final Logger logger = LoggerFactory.getLogger(ProductDataDetailInitializer.class); + + @Autowired + private ProductsService productsService; + + @Autowired + private ProductAttributesService productAttributesService; + + @Autowired + private ProductAttributeValuesService productAttributeValuesService; + + @Autowired + private ProductImagesService productImagesService; + + @Autowired + private ProductSkusService productSkusService; + + @Autowired + private ProductInventoriesService productInventoriesService; + + /** + * 系统启动时初始化商品详细数据 + */ + // @PostConstruct + public void initProductDetailData() { + logger.info("开始初始化商品详细数据..."); + + // 初始化商品属性 + initProductAttributes(); + + // 初始化商品属性值 + initProductAttributeValues(); + + // 初始化商品图片 + initProductImages(); + + // 初始化商品SKU + initProductSkus(); + + // 初始化商品库存 + initProductInventories(); + + logger.info("商品详细数据初始化完成"); + } + + /** + * 初始化商品属性 + */ + private void initProductAttributes() { + logger.info("开始初始化商品属性..."); + + // 定义初始商品属性信息 + Object[][] attributeInfos = { + // 手机分类 (categoryId = 10) + {"颜色", 10, 0, 1}, // 0: 规格属性 + {"存储容量", 10, 0, 2}, + {"运行内存", 10, 0, 3}, + // 电脑分类 (categoryId = 5) + {"处理器", 5, 0, 1}, + {"内存", 5, 0, 2}, + {"硬盘", 5, 0, 3}, + }; + + for (Object[] attributeInfo : attributeInfos) { + String attributeName = (String) attributeInfo[0]; + Long categoryId = Long.valueOf((Integer) attributeInfo[1]); + Integer attributeType = (Integer) attributeInfo[2]; + Integer sort = (Integer) attributeInfo[3]; + + // 检查属性是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("attribute_name", attributeName) + .eq("category_id", categoryId); + ProductAttributes existingAttribute = productAttributesService.getOne(queryWrapper); + + if (existingAttribute == null) { + // 创建新属性 + ProductAttributes attribute = new ProductAttributes(); + attribute.setAttributeName(attributeName); + attribute.setCategoryId(categoryId); + attribute.setAttributeType(attributeType); + attribute.setSort(sort); + attribute.setCreatedAt(new Date()); + attribute.setUpdatedAt(new Date()); + + productAttributesService.save(attribute); + logger.info("成功创建商品属性: {} (分类ID: {})", attributeName, categoryId); + } else { + logger.info("商品属性 {} (分类ID: {}) 已存在,跳过创建", attributeName, categoryId); + } + } + + logger.info("商品属性初始化完成"); + } + + /** + * 初始化商品属性值 + */ + private void initProductAttributeValues() { + logger.info("开始初始化商品属性值..."); + + // 获取iPhone 16 Pro商品 + Products iphoneProduct = productsService.getOne(new QueryWrapper().eq("product_name", "iPhone 16 Pro")); + if (iphoneProduct != null) { + Long productId = iphoneProduct.getId(); + + // 获取颜色属性ID + ProductAttributes colorAttr = productAttributesService.getOne(new QueryWrapper() + .eq("attribute_name", "颜色") + .eq("category_id", 10)); + + // 获取存储容量属性ID + ProductAttributes storageAttr = productAttributesService.getOne(new QueryWrapper() + .eq("attribute_name", "存储容量") + .eq("category_id", 10)); + + if (colorAttr != null && storageAttr != null) { + // 定义iPhone 16 Pro的属性值 + Object[][] attributeValueInfos = { + {productId, colorAttr.getId(), "深空黑色", 1}, + {productId, colorAttr.getId(), "银色", 2}, + {productId, colorAttr.getId(), "金色", 3}, + {productId, colorAttr.getId(), "白色", 4}, + {productId, storageAttr.getId(), "128GB", 1}, + {productId, storageAttr.getId(), "256GB", 2}, + {productId, storageAttr.getId(), "512GB", 3}, + {productId, storageAttr.getId(), "1TB", 4}, + }; + + for (Object[] valueInfo : attributeValueInfos) { + Long prodId = (Long) valueInfo[0]; + Long attrId = (Long) valueInfo[1]; + String attrValue = (String) valueInfo[2]; + Integer sort = (Integer) valueInfo[3]; + + // 检查属性值是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", prodId) + .eq("attribute_id", attrId) + .eq("attribute_value", attrValue); + ProductAttributeValues existingValue = productAttributeValuesService.getOne(queryWrapper); + + if (existingValue == null) { + // 创建新属性值 + ProductAttributeValues attributeValue = new ProductAttributeValues(); + attributeValue.setProductId(prodId); + attributeValue.setAttributeId(attrId); + attributeValue.setAttributeValue(attrValue); + attributeValue.setSort(sort); + attributeValue.setCreatedAt(new Date()); + attributeValue.setUpdatedAt(new Date()); + + productAttributeValuesService.save(attributeValue); + logger.info("成功创建商品属性值: {} (商品ID: {}, 属性ID: {})", attrValue, prodId, attrId); + } else { + logger.info("商品属性值 {} (商品ID: {}, 属性ID: {}) 已存在,跳过创建", attrValue, prodId, attrId); + } + } + } + } + + logger.info("商品属性值初始化完成"); + } + + /** + * 初始化商品图片 + */ + private void initProductImages() { + logger.info("开始初始化商品图片..."); + + // 获取所有商品 + for (Products product : productsService.list()) { + Long productId = product.getId(); + String productName = product.getProductName(); + + // 定义商品图片信息 + Object[][] imageInfos = { + {productId, product.getMainImage(), 1, 1}, // 主图 + {productId, productName.toLowerCase().replace(" ", "") + "_1.jpg", 2, 0}, + {productId, productName.toLowerCase().replace(" ", "") + "_2.jpg", 3, 0}, + {productId, productName.toLowerCase().replace(" ", "") + "_3.jpg", 4, 0}, + }; + + for (Object[] imageInfo : imageInfos) { + Long prodId = (Long) imageInfo[0]; + String imageUrl = (String) imageInfo[1]; + Integer sort = (Integer) imageInfo[2]; + Integer isMain = (Integer) imageInfo[3]; + + // 检查图片是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", prodId) + .eq("image_url", imageUrl); + ProductImages existingImage = productImagesService.getOne(queryWrapper); + + if (existingImage == null) { + // 创建新图片 + ProductImages productImage = new ProductImages(); + productImage.setProductId(prodId); + productImage.setImageUrl(imageUrl); + productImage.setSort(sort); + productImage.setIsMain(isMain); + productImage.setCreatedAt(new Date()); + + productImagesService.save(productImage); + logger.info("成功创建商品图片: {} (商品ID: {})", imageUrl, prodId); + } else { + logger.info("商品图片 {} (商品ID: {}) 已存在,跳过创建", imageUrl, prodId); + } + } + } + + logger.info("商品图片初始化完成"); + } + + /** + * 初始化商品SKU + */ + private void initProductSkus() { + logger.info("开始初始化商品SKU..."); + + // 获取iPhone 16 Pro商品 + Products iphoneProduct = productsService.getOne(new QueryWrapper().eq("product_name", "iPhone 16 Pro")); + if (iphoneProduct != null) { + Long productId = iphoneProduct.getId(); + + // 定义iPhone 16 Pro的SKU信息 + Object[][] skuInfos = { + {productId, "IP16P-128GB-B", "{\"颜色\":\"深空黑色\",\"存储容量\":\"128GB\"}", 7999.00, 100, "iphone16_black_128.jpg", 1}, + {productId, "IP16P-128GB-S", "{\"颜色\":\"银色\",\"存储容量\":\"128GB\"}", 7999.00, 100, "iphone16_silver_128.jpg", 1}, + {productId, "IP16P-256GB-B", "{\"颜色\":\"深空黑色\",\"存储容量\":\"256GB\"}", 8999.00, 100, "iphone16_black_256.jpg", 1}, + {productId, "IP16P-256GB-S", "{\"颜色\":\"银色\",\"存储容量\":\"256GB\"}", 8999.00, 100, "iphone16_silver_256.jpg", 1}, + }; + + for (Object[] skuInfo : skuInfos) { + Long prodId = (Long) skuInfo[0]; + String skuCode = (String) skuInfo[1]; + String skuSpecs = (String) skuInfo[2]; + Double price = (Double) skuInfo[3]; + Integer stock = (Integer) skuInfo[4]; + String image = (String) skuInfo[5]; + Integer status = (Integer) skuInfo[6]; + + // 检查SKU是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", prodId) + .eq("sku_code", skuCode); + ProductSkus existingSku = productSkusService.getOne(queryWrapper); + + if (existingSku == null) { + // 创建新SKU + ProductSkus productSku = new ProductSkus(); + productSku.setProductId(prodId); + productSku.setSkuCode(skuCode); + productSku.setSkuSpecs(skuSpecs); + productSku.setPrice(new BigDecimal(Double.toString(price))); + productSku.setStock(stock); + productSku.setImage(image); + productSku.setStatus(status); + productSku.setCreatedAt(new Date()); + productSku.setUpdatedAt(new Date()); + + productSkusService.save(productSku); + logger.info("成功创建商品SKU: {} (商品ID: {})", skuCode, prodId); + } else { + logger.info("商品SKU {} (商品ID: {}) 已存在,跳过创建", skuCode, prodId); + } + } + } + + logger.info("商品SKU初始化完成"); + } + + /** + * 初始化商品库存 + */ + private void initProductInventories() { + logger.info("开始初始化商品库存..."); + + // 获取所有商品SKU + for (ProductSkus sku : productSkusService.list()) { + Long skuId = sku.getId(); + + // 检查库存是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("sku_id", skuId); + ProductInventories existingInventory = productInventoriesService.getOne(queryWrapper); + + if (existingInventory == null) { + // 创建新库存 + ProductInventories inventory = new ProductInventories(); + inventory.setSkuId(skuId); + inventory.setCurrentStock(sku.getStock()); + inventory.setSafetyStock(10); // 默认安全库存为10 + inventory.setLockStock(0); + inventory.setLastUpdateTime(new Date()); + inventory.setCreatedAt(new Date()); + inventory.setUpdatedAt(new Date()); + + productInventoriesService.save(inventory); + logger.info("成功创建商品库存: SKU ID={}, 当前库存={}", skuId, sku.getStock()); + } else { + logger.info("商品库存 SKU ID={} 已存在,跳过创建", skuId); + } + } + + logger.info("商品库存初始化完成"); + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/inti/ProductDataInitializer.java b/src/main/java/com/qf/backend/inti/ProductDataInitializer.java index b834533..4fb0fbb 100644 --- a/src/main/java/com/qf/backend/inti/ProductDataInitializer.java +++ b/src/main/java/com/qf/backend/inti/ProductDataInitializer.java @@ -6,10 +6,12 @@ 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.ProductCategories; -import com.qf.backend.entity.Products; -import com.qf.backend.service.ProductCategoriesService; -import com.qf.backend.service.ProductsService; +import com.qf.backend.entity.Product.ProductCategories; +import com.qf.backend.entity.Product.Products; +import com.qf.backend.service.Products.ProductCategoriesService; +import com.qf.backend.service.Products.ProductsService; + +import jakarta.annotation.PostConstruct; /** * 商品数据初始化配置类,用于在系统启动时创建初始商品分类和商品信息 diff --git a/src/main/java/com/qf/backend/inti/RoleInitializer.java b/src/main/java/com/qf/backend/inti/RoleInitializer.java index 4afd446..bc71ebe 100644 --- a/src/main/java/com/qf/backend/inti/RoleInitializer.java +++ b/src/main/java/com/qf/backend/inti/RoleInitializer.java @@ -7,7 +7,9 @@ import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qf.backend.entity.User.Roles; -import com.qf.backend.service.RolesService; +import com.qf.backend.service.User.RolesService; + +import jakarta.annotation.PostConstruct; /** * 角色初始化配置类,用于在系统启动时创建内置角色 diff --git a/src/main/java/com/qf/backend/inti/ShopDataInitializer.java b/src/main/java/com/qf/backend/inti/ShopDataInitializer.java new file mode 100644 index 0000000..ee3a5f9 --- /dev/null +++ b/src/main/java/com/qf/backend/inti/ShopDataInitializer.java @@ -0,0 +1,188 @@ +package com.qf.backend.inti; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.Shop.ShopCategories; +import com.qf.backend.entity.Shop.Shops; +import com.qf.backend.service.Shop.ShopCategoriesService; +import com.qf.backend.service.Shop.ShopsService; + +import jakarta.annotation.PostConstruct; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 店铺数据初始化配置类,用于在系统启动时创建店铺分类和店铺信息 + */ +@Component +public class ShopDataInitializer { + private static final Logger logger = LoggerFactory.getLogger(ShopDataInitializer.class); + + @Autowired + private ShopCategoriesService shopCategoriesService; + + @Autowired + private ShopsService shopsService; + + /** + * 系统启动时初始化店铺数据 + */ + // @PostConstruct + public void initShopData() { + logger.info("开始初始化店铺数据..."); + + // 初始化店铺分类 + initShopCategories(); + + // 初始化店铺信息 + initShops(); + + logger.info("店铺数据初始化完成"); + } + + /** + * 初始化店铺分类 + */ + private void initShopCategories() { + logger.info("开始初始化店铺分类..."); + + // 定义初始店铺分类信息 + Object[][] categoryInfos = { + // 顶级分类 + {"1", "数码家电", "0", 1, "digital-appliance.jpg", 1, 1}, + {"2", "服装鞋包", "0", 1, "clothing-shoes.jpg", 2, 1}, + {"3", "家居生活", "0", 1, "home-living.jpg", 3, 1}, + // 二级分类 - 数码家电 + {"4", "手机数码", "1", 2, "phone-digital.jpg", 1, 1}, + {"5", "电脑办公", "1", 2, "computer-office.jpg", 2, 1}, + {"6", "家用电器", "1", 2, "home-appliance.jpg", 3, 1}, + // 二级分类 - 服装鞋包 + {"7", "男装", "2", 2, "men-clothing.jpg", 1, 1}, + {"8", "女装", "2", 2, "women-clothing.jpg", 2, 1}, + {"9", "鞋靴", "2", 2, "shoes.jpg", 3, 1}, + }; + + for (Object[] categoryInfo : categoryInfos) { + String categoryName = (String) categoryInfo[1]; // 第二个元素是分类名称 + Long parentId = Long.valueOf((String) categoryInfo[2]); // 第三个元素是父分类ID + Integer level = (Integer) categoryInfo[3]; // 第四个元素是级别 + String icon = (String) categoryInfo[4]; // 第五个元素是图标 + Integer sort = (Integer) categoryInfo[5]; // 第六个元素是排序 + Integer status = (Integer) categoryInfo[6]; // 第七个元素是状态 + + // 检查分类是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("category_name", categoryName) + .eq("parent_id", parentId); + ShopCategories existingCategory = shopCategoriesService.getOne(queryWrapper); + + if (existingCategory == null) { + // 创建新分类 + ShopCategories category = new ShopCategories(); + category.setCategoryName(categoryName); + category.setParentId(parentId); + category.setLevel(level); + category.setIcon(icon); + category.setSort(sort); + category.setStatus(status); + category.setCreatedAt(new Date()); + category.setUpdatedAt(new Date()); + + shopCategoriesService.save(category); + logger.info("成功创建店铺分类: {}", categoryName); + } else { + logger.info("店铺分类 {} 已存在,跳过创建", categoryName); + } + } + + logger.info("店铺分类初始化完成"); + } + + /** + * 初始化店铺信息 + */ + private void initShops() { + logger.info("开始初始化店铺信息..."); + + // 定义初始店铺信息 + Object[][] shopInfos = { + {"Apple官方旗舰店", 2, 4, "apple-logo.jpg", "apple-cover.jpg", "Apple官方授权旗舰店,销售最新款Apple产品", "北京市朝阳区三里屯SOHO", "400-123-4567", "Apple客服", 4.8, 10000, 1, "business-license-1.jpg", "09:00:00", "21:00:00"}, + {"华为官方旗舰店", 2, 4, "huawei-logo.jpg", "huawei-cover.jpg", "华为官方授权旗舰店,销售华为全系列产品", "上海市浦东新区陆家嘴金融中心", "400-789-0123", "华为客服", 4.7, 8000, 1, "business-license-2.jpg", "09:00:00", "21:00:00"}, + {"小米官方旗舰店", 2, 4, "xiaomi-logo.jpg", "xiaomi-cover.jpg", "小米官方授权旗舰店,销售小米全系列产品", "广州市天河区天河城", "400-345-6789", "小米客服", 4.6, 7000, 1, "business-license-3.jpg", "09:00:00", "21:00:00"}, + {"Nike官方旗舰店", 2, 8, "nike-logo.jpg", "nike-cover.jpg", "Nike官方授权旗舰店,销售Nike运动产品", "深圳市南山区科技园", "400-678-9012", "Nike客服", 4.5, 6000, 1, "business-license-4.jpg", "10:00:00", "22:00:00"}, + {"Adidas官方旗舰店", 2, 8, "adidas-logo.jpg", "adidas-cover.jpg", "Adidas官方授权旗舰店,销售Adidas运动产品", "杭州市西湖区武林广场", "400-901-2345", "Adidas客服", 4.4, 5000, 1, "business-license-5.jpg", "10:00:00", "22:00:00"}, + }; + + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + + for (Object[] shopInfo : shopInfos) { + String shopName = (String) shopInfo[0]; + Long userId = Long.valueOf((Integer) shopInfo[1]); + Long categoryId = Long.valueOf((Integer) shopInfo[2]); + String shopLogo = (String) shopInfo[3]; + String coverImage = (String) shopInfo[4]; + String description = (String) shopInfo[5]; + String address = (String) shopInfo[6]; + String contactPhone = (String) shopInfo[7]; + String contactPerson = (String) shopInfo[8]; + Double rating = (Double) shopInfo[9]; + Integer salesVolume = (Integer) shopInfo[10]; + Integer status = (Integer) shopInfo[11]; + String businessLicense = (String) shopInfo[12]; + String businessStartTimeStr = (String) shopInfo[13]; + String businessEndTimeStr = (String) shopInfo[14]; + + // 检查店铺是否已存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("shop_name", shopName); + Shops existingShop = shopsService.getOne(queryWrapper); + + if (existingShop == null) { + // 创建新店铺 + Shops shop = new Shops(); + shop.setShopName(shopName); + shop.setUserId(userId); + shop.setCategoryId(categoryId); + shop.setShopLogo(shopLogo); + shop.setCoverImage(coverImage); + shop.setDescription(description); + shop.setAddress(address); + shop.setContactPhone(contactPhone); + shop.setContactPerson(contactPerson); + shop.setRating(new BigDecimal(Double.toString(rating))); + shop.setSalesVolume(salesVolume); + shop.setStatus(status); + shop.setBusinessLicense(businessLicense); + + // 解析营业时间 + try { + Date businessStartTime = timeFormat.parse(businessStartTimeStr); + Date businessEndTime = timeFormat.parse(businessEndTimeStr); + shop.setBusinessStartTime(businessStartTime); + shop.setBusinessEndTime(businessEndTime); + } catch (ParseException e) { + logger.error("解析营业时间失败: {}", e.getMessage()); + // 使用默认营业时间 + shop.setBusinessStartTime(new Date()); + shop.setBusinessEndTime(new Date()); + } + + shop.setCreatedAt(new Date()); + shop.setUpdatedAt(new Date()); + + shopsService.save(shop); + logger.info("成功创建店铺: {}", shopName); + } else { + logger.info("店铺 {} 已存在,跳过创建", shopName); + } + } + + logger.info("店铺信息初始化完成"); + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/inti/ShopRatingsInitializer.java b/src/main/java/com/qf/backend/inti/ShopRatingsInitializer.java new file mode 100644 index 0000000..f13b5cb --- /dev/null +++ b/src/main/java/com/qf/backend/inti/ShopRatingsInitializer.java @@ -0,0 +1,91 @@ +package com.qf.backend.inti; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.Shop.ShopRatings; +import com.qf.backend.service.Shop.ShopRatingsService; + +import jakarta.annotation.PostConstruct; +import java.util.Date; + +/** + * 店铺评分数据初始化配置类,用于在系统启动时创建初始店铺评分信息 + */ +@Component +public class ShopRatingsInitializer { + private static final Logger logger = LoggerFactory.getLogger(ShopRatingsInitializer.class); + + @Autowired + private ShopRatingsService shopRatingsService; + + /** + * 系统启动时初始化店铺评分数据 + */ + // @PostConstruct + public void initShopRatingsData() { + logger.info("开始初始化店铺评分数据..."); + + // 初始化店铺评分信息 + initShopRatings(); + + logger.info("店铺评分数据初始化完成"); + } + + /** + * 初始化店铺评分信息 + */ + private void initShopRatings() { + logger.info("开始初始化店铺评分信息..."); + + // 定义初始店铺评分信息 + Object[][] ratingInfos = { + {1, 1, 1, 5, "商品质量很好,物流速度快,下次还会再来", "[\"rating1.jpg\",\"rating2.jpg\"]", 1}, + {1, 2, 2, 4, "商品还不错,服务态度很好", "[\"rating3.jpg\"]", 1}, + {1, 3, 3, 5, "非常满意的购物体验,商品超出预期", "[\"rating4.jpg\",\"rating5.jpg\",\"rating6.jpg\"]", 1}, + {2, 1, 4, 3, "商品一般,物流有点慢", null, 1}, + {2, 2, 5, 4, "商品质量不错,包装很严实", "[\"rating7.jpg\"]", 1}, + }; + + for (Object[] ratingInfo : ratingInfos) { + Long shopId = Long.valueOf((Integer) ratingInfo[0]); + Long userId = Long.valueOf((Integer) ratingInfo[1]); + Long orderId = Long.valueOf((Integer) ratingInfo[2]); + Integer rating = (Integer) ratingInfo[3]; + String content = (String) ratingInfo[4]; + String images = (String) ratingInfo[5]; + Integer status = (Integer) ratingInfo[6]; + + // 检查评分是否已存在(根据店铺ID、用户ID和订单ID组合判断) + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("shop_id", shopId) + .eq("user_id", userId) + .eq("order_id", orderId); + ShopRatings existingRating = shopRatingsService.getOne(queryWrapper); + + if (existingRating == null) { + // 创建新评分 + ShopRatings shopRating = new ShopRatings(); + shopRating.setShopId(shopId); + shopRating.setUserId(userId); + shopRating.setOrderId(orderId); + shopRating.setRating(rating); + shopRating.setContent(content); + shopRating.setImages(images); + shopRating.setStatus(status); + shopRating.setCreatedAt(new Date()); + shopRating.setUpdatedAt(new Date()); + + shopRatingsService.save(shopRating); + logger.info("成功创建店铺评分: 店铺ID={}, 用户ID={}, 评分={}星", shopId, userId, rating); + } else { + logger.info("店铺评分已存在,跳过创建: 店铺ID={}, 用户ID={}, 订单ID={}", shopId, userId, orderId); + } + } + + logger.info("店铺评分信息初始化完成"); + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/inti/UserInitializer.java b/src/main/java/com/qf/backend/inti/UserInitializer.java index f182834..b0c8880 100644 --- a/src/main/java/com/qf/backend/inti/UserInitializer.java +++ b/src/main/java/com/qf/backend/inti/UserInitializer.java @@ -7,7 +7,9 @@ import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qf.backend.entity.User.Users; -import com.qf.backend.service.UsersService; +import com.qf.backend.service.User.UsersService; + +import jakarta.annotation.PostConstruct; /** * 用户初始化配置类,用于在系统启动时创建内置用户 diff --git a/src/main/java/com/qf/backend/mapper/OrderItemsMapper.java b/src/main/java/com/qf/backend/mapper/Orders/OrderItemsMapper.java similarity index 94% rename from src/main/java/com/qf/backend/mapper/OrderItemsMapper.java rename to src/main/java/com/qf/backend/mapper/Orders/OrderItemsMapper.java index 975024b..df24408 100644 --- a/src/main/java/com/qf/backend/mapper/OrderItemsMapper.java +++ b/src/main/java/com/qf/backend/mapper/Orders/OrderItemsMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Orders; import java.util.List; @@ -7,7 +7,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.OrderItems; +import com.qf.backend.entity.Order.OrderItems; /** * 订单商品项表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/OrderStatusHistoryMapper.java b/src/main/java/com/qf/backend/mapper/Orders/OrderStatusHistoryMapper.java similarity index 91% rename from src/main/java/com/qf/backend/mapper/OrderStatusHistoryMapper.java rename to src/main/java/com/qf/backend/mapper/Orders/OrderStatusHistoryMapper.java index 8615fc4..d32b2db 100644 --- a/src/main/java/com/qf/backend/mapper/OrderStatusHistoryMapper.java +++ b/src/main/java/com/qf/backend/mapper/Orders/OrderStatusHistoryMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Orders; 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.OrderStatusHistory; +import com.qf.backend.entity.Order.OrderStatusHistory; /** * 订单状态历史表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/OrdersMapper.java b/src/main/java/com/qf/backend/mapper/Orders/OrdersMapper.java similarity index 91% rename from src/main/java/com/qf/backend/mapper/OrdersMapper.java rename to src/main/java/com/qf/backend/mapper/Orders/OrdersMapper.java index cf6284a..e5a7c76 100644 --- a/src/main/java/com/qf/backend/mapper/OrdersMapper.java +++ b/src/main/java/com/qf/backend/mapper/Orders/OrdersMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Orders; 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.Orders; +import com.qf.backend.entity.Order.Orders; /** * 订单信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductAttributeValuesMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductAttributeValuesMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductAttributeValuesMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductAttributeValuesMapper.java index d819f5b..c36edaa 100644 --- a/src/main/java/com/qf/backend/mapper/ProductAttributeValuesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductAttributeValuesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductAttributeValues; +import com.qf.backend.entity.Product.ProductAttributeValues; /** * 商品属性值表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductAttributesMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductAttributesMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductAttributesMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductAttributesMapper.java index c41bec3..783e63c 100644 --- a/src/main/java/com/qf/backend/mapper/ProductAttributesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductAttributesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductAttributes; +import com.qf.backend.entity.Product.ProductAttributes; /** * 商品属性表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductCategoriesMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductCategoriesMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductCategoriesMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductCategoriesMapper.java index 9c3b5a3..6a1ddc7 100644 --- a/src/main/java/com/qf/backend/mapper/ProductCategoriesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductCategoriesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductCategories; +import com.qf.backend.entity.Product.ProductCategories; /** * 商品分类表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductImagesMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductImagesMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductImagesMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductImagesMapper.java index a6fad0c..e7e3530 100644 --- a/src/main/java/com/qf/backend/mapper/ProductImagesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductImagesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductImages; +import com.qf.backend.entity.Product.ProductImages; /** * 商品图片表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductInventoriesMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductInventoriesMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductInventoriesMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductInventoriesMapper.java index 44e647a..85fbe80 100644 --- a/src/main/java/com/qf/backend/mapper/ProductInventoriesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductInventoriesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductInventories; +import com.qf.backend.entity.Product.ProductInventories; /** * 商品库存表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductSkusMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductSkusMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ProductSkusMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductSkusMapper.java index 3739abd..782212f 100644 --- a/src/main/java/com/qf/backend/mapper/ProductSkusMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductSkusMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.ProductSkus; +import com.qf.backend.entity.Product.ProductSkus; /** * 商品SKU表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ProductsMapper.java b/src/main/java/com/qf/backend/mapper/Products/ProductsMapper.java similarity index 89% rename from src/main/java/com/qf/backend/mapper/ProductsMapper.java rename to src/main/java/com/qf/backend/mapper/Products/ProductsMapper.java index 2f70f6a..3edde48 100644 --- a/src/main/java/com/qf/backend/mapper/ProductsMapper.java +++ b/src/main/java/com/qf/backend/mapper/Products/ProductsMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Products; 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.Products; +import com.qf.backend.entity.Product.Products; /** * 商品信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ShopCategoriesMapper.java b/src/main/java/com/qf/backend/mapper/Shop/ShopCategoriesMapper.java similarity index 91% rename from src/main/java/com/qf/backend/mapper/ShopCategoriesMapper.java rename to src/main/java/com/qf/backend/mapper/Shop/ShopCategoriesMapper.java index 19fa0f8..d5d0839 100644 --- a/src/main/java/com/qf/backend/mapper/ShopCategoriesMapper.java +++ b/src/main/java/com/qf/backend/mapper/Shop/ShopCategoriesMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Shop; 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.ShopCategories; +import com.qf.backend.entity.Shop.ShopCategories; /** * 店铺分类表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ShopRatingsMapper.java b/src/main/java/com/qf/backend/mapper/Shop/ShopRatingsMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ShopRatingsMapper.java rename to src/main/java/com/qf/backend/mapper/Shop/ShopRatingsMapper.java index 2605a5f..75f1137 100644 --- a/src/main/java/com/qf/backend/mapper/ShopRatingsMapper.java +++ b/src/main/java/com/qf/backend/mapper/Shop/ShopRatingsMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Shop; 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.ShopRatings; +import com.qf.backend.entity.Shop.ShopRatings; /** * 店铺评价表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/ShopsMapper.java b/src/main/java/com/qf/backend/mapper/Shop/ShopsMapper.java similarity index 90% rename from src/main/java/com/qf/backend/mapper/ShopsMapper.java rename to src/main/java/com/qf/backend/mapper/Shop/ShopsMapper.java index c7bad7b..37553b4 100644 --- a/src/main/java/com/qf/backend/mapper/ShopsMapper.java +++ b/src/main/java/com/qf/backend/mapper/Shop/ShopsMapper.java @@ -1,9 +1,9 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.Shop; 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.Shops; +import com.qf.backend.entity.Shop.Shops; /** * 店铺信息表 Mapper 接口 diff --git a/src/main/java/com/qf/backend/mapper/PermissionsMapper.java b/src/main/java/com/qf/backend/mapper/User/PermissionsMapper.java similarity index 95% rename from src/main/java/com/qf/backend/mapper/PermissionsMapper.java rename to src/main/java/com/qf/backend/mapper/User/PermissionsMapper.java index 0a2a7f1..1fb544e 100644 --- a/src/main/java/com/qf/backend/mapper/PermissionsMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/PermissionsMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java b/src/main/java/com/qf/backend/mapper/User/RolePermissionsMapper.java similarity index 96% rename from src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java rename to src/main/java/com/qf/backend/mapper/User/RolePermissionsMapper.java index 1406553..76005d3 100644 --- a/src/main/java/com/qf/backend/mapper/RolePermissionsMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/RolePermissionsMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/qf/backend/mapper/RolesMapper.java b/src/main/java/com/qf/backend/mapper/User/RolesMapper.java similarity index 95% rename from src/main/java/com/qf/backend/mapper/RolesMapper.java rename to src/main/java/com/qf/backend/mapper/User/RolesMapper.java index 0a8e960..1ac374f 100644 --- a/src/main/java/com/qf/backend/mapper/RolesMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/RolesMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java b/src/main/java/com/qf/backend/mapper/User/UserDetailsMapper.java similarity index 96% rename from src/main/java/com/qf/backend/mapper/UserDetailsMapper.java rename to src/main/java/com/qf/backend/mapper/User/UserDetailsMapper.java index 1770e9c..21f0a2f 100644 --- a/src/main/java/com/qf/backend/mapper/UserDetailsMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/UserDetailsMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/qf/backend/mapper/UserRolesMapper.java b/src/main/java/com/qf/backend/mapper/User/UserRolesMapper.java similarity index 96% rename from src/main/java/com/qf/backend/mapper/UserRolesMapper.java rename to src/main/java/com/qf/backend/mapper/User/UserRolesMapper.java index f81bbca..2b39e97 100644 --- a/src/main/java/com/qf/backend/mapper/UserRolesMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/UserRolesMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/qf/backend/mapper/UsersMapper.java b/src/main/java/com/qf/backend/mapper/User/UsersMapper.java similarity index 97% rename from src/main/java/com/qf/backend/mapper/UsersMapper.java rename to src/main/java/com/qf/backend/mapper/User/UsersMapper.java index dcadc3b..a2cba0c 100644 --- a/src/main/java/com/qf/backend/mapper/UsersMapper.java +++ b/src/main/java/com/qf/backend/mapper/User/UsersMapper.java @@ -1,4 +1,4 @@ -package com.qf.backend.mapper; +package com.qf.backend.mapper.User; import org.apache.ibatis.annotations.Select; diff --git a/src/main/java/com/qf/backend/service/OrderItemsService.java b/src/main/java/com/qf/backend/service/Order/OrderItemsService.java similarity index 95% rename from src/main/java/com/qf/backend/service/OrderItemsService.java rename to src/main/java/com/qf/backend/service/Order/OrderItemsService.java index 222606c..613a135 100644 --- a/src/main/java/com/qf/backend/service/OrderItemsService.java +++ b/src/main/java/com/qf/backend/service/Order/OrderItemsService.java @@ -1,10 +1,10 @@ -package com.qf.backend.service; +package com.qf.backend.service.Order; import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.OrderItems; +import com.qf.backend.entity.Order.OrderItems; /** * 订单项服务接口 diff --git a/src/main/java/com/qf/backend/service/OrderStatusHistoryService.java b/src/main/java/com/qf/backend/service/Order/OrderStatusHistoryService.java similarity index 95% rename from src/main/java/com/qf/backend/service/OrderStatusHistoryService.java rename to src/main/java/com/qf/backend/service/Order/OrderStatusHistoryService.java index bdb95a5..9053084 100644 --- a/src/main/java/com/qf/backend/service/OrderStatusHistoryService.java +++ b/src/main/java/com/qf/backend/service/Order/OrderStatusHistoryService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Order; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.OrderStatusHistory; +import com.qf.backend.entity.Order.OrderStatusHistory; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/OrdersService.java b/src/main/java/com/qf/backend/service/Order/OrdersService.java similarity index 75% rename from src/main/java/com/qf/backend/service/OrdersService.java rename to src/main/java/com/qf/backend/service/Order/OrdersService.java index 49ca2a6..0f98215 100644 --- a/src/main/java/com/qf/backend/service/OrdersService.java +++ b/src/main/java/com/qf/backend/service/Order/OrdersService.java @@ -1,10 +1,10 @@ -package com.qf.backend.service; +package com.qf.backend.service.Order; + +import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Orders; - -import java.util.List; +import com.qf.backend.entity.Order.Orders; /** * 订单服务接口 @@ -21,9 +21,11 @@ public interface OrdersService extends IService { /** * 根据用户ID查询订单列表 * @param userId 用户ID + * @param page 当前页码 + * @param size 每页数量 * @return 订单列表 */ - Result> getOrdersByUserId(Long userId); + Result> getOrdersByUserId(Long userId, int page, int size); /** * 创建订单 @@ -64,9 +66,11 @@ public interface OrdersService extends IService { /** * 根据店铺ID查询订单 * @param shopId 店铺ID + * @param page 当前页码 + * @param size 每页数量 * @return 订单列表 */ - Result> getOrdersByShopId(Long shopId); + Result> getOrdersByShopId(Long shopId, int page, int size); /** * 更新订单状态 @@ -77,9 +81,11 @@ public interface OrdersService extends IService { Result updateOrderStatus(Long orderId, Integer status); /** - * 根据订单状态查询订单 + * 根据订单状态查询订单 * @param status 订单状态 + * @param page 当前页码 + * @param size 每页数量 * @return 订单列表 */ - Result> getOrdersByStatus(Integer status); + Result> getOrdersByStatus(Integer status, int page, int size); } diff --git a/src/main/java/com/qf/backend/service/ProductAttributeValuesService.java b/src/main/java/com/qf/backend/service/Products/ProductAttributeValuesService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ProductAttributeValuesService.java rename to src/main/java/com/qf/backend/service/Products/ProductAttributeValuesService.java index 0c97525..b372c26 100644 --- a/src/main/java/com/qf/backend/service/ProductAttributeValuesService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductAttributeValuesService.java @@ -1,10 +1,10 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; + +import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductAttributeValues; - -import java.util.List; +import com.qf.backend.entity.Product.ProductAttributeValues; /** * 商品属性值服务接口 diff --git a/src/main/java/com/qf/backend/service/ProductAttributesService.java b/src/main/java/com/qf/backend/service/Products/ProductAttributesService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ProductAttributesService.java rename to src/main/java/com/qf/backend/service/Products/ProductAttributesService.java index 0970e58..03d9d7c 100644 --- a/src/main/java/com/qf/backend/service/ProductAttributesService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductAttributesService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductAttributes; +import com.qf.backend.entity.Product.ProductAttributes; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ProductCategoriesService.java b/src/main/java/com/qf/backend/service/Products/ProductCategoriesService.java similarity index 94% rename from src/main/java/com/qf/backend/service/ProductCategoriesService.java rename to src/main/java/com/qf/backend/service/Products/ProductCategoriesService.java index 2180788..e5b224d 100644 --- a/src/main/java/com/qf/backend/service/ProductCategoriesService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductCategoriesService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductCategories; +import com.qf.backend.entity.Product.ProductCategories; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ProductImagesService.java b/src/main/java/com/qf/backend/service/Products/ProductImagesService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ProductImagesService.java rename to src/main/java/com/qf/backend/service/Products/ProductImagesService.java index 5ca72c8..cfea489 100644 --- a/src/main/java/com/qf/backend/service/ProductImagesService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductImagesService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductImages; +import com.qf.backend.entity.Product.ProductImages; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ProductInventoriesService.java b/src/main/java/com/qf/backend/service/Products/ProductInventoriesService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ProductInventoriesService.java rename to src/main/java/com/qf/backend/service/Products/ProductInventoriesService.java index 2e3971a..5c9ff04 100644 --- a/src/main/java/com/qf/backend/service/ProductInventoriesService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductInventoriesService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductInventories; +import com.qf.backend.entity.Product.ProductInventories; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ProductSkusService.java b/src/main/java/com/qf/backend/service/Products/ProductSkusService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ProductSkusService.java rename to src/main/java/com/qf/backend/service/Products/ProductSkusService.java index 023e0e5..35eacf8 100644 --- a/src/main/java/com/qf/backend/service/ProductSkusService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductSkusService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ProductSkus; +import com.qf.backend.entity.Product.ProductSkus; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ProductsService.java b/src/main/java/com/qf/backend/service/Products/ProductsService.java similarity index 70% rename from src/main/java/com/qf/backend/service/ProductsService.java rename to src/main/java/com/qf/backend/service/Products/ProductsService.java index 42db6af..e4f5791 100644 --- a/src/main/java/com/qf/backend/service/ProductsService.java +++ b/src/main/java/com/qf/backend/service/Products/ProductsService.java @@ -1,10 +1,11 @@ -package com.qf.backend.service; +package com.qf.backend.service.Products; + +import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Products; - -import java.util.List; +import com.qf.backend.dto.response.ProductsResponse; +import com.qf.backend.entity.Product.Products; /** * 商品服务接口 @@ -14,16 +15,36 @@ public interface ProductsService extends IService { /** * 根据商品名称查询商品 * @param productName 商品名称 + * @param page 当前页码 + * @param size 每页数量 * @return 商品列表 */ - Result> getProductsByName(String productName); + Result> getProductsByName(String productName , int page, int size); /** * 根据分类ID查询商品 * @param categoryId 分类ID + * @param page 当前页码 + * @param size 每页数量 * @return 商品列表 */ - Result> getProductsByCategoryId(Long categoryId); + Result> getProductsByCategoryId(Long categoryId , int page, int size); + + /** + * 根据商品ID查询商品 + * @param id 商品ID + * @return 商品详情 + */ + Result getProductById(Long id); + + /** + * 根据店铺ID列表查询商品 + * @param shopIds 店铺ID列表 + * @param page 当前页码 + * @param size 每页数量 + * @return 商品列表 + */ + Result> getProductsByShopIds(List shopIds , int page, int size); /** * 创建商品 @@ -46,13 +67,7 @@ public interface ProductsService extends IService { */ Result deleteProduct(Long id); - /** - * 根据商品ID查询商品 - * @param id 商品ID - * @return 商品信息 - */ - Result getProductById(Long id); - + /** * 分页查询商品 * @param page 当前页码 @@ -61,13 +76,7 @@ public interface ProductsService extends IService { */ Result> listProductsByPage(int page, int size); - /** - * 根据店铺ID查询商品 - * @param shopId 店铺ID - * @return 商品列表 - */ - Result> getProductsByShopId(Long shopId); - + /** * 批量上下架商品 * @param ids 商品ID列表 diff --git a/src/main/java/com/qf/backend/service/ShopCategoriesService.java b/src/main/java/com/qf/backend/service/Shop/ShopCategoriesService.java similarity index 95% rename from src/main/java/com/qf/backend/service/ShopCategoriesService.java rename to src/main/java/com/qf/backend/service/Shop/ShopCategoriesService.java index 6cfc34a..2f996f2 100644 --- a/src/main/java/com/qf/backend/service/ShopCategoriesService.java +++ b/src/main/java/com/qf/backend/service/Shop/ShopCategoriesService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Shop; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ShopCategories; +import com.qf.backend.entity.Shop.ShopCategories; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ShopRatingsService.java b/src/main/java/com/qf/backend/service/Shop/ShopRatingsService.java similarity index 96% rename from src/main/java/com/qf/backend/service/ShopRatingsService.java rename to src/main/java/com/qf/backend/service/Shop/ShopRatingsService.java index 0848f91..4a85922 100644 --- a/src/main/java/com/qf/backend/service/ShopRatingsService.java +++ b/src/main/java/com/qf/backend/service/Shop/ShopRatingsService.java @@ -1,8 +1,8 @@ -package com.qf.backend.service; +package com.qf.backend.service.Shop; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.ShopRatings; +import com.qf.backend.entity.Shop.ShopRatings; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/ShopsService.java b/src/main/java/com/qf/backend/service/Shop/ShopsService.java similarity index 85% rename from src/main/java/com/qf/backend/service/ShopsService.java rename to src/main/java/com/qf/backend/service/Shop/ShopsService.java index 2f758c2..fdf2459 100644 --- a/src/main/java/com/qf/backend/service/ShopsService.java +++ b/src/main/java/com/qf/backend/service/Shop/ShopsService.java @@ -1,10 +1,10 @@ -package com.qf.backend.service; +package com.qf.backend.service.Shop; import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; -import com.qf.backend.entity.Shops; +import com.qf.backend.entity.Shop.Shops; /** * 店铺服务接口 @@ -16,7 +16,7 @@ public interface ShopsService extends IService { * @param shopName 店铺名称 * @return 店铺列表 */ - Result> getShopsByName(String shopName); + Result> getShopsByName(String shopName, int page, int size); /** * 根据用户ID查询店铺 @@ -64,9 +64,11 @@ public interface ShopsService extends IService { /** * 根据店铺分类ID查询店铺 * @param categoryId 分类ID + * @param page 当前页码 + * @param size 每页数量 * @return 店铺列表 */ - Result> getShopsByCategoryId(Long categoryId); + Result> getShopsByCategoryId(Long categoryId, int page, int size); /** * 更新店铺状态 diff --git a/src/main/java/com/qf/backend/service/PermissionsService.java b/src/main/java/com/qf/backend/service/User/PermissionsService.java similarity index 97% rename from src/main/java/com/qf/backend/service/PermissionsService.java rename to src/main/java/com/qf/backend/service/User/PermissionsService.java index 12d2778..a3dcf0f 100644 --- a/src/main/java/com/qf/backend/service/PermissionsService.java +++ b/src/main/java/com/qf/backend/service/User/PermissionsService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; diff --git a/src/main/java/com/qf/backend/service/RolePermissionsService.java b/src/main/java/com/qf/backend/service/User/RolePermissionsService.java similarity index 98% rename from src/main/java/com/qf/backend/service/RolePermissionsService.java rename to src/main/java/com/qf/backend/service/User/RolePermissionsService.java index 2a5adff..5ae0987 100644 --- a/src/main/java/com/qf/backend/service/RolePermissionsService.java +++ b/src/main/java/com/qf/backend/service/User/RolePermissionsService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.entity.User.RolePermissions; diff --git a/src/main/java/com/qf/backend/service/RolesService.java b/src/main/java/com/qf/backend/service/User/RolesService.java similarity index 97% rename from src/main/java/com/qf/backend/service/RolesService.java rename to src/main/java/com/qf/backend/service/User/RolesService.java index f8b291a..08b3f6f 100644 --- a/src/main/java/com/qf/backend/service/RolesService.java +++ b/src/main/java/com/qf/backend/service/User/RolesService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import java.util.List; diff --git a/src/main/java/com/qf/backend/service/UserDetailsService.java b/src/main/java/com/qf/backend/service/User/UserDetailsService.java similarity index 96% rename from src/main/java/com/qf/backend/service/UserDetailsService.java rename to src/main/java/com/qf/backend/service/User/UserDetailsService.java index 02b165c..7e7a260 100644 --- a/src/main/java/com/qf/backend/service/UserDetailsService.java +++ b/src/main/java/com/qf/backend/service/User/UserDetailsService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import com.baomidou.mybatisplus.extension.service.IService; import com.qf.backend.dto.Result; diff --git a/src/main/java/com/qf/backend/service/UserRolesService.java b/src/main/java/com/qf/backend/service/User/UserRolesService.java similarity index 86% rename from src/main/java/com/qf/backend/service/UserRolesService.java rename to src/main/java/com/qf/backend/service/User/UserRolesService.java index 3f9a941..75b2c52 100644 --- a/src/main/java/com/qf/backend/service/UserRolesService.java +++ b/src/main/java/com/qf/backend/service/User/UserRolesService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import java.util.List; @@ -13,10 +13,10 @@ public interface UserRolesService extends IService { /** * 根据用户ID查询用户角色关联 - * @param userId 用户ID - * @return 用户角色关联列表 + * @param userIds 用户IDs + * @return 用户角色关联列表 */ - Result> getUserRolesByUserId(Long userId); + Result> getUserRolesByUserId(List userIds); /** * 根据角色ID查询用户角色关联 diff --git a/src/main/java/com/qf/backend/service/UsersService.java b/src/main/java/com/qf/backend/service/User/UsersService.java similarity index 89% rename from src/main/java/com/qf/backend/service/UsersService.java rename to src/main/java/com/qf/backend/service/User/UsersService.java index 905de13..53a97db 100644 --- a/src/main/java/com/qf/backend/service/UsersService.java +++ b/src/main/java/com/qf/backend/service/User/UsersService.java @@ -1,4 +1,4 @@ -package com.qf.backend.service; +package com.qf.backend.service.User; import java.util.List; @@ -21,21 +21,21 @@ public interface UsersService extends IService { * @param isUsername 是否为用户名标识(true为用户名,false为邮箱) * @return 用户信息 */ - Result getUserByIdentifier(String identifier, boolean isUsername); + Result getUserByIdentifier(String identifier, boolean isUsername); /** * 根据用户名查询用户 * @param username 用户名 * @return 用户信息 */ - Result getUserByUsername(String username); + Result getUserByUsername(String username); /** * 根据邮箱查询用户 * @param email 邮箱 * @return 用户信息 */ - Result getUserByEmail(String email); + Result getUserByEmail(String email); /** * 登录 diff --git a/src/main/java/com/qf/backend/service/UserLoginService.java b/src/main/java/com/qf/backend/service/UserLoginService.java deleted file mode 100644 index 5b0320c..0000000 --- a/src/main/java/com/qf/backend/service/UserLoginService.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template - */ - -package com.qf.backend.service; - -import com.qf.backend.dto.LoginResponse; -import com.qf.backend.dto.Result; - -/** - * 用户登录服务接口 - */ -public interface UserLoginService { - /** - * 用户登录 - * @param username 用户名 - * @param password 密码 - * @return 登录结果,包含登录状态、token等信息 - */ - Result login(String username, String password); -} diff --git a/src/main/java/com/qf/backend/service/impl/OrderItemsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Orders/OrderItemsServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/OrderItemsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Orders/OrderItemsServiceImpl.java index 2ebb4ae..4a08d83 100644 --- a/src/main/java/com/qf/backend/service/impl/OrderItemsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Orders/OrderItemsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Orders; import java.math.BigDecimal; import java.util.Collection; @@ -14,11 +14,11 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qf.backend.dto.Result; -import com.qf.backend.entity.OrderItems; +import com.qf.backend.entity.Order.OrderItems; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.OrderItemsMapper; -import com.qf.backend.service.OrderItemsService; +import com.qf.backend.mapper.Orders.OrderItemsMapper; +import com.qf.backend.service.Order.OrderItemsService; import com.qf.backend.util.ResultUtils; @Service diff --git a/src/main/java/com/qf/backend/service/impl/OrderStatusHistoryServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Orders/OrderStatusHistoryServiceImpl.java similarity index 97% rename from src/main/java/com/qf/backend/service/impl/OrderStatusHistoryServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Orders/OrderStatusHistoryServiceImpl.java index eb2b46e..d6fa808 100644 --- a/src/main/java/com/qf/backend/service/impl/OrderStatusHistoryServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Orders/OrderStatusHistoryServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Orders; import java.util.List; @@ -10,11 +10,11 @@ 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.OrderStatusHistory; +import com.qf.backend.entity.Order.OrderStatusHistory; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.OrderStatusHistoryMapper; -import com.qf.backend.service.OrderStatusHistoryService; +import com.qf.backend.mapper.Orders.OrderStatusHistoryMapper; +import com.qf.backend.service.Order.OrderStatusHistoryService; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/OrdersServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Orders/OrdersServiceImpl.java similarity index 83% rename from src/main/java/com/qf/backend/service/impl/OrdersServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Orders/OrdersServiceImpl.java index dd617f5..b48548b 100644 --- a/src/main/java/com/qf/backend/service/impl/OrdersServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Orders/OrdersServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Orders; import java.math.BigDecimal; import java.util.Date; @@ -10,13 +10,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.Orders; +import com.qf.backend.entity.Order.Orders; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.OrdersMapper; -import com.qf.backend.service.OrdersService; +import com.qf.backend.mapper.Orders.OrdersMapper; +import com.qf.backend.service.Order.OrdersService; import com.qf.backend.util.ResultUtils; @Service @@ -47,19 +48,31 @@ public class OrdersServiceImpl extends ServiceImpl impleme throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询订单失败: " + e.getMessage(), e); } } - + /** + * 根据用户ID查询订单列表 + * @param userId 用户ID + * @param page 当前页码 + * @param size 每页数量 + * @return 订单列表 + */ @Override - public Result> getOrdersByUserId(Long userId) { + public Result> getOrdersByUserId(Long userId, int page, int size) { // 参数校验 - if (userId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); + if (userId == null || page <= 0 || size <= 0) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID、页码和每页数量必须且大于0"); } + try { - List ordersList = ordersMapper.selectList( + // 使用MyBatis-Plus的分页功能 + // 构建分页查询条件 + Page ordersPage = new Page<>(page, size); + // 执行分页查询 + // 分页查询用户订单 + Page pageResult = ordersMapper.selectPage(ordersPage, new QueryWrapper().eq("user_id", userId).orderByDesc("create_time") ); - return ResultUtils.success(ordersList); + return ResultUtils.success(pageResult.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -219,17 +232,22 @@ public class OrdersServiceImpl extends ServiceImpl impleme } @Override - public Result> getOrdersByShopId(Long shopId) { + public Result> getOrdersByShopId(Long shopId, int page, int size) { // 参数校验 - if (shopId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "店铺ID不能为空"); + if (shopId == null || page <= 0 || size <= 0) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "店铺ID、页码和每页数量必须且大于0"); } try { - List ordersList = ordersMapper.selectList( + // 使用MyBatis-Plus的分页功能 + // 构建分页查询条件 + Page ordersPage = new Page<>(page, size); + // 执行分页查询 + // 分页查询店铺订单 + Page pageResult = ordersMapper.selectPage(ordersPage, new QueryWrapper().eq("shop_id", shopId).orderByDesc("create_time") ); - return ResultUtils.success(ordersList); + return ResultUtils.success(pageResult.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -280,17 +298,22 @@ public class OrdersServiceImpl extends ServiceImpl impleme } @Override - public Result> getOrdersByStatus(Integer status) { + public Result> getOrdersByStatus(Integer status, int page, int size) { // 参数校验 - if (status == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "订单状态不能为空"); + if (status == null || page <= 0 || size <= 0) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "订单状态和页码必须且大于0"); } try { - List ordersList = ordersMapper.selectList( - new QueryWrapper().eq("status", status).orderByDesc("create_time") + // 使用MyBatis-Plus的分页功能 + // 构建分页查询条件 + Page ordersPage = new Page<>(page, size); + // 执行分页查询 + // 分页查询订单 + Page pageResult = ordersMapper.selectPage(ordersPage, + new QueryWrapper().eq("order_status", status).orderByDesc("create_time") ); - return ResultUtils.success(ordersList); + return ResultUtils.success(pageResult.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { diff --git a/src/main/java/com/qf/backend/service/impl/ProductAttributeValuesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductAttributeValuesServiceImpl.java similarity index 97% rename from src/main/java/com/qf/backend/service/impl/ProductAttributeValuesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductAttributeValuesServiceImpl.java index 3b9e044..c016d3e 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductAttributeValuesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductAttributeValuesServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; import java.util.List; @@ -8,11 +8,11 @@ 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.ProductAttributeValues; +import com.qf.backend.entity.Product.ProductAttributeValues; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductAttributeValuesMapper; -import com.qf.backend.service.ProductAttributeValuesService; +import com.qf.backend.mapper.Products.ProductAttributeValuesMapper; +import com.qf.backend.service.Products.ProductAttributeValuesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ProductAttributesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductAttributesServiceImpl.java similarity index 97% rename from src/main/java/com/qf/backend/service/impl/ProductAttributesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductAttributesServiceImpl.java index 62ec4ee..15826d8 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductAttributesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductAttributesServiceImpl.java @@ -1,19 +1,20 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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.ProductAttributes; +import com.qf.backend.entity.Product.ProductAttributes; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductAttributesMapper; -import com.qf.backend.service.ProductAttributesService; +import com.qf.backend.mapper.Products.ProductAttributesMapper; +import com.qf.backend.service.Products.ProductAttributesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; /** * 商品属性服务实现类 diff --git a/src/main/java/com/qf/backend/service/impl/ProductCategoriesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductCategoriesServiceImpl.java similarity index 97% rename from src/main/java/com/qf/backend/service/impl/ProductCategoriesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductCategoriesServiceImpl.java index fb95cee..d8f59c6 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductCategoriesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductCategoriesServiceImpl.java @@ -1,20 +1,21 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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.ProductCategories; +import com.qf.backend.entity.Product.ProductCategories; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductCategoriesMapper; -import com.qf.backend.service.ProductCategoriesService; +import com.qf.backend.mapper.Products.ProductCategoriesMapper; +import com.qf.backend.service.Products.ProductCategoriesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; /** * 商品分类服务实现类 diff --git a/src/main/java/com/qf/backend/service/impl/ProductImagesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductImagesServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/ProductImagesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductImagesServiceImpl.java index 886c0ad..84f5e05 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductImagesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductImagesServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; import java.util.List; @@ -11,11 +11,11 @@ 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.ProductImages; +import com.qf.backend.entity.Product.ProductImages; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductImagesMapper; -import com.qf.backend.service.ProductImagesService; +import com.qf.backend.mapper.Products.ProductImagesMapper; +import com.qf.backend.service.Products.ProductImagesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ProductInventoriesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductInventoriesServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/ProductInventoriesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductInventoriesServiceImpl.java index aff0b84..b8e395c 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductInventoriesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductInventoriesServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; import java.util.List; @@ -10,11 +10,11 @@ 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.ProductInventories; +import com.qf.backend.entity.Product.ProductInventories; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductInventoriesMapper; -import com.qf.backend.service.ProductInventoriesService; +import com.qf.backend.mapper.Products.ProductInventoriesMapper; +import com.qf.backend.service.Products.ProductInventoriesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ProductSkusServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductSkusServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/ProductSkusServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductSkusServiceImpl.java index aef4386..b442eec 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductSkusServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductSkusServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; import java.util.List; @@ -10,11 +10,11 @@ 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.ProductSkus; +import com.qf.backend.entity.Product.ProductSkus; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductSkusMapper; -import com.qf.backend.service.ProductSkusService; +import com.qf.backend.mapper.Products.ProductSkusMapper; +import com.qf.backend.service.Products.ProductSkusService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ProductsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Products/ProductsServiceImpl.java similarity index 53% rename from src/main/java/com/qf/backend/service/impl/ProductsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Products/ProductsServiceImpl.java index 0e0cc67..1e097d3 100644 --- a/src/main/java/com/qf/backend/service/impl/ProductsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Products/ProductsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Products; import java.util.List; @@ -9,11 +9,24 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.Products; +import com.qf.backend.dto.response.ProductsResponse; +import com.qf.backend.entity.Product.ProductAttributeValues; +import com.qf.backend.entity.Product.ProductAttributes; +import com.qf.backend.entity.Product.ProductCategories; +import com.qf.backend.entity.Product.ProductImages; +import com.qf.backend.entity.Product.ProductSkus; +import com.qf.backend.entity.Product.Products; +import com.qf.backend.entity.Shop.Shops; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ProductsMapper; -import com.qf.backend.service.ProductsService; +import com.qf.backend.mapper.Products.ProductsMapper; +import com.qf.backend.service.Products.ProductAttributeValuesService; +import com.qf.backend.service.Products.ProductAttributesService; +import com.qf.backend.service.Products.ProductCategoriesService; +import com.qf.backend.service.Products.ProductImagesService; +import com.qf.backend.service.Products.ProductSkusService; +import com.qf.backend.service.Products.ProductsService; +import com.qf.backend.service.Shop.ShopsService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; @@ -25,16 +38,43 @@ public class ProductsServiceImpl extends ServiceImpl i @Autowired private ProductsMapper productsMapper; + @Autowired + private ShopsService shopsService; + @Autowired + private ProductCategoriesService categoriesService; + @Autowired + private ProductAttributesService attributesService; + @Autowired + private ProductAttributeValuesService attributeValuesService; + @Autowired + private ProductSkusService skusService; + @Autowired + private ProductImagesService imagesService; + /** + * 根据商品名称查询商品列表 + * + * @param productName 商品名称 + * @param page 当前页码 + * @param size 每页数量 + * @return 商品列表 + */ @Override - public Result> getProductsByName(String productName) { + public Result> getProductsByName(String productName, int page, int size) { if (ValidateUtil.isEmpty(productName)) { throw new BusinessException(ErrorCode.MISSING_PARAM, "商品名称不能为空"); } + if (page < 1) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "页码不能小于1"); + } + if (size < 1 || size > 100) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "每页数量必须在1-100之间"); + } + try { - List products = productsMapper.selectList( - new QueryWrapper().like("product_name", productName)); - return ResultUtils.success(products); + Page productPage = new Page<>(page, size); + Page resultPage = productsMapper.selectPage(productPage, new QueryWrapper().like("product_name", productName)); + return ResultUtils.success(resultPage.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -42,15 +82,29 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 根据分类ID查询商品列表 + * + * @param categoryId 分类ID + * @param page 当前页码 + * @param size 每页数量 + * @return 商品列表 + */ @Override - public Result> getProductsByCategoryId(Long categoryId) { + public Result> getProductsByCategoryId(Long categoryId, int page, int size) { if (ValidateUtil.isEmpty(categoryId)) { throw new BusinessException(ErrorCode.MISSING_PARAM, "分类ID不能为空"); } + if (page < 1) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "页码不能小于1"); + } + if (size < 1 || size > 100) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "每页数量必须在1-100之间"); + } try { - List products = productsMapper.selectList( - new QueryWrapper().eq("category_id", categoryId)); - return ResultUtils.success(products); + Page productPage = new Page<>(page, size); + Page resultPage = productsMapper.selectPage(productPage, new QueryWrapper().eq("category_id", categoryId)); + return ResultUtils.success(resultPage.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -58,6 +112,12 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 创建商品 + * + * @param products 商品信息 + * @return 创建结果 + */ @Override public Result createProduct(Products products) { if (ValidateUtil.isEmpty(products)) { @@ -85,6 +145,12 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 更新商品信息 + * + * @param products 商品信息 + * @return 更新结果 + */ @Override public Result updateProduct(Products products) { if (ValidateUtil.isEmpty(products)) { @@ -111,6 +177,12 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 删除商品 + * + * @param id 商品ID + * @return 删除结果 + */ @Override public Result deleteProduct(Long id) { if (ValidateUtil.isEmpty(id)) { @@ -131,8 +203,14 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 根据商品ID查询商品详情 (包含关联分类信息和店铺信息 ) + * + * @param id 商品ID + * @return 商品详情 + */ @Override - public Result getProductById(Long id) { + public Result getProductById(Long id) { if (ValidateUtil.isEmpty(id)) { throw new BusinessException(ErrorCode.MISSING_PARAM, "商品ID不能为空"); } @@ -141,7 +219,9 @@ public class ProductsServiceImpl extends ServiceImpl i if (product == null) { throw new BusinessException(ErrorCode.NOT_FOUND, "商品不存在"); } - return ResultUtils.success(product); + // 获取商品详情 + ProductsResponse productsResponse = getProductDetail(product); + return ResultUtils.success(productsResponse); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -149,6 +229,13 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 分页查询商品列表 + * + * @param page 页码 + * @param size 每页数量 + * @return 商品列表 + */ @Override public Result> listProductsByPage(int page, int size) { if (page < 1) { @@ -168,22 +255,43 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 根据店铺ID列表查询商品列表 + * + * @param shopIds 店铺ID列表 + * @param page 当前页码 + * @param size 每页数量 + * @return 商品列表 + */ @Override - public Result> getProductsByShopId(Long shopId) { - if (ValidateUtil.isEmpty(shopId)) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "店铺ID不能为空"); + public Result> getProductsByShopIds(List shopIds, int page, int size) { + if (ValidateUtil.isEmpty(shopIds)) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "店铺ID列表不能为空"); + } + if (page < 1) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "页码不能小于1"); + } + if (size < 1 || size > 100) { + throw new BusinessException(ErrorCode.INVALID_PARAM, "每页数量必须在1-100之间"); } try { - List products = productsMapper.selectList( - new QueryWrapper().eq("shop_id", shopId)); - return ResultUtils.success(products); + Page productPage = new Page<>(page, size); + Page resultPage = productsMapper.selectPage(productPage, new QueryWrapper().in("shop_id", shopIds)); + return ResultUtils.success(resultPage.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { - throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询商品失败", e); + throw new BusinessException(ErrorCode.DATABASE_ERROR, "分页查询商品失败", e); } } + /** + * 批量更新商品状态 + * + * @param ids 商品ID列表 + * @param status 商品状态 + * @return 更新结果 + */ @Override public Result batchUpdateProductStatus(List ids, Integer status) { if (ValidateUtil.isEmpty(ids)) { @@ -221,6 +329,14 @@ public class ProductsServiceImpl extends ServiceImpl i } } + /** + * 搜索商品 + * + * @param keyword 搜索关键词 + * @param page 页码 + * @param size 每页数量 + * @return 商品列表 + */ @Override public Result> searchProducts(String keyword, int page, int size) { if (ValidateUtil.isEmpty(keyword)) { @@ -245,4 +361,67 @@ public class ProductsServiceImpl extends ServiceImpl i throw new BusinessException(ErrorCode.DATABASE_ERROR, "搜索商品失败", e); } } -} + + /** + * 根据商品查询对应的分类信息和店铺信息 (包含关联分类信息和店铺信息 ) + * + * @param product 商品信息 + * @return 商品详情 + */ + public ProductsResponse getProductDetail(Products product) { + // 验证参数 + if (product == null || product.getId() == null) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "商品ID不能为空"); + } + try { + // 创建商品详情对象 + ProductsResponse productsResponse = new ProductsResponse(); + // 提取商品id信息 + Long productId = product.getId(); + + // 1. 查询商品基本信息 + Products products = productsMapper.selectById(productId); + if (products == null) { + throw new BusinessException(ErrorCode.NOT_FOUND, "商品不存在"); + } + productsResponse.setProducts(products); + + // 2. 根据商品的shopId查询店铺信息 + if (products.getShopId() != null) { + Shops shop = shopsService.getShopById(products.getShopId()).getData(); + productsResponse.setShop(shop); + } + + // 3. 根据商品的categoryId查询分类信息 + if (products.getCategoryId() != null) { + ProductCategories category = categoriesService.getCategoryById(products.getCategoryId()).getData(); + productsResponse.setCategory(category); + } + + // 4. 查询商品属性信息 + List attributes = attributesService.list(new QueryWrapper() + .eq("category_id", products.getCategoryId())); + productsResponse.setAttributes(attributes); + + // 5. 查询商品属性值信息 + List attributeValues = attributeValuesService + .list(new QueryWrapper() + .eq("product_id", productId)); + productsResponse.setAttributeValuesList(attributeValues); + + // 6. 查询商品SKU信息 + List productSkus = skusService.list(new QueryWrapper() + .eq("product_id", productId)); + productsResponse.setProductSkus(productSkus); + + // 7. 查询商品图片信息 + List productImages = imagesService.list(new QueryWrapper() + .eq("product_id", productId)); + productsResponse.setProductImages(productImages); + + return productsResponse; + } catch (Exception e) { + throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询商品详情失败", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qf/backend/service/impl/ShopCategoriesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Shop/ShopCategoriesServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/ShopCategoriesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Shop/ShopCategoriesServiceImpl.java index 3494064..04f136b 100644 --- a/src/main/java/com/qf/backend/service/impl/ShopCategoriesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Shop/ShopCategoriesServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Shop; import java.util.List; @@ -10,11 +10,11 @@ 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.ShopCategories; +import com.qf.backend.entity.Shop.ShopCategories; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ShopCategoriesMapper; -import com.qf.backend.service.ShopCategoriesService; +import com.qf.backend.mapper.Shop.ShopCategoriesMapper; +import com.qf.backend.service.Shop.ShopCategoriesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ShopRatingsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Shop/ShopRatingsServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/ShopRatingsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Shop/ShopRatingsServiceImpl.java index ed58888..2643247 100644 --- a/src/main/java/com/qf/backend/service/impl/ShopRatingsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Shop/ShopRatingsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Shop; import java.util.List; @@ -11,11 +11,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.ShopRatings; +import com.qf.backend.entity.Shop.ShopRatings; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ShopRatingsMapper; -import com.qf.backend.service.ShopRatingsService; +import com.qf.backend.mapper.Shop.ShopRatingsMapper; +import com.qf.backend.service.Shop.ShopRatingsService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/ShopsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/Shop/ShopsServiceImpl.java similarity index 92% rename from src/main/java/com/qf/backend/service/impl/ShopsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/Shop/ShopsServiceImpl.java index 0dc5b71..c1f1876 100644 --- a/src/main/java/com/qf/backend/service/impl/ShopsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/Shop/ShopsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.Shop; import java.util.List; @@ -11,14 +11,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.Shops; +import com.qf.backend.entity.Shop.Shops; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.ShopsMapper; -import com.qf.backend.service.ShopsService; +import com.qf.backend.mapper.Shop.ShopsMapper; +import com.qf.backend.service.Shop.ShopsService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; + +/** + * 店铺服务实现类 + * @author 30803 + */ @Service public class ShopsServiceImpl extends ServiceImpl implements ShopsService { @@ -29,18 +34,18 @@ public class ShopsServiceImpl extends ServiceImpl implements // 根据店铺名称查询店铺 @Override - public Result> getShopsByName(String shopName) { - logger.info("根据店铺名称查询店铺: {}", shopName); + public Result> getShopsByName(String shopName, int page, int size) { + logger.info("根据店铺名称查询店铺: {}, 当前页码: {}, 每页数量: {}", shopName, page, size); try { if (ValidateUtil.isEmpty(shopName)) { throw new BusinessException(ErrorCode.INVALID_PARAM, "店铺名称不能为空"); } - + // 构建分页查询条件 QueryWrapper queryWrapper = new QueryWrapper().like("shop_name", shopName); - List shopsList = shopsMapper.selectList(queryWrapper); - logger.info("查询到 {} 个店铺", shopsList.size()); - return ResultUtils.success(shopsList); + Page shopsList = shopsMapper.selectPage(new Page<>(page, size), queryWrapper); + logger.info("查询到 {} 个店铺", shopsList.getTotal()); + return ResultUtils.success(shopsList.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -186,9 +191,9 @@ public class ShopsServiceImpl extends ServiceImpl implements Shops shop = getShopByIdAndCheckExist(id); if (shop == null) { - throw new BusinessException(ErrorCode.SHOP_NOT_FOUND, "店铺不存在"); + throw new BusinessException(ErrorCode.SHOP_NOT_FOUND, "店铺不存在: 店铺ID = " + id); } - + // return ResultUtils.success(shop); } catch (BusinessException e) { throw e; @@ -228,18 +233,17 @@ public class ShopsServiceImpl extends ServiceImpl implements // 根据店铺分类ID查询店铺 @Override - public Result> getShopsByCategoryId(Long categoryId) { + public Result> getShopsByCategoryId(Long categoryId, int page, int size) { logger.info("根据店铺分类ID查询店铺: 分类ID = {}", categoryId); try { if (categoryId == null) { throw new BusinessException(ErrorCode.MISSING_PARAM, "分类ID不能为空"); } - QueryWrapper queryWrapper = new QueryWrapper().eq("category_id", categoryId); - List shopsList = shopsMapper.selectList(queryWrapper); - logger.info("查询到 {} 个店铺", shopsList.size()); - return ResultUtils.success(shopsList); + Page shopsList = shopsMapper.selectPage(new Page<>(page, size), queryWrapper); + logger.info("查询到 {} 个店铺", shopsList.getTotal()); + return ResultUtils.success(shopsList.getRecords()); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -331,5 +335,4 @@ public class ShopsServiceImpl extends ServiceImpl implements QueryWrapper queryWrapper = new QueryWrapper().eq("id", id); return shopsMapper.selectOne(queryWrapper); } - } diff --git a/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/PermissionsServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/PermissionsServiceImpl.java index d5c7b66..792ae9c 100644 --- a/src/main/java/com/qf/backend/service/impl/PermissionsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/PermissionsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; import java.util.List; @@ -13,8 +13,8 @@ import com.qf.backend.dto.Result; 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; -import com.qf.backend.service.PermissionsService; +import com.qf.backend.mapper.User.PermissionsMapper; +import com.qf.backend.service.User.PermissionsService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/RolePermissionsServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/RolePermissionsServiceImpl.java index 71c3982..8337bd9 100644 --- a/src/main/java/com/qf/backend/service/impl/RolePermissionsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/RolePermissionsServiceImpl.java @@ -1,18 +1,19 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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.entity.User.RolePermissions; import com.qf.backend.exception.BusinessException; import com.qf.backend.exception.ErrorCode; -import com.qf.backend.mapper.RolePermissionsMapper; -import com.qf.backend.service.RolePermissionsService; +import com.qf.backend.mapper.User.RolePermissionsMapper; +import com.qf.backend.service.User.RolePermissionsService; import com.qf.backend.util.ValidateUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; /** * 角色权限关联服务实现类 diff --git a/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/RolesServiceImpl.java similarity index 98% rename from src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/RolesServiceImpl.java index 00b001d..b27bc42 100644 --- a/src/main/java/com/qf/backend/service/impl/RolesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/RolesServiceImpl.java @@ -3,7 +3,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; import java.util.List; @@ -19,8 +19,8 @@ import com.qf.backend.dto.Result; 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; -import com.qf.backend.service.RolesService; +import com.qf.backend.mapper.User.RolesMapper; +import com.qf.backend.service.User.RolesService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; diff --git a/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/UserDetailsServiceImpl.java similarity index 70% rename from src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/UserDetailsServiceImpl.java index b34a37d..9d09a37 100644 --- a/src/main/java/com/qf/backend/service/impl/UserDetailsServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/UserDetailsServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; import java.util.ArrayList; import java.util.List; @@ -6,19 +6,19 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import com.qf.backend.dto.Result; +import com.qf.backend.dto.response.Userresponse; +import com.qf.backend.entity.User.CustomUserDetails; 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; +import com.qf.backend.service.User.RolesService; +import com.qf.backend.service.User.UserRolesService; +import com.qf.backend.service.User.UsersService; @@ -48,19 +48,18 @@ public class UserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 1. 从数据库中查询用户 - Result result = usersService.getUserByUsername(username); + Result result = usersService.getUserByUsername(username); if (result == null || result.getData() == null) { throw new UsernameNotFoundException("用户名不存在: " + username); } - - Users user = result.getData(); + Userresponse user = result.getData(); // 2. 构建权限列表(这里简化处理,实际应从数据库中查询用户的角色和权限) List authorities = new ArrayList<>(); // 查询用户角色关联 - Result> userRoleResultList = userRolesService.getUserRolesByUserId(user.getId()); + Result> userRoleResultList = userRolesService.getUserRolesByUserId(List.of(user.getUsers().getId())); if (userRoleResultList == null || userRoleResultList.getData() == null) { - throw new UsernameNotFoundException("用户角色不存在: " + user.getId()); + throw new UsernameNotFoundException("用户角色不存在: " + user.getUsers().getId()); } // 3. 查询角色权限 for (UserRoles userRole : userRoleResultList.getData()) { @@ -74,14 +73,15 @@ public class UserDetailsServiceImpl implements UserDetailsService { } // 3. 返回UserDetails对象 // 注意:在实际应用中,密码应该加密存储,这里直接使用明文密码(仅用于演示) - return User.builder() - .username(user.getUsername()) // 用户名 - .password(user.getPassword()) // 密码需要加密存储,这里直接使用明文密码(仅用于演示) - .authorities(authorities) // 假设用户默认拥有USER权限 - .accountExpired(false) // 假设账号永不过期 - .accountLocked(false) // 假设账号永不过期 - .credentialsExpired(false) // 假设密码永不过期 - .disabled(user.getStatus() == 0) // 假设status为0表示禁用 - .build(); + return new CustomUserDetails( + user.getUsers().getId(), // 👈 传入 ID + user.getUsers().getUsername(), // 用户名 + user.getUsers().getPassword(), // 必须是加密后的密码! + authorities, // 权限列表 + user.getUsers().getStatus() != 0, // enabled: status=0 表示禁用 + true, // accountNonExpired 账号未过期 + true, // accountNonLocked 账号未锁定 + true // credentialsNonExpired 凭证未过期 + ); } } \ No newline at end of file diff --git a/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/UsersRolesServiceImpl.java similarity index 93% rename from src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/UsersRolesServiceImpl.java index 1cac0c4..67f11c0 100644 --- a/src/main/java/com/qf/backend/service/impl/UsersRolesServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/UsersRolesServiceImpl.java @@ -3,7 +3,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; import java.util.Date; import java.util.List; @@ -17,8 +17,8 @@ import com.qf.backend.dto.Result; 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; -import com.qf.backend.service.UserRolesService; +import com.qf.backend.mapper.User.UserRolesMapper; +import com.qf.backend.service.User.UserRolesService; import com.qf.backend.util.ResultUtils; @@ -34,12 +34,12 @@ public class UsersRolesServiceImpl extends ServiceImpl> getUserRolesByUserId(Long userId) { - if (userId == null) { - throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空"); + public Result> getUserRolesByUserId(List userIds) { + if (userIds == null || userIds.isEmpty()) { + throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID列表不能为空"); } try { - List userRoles = userRolesMapper.selectList(new QueryWrapper().eq("user_id", userId)); + List userRoles = userRolesMapper.selectList(new QueryWrapper().in("user_id", userIds)); return ResultUtils.success(userRoles); } catch (BusinessException e) { throw e; @@ -87,7 +87,7 @@ public class UsersRolesServiceImpl extends ServiceImpl 0); } /** - * 更新用户ID关联的角色 + * 更新用户ID关联的角色 (是否有用存疑) * @param userId 用户ID * @param roleId 角色ID * @return 是否成功 diff --git a/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java b/src/main/java/com/qf/backend/service/impl/User/UsersServiceImpl.java similarity index 76% rename from src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java rename to src/main/java/com/qf/backend/service/impl/User/UsersServiceImpl.java index 61df09c..713303f 100644 --- a/src/main/java/com/qf/backend/service/impl/UsersServiceImpl.java +++ b/src/main/java/com/qf/backend/service/impl/User/UsersServiceImpl.java @@ -1,4 +1,4 @@ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; import java.util.ArrayList; import java.util.Collections; @@ -21,15 +21,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qf.backend.dto.Result; import com.qf.backend.dto.request.PageRequest; import com.qf.backend.dto.response.Userresponse; +import com.qf.backend.entity.User.Permissions; +import com.qf.backend.entity.User.RolePermissions; 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.mapper.User.UsersMapper; +import com.qf.backend.service.User.PermissionsService; +import com.qf.backend.service.User.RolePermissionsService; +import com.qf.backend.service.User.RolesService; +import com.qf.backend.service.User.UserRolesService; +import com.qf.backend.service.User.UsersService; import com.qf.backend.util.ResultUtils; import com.qf.backend.util.ValidateUtil; @@ -43,13 +47,15 @@ public class UsersServiceImpl extends ServiceImpl implements @Autowired private UserRolesService userRolesService; @Autowired - private RolesMapper rolesMapper; - - + private RolesService rolesService; + @Autowired + private RolePermissionsService rolePermissionsService; + @Autowired + private PermissionsService permissionsService; // 根据用户名或邮箱查询用户(通用方法) @Override - public Result getUserByIdentifier(String identifier, boolean isUsername) { + public Result getUserByIdentifier(String identifier, boolean isUsername) { logger.info(isUsername ? "根据用户名查询用户: {}" : "根据邮箱查询用户: {}", identifier); try { @@ -63,14 +69,16 @@ public class UsersServiceImpl extends ServiceImpl implements } // 根据标识符类型调用不同的查询方法 - Users users = isUsername - ? usersMapper.selectByUsername(identifier) - : usersMapper.selectByEmail(identifier); - + Users users = isUsername + ? usersMapper.selectByUsername(identifier) + : usersMapper.selectByEmail(identifier); + if (users == null) { throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + identifier); } - return ResultUtils.success(users); + Userresponse userresponse = getUserPermissionsMap(Collections.singletonList(users)).get(0); + + return ResultUtils.success(userresponse); } catch (BusinessException e) { throw e; } catch (Exception e) { @@ -81,13 +89,13 @@ public class UsersServiceImpl extends ServiceImpl implements // 根据用户名查询用户 @Override - public Result getUserByUsername(String username) { + public Result getUserByUsername(String username) { return getUserByIdentifier(username, true); } // 根据邮箱查询用户 @Override - public Result getUserByEmail(String email) { + public Result getUserByEmail(String email) { return getUserByIdentifier(email, false); } @@ -259,47 +267,12 @@ public class UsersServiceImpl extends ServiceImpl implements throw new BusinessException(ErrorCode.INVALID_PARAM, "每页大小必须在1-100之间"); } // 使用MyBatis-Plus的分页功能 + // 构建分页查询条件 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()); - - // 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()); + // 转换为响应DTO + List userResponseList = getUserPermissionsMap(resultPage.getRecords()); logger.info("分页查询成功: 共 {} 条记录, 第 {} 页", resultPage.getTotal(), pageRequest.getPage()); return ResultUtils.success(userResponseList); @@ -394,4 +367,68 @@ public class UsersServiceImpl extends ServiceImpl implements return usersMapper.selectOne(queryWrapper); } + /** + * 根据用户列表获取用户权限信息 + * @param users 用户列表 + * @return Userresponse 包含用户权限信息的列表 + */ + private List getUserPermissionsMap(List users) { + // 1. 获取当前页所有用户 + List userList = users; + // 2. 提取所有用户ID + List userIds = userList.stream().map(Users::getId).collect(Collectors.toList()); + + // 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 rolePermissionsList = rolePermissionsService.list(new QueryWrapper() + .in("role_id", roleIds)); + + // 6. 提取所有权限ID + List permissionIds = rolePermissionsList.stream().map(RolePermissions::getPermissionId) + .collect(Collectors.toList()); + + // 7. 一次性查询所有权限信息 + List permissionsList = permissionsService.list(new QueryWrapper() + .in("id", permissionIds)); + + // 7. 构建权限映射,按权限ID分组 + Map permissionMap = permissionsList.stream() + .collect(Collectors.toMap(Permissions::getId, permission -> permission)); + + // 8. 一次性查询所有角色信息 + List rolesList = rolesService.list(new QueryWrapper() + .in("id", roleIds)); + + // 8. 构建角色映射,按角色ID分组 + Map roleMap = rolesList.stream() + .collect(Collectors.toMap(Roles::getId, role -> role)); + + // 9. 构建用户-角色列表映射 + 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); + } + } + + // 9. 构建响应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()); + + return userResponseList; + } } diff --git a/src/main/java/com/qf/backend/service/impl/rolesMapper.java b/src/main/java/com/qf/backend/service/impl/User/rolesMapper.java similarity index 84% rename from src/main/java/com/qf/backend/service/impl/rolesMapper.java rename to src/main/java/com/qf/backend/service/impl/User/rolesMapper.java index 918097e..ffa83a9 100644 --- a/src/main/java/com/qf/backend/service/impl/rolesMapper.java +++ b/src/main/java/com/qf/backend/service/impl/User/rolesMapper.java @@ -3,7 +3,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.qf.backend.service.impl; +package com.qf.backend.service.impl.User; class rolesMapper { diff --git a/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java b/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java deleted file mode 100644 index be27a6c..0000000 --- a/src/main/java/com/qf/backend/service/impl/UserLoginServiceImpl.java +++ /dev/null @@ -1,117 +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.service.impl; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.qf.backend.dto.LoginResponse; -import com.qf.backend.dto.Result; -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; -import com.qf.backend.service.RolesService; -import com.qf.backend.service.UserLoginService; -import com.qf.backend.service.UserRolesService; -import com.qf.backend.service.UsersService; -import com.qf.backend.util.ResultUtils; -import com.qf.backend.util.ValidateUtil; - - - -/** - * - * @author 30803 - */ -@Service -public class UserLoginServiceImpl implements UserLoginService { - private Logger logger = LoggerFactory.getLogger(UserLoginServiceImpl.class); - @Autowired - private UsersService usersServiceImpl; - @Autowired - private UserRolesService userRolesServiceImpl; - @Autowired - private RolesService rolesServiceImpl; - @Autowired - private RolePermissionsService rolePermissionsServiceImpl; - @Autowired - private PermissionsService permissionsServiceImpl; - /** - * 用户登录 - * @param username 用户名 - * @param password 密码 - * @return 登录结果 - */ - @Override - public Result login(String username, String password) { - logger.info("用户登录,用户名:{}", username); - // 1. 校验用户名和密码是否为空 - try{ - if (ValidateUtil.isEmpty(username) || ValidateUtil.isEmpty(password)) { - throw new IllegalArgumentException("用户名或密码不能为空"); - } - // 2. 登录 - Result result = usersServiceImpl.login(username, password); - if (result == null || result.getData() == null) { - throw new IllegalArgumentException("用户名不存在或密码错误"); - } - - Users user = result.getData(); - // 3. 获取用户角色 - Result> userRolesResult = userRolesServiceImpl.getUserRolesByUserId(user.getId()); - if (userRolesResult == null || userRolesResult.getData() == null) { - throw new IllegalArgumentException("获取用户角色失败"); - } - - List userRoles = userRolesResult.getData(); - Set roleNames = new HashSet<>(); - Set roleIds = new HashSet<>(); - - // 4. 获取角色名称和角色ID - for (UserRoles ur : userRoles) { - Roles role = rolesServiceImpl.getById(ur.getRoleId()); - if (role != null) { - roleNames.add(String.valueOf(role.getRoleType())); - roleIds.add(role.getId()); - } - } - - // 5. 获取用户权限 - Set permissionCodes = new HashSet<>(); - for (Long roleId : roleIds) { - List permissionIds = rolePermissionsServiceImpl.listPermissionIdsByRoleId(roleId); - for (Long permissionId : permissionIds) { - Permissions permission = permissionsServiceImpl.getById(permissionId); - if (permission != null) { - permissionCodes.add(permission.getPermissionCode()); - } - } - } - - // 6. 构建LoginResponse对象 - LoginResponse loginResponse = new LoginResponse(); - loginResponse.setUsername(user.getUsername()); - loginResponse.setRoles(new ArrayList<>(roleNames)); - loginResponse.setPermissions(new ArrayList<>(permissionCodes)); - return ResultUtils.success(loginResponse); - } catch (Exception e) { - logger.error("用户登录失败,用户名:{}", username, e); - return ResultUtils.fail(ErrorCode.SYSTEM_ERROR, e.getMessage()); - } - } - -} diff --git a/src/main/java/com/qf/backend/util/JwtUtils.java b/src/main/java/com/qf/backend/util/JwtUtils.java index 5b35185..285e8ef 100644 --- a/src/main/java/com/qf/backend/util/JwtUtils.java +++ b/src/main/java/com/qf/backend/util/JwtUtils.java @@ -46,6 +46,13 @@ public class JwtUtils { public String getUsernameFromToken(String token) { return getClaimFromToken(token, Claims::getSubject); } + + /** + * 从token中获取用户id + */ + public Long getUserIdFromToken(String token) { + return getClaimFromToken(token, claims -> claims.get("userId", Long.class)); + } /** * 从token中获取过期时间