From 4da6b34930be3490b109b9dd1a98bcb71e2a4bee Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 12 Jul 2026 10:55:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20Dashboard=E6=8B=86=E5=88=86?= =?UTF-8?q?=E4=B8=BA=E6=A0=87=E5=87=86Controller-Service-Mapper=E4=B8=89?= =?UTF-8?q?=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DashboardController.java | 61 ++----------------- .../situ/stlserver/dao/DashboardMapper.java | 38 ++++++++++++ .../stlserver/service/DashboardService.java | 11 ++++ .../service/impl/DashboardServiceImpl.java | 61 +++++++++++++++++++ 4 files changed, 116 insertions(+), 55 deletions(-) create mode 100644 src/main/java/edu/situ/stlserver/dao/DashboardMapper.java create mode 100644 src/main/java/edu/situ/stlserver/service/DashboardService.java create mode 100644 src/main/java/edu/situ/stlserver/service/impl/DashboardServiceImpl.java diff --git a/src/main/java/edu/situ/stlserver/controller/DashboardController.java b/src/main/java/edu/situ/stlserver/controller/DashboardController.java index fe9c118..275dfa2 100644 --- a/src/main/java/edu/situ/stlserver/controller/DashboardController.java +++ b/src/main/java/edu/situ/stlserver/controller/DashboardController.java @@ -1,85 +1,36 @@ package edu.situ.stlserver.controller; import edu.situ.stlserver.model.vo.HttpResult; -import edu.situ.stlserver.service.CourseService; -import edu.situ.stlserver.service.CoachService; -import edu.situ.stlserver.service.MemberService; +import edu.situ.stlserver.service.DashboardService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.HashMap; -import java.util.Map; - @RestController @RequestMapping("/dashboard") public class DashboardController { @Autowired - private CoachService coachService; - - @Autowired - private MemberService memberService; - - @Autowired - private CourseService courseService; + private DashboardService dashboardService; @GetMapping("/stats") public HttpResult getStats() { - Map stats = new HashMap<>(); - // 教练总数 - stats.put("coachCount", coachService.getAll().size()); - // 会员总数 - stats.put("memberCount", memberService.getAll().size()); - // 课程总数 - stats.put("courseCount", courseService.getAll().size()); - // 在职教练数 - long activeCoachCount = coachService.getAll().stream() - .filter(c -> c.getQuitDate() == null) - .count(); - stats.put("activeCoachCount", activeCoachCount); - // 有效会员数 - long activeMemberCount = memberService.getAll().stream() - .filter(m -> m.getExpireDate() == null) - .count(); - stats.put("activeMemberCount", activeMemberCount); - // 进行中课程数 - long activeCourseCount = courseService.getAll().stream() - .filter(c -> "进行中".equals(c.getStatus())) - .count(); - stats.put("activeCourseCount", activeCourseCount); - return HttpResult.success(stats); + return HttpResult.success(dashboardService.getStats()); } @GetMapping("/member-level") public HttpResult getMemberLevel() { - Map levelMap = new HashMap<>(); - levelMap.put("钻石", memberService.getAll().stream().filter(m -> "钻石".equals(m.getLevel())).count()); - levelMap.put("金卡", memberService.getAll().stream().filter(m -> "金卡".equals(m.getLevel())).count()); - levelMap.put("银卡", memberService.getAll().stream().filter(m -> "银卡".equals(m.getLevel())).count()); - levelMap.put("普通", memberService.getAll().stream().filter(m -> "普通".equals(m.getLevel())).count()); - return HttpResult.success(levelMap); + return HttpResult.success(dashboardService.getMemberLevel()); } @GetMapping("/course-type") public HttpResult getCourseType() { - Map typeMap = new HashMap<>(); - courseService.getAll().forEach(c -> { - typeMap.merge(c.getType(), 1L, Long::sum); - }); - return HttpResult.success(typeMap); + return HttpResult.success(dashboardService.getCourseType()); } @GetMapping("/member-trend") public HttpResult getMemberTrend() { - Map trendMap = new HashMap<>(); - memberService.getAll().forEach(m -> { - String month = m.getJoinDate().substring(0, 7); // yyyy-MM - trendMap.merge(month, 1L, Long::sum); - }); - // 按月份排序 - Map sortedMap = new java.util.TreeMap<>(trendMap); - return HttpResult.success(sortedMap); + return HttpResult.success(dashboardService.getMemberTrend()); } } diff --git a/src/main/java/edu/situ/stlserver/dao/DashboardMapper.java b/src/main/java/edu/situ/stlserver/dao/DashboardMapper.java new file mode 100644 index 0000000..ac75fe9 --- /dev/null +++ b/src/main/java/edu/situ/stlserver/dao/DashboardMapper.java @@ -0,0 +1,38 @@ +package edu.situ.stlserver.dao; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DashboardMapper { + + @Select("SELECT COUNT(*) FROM coaches") + int countCoaches(); + + @Select("SELECT COUNT(*) FROM coaches WHERE quit_date IS NULL") + int countActiveCoaches(); + + @Select("SELECT COUNT(*) FROM members") + int countMembers(); + + @Select("SELECT COUNT(*) FROM members WHERE expire_date IS NULL") + int countActiveMembers(); + + @Select("SELECT COUNT(*) FROM courses") + int countCourses(); + + @Select("SELECT COUNT(*) FROM courses WHERE status = '进行中'") + int countActiveCourses(); + + @Select("SELECT level, COUNT(*) as count FROM members GROUP BY level") + List> countMemberByLevel(); + + @Select("SELECT type, COUNT(*) as count FROM courses GROUP BY type") + List> countCourseByType(); + + @Select("SELECT DATE_FORMAT(join_date, '%Y-%m') as month, COUNT(*) as count FROM members GROUP BY month ORDER BY month") + List> countMemberByMonth(); +} diff --git a/src/main/java/edu/situ/stlserver/service/DashboardService.java b/src/main/java/edu/situ/stlserver/service/DashboardService.java new file mode 100644 index 0000000..45318f9 --- /dev/null +++ b/src/main/java/edu/situ/stlserver/service/DashboardService.java @@ -0,0 +1,11 @@ +package edu.situ.stlserver.service; + +import java.util.List; +import java.util.Map; + +public interface DashboardService { + Map getStats(); + Map getMemberLevel(); + Map getCourseType(); + Map getMemberTrend(); +} diff --git a/src/main/java/edu/situ/stlserver/service/impl/DashboardServiceImpl.java b/src/main/java/edu/situ/stlserver/service/impl/DashboardServiceImpl.java new file mode 100644 index 0000000..7e8e44d --- /dev/null +++ b/src/main/java/edu/situ/stlserver/service/impl/DashboardServiceImpl.java @@ -0,0 +1,61 @@ +package edu.situ.stlserver.service.impl; + +import edu.situ.stlserver.dao.DashboardMapper; +import edu.situ.stlserver.service.DashboardService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +@Service +public class DashboardServiceImpl implements DashboardService { + + @Autowired + private DashboardMapper dashboardMapper; + + @Override + public Map getStats() { + Map stats = new LinkedHashMap<>(); + stats.put("coachCount", dashboardMapper.countCoaches()); + stats.put("activeCoachCount", dashboardMapper.countActiveCoaches()); + stats.put("memberCount", dashboardMapper.countMembers()); + stats.put("activeMemberCount", dashboardMapper.countActiveMembers()); + stats.put("courseCount", dashboardMapper.countCourses()); + stats.put("activeCourseCount", dashboardMapper.countActiveCourses()); + return stats; + } + + @Override + public Map getMemberLevel() { + Map map = new LinkedHashMap<>(); + map.put("钻石", 0L); + map.put("金卡", 0L); + map.put("银卡", 0L); + map.put("普通", 0L); + dashboardMapper.countMemberByLevel().forEach(row -> { + map.put((String) row.get("level"), ((Number) row.get("count")).longValue()); + }); + return map; + } + + @Override + public Map getCourseType() { + Map map = new LinkedHashMap<>(); + dashboardMapper.countCourseByType().forEach(row -> { + map.put((String) row.get("type"), ((Number) row.get("count")).longValue()); + }); + return map; + } + + @Override + public Map getMemberTrend() { + Map map = new TreeMap<>(); + dashboardMapper.countMemberByMonth().forEach(row -> { + map.put((String) row.get("month"), ((Number) row.get("count")).longValue()); + }); + return map; + } +}