diff --git a/repos/.vitepress/config/nav.ts b/repos/.vitepress/config/nav.ts index 7be7346cf..f0fdb9d19 100644 --- a/repos/.vitepress/config/nav.ts +++ b/repos/.vitepress/config/nav.ts @@ -11,6 +11,11 @@ export const nav: DefaultTheme.Config['nav'] = [ link: '/fragments/index', activeMatch: '/fragments/' }, + { + text: '方案春秋志', + link: '/solutions/index', + activeMatch: '/solutions/' + }, { text: '关于', items: [ diff --git a/repos/.vitepress/config/sidebar.ts b/repos/.vitepress/config/sidebar.ts index b7db161bd..7ac48a7cd 100644 --- a/repos/.vitepress/config/sidebar.ts +++ b/repos/.vitepress/config/sidebar.ts @@ -3,7 +3,8 @@ import { sync } from "fast-glob" export const sidebar: DefaultTheme.Config['sidebar'] = { '/issues/': getItems("issues"), - '/fragments/': getItems("fragments") + '/fragments/': getItems("fragments"), + '/solutions/': getItems("solutions") } /** diff --git a/repos/solutions/2021/11/18.用Java8获取近N天日期.md b/repos/solutions/2021/11/18.用Java8获取近N天日期.md new file mode 100644 index 000000000..69d7aece5 --- /dev/null +++ b/repos/solutions/2021/11/18.用Java8获取近N天日期.md @@ -0,0 +1,107 @@ +--- +title: 用Java8获取近N天日期 +author: 查尔斯 +date: 2021/11/18 20:55 +categories: + - 方案春秋志 +tags: + - Java +--- + +# 用Java8获取近N天日期 + +## 前言 + +**C:** 登录进入管理类系统,首页一般都是以展示数据仪表盘为主。例如:展示一些总量、展示近一周或是近 N 天的某数据的折线图、柱状图等等。 + +那在展示这类近 N 天的图表时,后端必然要给前端提供一个近 N 天的日期集合用于显示。 + +至于实现的方法也有很多种,笔者在这儿就记录一种目前看来扩展性相对较好的方案。 + +## 涉及技术栈 + +- Spring Boot 2.3.1.RELEASE +- MyBatis Plus 3.1.0(使用了 MyBatis Plus 的代码生成器) + +## Controller层 + +```java +/** + * 统计控制器 + * + * @author Charles7c + * @date 2021/11/18 20:55 + */ +@Api(value = "统计接口", tags = "统计接口集") +@RestController +@RequestMapping("/statistics") +public class StatisticsController { + + @Resource + private IRequestService requestService; + + @GetMapping("/request/{days}") + @ApiOperation(value = "日请求数据统计", notes = "日请求数据统计接口") + public R> requestByDays(@ApiParam(value = "days", required = true) @PathVariable("days") Integer days) { + return R.ok(requestService.getRequestTotal(day)); + } +} +``` + +## Service层 + +::: tip 笔者说 +Service 层接口内容略,这个应该对你没影响吧? +::: + +```java {28,30,35,37} +/** + * 请求服务实现类 + * + * @author Charles7c + * @date 2021/11/18 20:55 + */ +@Service +public class RequestServiceImpl extends ServiceImpl implements IRequestService { + + @Override + public Map getRequestTotal(int days) { + // 响应数据 + Map respMap = MapUtil.newHashMap(2); + + // 日期列表 + List dateList = new ArrayList<>(days); + // 请求列表 + List requestList = new ArrayList<>(); + // ... + + // 指定日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 遍历生成日期列表 + // 例如:days 为 5,现在是 2021-11-18, + // 则可以获取到 2021-11-14、2021-11-15、2021-11-16、2021-11-17、2021-11-18 + for (int i = days - 1; i >= 0; i--) { + // 当前日期 - i天 + LocalDateTime plusDate = LocalDateTime.now().plusDays(-i); + // 将日期转换为 yyyy-MM-dd 格式字符串 + String plusDateStr = formatter.format(plusDate); + // 添加到日期列表 + dateList.add(plusDateStr); + + // [根据日期查询指定统计数据列表(具体使用时,根据你自己需求决定查询什么表,什么字段...,此处仅为样例)] + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + // 拼接 SQL,apply 用法,参见:https://mp.baomidou.com/guide/wrapper.html#apply + queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", plusDateStr); + requestList.add(baseMapper.selectCount(queryWrapper).toString()); + + // ... + } + + // 添加响应数据 + respMap.put("dateList", dateList); + respMap.put("requestList", requestList); + // ... + return respMap; + } +} +``` diff --git a/repos/solutions/2021/11/22.一条SQL查询今年每月统计信息.md b/repos/solutions/2021/11/22.一条SQL查询今年每月统计信息.md new file mode 100644 index 000000000..f3d59301c --- /dev/null +++ b/repos/solutions/2021/11/22.一条SQL查询今年每月统计信息.md @@ -0,0 +1,87 @@ +--- +title: 一条SQL查询今年每月统计信息 +author: 查尔斯 +date: 2021/11/22 18:22 +categories: + - 方案春秋志 +tags: + - SQL +--- + +# 一条SQL查询今年每月统计信息 + +## 前言 + +**C:** 前不久,笔者介绍过一种统计近 N 天记录数的需求解决方案。今天,笔者再介绍一种也很常见的统计需求。 + +::: info 示例需求: 统计今年每月的注册用户数。 +你可以基于这个示例需求,去完成各种类似的月统计需求。而且啊,笔者今天这个需求解决方案的重点是在 SQL 上,这类需求问题在 SQL 语句笔试上也挺常见,所以下回再见到类似的需求,你可以好好回想下本篇实现。 +::: + +## 涉及技术栈 + +- Spring Boot 2.3.1.RELEASE +- MyBatis Plus 3.1.0(使用了 MyBatis Plus 的代码生成器) +- MySQL 5.6 + +## Controller层 + +略 + +## Service层 + +略 + +## DAO层 + +::: warning 笔者说 +记得要采用 LinkedHashMap,这样可以保证结果集的有序,即:1月、2月、......。 +::: + +```java +@Select({ + "SELECT", + "SUM(CASE MONTH(`create_time`) WHEN '1' THEN 1 ELSE 0 END) AS `1月`,", + "SUM(CASE MONTH(`create_time`) WHEN '2' THEN 1 ELSE 0 END) AS `2月`,", + "SUM(CASE MONTH(`create_time`) WHEN '3' THEN 1 ELSE 0 END) AS `3月`,", + "SUM(CASE MONTH(`create_time`) WHEN '4' THEN 1 ELSE 0 END) AS `4月`,", + "SUM(CASE MONTH(`create_time`) WHEN '5' THEN 1 ELSE 0 END) AS `5月`,", + "SUM(CASE MONTH(`create_time`) WHEN '6' THEN 1 ELSE 0 END) AS `6月`,", + "SUM(CASE MONTH(`create_time`) WHEN '7' THEN 1 ELSE 0 END) AS `7月`,", + "SUM(CASE MONTH(`create_time`) WHEN '8' THEN 1 ELSE 0 END) AS `8月`,", + "SUM(CASE MONTH(`create_time`) WHEN '9' THEN 1 ELSE 0 END) AS `9月`,", + "SUM(CASE MONTH(`create_time`) WHEN '10' THEN 1 ELSE 0 END) AS `10月`,", + "SUM(CASE MONTH(`create_time`) WHEN '11' THEN 1 ELSE 0 END) AS `11月`,", + "SUM(CASE MONTH(`create_time`) WHEN '12' THEN 1 ELSE 0 END) AS `12月`,", + "FROM `t_user`", + "WHERE YEAR(`create_time`)= YEAR(NOW())" +}) +LinkedHashMap countRegisterByMonth(); +``` + +## SQL语句 + +::: tip 笔者说 +这条 SQL 的思路就是将每条记录的 create_time(创建时间)求一下月份信息,求出的月份如果是对应的月份,那么就记为 1,否则记为 0,这样每月最后再做个 SUM 求和,就可以快速得到对应月份的记录数量了,不用 COUNT 依然可以计数。 + +SQL语句单独放在下面,方便各位同学复制。:smile: +::: + +```sql +# 统计今年每月的注册用户数 +SELECT + SUM(CASE MONTH(`create_time`) WHEN '1' THEN 1 ELSE 0 END) AS `1月`, + SUM(CASE MONTH(`create_time`) WHEN '2' THEN 1 ELSE 0 END) AS `2月`, + SUM(CASE MONTH(`create_time`) WHEN '3' THEN 1 ELSE 0 END) AS `3月`, + SUM(CASE MONTH(`create_time`) WHEN '4' THEN 1 ELSE 0 END) AS `4月`, + SUM(CASE MONTH(`create_time`) WHEN '5' THEN 1 ELSE 0 END) AS `5月`, + SUM(CASE MONTH(`create_time`) WHEN '6' THEN 1 ELSE 0 END) AS `6月`, + SUM(CASE MONTH(`create_time`) WHEN '7' THEN 1 ELSE 0 END) AS `7月`, + SUM(CASE MONTH(`create_time`) WHEN '8' THEN 1 ELSE 0 END) AS `8月`, + SUM(CASE MONTH(`create_time`) WHEN '9' THEN 1 ELSE 0 END) AS `9月`, + SUM(CASE MONTH(`create_time`) WHEN '10' THEN 1 ELSE 0 END) AS `10月`, + SUM(CASE MONTH(`create_time`) WHEN '11' THEN 1 ELSE 0 END) AS `11月`, + SUM(CASE MONTH(`create_time`) WHEN '12' THEN 1 ELSE 0 END) AS `12月` +FROM `t_user` # 根据自身需要确定实际业务表 +WHERE YEAR(`create_time`)= YEAR(NOW()); +``` diff --git a/repos/solutions/index.md b/repos/solutions/index.md new file mode 100644 index 000000000..353228e13 --- /dev/null +++ b/repos/solutions/index.md @@ -0,0 +1,12 @@ +--- +editLink: false +lastUpdated: false +aside: false +--- + +# 方案春秋志 + +::: tip 笔者说 +上学的时候除了有错题本之外,一般还会额外准备一个用来记录名言佳剧的本子,按当时的意图是希望日积月累来提升写作能力。 +在写代码的时候,经常会想到或遇到一些小方案,在此记录下来,大抵亦是如此。 +::: \ No newline at end of file