refactor: 重构用户相关实体类和服务层代码

将用户相关的实体类移动到User子包中,重构服务层接口和实现类
更新DTO和请求响应类,优化用户角色关联逻辑
调整安全配置允许用户注册接口公开访问
修改验证工具类注释,完善分页请求类
This commit is contained in:
qingfeng1121
2026-01-21 14:44:31 +08:00
parent d6d95c20d2
commit 9787bc1735
63 changed files with 736 additions and 2998 deletions

View File

@@ -3,9 +3,11 @@ package com.qf.backend;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("com.qf.backend.mapper")
@ComponentScan(basePackages = "com.qf.backend") // 确保扫描范围包含 config 包
public class BackendApplication {
public static void main(String[] args) {

View File

@@ -69,6 +69,8 @@ public class SecurityConfig {
.authorizeHttpRequests(auth -> auth
// 登录接口公开访问,不需要认证
.requestMatchers("/api/auth/login").permitAll()
// 公开注册接口,不需要认证
.requestMatchers("/api/user/**").permitAll()
// 其他所有请求都需要认证
.anyRequest().authenticated()
)

View File

@@ -0,0 +1,42 @@
package com.qf.backend.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.qf.backend.dto.Result;
import com.qf.backend.dto.request.PageRequest;
import com.qf.backend.dto.response.Userresponse;
import com.qf.backend.service.UsersService;
/**
* 管理员用户控制器
* 处理管理员用户相关的HTTP请求
* 遵循RESTful API设计规范
* @author 30803
*/
@RestController
@RequestMapping("/api/admin")
public class AdminUserControoler {
private static final Logger logger = LoggerFactory.getLogger(AdminUserControoler.class);
@Autowired
private UsersService usersService;
/**
* 分页获取所有用户信息
* @param page 当前页码
* @param size 每页数量
* @return 所有用户信息
*/
@PostMapping("/getuserinfo")
public Result<List<Userresponse>> getAllUserInfo(@PathVariable PageRequest pageRequest ) {
logger.info("获取所有用户信息请求");
return usersService.listUsersByPage(pageRequest);
}
}

View File

@@ -42,6 +42,7 @@ public class AuthController {
/**
* 用户登录接口
*
* @param loginRequest 登录请求体,包含用户名和密码
* @return ResponseEntity 包含JWT令牌的响应
*
@@ -58,8 +59,8 @@ public class AuthController {
try {
// 1. 创建认证令牌将用户名和密码封装到UsernamePasswordAuthenticationToken中
// 这里的令牌是未认证状态的,因为还没有验证密码是否正确
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword());
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(), loginRequest.getPassword());
// 2. 调用AuthenticationManager.authenticate()方法进行认证
// 这个方法会触发以下流程:
@@ -67,9 +68,9 @@ public class AuthController {
// b. 使用PasswordEncoder验证密码是否匹配
// c. 认证成功后返回一个已认证的Authentication对象
Authentication authentication = authenticationManager.authenticate(authenticationToken);
System.out.println(authentication);
// 3. 从已认证的Authentication对象中获取UserDetails
// UserDetails包含了用户的基本信息和权限列表
// UserDetails是Spring Security的核心接口包含了用户的基本信息和权限列表
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
// 4. 使用JwtUtils生成JWT令牌
@@ -78,6 +79,9 @@ public class AuthController {
// 5. 创建LoginResponse对象封装JWT令牌和令牌类型
LoginResponse loginResponse = new LoginResponse();
loginResponse.setUsername(userDetails.getUsername());
// loginResponse.setRoles(userDetails.getAuthorities().stream().map(grantedAuthority -> grantedAuthority.getAuthority()).collect(Collectors.toList()));
// loginResponse.setPermissions(jwtUtils.getPermissions(userDetails));
loginResponse.setToken(jwt);
loginResponse.setTokenType(jwtUtils.getTokenPrefix());
// 5. 返回包含JWT令牌的响应

View File

@@ -1,147 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.OrderItems;
import com.qf.backend.service.OrderItemsService;
import java.util.List;
/**
* 订单项控制器
* 处理订单项相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/order-items")
@RestController
public class OrderItemsController {
private static final Logger logger = LoggerFactory.getLogger(OrderItemsController.class);
@Autowired
private OrderItemsService orderItemsService;
/**
* 根据订单ID查询订单项
* @param orderId 订单ID
* @return 订单项列表
*/
@GetMapping("/order/{orderId}")
public Result<List<OrderItems>> getOrderItemsByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID查询订单项订单ID{}", orderId);
return orderItemsService.getOrderItemsByOrderId(orderId);
}
/**
* 根据商品ID查询订单项
* @param productId 商品ID
* @return 订单项列表
*/
@GetMapping("/product/{productId}")
public Result<List<OrderItems>> getOrderItemsByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询订单项商品ID{}", productId);
return orderItemsService.getOrderItemsByProductId(productId);
}
/**
* 创建订单项
* @param orderItems 订单项信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createOrderItem(@RequestBody OrderItems orderItems) {
logger.info("创建订单项,订单项信息:{}", orderItems);
return orderItemsService.createOrderItem(orderItems);
}
/**
* 更新订单项信息
* @param orderItems 订单项信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateOrderItem(@RequestBody OrderItems orderItems) {
logger.info("更新订单项信息,订单项信息:{}", orderItems);
return orderItemsService.updateOrderItem(orderItems);
}
/**
* 删除订单项
* @param id 订单项ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteOrderItem(@PathVariable Long id) {
logger.info("删除订单项订单项ID{}", id);
return orderItemsService.deleteOrderItem(id);
}
/**
* 根据订单项ID查询订单项
* @param id 订单项ID
* @return 订单项信息
*/
@GetMapping("/{id}")
public Result<OrderItems> getOrderItemById(@PathVariable Long id) {
logger.info("根据订单项ID查询订单项订单项ID{}", id);
return orderItemsService.getOrderItemById(id);
}
/**
* 批量创建订单项
* @param orderItemsList 订单项列表
* @return 是否成功
*/
@PostMapping("/batch-create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> batchCreateOrderItems(@RequestBody List<OrderItems> orderItemsList) {
logger.info("批量创建订单项,订单项数量:{}", orderItemsList.size());
return orderItemsService.batchCreateOrderItems(orderItemsList);
}
/**
* 根据订单ID删除所有订单项
* @param orderId 订单ID
* @return 是否成功
*/
@DeleteMapping("/delete-by-order/{orderId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteOrderItemsByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID删除所有订单项订单ID{}", orderId);
return orderItemsService.deleteOrderItemsByOrderId(orderId);
}
/**
* 计算订单总金额
* @param orderId 订单ID
* @return 订单总金额
*/
@GetMapping("/calculate-total/{orderId}")
public Result<Double> calculateOrderTotal(@PathVariable Long orderId) {
logger.info("计算订单总金额订单ID{}", orderId);
return orderItemsService.calculateOrderTotal(orderId);
}
/**
* 根据SKU ID查询订单项
* @param skuId SKU ID
* @return 订单项列表
*/
@GetMapping("/sku/{skuId}")
public Result<List<OrderItems>> getOrderItemsBySkuId(@PathVariable Long skuId) {
logger.info("根据SKU ID查询订单项SKU ID{}", skuId);
return orderItemsService.getOrderItemsBySkuId(skuId);
}
}

View File

@@ -1,137 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.OrderStatusHistory;
import com.qf.backend.service.OrderStatusHistoryService;
import java.util.List;
/**
* 订单状态历史控制器
* 处理订单状态历史相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/order-status-history")
@RestController
public class OrderStatusHistoryController {
private static final Logger logger = LoggerFactory.getLogger(OrderStatusHistoryController.class);
@Autowired
private OrderStatusHistoryService orderStatusHistoryService;
/**
* 根据订单ID查询状态历史
* @param orderId 订单ID
* @return 订单状态历史列表
*/
@GetMapping("/order/{orderId}")
public Result<List<OrderStatusHistory>> getHistoryByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID查询状态历史订单ID{}", orderId);
return orderStatusHistoryService.getHistoryByOrderId(orderId);
}
/**
* 创建订单状态历史记录
* @param orderStatusHistory 订单状态历史信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createStatusHistory(@RequestBody OrderStatusHistory orderStatusHistory) {
logger.info("创建订单状态历史记录,订单状态历史信息:{}", orderStatusHistory);
return orderStatusHistoryService.createStatusHistory(orderStatusHistory);
}
/**
* 更新订单状态历史信息
* @param orderStatusHistory 订单状态历史信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateStatusHistory(@RequestBody OrderStatusHistory orderStatusHistory) {
logger.info("更新订单状态历史信息,订单状态历史信息:{}", orderStatusHistory);
return orderStatusHistoryService.updateStatusHistory(orderStatusHistory);
}
/**
* 删除订单状态历史记录
* @param id 记录ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteStatusHistory(@PathVariable Long id) {
logger.info("删除订单状态历史记录记录ID{}", id);
return orderStatusHistoryService.deleteStatusHistory(id);
}
/**
* 根据记录ID查询订单状态历史
* @param id 记录ID
* @return 订单状态历史信息
*/
@GetMapping("/{id}")
public Result<OrderStatusHistory> getStatusHistoryById(@PathVariable Long id) {
logger.info("根据记录ID查询订单状态历史记录ID{}", id);
return orderStatusHistoryService.getStatusHistoryById(id);
}
/**
* 批量创建订单状态历史记录
* @param historyList 订单状态历史列表
* @return 是否成功
*/
@PostMapping("/batch-create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchCreateStatusHistory(@RequestBody List<OrderStatusHistory> historyList) {
logger.info("批量创建订单状态历史记录,记录数量:{}", historyList.size());
return orderStatusHistoryService.batchCreateStatusHistory(historyList);
}
/**
* 根据订单ID和状态查询历史记录
* @param orderId 订单ID
* @param status 订单状态
* @return 订单状态历史列表
*/
@GetMapping("/order/{orderId}/status/{status}")
public Result<List<OrderStatusHistory>> getHistoryByOrderIdAndStatus(@PathVariable Long orderId, @PathVariable Integer status) {
logger.info("根据订单ID和状态查询历史记录订单ID{},状态:{}", orderId, status);
return orderStatusHistoryService.getHistoryByOrderIdAndStatus(orderId, status);
}
/**
* 获取订单最新状态
* @param orderId 订单ID
* @return 最新订单状态历史信息
*/
@GetMapping("/order/{orderId}/latest")
public Result<OrderStatusHistory> getLatestStatusHistory(@PathVariable Long orderId) {
logger.info("获取订单最新状态订单ID{}", orderId);
return orderStatusHistoryService.getLatestStatusHistory(orderId);
}
/**
* 根据订单ID删除所有状态历史
* @param orderId 订单ID
* @return 是否成功
*/
@DeleteMapping("/delete-by-order/{orderId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteHistoryByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID删除所有状态历史订单ID{}", orderId);
return orderStatusHistoryService.deleteHistoryByOrderId(orderId);
}
}

View File

@@ -1,149 +1,176 @@
package com.qf.backend.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.dto.request.OrderRequest;
import com.qf.backend.dto.request.PageRequest;
import com.qf.backend.entity.Orders;
import com.qf.backend.service.OrderItemsService;
import com.qf.backend.service.OrdersService;
import java.util.List;
/**
* 订单控制器
* 订单控制器 (订单接口)
* 处理订单相关的HTTP请求
* 遵循RESTful API设计规范
*
* @author 30803
*/
@RequestMapping("/api/orders")
@RestController
@RequestMapping("/api/orders")
public class OrdersController {
private static final Logger logger = LoggerFactory.getLogger(OrdersController.class);
@Autowired
private OrdersService ordersService;
@Autowired
private OrderItemsService orderItemsService;
/**
* 根据订单号查询订单
* @param orderNumber 订单号
* 获取订单详情
* @param orderRequest 订单ID请求
* @return 订单信息
*/
@GetMapping("/number/{orderNumber}")
public Result<Orders> getOrderByNumber(@PathVariable String orderNumber) {
logger.info("根据订单号查询订单,订单号:{}", orderNumber);
return ordersService.getOrderByNumber(orderNumber);
}
/**
* 根据用户ID查询订单列表
* @param userId 用户ID
* @return 订单列表
*/
@GetMapping("/user/{userId}")
public Result<List<Orders>> getOrdersByUserId(@PathVariable Long userId) {
logger.info("根据用户ID查询订单列表用户ID{}", userId);
return ordersService.getOrdersByUserId(userId);
@PostMapping("/getorderinfo")
// 只有用户本人或管理员才能获取订单信息
@PreAuthorize("#userId == authentication.principal.userId or hasRole('ROLE_ADMIN')")
public Result<Orders> getOrderInfo(@RequestBody OrderRequest orderRequest) {
logger.info("获取订单信息请求订单ID{}", orderRequest.getId());
return ordersService.getOrderById(orderRequest.getId());
}
/**
* 创建订单
* @param orders 订单信息
* @return 是否成功
* @param orderRequest 订单信息
* @return 创建结果
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createOrder(@RequestBody Orders orders) {
logger.info("创建订单,订单信息:{}", orders);
return ordersService.createOrder(orders);
// 只有登录用户才能创建订单
@PreAuthorize("isAuthenticated()")
public Result<Boolean> createOrder(@RequestBody OrderRequest orderRequest) {
logger.info("创建订单请求,订单信息:{}", orderRequest);
Orders orders = new Orders(null, orderRequest.getOrderNo(), orderRequest.getUserId(),
orderRequest.getShopId(), orderRequest.getTotalAmount(), orderRequest.getActualAmount(),
orderRequest.getShippingFee(), 0, orderRequest.getShippingAddress(),
orderRequest.getReceiverName(), orderRequest.getReceiverPhone(), orderRequest.getPaymentMethod(),
null, null, null, null, orderRequest.getRemark(), null, null);
// 1. 创建订单主表
Result<Boolean> createOrderResult = ordersService.createOrder(orders);
if (createOrderResult.getCode() != 200) {
return createOrderResult;
}
// 2. 创建订单项
if (orderRequest.getOrderItems() != null && !orderRequest.getOrderItems().isEmpty()) {
for (var item : orderRequest.getOrderItems()) {
item.setOrderId(orders.getId());
}
return orderItemsService.batchCreateOrderItems(orderRequest.getOrderItems());
}
return createOrderResult;
}
/**
* 更新订单信息
* @param orders 订单信息
* @return 是否成功
* @param orderRequest 订单信息
* @return 更新结果
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateOrder(@RequestBody Orders orders) {
logger.info("更新订单信息,订单信息:{}", orders);
@PostMapping("/update")
// 只有管理员或店铺所有者才能更新订单
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> updateOrder(@RequestBody OrderRequest orderRequest) {
logger.info("更新订单信息请求,订单信息:{}", orderRequest);
Orders orders = new Orders(orderRequest.getId(), orderRequest.getOrderNo(), orderRequest.getUserId(),
orderRequest.getShopId(), orderRequest.getTotalAmount(), orderRequest.getActualAmount(),
orderRequest.getShippingFee(), orderRequest.getOrderStatus(), orderRequest.getShippingAddress(),
orderRequest.getReceiverName(), orderRequest.getReceiverPhone(), orderRequest.getPaymentMethod(),
orderRequest.getPaymentTime(), orderRequest.getShippingTime(), orderRequest.getDeliveryTime(),
orderRequest.getCompleteTime(), orderRequest.getRemark(), null, null);
return ordersService.updateOrder(orders);
}
/**
* 删除订单
* @param id 订单ID
* @return 是否成功
* @param orderRequest 订单ID请求
* @return 删除结果
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteOrder(@PathVariable Long id) {
logger.info("删除订单订单ID{}", id);
return ordersService.deleteOrder(id);
}
/**
* 根据订单ID查询订单
* @param id 订单ID
* @return 订单信息
*/
@GetMapping("/{id}")
public Result<Orders> getOrderById(@PathVariable Long id) {
logger.info("根据订单ID查询订单订单ID{}", id);
return ordersService.getOrderById(id);
@PostMapping("/delete")
// 只有管理员或店铺所有者才能删除订单
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> deleteOrder(@RequestBody OrderRequest orderRequest) {
logger.info("删除订单请求订单ID{}", orderRequest.getId());
return ordersService.deleteOrder(orderRequest.getId());
}
/**
* 分页查询订单
* @param page 当前页码
* @param size 每页数量
* @param pageRequest 分页请求
* @return 订单列表
*/
@GetMapping("/page/{page}/{size}")
public Result<List<Orders>> listOrdersByPage(@PathVariable int page, @PathVariable int size) {
logger.info("分页查询订单,页码:{},每页数量:{}", page, size);
return ordersService.listOrdersByPage(page, size);
@PostMapping("/list")
// 只有管理员或店铺所有者才能查询所有订单
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<List<Orders>> listOrdersByPage(@RequestBody PageRequest pageRequest) {
logger.info("分页查询订单请求,页码:{},每页大小:{}", pageRequest.getPage(), pageRequest.getSize());
return ordersService.listOrdersByPage(pageRequest.getPage(), pageRequest.getSize());
}
/**
* 根据用户ID查询订单
* @param orderRequest 用户ID请求
* @return 订单列表
*/
@PostMapping("/byuser")
// 只有用户本人或管理员才能查询用户订单
@PreAuthorize("#userId == authentication.principal.userId or hasRole('ROLE_ADMIN')")
public Result<List<Orders>> getOrdersByUser(@RequestBody OrderRequest orderRequest) {
logger.info("根据用户ID查询订单请求用户ID{}", orderRequest.getUserId());
return ordersService.getOrdersByUserId(orderRequest.getUserId());
}
/**
* 根据店铺ID查询订单
* @param shopId 店铺ID
* @param orderRequest 店铺ID请求
* @return 订单列表
*/
@GetMapping("/shop/{shopId}")
public Result<List<Orders>> getOrdersByShopId(@PathVariable Long shopId) {
logger.info("根据店铺ID查询订单店铺ID{}", shopId);
return ordersService.getOrdersByShopId(shopId);
}
/**
* 更新订单状态
* @param orderId 订单ID
* @param status 订单状态
* @return 是否成功
*/
@PutMapping("/update-status/{orderId}/{status}")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> updateOrderStatus(@PathVariable Long orderId, @PathVariable Integer status) {
logger.info("更新订单状态订单ID{},状态:{}", orderId, status);
return ordersService.updateOrderStatus(orderId, status);
@PostMapping("/byshop")
// 只有店铺所有者或管理员才能查询店铺订单
@PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')")
public Result<List<Orders>> getOrdersByShop(@RequestBody OrderRequest orderRequest) {
logger.info("根据店铺ID查询订单请求店铺ID{}", orderRequest.getShopId());
return ordersService.getOrdersByShopId(orderRequest.getShopId());
}
/**
* 根据订单状态查询订单
* @param status 订单状态
* @param orderRequest 订单状态请求
* @return 订单列表
*/
@GetMapping("/status/{status}")
public Result<List<Orders>> getOrdersByStatus(@PathVariable Integer status) {
logger.info("根据订单状态查询订单,状态:{}", status);
return ordersService.getOrdersByStatus(status);
@PostMapping("/bystatus")
// 只有店铺所有者或管理员才能查询特定状态的订单
@PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')")
public Result<List<Orders>> getOrdersByStatus(@RequestBody OrderRequest orderRequest) {
logger.info("根据订单状态查询订单请求,状态:{}", orderRequest.getOrderStatus());
return ordersService.getOrdersByStatus(orderRequest.getOrderStatus());
}
/**
* 更新订单状态
* @param orderRequest 订单状态请求
* @return 更新结果
*/
@PostMapping("/updatestatus")
// 只有店铺所有者或管理员才能更新订单状态
@PreAuthorize("#shopId == authentication.principal.shopId or hasRole('ROLE_ADMIN')")
public Result<Boolean> updateOrderStatus(@RequestBody OrderRequest orderRequest) {
logger.info("更新订单状态请求订单ID{},状态:{}", orderRequest.getId(), orderRequest.getOrderStatus());
return ordersService.updateOrderStatus(orderRequest.getId(), orderRequest.getOrderStatus());
}
}

View File

@@ -1,158 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Payments;
import com.qf.backend.service.PaymentsService;
import java.util.List;
/**
* 支付控制器
* 处理支付相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/payments")
@RestController
public class PaymentsController {
private static final Logger logger = LoggerFactory.getLogger(PaymentsController.class);
@Autowired
private PaymentsService paymentsService;
/**
* 根据订单ID查询支付记录
* @param orderId 订单ID
* @return 支付记录
*/
@GetMapping("/order/{orderId}")
public Result<Payments> getPaymentByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID查询支付记录订单ID{}", orderId);
Payments payment = paymentsService.getPaymentByOrderId(orderId);
return Result.success(payment);
}
/**
* 根据支付流水号查询支付记录
* @param transactionId 支付流水号
* @return 支付记录
*/
@GetMapping("/transaction/{transactionId}")
public Result<Payments> getPaymentByTransactionId(@PathVariable String transactionId) {
logger.info("根据支付流水号查询支付记录,支付流水号:{}", transactionId);
Payments payment = paymentsService.getPaymentByTransactionId(transactionId);
return Result.success(payment);
}
/**
* 创建支付记录
* @param payments 支付信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createPayment(@RequestBody Payments payments) {
logger.info("创建支付记录,支付信息:{}", payments);
boolean result = paymentsService.createPayment(payments);
return Result.success(result);
}
/**
* 更新支付信息
* @param payments 支付信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updatePayment(@RequestBody Payments payments) {
logger.info("更新支付信息,支付信息:{}", payments);
boolean result = paymentsService.updatePayment(payments);
return Result.success(result);
}
/**
* 删除支付记录
* @param id 支付ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deletePayment(@PathVariable Long id) {
logger.info("删除支付记录支付ID{}", id);
boolean result = paymentsService.deletePayment(id);
return Result.success(result);
}
/**
* 根据支付ID查询支付记录
* @param id 支付ID
* @return 支付记录
*/
@GetMapping("/{id}")
public Result<Payments> getPaymentById(@PathVariable Long id) {
logger.info("根据支付ID查询支付记录支付ID{}", id);
Payments payment = paymentsService.getPaymentById(id);
return Result.success(payment);
}
/**
* 根据用户ID查询支付记录
* @param userId 用户ID
* @return 支付记录列表
*/
@GetMapping("/user/{userId}")
public Result<List<Payments>> getPaymentsByUserId(@PathVariable Long userId) {
logger.info("根据用户ID查询支付记录用户ID{}", userId);
List<Payments> payments = paymentsService.getPaymentsByUserId(userId);
return Result.success(payments);
}
/**
* 根据支付状态查询支付记录
* @param status 支付状态
* @return 支付记录列表
*/
@GetMapping("/status/{status}")
public Result<List<Payments>> getPaymentsByStatus(@PathVariable Integer status) {
logger.info("根据支付状态查询支付记录,状态:{}", status);
List<Payments> payments = paymentsService.getPaymentsByStatus(status);
return Result.success(payments);
}
/**
* 更新支付状态
* @param paymentId 支付ID
* @param status 支付状态
* @return 是否成功
*/
@PutMapping("/update-status/{paymentId}/{status}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updatePaymentStatus(@PathVariable Long paymentId, @PathVariable Integer status) {
logger.info("更新支付状态支付ID{},状态:{}", paymentId, status);
boolean result = paymentsService.updatePaymentStatus(paymentId, status);
return Result.success(result);
}
/**
* 分页查询支付记录
* @param page 当前页码
* @param size 每页数量
* @return 支付记录列表
*/
@GetMapping("/page/{page}/{size}")
public Result<List<Payments>> listPaymentsByPage(@PathVariable int page, @PathVariable int size) {
logger.info("分页查询支付记录,页码:{},每页数量:{}", page, size);
List<Payments> payments = paymentsService.listPaymentsByPage(page, size);
return Result.success(payments);
}
}

View File

@@ -1,145 +0,0 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Permissions;
import com.qf.backend.service.PermissionsService;
import java.util.List;
/**
* 权限管理控制器
* 处理权限相关的HTTP请求
* 遵循RESTful API设计规范
* @author 30803
*/
@RequestMapping("/api/permissions")
@RestController
public class PermissionsController {
private static final Logger logger = LoggerFactory.getLogger(PermissionsController.class);
@Autowired
private PermissionsService permissionsService;
/**
* 查询所有权限
* @return 权限列表
*/
@GetMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Permissions>> listAllPermissions() {
logger.info("管理员查询所有权限");
return permissionsService.listAllPermissions();
}
/**
* 根据权限ID查询权限
* @param id 权限ID
* @return 权限信息
*/
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Permissions> getPermissionById(@PathVariable Long id) {
logger.info("管理员根据ID查询权限ID{}", id);
return permissionsService.getPermissionById(id);
}
/**
* 根据权限编码查询权限
* @param permissionCode 权限编码
* @return 权限信息
*/
@GetMapping("/code/{permissionCode}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Permissions> getPermissionByCode(@PathVariable String permissionCode) {
logger.info("管理员根据权限编码查询权限,权限编码:{}", permissionCode);
return permissionsService.getPermissionByCode(permissionCode);
}
/**
* 创建权限
* @param permissions 权限信息
* @return 是否成功
*/
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createPermission(@RequestBody Permissions permissions) {
logger.info("管理员创建权限:{}", permissions);
return permissionsService.createPermission(permissions);
}
/**
* 更新权限信息
* @param permissions 权限信息
* @return 是否成功
*/
@PutMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updatePermission(@RequestBody Permissions permissions) {
logger.info("管理员更新权限:{}", permissions);
return permissionsService.updatePermission(permissions);
}
/**
* 删除权限
* @param id 权限ID
* @return 是否成功
*/
@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deletePermission(@PathVariable Long id) {
logger.info("管理员删除权限ID{}", id);
return permissionsService.deletePermission(id);
}
/**
* 批量删除权限
* @param ids 权限ID列表
* @return 是否成功
*/
@DeleteMapping("/batch")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchDeletePermissions(@RequestBody List<Long> ids) {
logger.info("管理员批量删除权限IDs{}", ids);
return permissionsService.batchDeletePermissions(ids);
}
/**
* 根据菜单ID查询权限
* @param menuId 菜单ID
* @return 权限列表
*/
@GetMapping("/menu/{menuId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Permissions>> listPermissionsByMenuId(@PathVariable Long menuId) {
logger.info("管理员根据菜单ID查询权限菜单ID{}", menuId);
return permissionsService.listPermissionsByMenuId(menuId);
}
/**
* 根据权限类型查询权限
* @param permissionType 权限类型
* @return 权限列表
*/
@GetMapping("/type/{permissionType}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Permissions>> listPermissionsByType(@PathVariable String permissionType) {
logger.info("管理员根据权限类型查询权限,权限类型:{}", permissionType);
return permissionsService.listPermissionsByType(permissionType);
}
}

View File

@@ -1,137 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductAttributeValues;
import com.qf.backend.service.ProductAttributeValuesService;
import java.util.List;
/**
* 商品属性值控制器
* 处理商品属性值相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-attribute-values")
@RestController
public class ProductAttributeValuesController {
private static final Logger logger = LoggerFactory.getLogger(ProductAttributeValuesController.class);
@Autowired
private ProductAttributeValuesService productAttributeValuesService;
/**
* 根据商品ID查询属性值
* @param productId 商品ID
* @return 属性值列表
*/
@GetMapping("/product/{productId}")
public Result<List<ProductAttributeValues>> getAttributeValuesByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询属性值商品ID{}", productId);
return productAttributeValuesService.getAttributeValuesByProductId(productId);
}
/**
* 根据属性ID查询属性值
* @param attributeId 属性ID
* @return 属性值列表
*/
@GetMapping("/attribute/{attributeId}")
public Result<List<ProductAttributeValues>> getAttributeValuesByAttributeId(@PathVariable Long attributeId) {
logger.info("根据属性ID查询属性值属性ID{}", attributeId);
return productAttributeValuesService.getAttributeValuesByAttributeId(attributeId);
}
/**
* 创建属性值
* @param productAttributeValues 属性值信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createAttributeValue(@RequestBody ProductAttributeValues productAttributeValues) {
logger.info("创建属性值,属性值信息:{}", productAttributeValues);
return productAttributeValuesService.createAttributeValue(productAttributeValues);
}
/**
* 更新属性值信息
* @param productAttributeValues 属性值信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateAttributeValue(@RequestBody ProductAttributeValues productAttributeValues) {
logger.info("更新属性值信息,属性值信息:{}", productAttributeValues);
return productAttributeValuesService.updateAttributeValue(productAttributeValues);
}
/**
* 删除属性值
* @param id 属性值ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteAttributeValue(@PathVariable Long id) {
logger.info("删除属性值属性值ID{}", id);
return productAttributeValuesService.deleteAttributeValue(id);
}
/**
* 根据属性值ID查询属性值
* @param id 属性值ID
* @return 属性值信息
*/
@GetMapping("/{id}")
public Result<ProductAttributeValues> getAttributeValueById(@PathVariable Long id) {
logger.info("根据属性值ID查询属性值属性值ID{}", id);
return productAttributeValuesService.getAttributeValueById(id);
}
/**
* 批量创建商品属性值
* @param attributeValues 属性值列表
* @return 是否成功
*/
@PostMapping("/batch-create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchCreateAttributeValues(@RequestBody List<ProductAttributeValues> attributeValues) {
logger.info("批量创建商品属性值,属性值数量:{}", attributeValues.size());
return productAttributeValuesService.batchCreateAttributeValues(attributeValues);
}
/**
* 根据商品ID和属性ID查询属性值
* @param productId 商品ID
* @param attributeId 属性ID
* @return 属性值信息
*/
@GetMapping("/product/{productId}/attribute/{attributeId}")
public Result<ProductAttributeValues> getAttributeValueByProductAndAttribute(@PathVariable Long productId, @PathVariable Long attributeId) {
logger.info("根据商品ID和属性ID查询属性值商品ID{}属性ID{}", productId, attributeId);
return productAttributeValuesService.getAttributeValueByProductAndAttribute(productId, attributeId);
}
/**
* 根据商品ID删除所有属性值
* @param productId 商品ID
* @return 是否成功
*/
@DeleteMapping("/delete-by-product/{productId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteAttributeValuesByProductId(@PathVariable Long productId) {
logger.info("根据商品ID删除所有属性值商品ID{}", productId);
return productAttributeValuesService.deleteAttributeValuesByProductId(productId);
}
}

View File

@@ -1,136 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductAttributes;
import com.qf.backend.service.ProductAttributesService;
import java.util.List;
/**
* 商品属性控制器
* 处理商品属性相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-attributes")
@RestController
public class ProductAttributesController {
private static final Logger logger = LoggerFactory.getLogger(ProductAttributesController.class);
@Autowired
private ProductAttributesService productAttributesService;
/**
* 根据分类ID查询属性
* @param categoryId 分类ID
* @return 属性列表
*/
@GetMapping("/category/{categoryId}")
public Result<List<ProductAttributes>> getAttributesByCategoryId(@PathVariable Long categoryId) {
logger.info("根据分类ID查询属性分类ID{}", categoryId);
return productAttributesService.getAttributesByCategoryId(categoryId);
}
/**
* 根据属性名称查询属性
* @param attributeName 属性名称
* @return 属性列表
*/
@GetMapping("/name/{attributeName}")
public Result<List<ProductAttributes>> getAttributesByName(@PathVariable String attributeName) {
logger.info("根据属性名称查询属性,属性名称:{}", attributeName);
return productAttributesService.getAttributesByName(attributeName);
}
/**
* 创建属性
* @param productAttributes 属性信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createAttribute(@RequestBody ProductAttributes productAttributes) {
logger.info("创建属性,属性信息:{}", productAttributes);
return productAttributesService.createAttribute(productAttributes);
}
/**
* 更新属性信息
* @param productAttributes 属性信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateAttribute(@RequestBody ProductAttributes productAttributes) {
logger.info("更新属性信息,属性信息:{}", productAttributes);
return productAttributesService.updateAttribute(productAttributes);
}
/**
* 删除属性
* @param id 属性ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteAttribute(@PathVariable Long id) {
logger.info("删除属性属性ID{}", id);
return productAttributesService.deleteAttribute(id);
}
/**
* 根据属性ID查询属性
* @param id 属性ID
* @return 属性信息
*/
@GetMapping("/{id}")
public Result<ProductAttributes> getAttributeById(@PathVariable Long id) {
logger.info("根据属性ID查询属性属性ID{}", id);
return productAttributesService.getAttributeById(id);
}
/**
* 批量删除属性
* @param ids 属性ID列表
* @return 是否成功
*/
@DeleteMapping("/batch-delete")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchDeleteAttributes(@RequestBody List<Long> ids) {
logger.info("批量删除属性属性ID数量{}", ids.size());
return productAttributesService.batchDeleteAttributes(ids);
}
/**
* 根据属性类型查询属性
* @param attributeType 属性类型
* @return 属性列表
*/
@GetMapping("/type/{attributeType}")
public Result<List<ProductAttributes>> getAttributesByType(@PathVariable String attributeType) {
logger.info("根据属性类型查询属性,属性类型:{}", attributeType);
return productAttributesService.getAttributesByType(attributeType);
}
/**
* 查询是否可搜索的属性
* @param searchable 是否可搜索
* @return 属性列表
*/
@GetMapping("/searchable")
public Result<List<ProductAttributes>> getAttributesBySearchable(@RequestParam Boolean searchable) {
logger.info("查询是否可搜索的属性,可搜索:{}", searchable);
return productAttributesService.getAttributesBySearchable(searchable);
}
}

View File

@@ -1,133 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductCategories;
import com.qf.backend.service.ProductCategoriesService;
import java.util.List;
/**
* 商品分类控制器
* 处理商品分类相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-categories")
@RestController
public class ProductCategoriesController {
private static final Logger logger = LoggerFactory.getLogger(ProductCategoriesController.class);
@Autowired
private ProductCategoriesService productCategoriesService;
/**
* 根据分类名称查询分类
* @param categoryName 分类名称
* @return 分类信息
*/
@GetMapping("/name/{categoryName}")
public Result<ProductCategories> getCategoryByName(@PathVariable String categoryName) {
logger.info("根据分类名称查询分类,分类名称:{}", categoryName);
return productCategoriesService.getCategoryByName(categoryName);
}
/**
* 根据父分类ID查询子分类
* @param parentId 父分类ID
* @return 子分类列表
*/
@GetMapping("/parent/{parentId}")
public Result<List<ProductCategories>> getSubCategoriesByParentId(@PathVariable Long parentId) {
logger.info("根据父分类ID查询子分类父分类ID{}", parentId);
return productCategoriesService.getSubCategoriesByParentId(parentId);
}
/**
* 创建分类
* @param productCategories 分类信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createCategory(@RequestBody ProductCategories productCategories) {
logger.info("创建分类,分类信息:{}", productCategories);
return productCategoriesService.createCategory(productCategories);
}
/**
* 更新分类信息
* @param productCategories 分类信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateCategory(@RequestBody ProductCategories productCategories) {
logger.info("更新分类信息,分类信息:{}", productCategories);
return productCategoriesService.updateCategory(productCategories);
}
/**
* 删除分类
* @param id 分类ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteCategory(@PathVariable Long id) {
logger.info("删除分类分类ID{}", id);
return productCategoriesService.deleteCategory(id);
}
/**
* 查询所有根分类父分类ID为0或null的分类
* @return 根分类列表
*/
@GetMapping("/root")
public Result<List<ProductCategories>> listRootCategories() {
logger.info("查询所有根分类");
return productCategoriesService.listRootCategories();
}
/**
* 根据分类ID查询分类
* @param id 分类ID
* @return 分类信息
*/
@GetMapping("/{id}")
public Result<ProductCategories> getCategoryById(@PathVariable Long id) {
logger.info("根据分类ID查询分类分类ID{}", id);
return productCategoriesService.getCategoryById(id);
}
/**
* 批量删除分类
* @param ids 分类ID列表
* @return 是否成功
*/
@DeleteMapping("/batch-delete")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchDeleteCategories(@RequestBody List<Long> ids) {
logger.info("批量删除分类分类ID数量{}", ids.size());
return productCategoriesService.batchDeleteCategories(ids);
}
/**
* 查询所有分类(树形结构)
* @return 分类树形列表
*/
@GetMapping("/tree")
public Result<List<ProductCategories>> listAllCategoriesWithTree() {
logger.info("查询所有分类(树形结构)");
return productCategoriesService.listAllCategoriesWithTree();
}
}

View File

@@ -1,138 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductImages;
import com.qf.backend.service.ProductImagesService;
import java.util.List;
/**
* 商品图片控制器
* 处理商品图片相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-images")
@RestController
public class ProductImagesController {
private static final Logger logger = LoggerFactory.getLogger(ProductImagesController.class);
@Autowired
private ProductImagesService productImagesService;
/**
* 根据商品ID查询图片
* @param productId 商品ID
* @return 图片列表
*/
@GetMapping("/product/{productId}")
public Result<List<ProductImages>> getImagesByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询图片商品ID{}", productId);
return productImagesService.getImagesByProductId(productId);
}
/**
* 根据商品ID查询主图
* @param productId 商品ID
* @return 主图信息
*/
@GetMapping("/product/{productId}/main")
public Result<ProductImages> getMainImageByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询主图商品ID{}", productId);
return productImagesService.getMainImageByProductId(productId);
}
/**
* 创建商品图片
* @param productImages 图片信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createImage(@RequestBody ProductImages productImages) {
logger.info("创建商品图片,图片信息:{}", productImages);
return productImagesService.createImage(productImages);
}
/**
* 更新图片信息
* @param productImages 图片信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateImage(@RequestBody ProductImages productImages) {
logger.info("更新图片信息,图片信息:{}", productImages);
return productImagesService.updateImage(productImages);
}
/**
* 删除图片
* @param id 图片ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteImage(@PathVariable Long id) {
logger.info("删除图片图片ID{}", id);
return productImagesService.deleteImage(id);
}
/**
* 根据图片ID查询图片
* @param id 图片ID
* @return 图片信息
*/
@GetMapping("/{id}")
public Result<ProductImages> getImageById(@PathVariable Long id) {
logger.info("根据图片ID查询图片图片ID{}", id);
return productImagesService.getImageById(id);
}
/**
* 批量创建商品图片
* @param images 图片列表
* @return 是否成功
*/
@PostMapping("/batch-create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchCreateImages(@RequestBody List<ProductImages> images) {
logger.info("批量创建商品图片,图片数量:{}", images.size());
return productImagesService.batchCreateImages(images);
}
/**
* 根据商品ID删除所有图片
* @param productId 商品ID
* @return 是否成功
*/
@DeleteMapping("/delete-by-product/{productId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteImagesByProductId(@PathVariable Long productId) {
logger.info("根据商品ID删除所有图片商品ID{}", productId);
return productImagesService.deleteImagesByProductId(productId);
}
/**
* 设置主图
* @param productId 商品ID
* @param imageId 图片ID
* @return 是否成功
*/
@PutMapping("/set-main/{productId}/{imageId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> setMainImage(@PathVariable Long productId, @PathVariable Long imageId) {
logger.info("设置主图商品ID{}图片ID{}", productId, imageId);
return productImagesService.setMainImage(productId, imageId);
}
}

View File

@@ -1,151 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductInventories;
import com.qf.backend.service.ProductInventoriesService;
import java.util.List;
/**
* 商品库存控制器
* 处理商品库存相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-inventories")
@RestController
public class ProductInventoriesController {
private static final Logger logger = LoggerFactory.getLogger(ProductInventoriesController.class);
@Autowired
private ProductInventoriesService productInventoriesService;
/**
* 根据商品ID查询库存
* @param productId 商品ID
* @return 库存列表
*/
@GetMapping("/product/{productId}")
public Result<List<ProductInventories>> getInventoriesByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询库存商品ID{}", productId);
return productInventoriesService.getInventoriesByProductId(productId);
}
/**
* 根据SKU ID查询库存
* @param skuId SKU ID
* @return 库存信息
*/
@GetMapping("/sku/{skuId}")
public Result<ProductInventories> getInventoryBySkuId(@PathVariable Long skuId) {
logger.info("根据SKU ID查询库存SKU ID{}", skuId);
return productInventoriesService.getInventoryBySkuId(skuId);
}
/**
* 创建库存记录
* @param productInventories 库存信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createInventory(@RequestBody ProductInventories productInventories) {
logger.info("创建库存记录,库存信息:{}", productInventories);
return productInventoriesService.createInventory(productInventories);
}
/**
* 更新库存信息
* @param productInventories 库存信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateInventory(@RequestBody ProductInventories productInventories) {
logger.info("更新库存信息,库存信息:{}", productInventories);
return productInventoriesService.updateInventory(productInventories);
}
/**
* 删除库存记录
* @param id 库存ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteInventory(@PathVariable Long id) {
logger.info("删除库存记录库存ID{}", id);
return productInventoriesService.deleteInventory(id);
}
/**
* 根据库存ID查询库存
* @param id 库存ID
* @return 库存信息
*/
@GetMapping("/{id}")
public Result<ProductInventories> getInventoryById(@PathVariable Long id) {
logger.info("根据库存ID查询库存库存ID{}", id);
return productInventoriesService.getInventoryById(id);
}
/**
* 增加库存
* @param skuId SKU ID
* @param quantity 增加数量
* @return 是否成功
*/
@PutMapping("/increase/{skuId}/{quantity}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> increaseInventory(@PathVariable Long skuId, @PathVariable Integer quantity) {
logger.info("增加库存SKU ID{},增加数量:{}", skuId, quantity);
return productInventoriesService.increaseInventory(skuId, quantity);
}
/**
* 减少库存
* @param skuId SKU ID
* @param quantity 减少数量
* @return 是否成功
*/
@PutMapping("/decrease/{skuId}/{quantity}")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> decreaseInventory(@PathVariable Long skuId, @PathVariable Integer quantity) {
logger.info("减少库存SKU ID{},减少数量:{}", skuId, quantity);
return productInventoriesService.decreaseInventory(skuId, quantity);
}
/**
* 检查库存是否充足
* @param skuId SKU ID
* @param quantity 需要的数量
* @return 是否充足
*/
@GetMapping("/check/{skuId}/{quantity}")
public Result<Boolean> checkInventorySufficient(@PathVariable Long skuId, @PathVariable Integer quantity) {
logger.info("检查库存是否充足SKU ID{},需要数量:{}", skuId, quantity);
return productInventoriesService.checkInventorySufficient(skuId, quantity);
}
/**
* 批量更新库存
* @param inventoryUpdates 库存更新列表
* @return 是否成功
*/
@PutMapping("/batch-update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchUpdateInventory(@RequestBody List<ProductInventories> inventoryUpdates) {
logger.info("批量更新库存,更新数量:{}", inventoryUpdates.size());
return productInventoriesService.batchUpdateInventory(inventoryUpdates);
}
}

View File

@@ -1,149 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ProductSkus;
import com.qf.backend.service.ProductSkusService;
import java.util.List;
/**
* 商品SKU控制器
* 处理商品SKU相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/product-skus")
@RestController
public class ProductSkusController {
private static final Logger logger = LoggerFactory.getLogger(ProductSkusController.class);
@Autowired
private ProductSkusService productSkusService;
/**
* 根据商品ID查询SKU
* @param productId 商品ID
* @return SKU列表
*/
@GetMapping("/product/{productId}")
public Result<List<ProductSkus>> getSkusByProductId(@PathVariable Long productId) {
logger.info("根据商品ID查询SKU商品ID{}", productId);
return productSkusService.getSkusByProductId(productId);
}
/**
* 根据SKU编码查询SKU
* @param skuCode SKU编码
* @return SKU信息
*/
@GetMapping("/code/{skuCode}")
public Result<ProductSkus> getSkuByCode(@PathVariable String skuCode) {
logger.info("根据SKU编码查询SKUSKU编码{}", skuCode);
return productSkusService.getSkuByCode(skuCode);
}
/**
* 创建SKU
* @param productSkus SKU信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createSku(@RequestBody ProductSkus productSkus) {
logger.info("创建SKUSKU信息{}", productSkus);
return productSkusService.createSku(productSkus);
}
/**
* 更新SKU信息
* @param productSkus SKU信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateSku(@RequestBody ProductSkus productSkus) {
logger.info("更新SKU信息SKU信息{}", productSkus);
return productSkusService.updateSku(productSkus);
}
/**
* 删除SKU
* @param id SKU ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteSku(@PathVariable Long id) {
logger.info("删除SKUSKU ID{}", id);
return productSkusService.deleteSku(id);
}
/**
* 根据SKU ID查询SKU
* @param id SKU ID
* @return SKU信息
*/
@GetMapping("/{id}")
public Result<ProductSkus> getSkuById(@PathVariable Long id) {
logger.info("根据SKU ID查询SKUSKU ID{}", id);
return productSkusService.getSkuById(id);
}
/**
* 批量创建SKU
* @param skus SKU列表
* @return 是否成功
*/
@PostMapping("/batch-create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchCreateSkus(@RequestBody List<ProductSkus> skus) {
logger.info("批量创建SKUSKU数量{}", skus.size());
return productSkusService.batchCreateSkus(skus);
}
/**
* 根据商品ID删除所有SKU
* @param productId 商品ID
* @return 是否成功
*/
@DeleteMapping("/delete-by-product/{productId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteSkusByProductId(@PathVariable Long productId) {
logger.info("根据商品ID删除所有SKU商品ID{}", productId);
return productSkusService.deleteSkusByProductId(productId);
}
/**
* 更新SKU库存
* @param skuId SKU ID
* @param quantity 库存数量
* @return 是否成功
*/
@PutMapping("/update-stock/{skuId}/{quantity}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateSkuStock(@PathVariable Long skuId, @PathVariable Integer quantity) {
logger.info("更新SKU库存SKU ID{},库存数量:{}", skuId, quantity);
return productSkusService.updateSkuStock(skuId, quantity);
}
/**
* 批量查询SKU
* @param skuIds SKU ID列表
* @return SKU列表
*/
@PostMapping("/batch-get")
public Result<List<ProductSkus>> batchGetSkus(@RequestBody List<Long> skuIds) {
logger.info("批量查询SKUSKU ID数量{}", skuIds.size());
return productSkusService.batchGetSkus(skuIds);
}
}

View File

@@ -1,151 +1,147 @@
package com.qf.backend.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.dto.request.PageRequest;
import com.qf.backend.dto.request.ProductRequest;
import com.qf.backend.entity.Products;
import com.qf.backend.service.ProductsService;
import java.util.List;
/**
* 商品控制器
* 商品控制器 (商品接口)
* 处理商品相关的HTTP请求
* 遵循RESTful API设计规范
*
* @author 30803
*/
@RequestMapping("/api/products")
@RestController
@RequestMapping("/api/products")
public class ProductsController {
private static final Logger logger = LoggerFactory.getLogger(ProductsController.class);
@Autowired
private ProductsService productsService;
/**
* 根据商品名称查询商品
* @param productName 商品名称
* @return 商品列表
* 获取商品详情
* @param productRequest 商品ID请求
* @return 商品信息
*/
@GetMapping("/name/{productName}")
public Result<List<Products>> getProductsByName(@PathVariable String productName) {
logger.info("根据商品名称查询商品,商品名称{}", productName);
return productsService.getProductsByName(productName);
}
/**
* 根据分类ID查询商品
* @param categoryId 分类ID
* @return 商品列表
*/
@GetMapping("/category/{categoryId}")
public Result<List<Products>> getProductsByCategoryId(@PathVariable Long categoryId) {
logger.info("根据分类ID查询商品分类ID{}", categoryId);
return productsService.getProductsByCategoryId(categoryId);
@PostMapping("/getproductinfo")
public Result<Products> getProductInfo(@RequestBody ProductRequest productRequest) {
logger.info("获取商品信息请求,商品ID{}", productRequest.getId());
return productsService.getProductById(productRequest.getId());
}
/**
* 创建商品
* @param products 商品信息
* @return 是否成功
* @param productRequest 商品信息
* @return 创建结果
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createProduct(@RequestBody Products products) {
logger.info("创建商品,商品信息:{}", products);
// 只有管理员或店铺所有者才能创建商品
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> createProduct(@RequestBody ProductRequest productRequest) {
logger.info("创建商品请求,商品信息:{}", productRequest);
Products products = new Products(null, productRequest.getProductName(), productRequest.getShopId(),
productRequest.getCategoryId(), productRequest.getDescription(), productRequest.getOriginalPrice(),
productRequest.getCurrentPrice(), 0, 1, productRequest.getMainImage(), 0, null, null);
return productsService.createProduct(products);
}
/**
* 更新商品信息
* @param products 商品信息
* @return 是否成功
* @param productRequest 商品信息
* @return 更新结果
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateProduct(@RequestBody Products products) {
logger.info("更新商品信息,商品信息:{}", products);
@PostMapping("/update")
// 只有管理员或店铺所有者才能更新商品
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> updateProduct(@RequestBody ProductRequest productRequest) {
logger.info("更新商品信息请求,更新信息:{}", productRequest);
Products products = new Products(productRequest.getId(), productRequest.getProductName(), productRequest.getShopId(),
productRequest.getCategoryId(), productRequest.getDescription(), productRequest.getOriginalPrice(),
productRequest.getCurrentPrice(), null, productRequest.getStatus(), productRequest.getMainImage(), null, null, null);
return productsService.updateProduct(products);
}
/**
* 删除商品
* @param id 商品ID
* @return 是否成功
* @param productRequest 商品ID请求
* @return 删除结果
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteProduct(@PathVariable Long id) {
logger.info("删除商品商品ID{}", id);
return productsService.deleteProduct(id);
}
/**
* 根据商品ID查询商品
* @param id 商品ID
* @return 商品信息
*/
@GetMapping("/{id}")
public Result<Products> getProductById(@PathVariable Long id) {
logger.info("根据商品ID查询商品商品ID{}", id);
return productsService.getProductById(id);
@PostMapping("/delete")
// 只有管理员或店铺所有者才能删除商品
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> deleteProduct(@RequestBody ProductRequest productRequest) {
logger.info("删除商品请求商品ID{}", productRequest.getId());
return productsService.deleteProduct(productRequest.getId());
}
/**
* 分页查询商品
* @param page 当前页码
* @param size 每页数量
* @param pageRequest 分页请求
* @return 商品列表
*/
@GetMapping("/page/{page}/{size}")
public Result<List<Products>> listProductsByPage(@PathVariable int page, @PathVariable int size) {
logger.info("分页查询商品,页码:{},每页数量{}", page, size);
return productsService.listProductsByPage(page, size);
@PostMapping("/list")
public Result<List<Products>> listProductsByPage(@RequestBody PageRequest pageRequest) {
logger.info("分页查询商品请求,页码:{},每页大小{}", pageRequest.getPage(), pageRequest.getSize());
return productsService.listProductsByPage(pageRequest.getPage(), pageRequest.getSize());
}
/**
* 根据分类ID查询商品
* @param productRequest 分类ID请求
* @return 商品列表
*/
@PostMapping("/bycategory")
public Result<List<Products>> getProductsByCategory(@RequestBody ProductRequest productRequest) {
logger.info("根据分类ID查询商品请求分类ID{}", productRequest.getCategoryId());
return productsService.getProductsByCategoryId(productRequest.getCategoryId());
}
/**
* 根据店铺ID查询商品
* @param shopId 店铺ID
* @param productRequest 店铺ID请求
* @return 商品列表
*/
@GetMapping("/shop/{shopId}")
public Result<List<Products>> getProductsByShopId(@PathVariable Long shopId) {
logger.info("根据店铺ID查询商品店铺ID{}", shopId);
return productsService.getProductsByShopId(shopId);
}
/**
* 批量上下架商品
* @param ids 商品ID列表
* @param status 状态(上架/下架)
* @return 是否成功
*/
@PutMapping("/batch-status")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchUpdateProductStatus(@RequestBody List<Long> ids, @RequestParam Integer status) {
logger.info("批量上下架商品商品ID数量{},状态:{}", ids.size(), status);
return productsService.batchUpdateProductStatus(ids, status);
@PostMapping("/byshop")
public Result<List<Products>> getProductsByShop(@RequestBody ProductRequest productRequest) {
logger.info("根据店铺ID查询商品请求店铺ID{}", productRequest.getShopId());
return productsService.getProductsByShopId(productRequest.getShopId());
}
/**
* 搜索商品
* @param keyword 关键词
* @param page 当前页码
* @param size 每页数量
* @param productRequest 搜索请求
* @return 商品列表
*/
@GetMapping("/search")
public Result<List<Products>> searchProducts(@RequestParam String keyword, @RequestParam int page, @RequestParam int size) {
logger.info("搜索商品,关键词:{},页码:{},每页数量{}", keyword, page, size);
return productsService.searchProducts(keyword, page, size);
@PostMapping("/search")
public Result<List<Products>> searchProducts(@RequestBody ProductRequest productRequest) {
logger.info("搜索商品请求,关键词:{},页码:{},每页大小{}",
productRequest.getKeyword(), productRequest.getPage(), productRequest.getSize());
return productsService.searchProducts(productRequest.getKeyword(), productRequest.getPage(), productRequest.getSize());
}
/**
* 批量上下架商品
* @param productRequest 批量操作请求
* @return 操作结果
*/
@PostMapping("/batchupdate")
// 只有管理员或店铺所有者才能批量操作商品
@PreAuthorize("hasRole('ROLE_ADMIN') or #shopId == authentication.principal.shopId")
public Result<Boolean> batchUpdateProductStatus(@RequestBody ProductRequest productRequest) {
logger.info("批量上下架商品请求商品ID列表{},状态:{}", productRequest.getIds(), productRequest.getStatus());
return productsService.batchUpdateProductStatus(productRequest.getIds(), productRequest.getStatus());
}
}

View File

@@ -1,158 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Refunds;
import com.qf.backend.service.RefundsService;
import java.util.List;
/**
* 退款控制器
* 处理退款相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/refunds")
@RestController
public class RefundsController {
private static final Logger logger = LoggerFactory.getLogger(RefundsController.class);
@Autowired
private RefundsService refundsService;
/**
* 根据订单ID查询退款记录
* @param orderId 订单ID
* @return 退款记录列表
*/
@GetMapping("/order/{orderId}")
public Result<List<Refunds>> getRefundsByOrderId(@PathVariable Long orderId) {
logger.info("根据订单ID查询退款记录订单ID{}", orderId);
List<Refunds> refunds = refundsService.getRefundsByOrderId(orderId);
return Result.success(refunds);
}
/**
* 根据退款单号查询退款记录
* @param refundNumber 退款单号
* @return 退款记录
*/
@GetMapping("/number/{refundNumber}")
public Result<Refunds> getRefundByNumber(@PathVariable String refundNumber) {
logger.info("根据退款单号查询退款记录,退款单号:{}", refundNumber);
Refunds refund = refundsService.getRefundByNumber(refundNumber);
return Result.success(refund);
}
/**
* 创建退款记录
* @param refunds 退款信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createRefund(@RequestBody Refunds refunds) {
logger.info("创建退款记录,退款信息:{}", refunds);
boolean result = refundsService.createRefund(refunds);
return Result.success(result);
}
/**
* 更新退款信息
* @param refunds 退款信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateRefund(@RequestBody Refunds refunds) {
logger.info("更新退款信息,退款信息:{}", refunds);
boolean result = refundsService.updateRefund(refunds);
return Result.success(result);
}
/**
* 删除退款记录
* @param id 退款ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteRefund(@PathVariable Long id) {
logger.info("删除退款记录退款ID{}", id);
boolean result = refundsService.deleteRefund(id);
return Result.success(result);
}
/**
* 根据退款ID查询退款记录
* @param id 退款ID
* @return 退款记录
*/
@GetMapping("/{id}")
public Result<Refunds> getRefundById(@PathVariable Long id) {
logger.info("根据退款ID查询退款记录退款ID{}", id);
Refunds refund = refundsService.getRefundById(id);
return Result.success(refund);
}
/**
* 根据用户ID查询退款记录
* @param userId 用户ID
* @return 退款记录列表
*/
@GetMapping("/user/{userId}")
public Result<List<Refunds>> getRefundsByUserId(@PathVariable Long userId) {
logger.info("根据用户ID查询退款记录用户ID{}", userId);
List<Refunds> refunds = refundsService.getRefundsByUserId(userId);
return Result.success(refunds);
}
/**
* 根据退款状态查询退款记录
* @param status 退款状态
* @return 退款记录列表
*/
@GetMapping("/status/{status}")
public Result<List<Refunds>> getRefundsByStatus(@PathVariable Integer status) {
logger.info("根据退款状态查询退款记录,状态:{}", status);
List<Refunds> refunds = refundsService.getRefundsByStatus(status);
return Result.success(refunds);
}
/**
* 更新退款状态
* @param refundId 退款ID
* @param status 退款状态
* @return 是否成功
*/
@PutMapping("/update-status/{refundId}/{status}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateRefundStatus(@PathVariable Long refundId, @PathVariable Integer status) {
logger.info("更新退款状态退款ID{},状态:{}", refundId, status);
boolean result = refundsService.updateRefundStatus(refundId, status);
return Result.success(result);
}
/**
* 分页查询退款记录
* @param page 当前页码
* @param size 每页数量
* @return 退款记录列表
*/
@GetMapping("/page/{page}/{size}")
public Result<List<Refunds>> listRefundsByPage(@PathVariable int page, @PathVariable int size) {
logger.info("分页查询退款记录,页码:{},每页数量:{}", page, size);
List<Refunds> refunds = refundsService.listRefundsByPage(page, size);
return Result.success(refunds);
}
}

View File

@@ -1,180 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.RolePermissions;
import com.qf.backend.service.RolePermissionsService;
import java.util.List;
/**
* 角色权限关联控制器
* 处理角色与权限关联相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/role-permissions")
@RestController
public class RolePermissionsController {
private static final Logger logger = LoggerFactory.getLogger(RolePermissionsController.class);
@Autowired
private RolePermissionsService rolePermissionsService;
/**
* 根据角色ID查询角色权限关联
* @param roleId 角色ID
* @return 角色权限关联列表
*/
@GetMapping("/role/{roleId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<RolePermissions>> getRolePermissionsByRoleId(@PathVariable Long roleId) {
logger.info("管理员根据角色ID查询角色权限关联角色ID{}", roleId);
List<RolePermissions> rolePermissions = rolePermissionsService.getRolePermissionsByRoleId(roleId);
return Result.success(rolePermissions);
}
/**
* 根据权限ID查询角色权限关联
* @param permissionId 权限ID
* @return 角色权限关联列表
*/
@GetMapping("/permission/{permissionId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<RolePermissions>> getRolePermissionsByPermissionId(@PathVariable Long permissionId) {
logger.info("管理员根据权限ID查询角色权限关联权限ID{}", permissionId);
List<RolePermissions> rolePermissions = rolePermissionsService.getRolePermissionsByPermissionId(permissionId);
return Result.success(rolePermissions);
}
/**
* 为角色添加权限
* @param request 角色权限关联请求体
* @return 是否成功
*/
@PostMapping("/add")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> addPermissionToRole(@RequestBody RolePermissionRequest request) {
logger.info("管理员为角色添加权限角色ID{}权限ID{}", request.getRoleId(), request.getPermissionId());
boolean result = rolePermissionsService.addPermissionToRole(request.getRoleId(), request.getPermissionId());
return Result.success(result);
}
/**
* 从角色移除权限
* @param request 角色权限关联请求体
* @return 是否成功
*/
@DeleteMapping("/remove")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> removePermissionFromRole(@RequestBody RolePermissionRequest request) {
logger.info("管理员从角色移除权限角色ID{}权限ID{}", request.getRoleId(), request.getPermissionId());
boolean result = rolePermissionsService.removePermissionFromRole(request.getRoleId(), request.getPermissionId());
return Result.success(result);
}
/**
* 批量为角色添加权限
* @param request 批量角色权限关联请求体
* @return 是否成功
*/
@PostMapping("/batch-add")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchAddPermissionsToRole(@RequestBody BatchRolePermissionRequest request) {
logger.info("管理员批量为角色添加权限角色ID{}权限ID列表{}", request.getRoleId(), request.getPermissionIds());
boolean result = rolePermissionsService.batchAddPermissionsToRole(request.getRoleId(), request.getPermissionIds());
return Result.success(result);
}
/**
* 清空角色的所有权限
* @param roleId 角色ID
* @return 是否成功
*/
@DeleteMapping("/clear/{roleId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> clearRolePermissions(@PathVariable Long roleId) {
logger.info("管理员清空角色的所有权限角色ID{}", roleId);
boolean result = rolePermissionsService.clearRolePermissions(roleId);
return Result.success(result);
}
/**
* 检查角色是否拥有指定权限
* @param roleId 角色ID
* @param permissionId 权限ID
* @return 是否拥有
*/
@GetMapping("/check")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> checkRoleHasPermission(Long roleId, Long permissionId) {
logger.info("管理员检查角色是否拥有指定权限角色ID{}权限ID{}", roleId, permissionId);
boolean result = rolePermissionsService.checkRoleHasPermission(roleId, permissionId);
return Result.success(result);
}
/**
* 根据角色ID查询其拥有的权限ID列表
* @param roleId 角色ID
* @return 权限ID列表
*/
@GetMapping("/permission-ids/{roleId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Long>> listPermissionIdsByRoleId(@PathVariable Long roleId) {
logger.info("管理员根据角色ID查询其拥有的权限ID列表角色ID{}", roleId);
List<Long> permissionIds = rolePermissionsService.listPermissionIdsByRoleId(roleId);
return Result.success(permissionIds);
}
/**
* 角色权限关联请求体
*/
public static class RolePermissionRequest {
private Long roleId;
private Long permissionId;
// getter和setter
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Long getPermissionId() {
return permissionId;
}
public void setPermissionId(Long permissionId) {
this.permissionId = permissionId;
}
}
/**
* 批量角色权限关联请求体
*/
public static class BatchRolePermissionRequest {
private Long roleId;
private List<Long> permissionIds;
// getter和setter
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public List<Long> getPermissionIds() {
return permissionIds;
}
public void setPermissionIds(List<Long> permissionIds) {
this.permissionIds = permissionIds;
}
}
}

View File

@@ -1,133 +0,0 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Roles;
import com.qf.backend.service.RolesService;
import java.util.List;
/**
* 角色管理控制器
* 处理角色相关的HTTP请求
* 遵循RESTful API设计规范
* @author 30803
*/
@RequestMapping("/api/roles")
@RestController
public class RolesController {
private static final Logger logger = LoggerFactory.getLogger(RolesController.class);
@Autowired
private RolesService rolesService;
/**
* 查询所有角色
* @return 角色列表
*/
@GetMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Roles>> listAllRoles() {
logger.info("管理员查询所有角色");
return rolesService.listAllRoles();
}
/**
* 根据角色ID查询角色
* @param id 角色ID
* @return 角色信息
*/
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Roles> getRoleById(@PathVariable Long id) {
logger.info("管理员根据ID查询角色ID{}", id);
return rolesService.getRoleById(id);
}
/**
* 根据角色名称查询角色
* @param roleName 角色名称
* @return 角色信息
*/
@GetMapping("/name/{roleName}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Roles> getRoleByName(@PathVariable String roleName) {
logger.info("管理员根据名称查询角色,名称:{}", roleName);
return rolesService.getRoleByName(roleName);
}
/**
* 根据用户ID查询其拥有的角色列表
* @param userId 用户ID
* @return 角色列表
*/
@GetMapping("/user/{userId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Roles>> listRolesByUserId(@PathVariable Long userId) {
logger.info("管理员根据用户ID查询角色列表用户ID{}", userId);
return rolesService.listRolesByUserId(userId);
}
/**
* 创建角色
* @param roles 角色信息
* @return 是否成功
*/
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createRole(@RequestBody Roles roles) {
logger.info("管理员创建角色:{}", roles);
return rolesService.createRole(roles);
}
/**
* 更新角色信息
* @param roles 角色信息
* @return 是否成功
*/
@PutMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateRole(@RequestBody Roles roles) {
logger.info("管理员更新角色:{}", roles);
return rolesService.updateRole(roles);
}
/**
* 删除角色
* @param id 角色ID
* @return 是否成功
*/
@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteRole(@PathVariable Long id) {
logger.info("管理员删除角色ID{}", id);
return rolesService.deleteRole(id);
}
/**
* 批量删除角色
* @param ids 角色ID列表
* @return 是否成功
*/
@DeleteMapping("/batch")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchDeleteRoles(@RequestBody List<Long> ids) {
logger.info("管理员批量删除角色IDs{}", ids);
return rolesService.batchDeleteRoles(ids);
}
}

View File

@@ -1,133 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ShopCategories;
import com.qf.backend.service.ShopCategoriesService;
import java.util.List;
/**
* 店铺分类控制器
* 处理店铺分类相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/shop-categories")
@RestController
public class ShopCategoriesController {
private static final Logger logger = LoggerFactory.getLogger(ShopCategoriesController.class);
@Autowired
private ShopCategoriesService shopCategoriesService;
/**
* 根据分类名称查询分类
* @param categoryName 分类名称
* @return 分类信息
*/
@GetMapping("/name/{categoryName}")
public Result<ShopCategories> getCategoryByName(@PathVariable String categoryName) {
logger.info("根据分类名称查询分类,分类名称:{}", categoryName);
return shopCategoriesService.getCategoryByName(categoryName);
}
/**
* 根据父分类ID查询子分类
* @param parentId 父分类ID
* @return 子分类列表
*/
@GetMapping("/parent/{parentId}")
public Result<List<ShopCategories>> getSubCategoriesByParentId(@PathVariable Long parentId) {
logger.info("根据父分类ID查询子分类父分类ID{}", parentId);
return shopCategoriesService.getSubCategoriesByParentId(parentId);
}
/**
* 创建分类
* @param shopCategories 分类信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> createCategory(@RequestBody ShopCategories shopCategories) {
logger.info("创建分类,分类信息:{}", shopCategories);
return shopCategoriesService.createCategory(shopCategories);
}
/**
* 更新分类信息
* @param shopCategories 分类信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateCategory(@RequestBody ShopCategories shopCategories) {
logger.info("更新分类信息,分类信息:{}", shopCategories);
return shopCategoriesService.updateCategory(shopCategories);
}
/**
* 删除分类
* @param id 分类ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteCategory(@PathVariable Long id) {
logger.info("删除分类分类ID{}", id);
return shopCategoriesService.deleteCategory(id);
}
/**
* 查询所有根分类父分类ID为0或null的分类
* @return 根分类列表
*/
@GetMapping("/root")
public Result<List<ShopCategories>> listRootCategories() {
logger.info("查询所有根分类");
return shopCategoriesService.listRootCategories();
}
/**
* 根据分类ID查询分类
* @param id 分类ID
* @return 分类信息
*/
@GetMapping("/{id}")
public Result<ShopCategories> getCategoryById(@PathVariable Long id) {
logger.info("根据分类ID查询分类分类ID{}", id);
return shopCategoriesService.getCategoryById(id);
}
/**
* 批量删除分类
* @param ids 分类ID列表
* @return 是否成功
*/
@DeleteMapping("/batch-delete")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchDeleteCategories(@RequestBody List<Long> ids) {
logger.info("批量删除分类分类ID数量{}", ids.size());
return shopCategoriesService.batchDeleteCategories(ids);
}
/**
* 查询所有分类(树形结构)
* @return 分类树形列表
*/
@GetMapping("/tree")
public Result<List<ShopCategories>> listAllCategoriesWithTree() {
logger.info("查询所有分类(树形结构)");
return shopCategoriesService.listAllCategoriesWithTree();
}
}

View File

@@ -1,161 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.ShopRatings;
import com.qf.backend.service.ShopRatingsService;
import java.util.List;
/**
* 店铺评分控制器
* 处理店铺评分相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/shop-ratings")
@RestController
public class ShopRatingsController {
private static final Logger logger = LoggerFactory.getLogger(ShopRatingsController.class);
@Autowired
private ShopRatingsService shopRatingsService;
/**
* 根据店铺ID查询评分
* @param shopId 店铺ID
* @return 评分列表
*/
@GetMapping("/shop/{shopId}")
public Result<List<ShopRatings>> getRatingsByShopId(@PathVariable Long shopId) {
logger.info("根据店铺ID查询评分店铺ID{}", shopId);
return shopRatingsService.getRatingsByShopId(shopId);
}
/**
* 根据用户ID查询评分
* @param userId 用户ID
* @return 评分列表
*/
@GetMapping("/user/{userId}")
public Result<List<ShopRatings>> getRatingsByUserId(@PathVariable Long userId) {
logger.info("根据用户ID查询评分用户ID{}", userId);
return shopRatingsService.getRatingsByUserId(userId);
}
/**
* 创建评分
* @param shopRatings 评分信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createRating(@RequestBody ShopRatings shopRatings) {
logger.info("创建评分,评分信息:{}", shopRatings);
return shopRatingsService.createRating(shopRatings);
}
/**
* 更新评分信息
* @param shopRatings 评分信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> updateRating(@RequestBody ShopRatings shopRatings) {
logger.info("更新评分信息,评分信息:{}", shopRatings);
return shopRatingsService.updateRating(shopRatings);
}
/**
* 删除评分
* @param id 评分ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteRating(@PathVariable Long id) {
logger.info("删除评分评分ID{}", id);
return shopRatingsService.deleteRating(id);
}
/**
* 根据评分ID查询评分
* @param id 评分ID
* @return 评分信息
*/
@GetMapping("/{id}")
public Result<ShopRatings> getRatingById(@PathVariable Long id) {
logger.info("根据评分ID查询评分评分ID{}", id);
return shopRatingsService.getRatingById(id);
}
/**
* 获取店铺平均评分
* @param shopId 店铺ID
* @return 平均评分
*/
@GetMapping("/shop/{shopId}/average")
public Result<Double> getAverageRatingByShopId(@PathVariable Long shopId) {
logger.info("获取店铺平均评分店铺ID{}", shopId);
return shopRatingsService.getAverageRatingByShopId(shopId);
}
/**
* 获取店铺评分数量
* @param shopId 店铺ID
* @return 评分数量
*/
@GetMapping("/shop/{shopId}/count")
public Result<Integer> getRatingCountByShopId(@PathVariable Long shopId) {
logger.info("获取店铺评分数量店铺ID{}", shopId);
return shopRatingsService.getRatingCountByShopId(shopId);
}
/**
* 根据评分星级查询店铺评分
* @param shopId 店铺ID
* @param rating 评分星级
* @return 评分列表
*/
@GetMapping("/shop/{shopId}/rating/{rating}")
public Result<List<ShopRatings>> getRatingsByShopIdAndRating(@PathVariable Long shopId, @PathVariable Integer rating) {
logger.info("根据评分星级查询店铺评分店铺ID{},评分星级:{}", shopId, rating);
return shopRatingsService.getRatingsByShopIdAndRating(shopId, rating);
}
/**
* 检查用户是否已对店铺评分
* @param shopId 店铺ID
* @param userId 用户ID
* @return 是否已评分
*/
@GetMapping("/check")
public Result<Boolean> checkUserHasRated(@RequestParam Long shopId, @RequestParam Long userId) {
logger.info("检查用户是否已对店铺评分店铺ID{}用户ID{}", shopId, userId);
return shopRatingsService.checkUserHasRated(shopId, userId);
}
/**
* 分页查询店铺评分
* @param shopId 店铺ID
* @param page 当前页码
* @param size 每页数量
* @return 评分列表
*/
@GetMapping("/shop/{shopId}/page/{page}/{size}")
public Result<List<ShopRatings>> listRatingsByShopIdAndPage(@PathVariable Long shopId, @PathVariable int page, @PathVariable int size) {
logger.info("分页查询店铺评分店铺ID{},页码:{},每页数量:{}", shopId, page, size);
return shopRatingsService.listRatingsByShopIdAndPage(shopId, page, size);
}
}

View File

@@ -1,151 +0,0 @@
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Shops;
import com.qf.backend.service.ShopsService;
import java.util.List;
/**
* 店铺控制器
* 处理店铺相关的HTTP请求
* 遵循RESTful API设计规范
*/
@RequestMapping("/api/shops")
@RestController
public class ShopsController {
private static final Logger logger = LoggerFactory.getLogger(ShopsController.class);
@Autowired
private ShopsService shopsService;
/**
* 根据店铺名称查询店铺
* @param shopName 店铺名称
* @return 店铺列表
*/
@GetMapping("/name/{shopName}")
public Result<List<Shops>> getShopsByName(@PathVariable String shopName) {
logger.info("根据店铺名称查询店铺,店铺名称:{}", shopName);
return shopsService.getShopsByName(shopName);
}
/**
* 根据用户ID查询店铺
* @param userId 用户ID
* @return 店铺信息
*/
@GetMapping("/user/{userId}")
public Result<Shops> getShopByUserId(@PathVariable Long userId) {
logger.info("根据用户ID查询店铺用户ID{}", userId);
return shopsService.getShopByUserId(userId);
}
/**
* 创建店铺
* @param shops 店铺信息
* @return 是否成功
*/
@PostMapping("/create")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> createShop(@RequestBody Shops shops) {
logger.info("创建店铺,店铺信息:{}", shops);
return shopsService.createShop(shops);
}
/**
* 更新店铺信息
* @param shops 店铺信息
* @return 是否成功
*/
@PutMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
public Result<Boolean> updateShop(@RequestBody Shops shops) {
logger.info("更新店铺信息,店铺信息:{}", shops);
return shopsService.updateShop(shops);
}
/**
* 删除店铺
* @param id 店铺ID
* @return 是否成功
*/
@DeleteMapping("/delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> deleteShop(@PathVariable Long id) {
logger.info("删除店铺店铺ID{}", id);
return shopsService.deleteShop(id);
}
/**
* 根据店铺ID查询店铺
* @param id 店铺ID
* @return 店铺信息
*/
@GetMapping("/{id}")
public Result<Shops> getShopById(@PathVariable Long id) {
logger.info("根据店铺ID查询店铺店铺ID{}", id);
return shopsService.getShopById(id);
}
/**
* 分页查询店铺
* @param page 当前页码
* @param size 每页数量
* @return 店铺列表
*/
@GetMapping("/page/{page}/{size}")
public Result<List<Shops>> listShopsByPage(@PathVariable int page, @PathVariable int size) {
logger.info("分页查询店铺,页码:{},每页数量:{}", page, size);
return shopsService.listShopsByPage(page, size);
}
/**
* 根据店铺分类ID查询店铺
* @param categoryId 分类ID
* @return 店铺列表
*/
@GetMapping("/category/{categoryId}")
public Result<List<Shops>> getShopsByCategoryId(@PathVariable Long categoryId) {
logger.info("根据店铺分类ID查询店铺分类ID{}", categoryId);
return shopsService.getShopsByCategoryId(categoryId);
}
/**
* 更新店铺状态
* @param shopId 店铺ID
* @param status 店铺状态
* @return 是否成功
*/
@PutMapping("/update-status/{shopId}/{status}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> updateShopStatus(@PathVariable Long shopId, @PathVariable Integer status) {
logger.info("更新店铺状态店铺ID{},状态:{}", shopId, status);
return shopsService.updateShopStatus(shopId, status);
}
/**
* 搜索店铺
* @param keyword 关键词
* @param page 当前页码
* @param size 每页数量
* @return 店铺列表
*/
@GetMapping("/search")
public Result<List<Shops>> searchShops(@RequestParam String keyword, @RequestParam int page, @RequestParam int size) {
logger.info("搜索店铺,关键词:{},页码:{},每页数量:{}", keyword, page, size);
return shopsService.searchShops(keyword, page, size);
}
}

View File

@@ -4,22 +4,20 @@
*/
package com.qf.backend.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.User.UserRoles;
import com.qf.backend.service.UserRolesService;
import java.util.List;
/**
* 用户角色关联控制器
@@ -59,111 +57,6 @@ public class UserRolesController {
return userRolesService.getUserRolesByRoleId(roleId);
}
/**
* 为用户添加角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
@PostMapping("/add")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> addRoleToUser(@RequestBody UserRolesRequest request) {
logger.info("管理员为用户添加角色用户ID{}角色ID{}", request.getUserId(), request.getRoleId());
return userRolesService.addRoleToUser(request.getUserId(), request.getRoleId());
}
/**
* 从用户移除角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
@DeleteMapping("/remove")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> removeRoleFromUser(@RequestBody UserRolesRequest request) {
logger.info("管理员从用户移除角色用户ID{}角色ID{}", request.getUserId(), request.getRoleId());
return userRolesService.removeRoleFromUser(request.getUserId(), request.getRoleId());
}
/**
* 批量为用户添加角色
* @param userId 用户ID
* @param roleIds 角色ID列表
* @return 是否成功
*/
@PostMapping("/batch-add")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> batchAddRolesToUser(@RequestBody BatchUserRolesRequest request) {
logger.info("管理员批量为用户添加角色用户ID{}角色ID列表{}", request.getUserId(), request.getRoleIds());
return userRolesService.batchAddRolesToUser(request.getUserId(), request.getRoleIds());
}
/**
* 清空用户的所有角色
* @param userId 用户ID
* @return 是否成功
*/
@DeleteMapping("/clear/{userId}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> clearUserRoles(@PathVariable Long userId) {
logger.info("管理员清空用户的所有角色用户ID{}", userId);
return userRolesService.clearUserRoles(userId);
}
/**
* 检查用户是否拥有指定角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否拥有
*/
@GetMapping("/check")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Boolean> checkUserHasRole(Long userId, Long roleId) {
logger.info("管理员检查用户是否拥有指定角色用户ID{}角色ID{}", userId, roleId);
return userRolesService.checkUserHasRole(userId, roleId);
}
/**
* 用户角色关联请求体
*/
public static class UserRolesRequest {
private Long userId;
private Long roleId;
// getter和setter
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
}
/**
* 批量用户角色关联请求体
*/
public static class BatchUserRolesRequest {
private Long userId;
private List<Long> roleIds;
// getter和setter
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public List<Long> getRoleIds() {
return roleIds;
}
public void setRoleIds(List<Long> roleIds) {
this.roleIds = roleIds;
}
}
}

View File

@@ -1,94 +1,101 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.qf.backend.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.security.access.prepost.PreAuthorize;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Users;
import com.qf.backend.dto.request.UsersRequest;
import com.qf.backend.entity.User.Users;
import com.qf.backend.service.UsersService;
import java.util.List;
/**
* 用户管理控制器
* 用户控制器 (用户接口)
* 处理用户相关的HTTP请求
* 遵循RESTful API设计规范
*
* @author 30803
*/
@RequestMapping("/api/users")
@RestController
@RequestMapping("/api/user")
public class UsersController {
private static final Logger logger = LoggerFactory.getLogger(UsersController.class);
@Autowired
private UsersService usersService;
/**
* 分页获取用户列表 仅管理员角色
* @param pageNum 页码
* @param pageSize 每页数量
* @return 用户列表
*/
@GetMapping("/page")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Users>> listUsersByPage(int pageNum, int pageSize) {
logger.info("管理员获取用户列表,页码:{},每页数量:{}", pageNum, pageSize);
return usersService.listUsersByPage(pageNum, pageSize);
}
/**
* 根据id查询用户 仅管理员角色
* @param id 用户ID
* 获取用户信息
* @param usersRequest 用户ID请求
* @return 用户信息
*/
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Users> getUserById(@PathVariable Long id) {
logger.info("管理员根据id查询用户id{}", id);
return usersService.getUserById(id);
@PostMapping("/getuserinfo")
// 只有用户本人或管理员才能获取用户信息
@PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式
public Result<Users> getUserInfo(@RequestBody UsersRequest usersRequest) {
logger.info("获取用户信息请求用户ID{}", usersRequest.getId());
return usersService.getUserById(usersRequest.getId());
}
/**
* 根据用户名查询用户 用户可以查询自己的信息
* @param username 用户
* @return 用户信息
* 更新用户信息
* @param usersRequest 用户信息
* @return 更新结果
*/
@GetMapping("/username/{username}")
// @PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Users> getUserByUsername(@PathVariable String username) {
logger.info("管理员根据用户名查询用户,用户名:{}", username);
return usersService.getUserByUsername(username);
@PostMapping("/info")
// 只有用户本人或管理员才能更新用户信息
@PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式
public Result<Boolean> updateUserInfo(@RequestBody UsersRequest usersRequest) {
logger.info("更新用户信息请求,更新信息:{}", usersRequest);
Users users = new Users(usersRequest.getId(), usersRequest.getUsername(), usersRequest.getPassword(),
usersRequest.getEmail(), usersRequest.getPhone(), usersRequest.getAvatar(), null, 1, null, null);
return usersService.updateUser(users);
}
/**
* 根据邮箱查询用户 仅管理员角色
* @param email 邮箱
* @return 用户信息
* 注销登录
* 修改用户状态为2删除
* @param usersRequest 注销请求
* @return 注销结果
*/
@GetMapping("/email/{email}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<Users> getUserByEmail(@PathVariable String email) {
logger.info("管理员根据邮箱查询用户,邮箱:{}", email);
return usersService.getUserByEmail(email);
@PostMapping("/logout")
// 只有用户本人或管理员才能注销登录
@PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式
public Result<Boolean> logout(@RequestBody UsersRequest usersRequest) {
logger.info("注销登录请求用户ID{}", usersRequest.getId());
return usersService.deleteUser(usersRequest.getId(),usersRequest.getStatus() );
}
/**
* 查询所有用户 仅管理员角色
* @return 用户列表
* 重置密码
*
* @param usersRequest 重置密码请求
* @return 重置结果
*/
@GetMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Result<List<Users>> listAllUsers() {
logger.info("管理员查询所有用户");
return usersService.listAllUsers();
@PostMapping("/resetpassword")
// 只有用户本人或管理员才能重置密码
@PreAuthorize("#id == authentication.principal.userId or hasRole('ROLE_ADMIN')") // SpEL 表达式
public Result<Boolean> resetPassword(@RequestBody UsersRequest usersRequest) {
logger.info("重置密码请求用户ID{}", usersRequest.getId());
return usersService.updatePassword(usersRequest.getId(), usersRequest.getPassword());
}
/**
* 注册用户
* 默认为1启用状态
* @param usersRequest 注册请求
* @return 注册结果
*/
@PostMapping("/register")
public Result<Boolean> registerUser(@RequestBody UsersRequest usersRequest) {
logger.info("用户注册请求,注册信息:{}", usersRequest);
Users users = new Users(null, usersRequest.getUsername(), usersRequest.getPassword(), usersRequest.getEmail(),
usersRequest.getPhone(), usersRequest.getAvatar(), null, 1, null, null);
return usersService.createUser(users);
}
}

View File

@@ -1,9 +0,0 @@
package com.qf.backend.dto;
import java.util.List;
import com.qf.backend.entity.Users;
public class UserDataList {
private List<Users> userDataList;
}

View File

@@ -1,25 +0,0 @@
package com.qf.backend.dto;
import java.util.Date;
/**
* 用户DTO 用于表示用户结构(包含用户的基本信息 和 角色信息)
* @author 30803
* @date 2023-12-12
* @description 用户DTO 用于表示用户结构
*
*/
public class UserDto {
private Long id; // 用户ID主键自增
private String username; // 用户名
private String email; // 邮箱
private String phone; // 手机号
private Integer status; // 状态0:禁用, 1:启用
private Long roleId; // 角色ID
private String roleName; // 角色名称
private String description; // 角色描述
private Integer roleType; // 角色类型0:默认用户,1:店主,2:管理员
private Date createdAt; // 创建时间
private Date updatedAt; // 更新时间
}

View File

@@ -0,0 +1,36 @@
package com.qf.backend.dto.request;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.qf.backend.entity.OrderItems;
import lombok.Data;
/**
* 订单请求DTO
*/
@Data
public class OrderRequest {
private Long id; // 订单ID
private String orderNo; // 订单号
private Long userId; // 用户ID
private Long shopId; // 店铺ID
private BigDecimal totalAmount; // 总金额
private BigDecimal actualAmount; // 实际支付金额
private BigDecimal shippingFee; // 运费
private Integer orderStatus; // 订单状态0:待付款, 1:待发货, 2:待收货, 3:已完成, 4:已取消, 5:已退款
private String shippingAddress; // 收货地址
private String receiverName; // 收件人姓名
private String receiverPhone; // 收件人电话
private String paymentMethod; // 支付方式
private Date paymentTime; // 支付时间
private Date shippingTime; // 发货时间
private Date deliveryTime; // 送达时间
private Date completeTime; // 完成时间
private String remark; // 备注
private List<OrderItems> orderItems; // 订单项列表
private Integer page; // 页码,用于分页查询
private Integer size; // 每页大小,用于分页查询
}

View File

@@ -0,0 +1,10 @@
package com.qf.backend.dto.request;
import lombok.Data;
@Data
public class PageRequest {
private Integer page; // 当前页码
private Integer size; // 每页数量
}

View File

@@ -0,0 +1,26 @@
package com.qf.backend.dto.request;
import java.math.BigDecimal;
import java.util.List;
import lombok.Data;
/**
* 商品请求DTO
*/
@Data
public class ProductRequest {
private Long id; // 商品ID
private String productName; // 商品名称
private Long shopId; // 店铺ID
private Long categoryId; // 商品分类ID
private String description; // 商品描述
private BigDecimal originalPrice; // 原价
private BigDecimal currentPrice; // 当前价格
private Integer status; // 状态0:下架, 1:上架
private String mainImage; // 主图URL
private String keyword; // 搜索关键词
private Integer page; // 页码
private Integer size; // 每页大小
private List<Long> ids; // 商品ID列表用于批量操作
}

View File

@@ -0,0 +1,16 @@
package com.qf.backend.dto.request;
import lombok.Data;
@Data
public class UsersRequest {
private Long id; // 用户ID
private String username; // 用户名,唯一
private String password; // 密码,加密存储
private String email; // 邮箱,唯一
private String phone; // 手机号,唯一
private String avatar; // 头像URL
// 默认为1启用状态
private Integer status; // 状态0:禁用, 1:启用, 2:删除
}

View File

@@ -0,0 +1,24 @@
package com.qf.backend.dto.response;
import java.util.List;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.entity.User.Users;
public class Userresponse {
private Users users;
private List<Roles> roles;
// getters and setters
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
public List<Roles> getRoles() {
return roles;
}
public void setRoles(List<Roles> roles) {
this.roles = roles;
}
}

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;

View File

@@ -1,4 +1,4 @@
package com.qf.backend.entity;
package com.qf.backend.entity.User;
import java.util.Date;
@@ -21,7 +21,6 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor // 自动生成全参构造器
@TableName("users")
public class Users {
@TableId(type = IdType.AUTO)
private Long id; // 用户ID主键自增
private String username; // 用户名唯一
@@ -31,7 +30,7 @@ public class Users {
private String avatar; // 头像URL
@TableField(exist = false) // 标记该字段在数据库中不存在
private Date lastLoginTime; // 最后登录时间
private Integer status; // 状态0:禁用, 1:启用
private Integer status; // 状态0:禁用, 1:启用 ,2:冻结 ,默认1
private Date createdAt; // 创建时间
private Date updatedAt; // 更新时间
}

View File

@@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.service.RolesService;
/**

View File

@@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.backend.entity.Users;
import com.qf.backend.entity.User.Users;
import com.qf.backend.service.UsersService;
/**

View File

@@ -3,7 +3,7 @@ package com.qf.backend.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.Permissions;
import com.qf.backend.entity.User.Permissions;
/**
* 权限信息表 Mapper 接口

View File

@@ -3,7 +3,7 @@ package com.qf.backend.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.RolePermissions;
import com.qf.backend.entity.User.RolePermissions;
/**
* 角色权限关联表 Mapper 接口

View File

@@ -3,7 +3,7 @@ package com.qf.backend.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.User.Roles;
/**
* 角色信息表 Mapper 接口

View File

@@ -3,7 +3,7 @@ package com.qf.backend.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.UserDetails;
import com.qf.backend.entity.User.UserDetails;
/**
* 用户详细信息表 Mapper 接口

View File

@@ -3,7 +3,7 @@ package com.qf.backend.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.User.UserRoles;
/**
* 用户角色关联表 Mapper 接口

View File

@@ -5,7 +5,7 @@ import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.backend.entity.Users;
import com.qf.backend.entity.User.Users;
/**
* 用户基本信息表 Mapper 接口

View File

@@ -2,7 +2,7 @@ package com.qf.backend.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Permissions;
import com.qf.backend.entity.User.Permissions;
import java.util.List;

View File

@@ -1,7 +1,7 @@
package com.qf.backend.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.entity.RolePermissions;
import com.qf.backend.entity.User.RolePermissions;
import java.util.List;

View File

@@ -4,7 +4,7 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.User.Roles;
/**
* 角色服务接口

View File

@@ -2,7 +2,7 @@ package com.qf.backend.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.UserDetails;
import com.qf.backend.entity.User.UserDetails;
/**
* 用户详情服务接口

View File

@@ -4,7 +4,7 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.User.UserRoles;
/**
* 用户角色关联服务接口
@@ -26,20 +26,19 @@ public interface UserRolesService extends IService<UserRoles> {
Result<List<UserRoles>> getUserRolesByRoleId(Long roleId);
/**
* 为用户添加角色
* 更新用户ID关联的角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
Result<Boolean> addRoleToUser(Long userId, Long roleId);
Result<Boolean> updateUserRoleByUserId(Long userId, Long roleId);
/**
* 从用户移除角色
* 创建用户角色关联
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
Result<Boolean> removeRoleFromUser(Long userId, Long roleId);
Result<Boolean> createUserRole(Long userId, Long roleId);
/**
* 批量为用户添加角色
@@ -48,19 +47,4 @@ public interface UserRolesService extends IService<UserRoles> {
* @return 是否成功
*/
Result<Boolean> batchAddRolesToUser(Long userId, List<Long> roleIds);
/**
* 清空用户的所有角色
* @param userId 用户ID
* @return 是否成功
*/
Result<Boolean> clearUserRoles(Long userId);
/**
* 检查用户是否拥有指定角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否拥有
*/
Result<Boolean> checkUserHasRole(Long userId, Long roleId);
}

View File

@@ -4,13 +4,25 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Users;
import com.qf.backend.dto.request.PageRequest;
import com.qf.backend.dto.response.Userresponse;
import com.qf.backend.entity.User.Users;
/**
* 用户服务接口
*/
public interface UsersService extends IService<Users> {
/**
* 根据用户名或邮箱查询用户
* @param identifier 标识符,可以是用户名或邮箱
* @param isUsername 是否为用户名标识true为用户名false为邮箱
* @return 用户信息
*/
Result<Users> getUserByIdentifier(String identifier, boolean isUsername);
/**
* 根据用户名查询用户
* @param username 用户名
@@ -52,13 +64,7 @@ public interface UsersService extends IService<Users> {
* @param id 用户ID
* @return 是否成功
*/
Result<Boolean> deleteUser(Long id);
/**
* 查询所有用户
* @return 用户列表
*/
Result<List<Users>> listAllUsers();
Result<Boolean> deleteUser(Long id, Integer status);
/**
* 分页查询用户
@@ -66,7 +72,7 @@ public interface UsersService extends IService<Users> {
* @param size 每页数量
* @return 用户列表
*/
Result<List<Users>> listUsersByPage(int page, int size);
Result<List<Userresponse>> listUsersByPage(PageRequest pageRequest);
/**
* 根据用户ID查询用户

View File

@@ -10,7 +10,7 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Permissions;
import com.qf.backend.entity.User.Permissions;
import com.qf.backend.exception.BusinessException;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.mapper.PermissionsMapper;

View File

@@ -2,7 +2,7 @@ package com.qf.backend.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.backend.entity.RolePermissions;
import com.qf.backend.entity.User.RolePermissions;
import com.qf.backend.exception.BusinessException;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.mapper.RolePermissionsMapper;

View File

@@ -16,7 +16,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.exception.BusinessException;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.mapper.RolesMapper;

View File

@@ -13,9 +13,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.Users;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.entity.User.UserRoles;
import com.qf.backend.entity.User.Users;
import com.qf.backend.service.RolesService;
import com.qf.backend.service.UserRolesService;
import com.qf.backend.service.UsersService;

View File

@@ -17,10 +17,10 @@ import org.springframework.stereotype.Service;
import com.qf.backend.dto.LoginResponse;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Permissions;
import com.qf.backend.entity.Roles;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.Users;
import com.qf.backend.entity.User.Permissions;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.entity.User.UserRoles;
import com.qf.backend.entity.User.Users;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.service.PermissionsService;
import com.qf.backend.service.RolePermissionsService;

View File

@@ -5,6 +5,7 @@
package com.qf.backend.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,7 +14,7 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.UserRoles;
import com.qf.backend.entity.User.UserRoles;
import com.qf.backend.exception.BusinessException;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.mapper.UserRolesMapper;
@@ -61,9 +62,38 @@ public class UsersRolesServiceImpl extends ServiceImpl<UserRolesMapper, UserRole
throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询角色用户信息失败", e);
}
}
/**
* 创建用户角色关联
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
@Override
public Result<Boolean> addRoleToUser(Long userId, Long roleId) {
public Result<Boolean> createUserRole(Long userId, Long roleId){
if (userId == null || roleId == null) {
throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空");
}
// 检查是否已经存在该关联关系
UserRoles existing = userRolesMapper.selectOne(new QueryWrapper<UserRoles>().eq("user_id", userId).eq("role_id", roleId));
if (existing != null) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "用户已拥有该角色");
}
// 创建用户角色关联
UserRoles userRoles = new UserRoles();
userRoles.setUserId(userId);
userRoles.setRoleId(roleId);
userRoles.setCreatedAt(new Date());
int result = userRolesMapper.insert(userRoles);
return ResultUtils.success(result > 0);
}
/**
* 更新用户ID关联的角色
* @param userId 用户ID
* @param roleId 角色ID
* @return 是否成功
*/
@Override
public Result<Boolean> updateUserRoleByUserId(Long userId, Long roleId) {
if (userId == null || roleId == null) {
throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空");
}
@@ -84,27 +114,12 @@ public class UsersRolesServiceImpl extends ServiceImpl<UserRolesMapper, UserRole
throw new BusinessException(ErrorCode.DATABASE_ERROR, "添加用户角色关联失败", e);
}
}
@Override
public Result<Boolean> removeRoleFromUser(Long userId, Long roleId) {
if (userId == null || roleId == null) {
throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空");
}
try {
// 检查关联关系是否存在
UserRoles existing = userRolesMapper.selectOne(new QueryWrapper<UserRoles>().eq("user_id", userId).eq("role_id", roleId));
if (existing == null) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "用户与角色的关联关系不存在");
}
int result = userRolesMapper.delete(new QueryWrapper<UserRoles>().eq("user_id", userId).eq("role_id", roleId));
return ResultUtils.success(result > 0);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
throw new BusinessException(ErrorCode.DATABASE_ERROR, "移除用户角色关联失败", e);
}
}
/**
* 批量为用户添加角色
* @param userId 用户ID
* @param roleIds 角色ID列表
* @return 是否成功
*/
@Override
public Result<Boolean> batchAddRolesToUser(Long userId, List<Long> roleIds) {
if (userId == null) {
@@ -135,40 +150,5 @@ public class UsersRolesServiceImpl extends ServiceImpl<UserRolesMapper, UserRole
}
}
@Override
public Result<Boolean> clearUserRoles(Long userId) {
if (userId == null) {
throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID不能为空");
}
try {
// 检查用户是否有角色关联
List<UserRoles> existingRoles = userRolesMapper.selectList(new QueryWrapper<UserRoles>().eq("user_id", userId));
if (existingRoles.isEmpty()) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "该用户没有关联的角色");
}
int result = userRolesMapper.delete(new QueryWrapper<UserRoles>().eq("user_id", userId));
return ResultUtils.success(result > 0);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
throw new BusinessException(ErrorCode.DATABASE_ERROR, "清除用户角色关联失败", e);
}
}
@Override
public Result<Boolean> checkUserHasRole(Long userId, Long roleId) {
if (userId == null || roleId == null) {
throw new BusinessException(ErrorCode.MISSING_PARAM, "用户ID和角色ID不能为空");
}
try {
// 修改selectInfo为selectOne因为selectInfo方法可能不存在
UserRoles userRoles = userRolesMapper.selectOne(new QueryWrapper<UserRoles>().eq("user_id", userId).eq("role_id", roleId));
return ResultUtils.success(userRoles != null);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
throw new BusinessException(ErrorCode.DATABASE_ERROR, "检查用户角色关系失败", e);
}
}
}

View File

@@ -1,6 +1,12 @@
package com.qf.backend.service.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -13,10 +19,16 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.backend.dto.Result;
import com.qf.backend.entity.Users;
import com.qf.backend.dto.request.PageRequest;
import com.qf.backend.dto.response.Userresponse;
import com.qf.backend.entity.User.Roles;
import com.qf.backend.entity.User.UserRoles;
import com.qf.backend.entity.User.Users;
import com.qf.backend.exception.BusinessException;
import com.qf.backend.exception.ErrorCode;
import com.qf.backend.mapper.RolesMapper;
import com.qf.backend.mapper.UsersMapper;
import com.qf.backend.service.UserRolesService;
import com.qf.backend.service.UsersService;
import com.qf.backend.util.ResultUtils;
import com.qf.backend.util.ValidateUtil;
@@ -28,20 +40,35 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
@Autowired
private UsersMapper usersMapper;
@Autowired
private UserRolesService userRolesService;
@Autowired
private RolesMapper rolesMapper;
// 根据用户名查询用户
// 根据用户名或邮箱查询用户(通用方法)
@Override
public Result<Users> getUserByUsername(String username) {
logger.info("根据用户名查询用户: {}", username);
public Result<Users> getUserByIdentifier(String identifier, boolean isUsername) {
logger.info(isUsername ? "根据用户名查询用户: {}" : "根据邮箱查询用户: {}", identifier);
try {
if (ValidateUtil.isEmpty(username)) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "用户名不能为空");
if (ValidateUtil.isEmpty(identifier)) {
throw new BusinessException(ErrorCode.INVALID_PARAM, isUsername ? "用户名不能为空" : "邮箱不能为空");
}
Users users = usersMapper.selectByUsername(username);
// 邮箱格式校验(仅当标识符为邮箱时)
if (!isUsername && !ValidateUtil.isValidEmail(identifier)) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱格式不正确");
}
// 根据标识符类型调用不同的查询方法
Users users = isUsername
? usersMapper.selectByUsername(identifier)
: usersMapper.selectByEmail(identifier);
if (users == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + username);
throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + identifier);
}
return ResultUtils.success(users);
} catch (BusinessException e) {
@@ -52,33 +79,18 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
}
}
// 根据用户名查询用户
@Override
public Result<Users> getUserByUsername(String username) {
return getUserByIdentifier(username, true);
}
// 根据邮箱查询用户
@Override
public Result<Users> getUserByEmail(String email) {
logger.info("根据邮箱查询用户: {}", email);
try {
if (ValidateUtil.isEmpty(email)) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱不能为空");
return getUserByIdentifier(email, false);
}
// 使用ValidateUtil进行邮箱格式校验
if (!ValidateUtil.isValidEmail(email)) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "邮箱格式不正确");
}
Users users = usersMapper.selectByEmail(email);
if (users == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在: " + email);
}
return ResultUtils.success(users);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
logger.error("查询用户失败: {}", e.getMessage(), e);
throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询用户失败: " + e.getMessage(), e);
}
}
// 登录
@Override
public Result<Users> login(String username, String password) {
@@ -108,7 +120,8 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
throw new BusinessException(ErrorCode.DATABASE_ERROR, "登录失败: " + e.getMessage(), e);
}
}
//创建用户
// 创建用户
@Override
public Result<Boolean> createUser(Users users) {
logger.info("创建用户: 用户对象");
@@ -119,13 +132,20 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
// 加密密码
users.setPassword(new BCryptPasswordEncoder().encode(users.getPassword()));
// 添加创建时间
users.setCreatedAt(new Date());
// 添加更新时间
users.setUpdatedAt(new Date());
// 插入数据库
int result = usersMapper.insert(users);
if (result <= 0) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "创建用户失败");
}
logger.info("用户创建成功");
// 创建成功同步创建用户角色关联
userRolesService.createUserRole(users.getId(), Long.valueOf(1L));
return ResultUtils.success(true);
} catch (IllegalArgumentException e) {
// 转换为业务异常
@@ -160,18 +180,22 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
// 使用ValidateUtil进行实体验证
ValidateUtil.validateEntity(users, "username", "email");
// 添加更新时间
users.setUpdatedAt(new Date());
// 更新用户信息,不包含密码更新
// 更新数据库
int result = usersMapper.updateInfo(users, new UpdateWrapper<Users>()
.set("username", users.getUsername())
.set("email", users.getEmail())
.set("phone", users.getPhone())
.set("avatar", users.getAvatar())
.set("updated_at", users.getUpdatedAt())
.eq("id", users.getId()));
if (result <= 0) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "更新用户信息失败");
}
logger.info("用户信息更新成功: 用户ID = {}", users.getId());
return ResultUtils.success(true);
} catch (IllegalArgumentException e) {
@@ -190,7 +214,7 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
// 删除用户
@Override
public Result<Boolean> deleteUser(Long id) {
public Result<Boolean> deleteUser(Long id, Integer status) {
logger.info("删除用户: 用户ID = {}", id);
try {
@@ -202,8 +226,12 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
if (users == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND, "用户不存在");
}
// 伪删除用户设置状态为0
int result = usersMapper.updateInfo(users, new UpdateWrapper<Users>()
.set("status", status)
.set("updated_at", new Date())
.eq("id", users.getId()));
int result = usersMapper.deleteById(id);
if (result <= 0) {
throw new BusinessException(ErrorCode.BUSINESS_ERROR, "删除用户失败");
}
@@ -218,41 +246,63 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
}
}
// 查询所有用户
@Override
public Result<List<Users>> listAllUsers() {
logger.info("查询所有用户列表");
try {
List<Users> usersList = usersMapper.selectList(null);
logger.info("查询到 {} 个用户", usersList.size());
return ResultUtils.success(usersList);
} catch (Exception e) {
logger.error("查询用户列表失败: {}", e.getMessage(), e);
throw new BusinessException(ErrorCode.DATABASE_ERROR, "查询用户列表失败: " + e.getMessage(), e);
}
}
// 分页查询用户
@Override
public Result<List<Users>> listUsersByPage(int page, int size) {
logger.info("分页查询用户: 页码 = {}, 每页大小 = {}", page, size);
public Result<List<Userresponse>> listUsersByPage(PageRequest pageRequest) {
logger.info("分页查询用户: 页码 = {}, 每页大小 = {}", pageRequest.getPage(), pageRequest.getSize());
try {
// 参数校验
if (page < 1) {
if (pageRequest.getPage() < 1) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "页码不能小于1");
}
if (size < 1 || size > 100) {
if (pageRequest.getSize() < 1 || pageRequest.getSize() > 100) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "每页大小必须在1-100之间");
}
// 使用MyBatis-Plus的分页功能
Page<Users> userPage = new Page<>(page, size);
Page<Users> userPage = new Page<>(pageRequest.getPage(), pageRequest.getSize());
Page<Users> resultPage = usersMapper.selectPage(userPage, null);
// 1. 获取当前页所有用户
List<Users> userList = resultPage.getRecords();
// 2. 提取所有用户ID
List<Long> userIds = userList.stream().map(Users::getId).collect(Collectors.toList());
logger.info("分页查询成功: 共 {} 条记录, 第 {} 页", resultPage.getTotal(), page);
return ResultUtils.success(resultPage.getRecords());
// 3. 一次性查询所有用户-角色关联
List<UserRoles> userRolesList = userRolesService.list(new QueryWrapper<UserRoles>()
.in("user_id", userIds));
// 4. 提取所有角色ID
List<Long> roleIds = userRolesList.stream().map(UserRoles::getRoleId).collect(Collectors.toList());
// 5. 一次性查询所有角色信息
List<Roles> rolesList = rolesMapper.selectList(new QueryWrapper<Roles>()
.in("id", roleIds));
// 6. 构建角色映射按角色ID分组
Map<Long, Roles> roleMap = rolesList.stream()
.collect(Collectors.toMap(Roles::getId, role -> role));
// 7. 构建用户-角色列表映射
Map<Long, List<Roles>> 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<Userresponse> userResponseList = userList.stream().map(user -> {
Userresponse response = new Userresponse();
response.setUsers(user);
// 从Map中取角色避免空指针
response.setRoles(userRoleMap.getOrDefault(user.getId(), Collections.emptyList()));
return response;
}).collect(Collectors.toList());
logger.info("分页查询成功: 共 {} 条记录, 第 {} 页", resultPage.getTotal(), pageRequest.getPage());
return ResultUtils.success(userResponseList);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
@@ -332,6 +382,7 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements
/**
* 根据用户ID查询用户并检查是否存在
*
* @param id 用户ID
* @return 用户对象如果用户不存在则返回null
*/

View File

@@ -0,0 +1,11 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.qf.backend.service.impl;
class rolesMapper {
}

View File

@@ -28,8 +28,8 @@ public class ValidateUtil {
}
/**
* 验证数据是否为空
* @param str 待验证的字符串
* @return 如果字符串为null或空字符串或只包含空白字符则返回true否则返回false
* @param obj 待验证的对象
* @return 如果对象为null或空字符串或只包含空白字符则返回true否则返回false
*/
public static boolean isEmpty(Object obj) {
if (obj == null) {

View File

@@ -3,7 +3,9 @@ jwt.secret=your_very_strong_secret_key_that_is_at_least_32_characters_long!
jwt.expiration=3600000
jwt.token-prefix=Bearer
# CORS 配置 - 开发用(允许所有来源)
cors.allowed-origins=*
cors.allowed-origins=http://localhost:3000,http://localhost:7071,http://localhost:8080,http://localhost:8081,http://localhost:5176,http://localhost:5175,http://localhost:5174,http://localhost:5173,http://localhost:5172,http://localhost:5171
cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS,PATCH
cors.allowed-headers=*
cors.exposed-headers=Authorization
cors.allow-credentials=true
cors.max-age=3600

View File

@@ -3,7 +3,7 @@ jwt.secret=${JWT_SECRET:defaultSecret}
jwt.expiration=${JWT_EXPIRATION:3600000}
jwt.token-prefix=${JWT_TOKEN_PREFIX:Bearer}
# CORS 配置 - 生产用(允许所有来源)
cors.allowed-origins=*
cors.allowed-origins=
cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS,PATCH
cors.allowed-headers=*
cors.exposed-headers=Authorization

View File

@@ -1,4 +1,5 @@
spring.application.name=backend
spring.profiles.active=dev
server.port=7071
# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/TaoTaoWang?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true