策略+异常+集合 综合案例(签到系统)

该程序是一个基于Java的签到系统,使用ArrayList管理签到记录。用户可以选择签到、签退或查看签到表,系统会检查并处理异常情况。签到和签退通过实现SignStrategy接口的类处理,使用LocalTime记录时间。签到时检查重复,签退则根据姓名查找并更新签退时间。
摘要由CSDN通过智能技术生成
//主方法包
import java.util.ArrayList;
import java.util.Scanner;

public class AppUse {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<People> list = new ArrayList<>();  //签到、签退、查看都围绕集合操作
        SignService signService = new SignService();

        lo:
        while (true) {
            System.out.println("-------------欢迎来到签到系统-------------");
            System.out.println("请输入当前所需操作");
            System.out.println("1.签到 2.签退 3.查看签到表 4.退出系统:\n请输入你的选择:");
            String option = sc.next();
            switch (option) {
                case "1":
                    signService.signService( new SignIn(),list);    //记住将list传入

                    break;
                case "2":
                    signService.signService(new SignOut(),list);   //记住将list传入

                    break;
                case "3":
                    signService.signService(new ShowAll(),list);   //记住将list传入

                    break;
                case "4":
                    System.out.println("感谢您的使用,再见。");
                    break lo;  //停止while循环
                default:
                    System.out.println("请输入正确信息");
            }
        }
    }
}
//签到方法包
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Scanner;

public class SignIn implements SignStrategy{

    @Override
    public void systemMethod(ArrayList<People> list) throws SignInException {
        //录入姓名
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入签到姓名:");
        String name1="";
        while(true){//循环判断姓名是否存在
            name1 = sc.next();
            int index = SignStrategy.getIndex(name1,list);
            if(index==-1) {
                //名字不重复,可以使用
                //生成签到时间
                LocalTime signIn = LocalTime.now();
                //生成空的签出时间
                LocalTime signOut = LocalTime.of(00, 00, 00);
                //封装
                People guy = new People(name1, signIn, signOut);
                //添加进集合
                list.add(guy);
                System.out.println("签到成功!");
                break;
            }else {  //姓名已存在
                throw new SignInException("已签到,请勿重复签到。");
            }
        }
    }
}

//签出方法包
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Scanner;

public class SignOut implements SignStrategy {

    @Override
    public void systemMethod(ArrayList<People> list) throws SignOutException{
        //录入名字
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入签退姓名:");
        String name2 = sc.next();
        //调用getIndex方法
        int index = SignStrategy.getIndex(name2,list);
        //判断是否-1,根据索引签退或抛出异常
        if(index==-1){
            throw new SignOutException("查无此人,请重新输入:");
        }else{
            //姓名存在,根据索引添加登出时间
            LocalTime signOut = LocalTime.now();
            //重新获取一次签到时间以便封装
            LocalTime signIn = list.get(index).getSignIn();
            //将签到时间、签退时间和姓名封装为People对象
            People guy = new People(name2,signIn,signOut);
            //修改集合中的元素为新封装的guy
            list.set(index,guy);
            System.out.println("签退成功!");

        }
    }
}
//查看签到表方法包
import javafx.scene.input.DataFormat;
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;

public class ShowAll implements SignStrategy {


    @Override
    public void systemMethod(ArrayList<People> list) throws someException{
        if (list.size() == 0) {
            throw new someException("查无信息");
        } else {

            System.out.println("姓名\t\t\t签到时间\t\t\t\t签退时间\t\t\t\t历经时长");
            for (int i = 0; i < list.size(); i++) {
                if(list.get(i).getSignOut().equals(LocalTime.MIDNIGHT)){    //通过签退时间是否等于00:00:00判断是否签退
                    System.out.println(list.get(i).getName()
                            + "\t\t\t" + list.get(i).getSignIn()
                            + "\t\t" + "未签退"
                            + "\t\t\t\t"+"未签退");
                }else {   //若已签退
                    Duration duration = Duration.between(list.get(i).getSignIn(),list.get(i).getSignOut());  //计算间隔
                    System.out.println(list.get(i).getName()
                            + "\t\t\t" + list.get(i).getSignIn()
                            + "\t\t" + list.get(i).getSignOut()
                            + "\t\t"+turnTime(duration.getSeconds()));
                }
            }
        }
    }
}


//People类  存放姓名时间
import java.time.LocalTime;
public class People {
    private String name;    //用新版时间类操作,最后需要类型转换
    private LocalTime signIn; //签退时间 同上
    private LocalTime signOut;

    public People(String name, LocalTime signIn, LocalTime signOut) {
        this.name = name;
        this.signIn = signIn;
        this.signOut = signOut;
    }
    public String getName() {
        return name;
    }
    public LocalTime getSignIn() {
        return signIn;
    }
    public LocalTime getSignOut() {
        return signOut;
    }
}

//异常捕捉
import java.util.ArrayList;
public class SignService {
    public void signService(SignStrategy Method,ArrayList<People> list){
        try{
            Method.systemMethod(list);
        }
            catch (SignInException e){
            System.out.println(e.getMessage());
        } catch (someException d) {
            System.out.println(d.getMessage());
        } catch (SignOutException f) {
            System.out.println(f.getMessage());
        }
    }
}
//策略接口
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;

public interface SignStrategy {
    //从抽象方法开始都要保证能接受同一个list
    void systemMethod(ArrayList<People> list) throws someException,SignInException,SignOutException;

    
    //此处保存一个获取索引的方法
    public static int getIndex(String name, ArrayList<People> list) {
        //遍历集合,获取每一个姓名
        for (int i = 0; i < list.size(); i++) {
            People guy = list.get(i);
            //对比取出的姓名和要查找的姓名
            if (guy.getName().equals(name)) {
                //找到了
                return i;
            }
        }
        //没找到,返回-1
        return -1;
    }

    
    //此处保存一个将秒数转换为hh:MM:ss时间的方法
    default LocalTime turnTime(long seconds){
        Duration duration = Duration.ofSeconds(seconds); // 将秒数转换为持续时间
        LocalTime localTime = LocalTime.ofSecondOfDay(duration.getSeconds()); // 将持续时间转换为 LocalTime 类型
        return localTime; // 输出
    }
}

设定异常

public class someException extends Throwable {
    public someException(String e) {
        super(e);
    }
}
public class SignInException extends Exception {
    public SignInException(String e) {
        super(e);
    }
}
public class SignOutException extends Exception {
    public SignOutException(String d) {
        super(d);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot是一个开源的Java框架,用于快速构建基于Java的企业级应用程序。Vue是一个开源的JavaScript框架,用于构建用户界面。 在你提到的日历签到系统中,可以使用Spring Boot作为后端框架,提供API接口和数据处理功能。Vue可以作为前端框架,用于构建用户界面,与后端进行数据交互和展示。 首先,你可以使用Spring Boot创建一个基本的Java项目。在项目中,你可以定义用户类、签到记录类等实体类,用于存储用户和签到信息。 接下来,你可以使用Spring Boot的数据库操作技术,如JPA或MyBatis,创建数据库表和关联关系。你可以创建用户表和签到记录表,将用户和签到信息存储在数据库中。 然后,你可以使用Spring Boot编写API接口,用于处理用户的注册、登录、签到等功能。通过定义控制器类和相应的方法,你可以实现用户的注册、登录和签到逻辑。 在前端方面,你可以使用Vue创建一个单页应用程序。你可以使用Vue的组件化思想,将用户界面分解为多个可重用的组件。你可以创建日历组件、签到记录组件等,然后将它们组合在一起。 通过Vue的路由功能,你可以定义不同页面之间的跳转和关系。例如,你可以创建一个注册页面、登录页面和签到页面,并通过路由进行相应的跳转。 最后,你可以使用Vue的异步请求功能,通过API接口与后端进行数据交互。你可以发送请求,获取用户和签到信息,并在前端展示出来。 总的来说,通过使用Spring Boot构建后端API接口,Vue构建前端用户界面,你可以实现一个基于Spring Boot和Vue的日历签到系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LU-Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值