diff --git a/pom.xml b/pom.xml
index e94c26f..21a0290 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,6 +110,19 @@
org.springframework.boot
spring-boot-starter-webflux
+
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 5.2.3
+
+
+ org.apache.poi
+ poi
+ 5.2.3
+
diff --git a/src/main/java/com/example/javatest/Controller/admin/AccountController.java b/src/main/java/com/example/javatest/Controller/admin/AccountController.java
index 9178a92..d5797cc 100644
--- a/src/main/java/com/example/javatest/Controller/admin/AccountController.java
+++ b/src/main/java/com/example/javatest/Controller/admin/AccountController.java
@@ -1,16 +1,21 @@
package com.example.javatest.Controller.admin;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.javatest.Entity.admin.Account;
import com.example.javatest.Mapper.admin.AccountMapper;
import com.example.javatest.common.Result;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.util.*;
@RestController
@RequestMapping("/admin/accounts")
@@ -179,4 +184,22 @@ public class AccountController {
Page resultPage = accountMapper.selectPage(page, queryWrapper);
return Result.success(resultPage);
}
+
+ @GetMapping("/statistics/cumulative-users-by-loop")
+ public Map getCumulativeUserCountByLoop() {
+ List dates = new ArrayList<>();
+ List userCounts = new ArrayList<>();
+ LocalDate today = LocalDate.now();
+ for (int i = 0; i < 7; i++) {
+ LocalDate queryDate = today.minusDays(i);
+ LocalDateTime endOfDay = queryDate.plusDays(1).atStartOfDay();
+ Long totalCount = accountMapper.countTotalUpTo(endOfDay);
+ dates.add(queryDate.toString());
+ userCounts.add(totalCount);
+ }
+ return Map.of(
+ "dates", dates,
+ "userCounts", userCounts
+ );
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/example/javatest/Controller/admin/DishController.java b/src/main/java/com/example/javatest/Controller/admin/DishController.java
index 2881f76..6efeb52 100644
--- a/src/main/java/com/example/javatest/Controller/admin/DishController.java
+++ b/src/main/java/com/example/javatest/Controller/admin/DishController.java
@@ -7,10 +7,19 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.javatest.Entity.admin.Dish;
import com.example.javatest.Mapper.admin.DishMapper;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
+import java.io.ByteArrayOutputStream;
import java.time.LocalDateTime;
import java.util.List;
@@ -120,4 +129,65 @@ public class DishController {
return dishMapper.selectList(new LambdaQueryWrapper()
.orderByDesc(Dish::getCreatedAt));
}
+
+ /**
+ * 导出当前分类的菜品数据到Excel
+ * @param category 分类名称
+ * @return Excel文件响应
+ */
+ @GetMapping("/export/{category}")
+ public ResponseEntity exportDishesToExcel(@PathVariable String category) {
+ // 查询当前分类的所有菜品
+ List dishes = dishMapper.selectList(
+ new LambdaQueryWrapper()
+ .eq(Dish::getCategory, category)
+ );
+
+ try (Workbook workbook = new XSSFWorkbook()) {
+ Sheet sheet = workbook.createSheet("菜品数据");
+
+ // 创建表头
+ String[] headers = {"菜品ID", "菜品名称", "分类", "价格", "库存", "状态", "描述", "累计销售", "标签"};
+ Row headerRow = sheet.createRow(0);
+ for (int i = 0; i < headers.length; i++) {
+ Cell cell = headerRow.createCell(i);
+ cell.setCellValue(headers[i]);
+ }
+
+ // 填充数据
+ int rowNum = 1;
+ for (Dish dish : dishes) {
+ Row row = sheet.createRow(rowNum++);
+ row.createCell(0).setCellValue(dish.getDishId());
+ row.createCell(1).setCellValue(dish.getDishName());
+ row.createCell(2).setCellValue(dish.getCategory());
+ row.createCell(3).setCellValue(dish.getPrice().doubleValue());
+ row.createCell(4).setCellValue(dish.getStock());
+ row.createCell(5).setCellValue(dish.getStatus());
+ row.createCell(6).setCellValue(dish.getDescription());
+ row.createCell(7).setCellValue(dish.getSales());
+ row.createCell(8).setCellValue(dish.getTag());
+ }
+
+ // 自动调整列宽
+ for (int i = 0; i < headers.length; i++) {
+ sheet.autoSizeColumn(i);
+ }
+
+ // 写入字节数组
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ workbook.write(outputStream);
+
+ // 设置响应头
+ HttpHeaders responseHeaders = new HttpHeaders();
+ responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ responseHeaders.setContentDispositionFormData("attachment", "菜品数据_" + category + ".xlsx");
+
+ return ResponseEntity.ok()
+ .headers(responseHeaders)
+ .body(outputStream.toByteArray());
+ } catch (Exception e) {
+ throw new RuntimeException("导出Excel失败: " + e.getMessage());
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/example/javatest/Mapper/admin/AccountMapper.java b/src/main/java/com/example/javatest/Mapper/admin/AccountMapper.java
index c42229f..99598c7 100644
--- a/src/main/java/com/example/javatest/Mapper/admin/AccountMapper.java
+++ b/src/main/java/com/example/javatest/Mapper/admin/AccountMapper.java
@@ -3,7 +3,13 @@ package com.example.javatest.Mapper.admin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.javatest.Entity.admin.Account;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.time.LocalDateTime;
@Mapper
public interface AccountMapper extends BaseMapper {
+ @Select("SELECT COUNT(account_id) FROM account WHERE is_deleted = 0 AND created_at < #{endOfDay}")
+ Long countTotalUpTo(@Param("endOfDay") LocalDateTime endOfDay);
}
\ No newline at end of file
diff --git a/src/main/java/org/example/cgpro/CGproApplication.java b/src/main/java/org/example/cgpro/CGproApplication.java
new file mode 100644
index 0000000..4eed4ec
--- /dev/null
+++ b/src/main/java/org/example/cgpro/CGproApplication.java
@@ -0,0 +1,13 @@
+package org.example.cgpro;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CGproApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(CGproApplication.class, args);
+ }
+
+}
diff --git a/src/test/java/org/example/cgpro/CGproApplicationTests.java b/src/test/java/org/example/cgpro/CGproApplicationTests.java
new file mode 100644
index 0000000..7ceee7f
--- /dev/null
+++ b/src/test/java/org/example/cgpro/CGproApplicationTests.java
@@ -0,0 +1,13 @@
+package org.example.cgpro;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CGproApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}