SpringBoot3+Vue3 开发高并发秒杀抢购系统「慕ke」

84 阅读11分钟

SpringBoot3+Vue3 开发高并发秒杀抢购系统

核心代码,注释必读

// download:3w ukoou com

微服务架构

单体式架构与微服务架构 单体式架构与微服务架构 传统的应用构建方法专注于单体式架构。在单体式架构中,一个应用内的所有功能和服务都锁在一起,作为一个单元来运行。以任何方式对应用进行增添或改进时,其架构会变得愈加复杂。这使得在不拆开整个应用的前提下,优化应用中的任何单一功能变得更加困难。这也意味着,如果应用中的一个进程需要扩展,那么整个应用也都必须扩展。

在微服务架构中,应用中的每一核心功能独立运行。这样,开发团队可以构建和更新新的组件,以满足不断变化的业务需求,而不必中断整个应用。

面向服务的架构与微服务架构 微服务架构是面向服务的架构(SOA)的一种演进。这两种方法的相似之处在于,它们都将庞大、复杂的应用分解为更易处理的较小组件。由于它们的相似性,人们经常将 SOA 和微服务架构相混淆。二者的主要区别是它们的范围:SOA 是一种企业级的架构方案,而微服务则是应用开发团队的一种实施策略。

微服务架构的优势 微服务可通过分布式部署,大幅提升您的团队和日常工作效率。您还可以并行开发多个微服务。这意味着更多开发人员可以同时开发同一个应用,进而缩短开发所需的时间。

SpringBoot3+Vue3 开发高并发秒杀抢购系统 - 自定义日期工具类-DateUtil

import cn.hutool.core.date.DateUtil;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * cn.hutool.core.date.DateUtil#date() 当前时间
 * cn.hutool.core.date.DateUtil#dateSecond() 当前时间-忽略毫秒部分
 */
public class ShunShunDateUtil {

    /**
     * 1、获取当前时间
     * @return
     */
    public static Date getCurrentDate(){
        return DateUtil.date();
    }

    /**
     * 2、获取当前时间的时间戳(毫秒级)
     * @return 时间
     */
    public static long getCurrentTimestampMS() {
        return DateUtil.current();
    }

    /**
     * 3、获取当前时间的时间戳(秒级)
     * @return 当前时间秒数
     * @since 4.0.0
     */
    public static long getCurrentTimestampS() {
        return DateUtil.currentSeconds();
    }

    /**
     * 4、当前时间格式化,格式 yyyy-MM-dd HH:mm:ss
     * @return 当前时间的标准形式字符串
     */
    public static String now() {
        return DateUtil.now();
    }

    /**
     * 5、当前日期格式化,格式 yyyy-MM-dd
     * @return 当前日期的标准形式字符串
     */
    public static String today() {
        return DateUtil.today();
    }

    /**
     * 1、获得指定日期所属季度,从1开始计数
     * 2、获得指定日期的月份,从0开始计数
     * 3、获得指定日期是所在年份的第几周
     * 4、获得指定日期是所在月份的第几周
     * 5、获得指定日期是这个日期所在月份的第几天
     * 6、获得指定日期是这个日期所在月份的第几天
     * 7、获得指定日期是星期几,1表示周日,2表示周一
     * 8、判断指定日期是否为周末(周六或周日)
     * 9、获得指定日期的小时数部分、分钟数部分、秒数部分、毫秒数部分
     * 10、判断当前日期 是否为上午、是否为下午、是否为今年
     * 11、返回当前日期的 月份、所在年份的第几周、所在月份的第几周、是这个日期所在月份的第几天、是星期几、小时数部分、分钟数部分、秒数部分、毫秒数部分
     * 12、获得指定日期年份和季节、获得指定日期区间内的年份和季节
     * 13、格式化日期时间、根据特定格式格式化日期、格式化日期时间、仅格式化日期部分、仅格式化时间、格式化为Http的标准日期格式、格式化为中文日期格式
     * 14、解析UTC时间
     * 15、解析CST时间
     * 16、获取秒级别的开始时间、获取秒级别的结束时间
     * 17、获取某小时的开始时间/结束时间、获取某分钟的开始时间/结束时间、、获取某天的开始时间/结束时间、、获取某周的开始时间/结束时间、获取某月的开始时间、获取某季度的开始时间、获取某年的开始时间
     * 18、获取同一时刻 昨天、明天、上周、下周、上个月、下个月、
     * 19、偏移毫秒数、秒数、分钟、小时、偏移天、偏移周、偏移月
     * 20、获取指定日期偏移指定时间后的时间,生成的偏移日期不影响原日期
     * 21、判断两个日期相差的时长、判断两个日期相差的毫秒数、判断两个日期相差的天数
     * 22、计算指定时间区间内的周数、计算两个日期相差月数、计算两个日期相差年数、
     * 23、当前日期是否在日期指定范围内、是否为相同时间
     * 24、比较两个日期是否为同一天、比较两个日期是否为同一周、比较两个日期是否为同一月
     * 25、计时,常用于记录某段代码的执行时间
     * 26、计时器
     * 27、生日转为年龄,计算法定年龄、是否闰年
     * 28、计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
     * 29、判定给定开始时间经过某段时间后是否过期、判定在指定检查时间是否过期
     * 30、HH:mm:ss 时间格式字符串转为秒数、秒数转为时间格式
     * 31、创建日期范围生成器
     * 32、俩个时间区间取交集、俩个时间区间取差集
     * 33、按日期范围遍历、创建日期范围生成器
     * 34、通过生日计算星座、计算生肖
     * 35、安全的日期比较
     * 36、纳秒转毫秒、纳秒转秒
     * 37、{@link Date} 转换为 {@link LocalDateTime},使用系统默认时区
     * 38、获得指定年份的总天数、获得指定月份的总天数、
     * 39、 创建{@link SimpleDateFormat}
     * 40、获取时长单位简写
     */

    public static void main(String[] args) {

    }


}

二、自定义日期工具类-LocalDateUtils

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import lombok.extern.slf4j.Slf4j;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * LocalDateTime工具类
 *  LocalDateTime年月日十分秒;LocalDate日期;LocalTime时间;
 *  LocalDateTime 类型都带的有毫秒
 */
@Slf4j
public class LocalDateUtils {

    /**
     * hutool工具包提供的LocalDateTime工具类
     *      cn.hutool.core.date.LocalDateTimeUtil
     * 1、获取当前时间
     * 2、毫秒转{@link LocalDateTime}
     * 3、{@link Date}转{@link LocalDateTime}
     * 4、格式化日期时间为yyyy-MM-dd HH:mm:ss格式、格式化日期时间为指定格式、格式化日期时间为yyyy-MM-dd格式
     * 5、日期偏移
     * 6、获取两个日期的差
     * 7、修改为一天的开始时间、修改为一天的结束时间
     * 8、是否为周末(周六或周日)、获取{@link LocalDate}对应的星期值
     * 9、检查两个时间段是否有时间重叠
     * 10、获得指定日期是所在年份的第几周
     * ...
     */

    public static void main(String[] args) {
       

    }



    /**
     * 比较两个时间的先后
     * @param time1
     * @param time2
     * @return
     *  0、相等
     *  -1、time1小于time2
     *  1、tim1大于time2
     */
    public static Integer compareLocalDateTime(LocalDateTime time1,LocalDateTime time2){
        if(time1.equals(time2)){
            return 0;
        }else if(time1.isBefore(time2)){
            return -1;
        }else{
            return 1;
        }
    }

    /**
     * LocalDateTime 转 LocalDate
     * @param time
     * @return (注意带了毫秒)
     */
    private static LocalDate localdatetimeToDate(LocalDateTime time){
        LocalDate localDate=time.toLocalDate();
        log.info("localDate = " + localDate.toString());
        return localDate;
    }

    /**
     * LocalDateTime 转 LocalTime
     * @param time
     * @return (注意带了毫秒)
     */
    private static LocalTime localdatetimeToTime(LocalDateTime time){
        LocalTime localTime=time.toLocalTime();
        log.info("localTime = " + localTime.toString());
        return localTime;
    }


    /**
     * 拆解时间子项
     * @param time
     * @param type
     *      0、获取年份
     *      1、获取月份
     *      2、获取日期为所在月的几号
     *      3、获取日期为周几(LocalDateTime---星期一为周一)
     *      4、获取日期为当年的第几天
     *      5、获取小时
     *      6、获取分钟
     *      7、获取秒
     * @return
     */
    public static Integer dismantleTime(LocalDateTime time, int type){
        switch (type){
            case 0:
                return time.getYear();
            case 1:
                return time.getMonthValue();
            case 2:
                return time.getDayOfMonth();
            case 3:
                return time.getDayOfWeek().getValue();
            case 4:
                return time.getDayOfYear();
            case 5:
                return time.getHour();
            case 6:
                return time.getMinute();
            case 7:
                return time.getSecond();
            default:
                return 0;
        }
    }
    
    /**
     * LocalDateTime转换为Date
     *
     * @param dateTime 日期时间
     * @return Date
     */
    public static Date toDate(LocalDateTime dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
        String dateString = simpleDateFormat.format(date);
        Date result = null;//parse():String--->date
        try {
            result = simpleDateFormat.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }

    
}

三、日期处理小测试

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @author oldA
 * @Description
 * @date 2023/6/28
 */
public class LocalDateTest {
    public static void main(String[] args) {
        //1、获取当前时间
        //2、自定义时间
        //3、拆解时间子项
        //4、 Date 转LocalDate
        //4、LocalDateTime 转 LocalTime(时间)
        //5、LocalDateTime 转 LocalDate(日期)
        //6、比较两个时间的先后
        //7、格式化日期时间为yyyy-MM-dd HH:mm:ss格式
        //8、格式化日期时间为指定格式
        //9、格式化日期时间为yyyy-MM-dd格式
        //10、获取一天的起始和结束一刻-MM-dd格式
        //11、日期偏移(加一天、减一天)
        //12、获取昨天的起始和结束一刻
        //13、获取昨天两个月前的起始时间
        //14、获取当前日期所在月份的起始时间和结束时间

        //1、获取当前时间
        LocalDateTime nowLocalDateTime= LocalDateTimeUtil.now();
        //2、自定义时间
        LocalDateTime oFnocalDateTime= LocalDateTime.of(2022,10,16,20,50,50,50);
        //2.1、 Date 转LocalDate
        LocalDateTime localDateTime=LocalDateTimeUtil.of(DateUtil.date());

        for (int i = 0; i < 8; i++) {
            //3、拆解时间子项 返回年月日时分秒
            System.out.println("i = " + LocalDateUtils.dismantleTime(oFnocalDateTime,i));
        }

        //4、 LocalDateTime 转 LocalTime(时间)
        System.out.println(LocalDateUtils.localdatetimeToTime(nowLocalDateTime));
        //5、 LocalDateTime 转 LocalDate(日期)
        System.out.println(LocalDateUtils.localdatetimeToDate(nowLocalDateTime));

        //6、比较两个时间的先后
        System.out.println(LocalDateUtils.compareLocalDateTime(oFnocalDateTime,nowLocalDateTime));


        //7、格式化日期时间为yyyy-MM-dd HH:mm:ss格式
        System.out.println(LocalDateTimeUtil.formatNormal(nowLocalDateTime));
        //8、格式化日期时间为指定格式
        System.out.println(LocalDateTimeUtil.format(nowLocalDateTime,"yyyy/MM/dd"));
        //8,1、格式化日期时间为yyyy-MM-dd格式
        System.out.println(LocalDateTimeUtil.formatNormal(localDateTime));


        //9、获取一天的起始和结束一刻
        System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.beginOfDay(oFnocalDateTime))));
        System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.beginOfDay(oFnocalDateTime))));



        //10、日期偏移 (可操作任意类型 天、小时、月份等)
        //10.1、 加一天
        System.out.println(String.format("%s>>>>>>%s","日期偏移+加一天",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.offset(oFnocalDateTime,1, ChronoUnit.DAYS))));
        //10.2、减一天
        System.out.println(String.format("%s>>>>>>%s","日期偏移+减一天",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.offset(oFnocalDateTime,-1, ChronoUnit.DAYS))));




        //11、获取昨天的起始和结束一刻
        LocalDateTime yesterDayTime=LocalDateTimeUtil.offset(oFnocalDateTime,-1, ChronoUnit.DAYS);
        LocalDateTime yesterdayTimeBegin=LocalDateTimeUtil.beginOfDay(yesterDayTime);
        LocalDateTime yesterdayTimeEnd=LocalDateTimeUtil.endOfDay(yesterDayTime);
        System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",LocalDateTimeUtil.formatNormal(yesterdayTimeBegin)));
        System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",LocalDateTimeUtil.formatNormal(yesterdayTimeEnd)));


        //12、获取昨天两个月前的起始时间
        LocalDateTime temp1=LocalDateTimeUtil.offset(yesterDayTime,-2, ChronoUnit.MONTHS);
        LocalDateTime temp2=LocalDateTimeUtil.beginOfDay(temp1);
        System.out.println(String.format("%s>>>>>>%s","获取昨天两个月前的起始时间",LocalDateTimeUtil.formatNormal(temp2)));

        //13、获取当前日期所在月份的起始时间和结束时间
        Date temp3=LocalDateUtils.toDate(oFnocalDateTime);
        //获取某月的开始时间
        Date beginOfMonth=DateUtil.beginOfMonth(temp3);
        //获取某月的结束时间
        Date endOfMonth=DateUtil.endOfMonth(temp3);
        System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.of(beginOfMonth))));
        System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.of(endOfMonth))));


    }
}
import cn.hutool.core.date.DateUtil;
import java.util.Calendar;
import java.util.Date;

/**
 * @author oldA
 * @Description
 * @date 2023/6/28
 */
public class DateTest {
    public static void main(String[] args) {
        //1、获取当前时间
        //2、自定义时间
        //3、比较两个时间
        //4、格式化日期时间为yyyy-MM-dd HH:mm:ss
        //5、根据特定格式格式化日期
        //6、获取一天的起始和结束一刻
        //7、日期偏移(加一天、减一天)
        //8、获取昨天的起始和结束一刻
        //9、获取昨天两个月前的起始时间
        //10、获取当前日期所在月份的起始时间和结束时间

        //1、获取当前时间
        Date currentDate=ShunShunDateUtil.getCurrentDate();

        //2、自定义时间
        Calendar calendar=Calendar.getInstance();
        calendar.set(2022,10,16,20,50,50);
        Date customDate=DateUtil.date(calendar);

        //3、比较两个时间
        System.out.println(DateUtil.compare(currentDate,customDate));

        //4、格式化日期时间为yyyy-MM-dd HH:mm:ss
        System.out.println(DateUtil.formatDateTime(customDate));

        //5、根据特定格式格式化日期
        System.out.println(DateUtil.format(customDate,"yyyy/MM/dd"));

        //6、获取一天的起始和结束一刻
        System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",DateUtil.formatDateTime(DateUtil.beginOfDay(customDate))));
        System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",DateUtil.formatDateTime(DateUtil.endOfDay(customDate))));



        //7、日期偏移 (可操作任意类型 天、小时、月份等)
        //7.1、 加一天
        System.out.println(String.format("%s>>>>>>%s","日期偏移+加一天",DateUtil.formatDateTime(DateUtil.offsetDay(customDate,1))));
        //7.2、减一天
        System.out.println(String.format("%s>>>>>>%s","日期偏移+减一天",DateUtil.formatDateTime(DateUtil.offsetDay(customDate,-1))));




        //8、获取昨天的起始和结束一刻(偏移量影响原日期、如不想影响可使用offset)
        Date yesterDayTime=DateUtil.offsetDay(customDate,-1);
        Date yesterdayTimeBegin=DateUtil.beginOfDay(yesterDayTime);
        Date yesterdayTimeEnd=DateUtil.endOfDay(yesterDayTime);
        System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",DateUtil.formatDateTime(yesterdayTimeBegin)));
        System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",DateUtil.formatDateTime(yesterdayTimeEnd)));


        //9、获取昨天两个月前的起始时间(偏移量影响原日期、如不想影响可使用offset)
        Date temp1=DateUtil.offsetMonth(yesterDayTime,-2);
        Date temp2=DateUtil.beginOfDay(temp1);
        System.out.println(String.format("%s>>>>>>%s","获取昨天两个月前的起始时间",DateUtil.formatDateTime(temp2)));

        //10、获取当前日期所在月份的起始时间和结束时间
        //获取某月的开始时间
        Date beginOfMonth=DateUtil.beginOfMonth(customDate);
        //获取某月的结束时间
        Date endOfMonth=DateUtil.endOfMonth(customDate);
        System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",DateUtil.formatDateTime(beginOfMonth)));
        System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",DateUtil.formatDateTime(endOfMonth)));
    }
}