学习通项目需要用到的

news2024/11/29 1:44:24

 思路:

  • 把长连接弄好
  • 课堂详细页面可以看到班级的所有学生,双击学生弹窗,可以确认从该课程中移除学生
  • 教师可以在班级详细页面通过输入学生的id,将学生加入该班级
  • 做好签到的页面,输入签到标题,选择签到的结束时间,点击确认签到
  • 老师可以添加学生,可以移除学生
  • 创建班级的时候,用一个成员变量记录当前的时间,加入课程的时候

最近完成了:

  • 教师双击课程页面中的课程,进入课堂活动页面。其中实现了发布随机选人。

 接下来是实现:学生在课堂里面可以查看随机选人的结果

正则表达式:

http://t.csdn.cn/xgyrZ

JavaFX 中 ListView的用法:

        //可以在Listview上显示1
        ObservableList<String>list= FXCollections.observableArrayList();
        list.add("1");
        courseListView1.setItems(list);
        courseListView1.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

其中的courseListview1是定义在fx :id处的

JavaFX给ListView添加点击事件:

//双击事件
        courseListView1.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if (event.getButton().equals(MouseButton.PRIMARY)) {
                        State stage=new Stage;
                        stage.show();
                    }
                }
            }
        });

雪花算法:

//新建一个类
public class SnowflakeIdGenerator {
    private final long twepoch = 1288834974657L;
    private final long workerIdBits = 5L;
    private final long datacenterIdBits = 5L;
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    private final long sequenceBits = 12L;
    private final long workerIdShift = sequenceBits;
    private final long datacenterIdShift = sequenceBits + workerIdBits;
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
    private long workerId;
    private long datacenterId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;

    public SnowflakeIdGenerator(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    public synchronized long nextId() {
        long timestamp = timeGen();

        if (timestamp < lastTimestamp) {
            throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }

        lastTimestamp = timestamp;

        return ((timestamp - twepoch) << timestampLeftShift) |
                (datacenterId << datacenterIdShift) |
                (workerId << workerIdShift) |
                sequence;
    }

    private long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }
}

在要获取id的地方,新建一个方法:

    public static String createCode(){
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);
        long id = idGenerator.nextId();
        String username = String.format("%011d", id % 100000000000L);
        return username;
    }

双击事件:

courseListView1.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                  //在里面写要进行的操作
                  //显示新页面
                  stage.setScene(new Scene());
                  stage.show();
                   
            }
        });

警告及提示的使用:

新建一个类:

public class Warning {
    public static void page(Alert.AlertType alertType,String title,String content)
    {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(content);
        alert.showAndWait();
    }
}

调用时使用:

//警告
Warning.page(Alert.AlertType.ERROR,"Waring","User1 does not exist or email does not match");//传入的第一个是警告,第二个是窗口标题,第三个是提示信息
//提示           
Warning.page(Alert.AlertType.CONFIRMATION,"Success","Created successfully");
//传入的第一个是提示,第二个是窗口标题,第三个是提示信息

发送邮箱:

先新建一个类,用来发送邮箱:

public class SendEmail {
    public static void sendEmail(String sendAddress, String title, String contend, String copySendAddress) throws MessagingException {
        Properties properties=new Properties();

        //设置服务器名称
        properties.setProperty("mail.host","smtp.qq.com");
        //设置邮箱的传输协议
        properties.setProperty("mail.transport.protocol","smtp");
        //设置是否要验证服务器用户名和密码
        properties.setProperty("mail.smtp.auth","true");

        //1.创建客户端和邮箱服务器对象
        Session session=Session.getInstance(properties);

        //2.开启session的debug模式,方便查看发送的email的运行状态
        session.setDebug(true);

        //3.用过session得到transport传输对象
        Transport transport=session.getTransport();

        //4.使用用户名密码连接邮箱服务器
        transport.connect("smtp.qq.com","2171204141@qq.com","quydlpssavwwdhhg");

        //5.创建邮件
        Message message=createSimpleMail(session,sendAddress,title,contend,copySendAddress);

        //6.发送邮件
        transport.sendMessage(message,message.getAllRecipients());
        transport.close();
    }
    private static Message createSimpleMail(Session session, String sendAddress, String title, String content, String copySendAddress) throws MessagingException {
        //创建邮件对象
        MimeMessage message=new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("2171204141@qq.com"));
        //指明邮件的收件人
        message.setRecipients(Message.RecipientType.TO, String.valueOf(new InternetAddress(sendAddress)));
        //邮件的标题
        message.setSubject(title);
        //邮件的内容
        message.setContent(content,"text/html;charset=UTF-8");
        //设置抄送人
        message.setRecipients(Message.RecipientType.CC,InternetAddress.parse(copySendAddress));
        return message;
    }

    public  void main(String[] args) throws MessagingException {
        sendEmail("2171204141@qq.com","验证码","con","2171204141@qq.com");
    }
}

新建一个类用来获取随机验证码,并且调用上一个类中的方法:

public class ObtainCode {
    public static String obtainCode(String emailField) throws MessagingException {
        Random r=new Random();
        int random = r.nextInt(1000000);
        String strCode=String.format("%06d", random);
        String str="验证码为:"+strCode+",此验证码三分钟内有效。";
        System.out.println("发送邮箱前");
        SendEmail.sendEmail(emailField,"学习通",str,emailField);
        System.out.println(strCode);

        return strCode;
    }

}

使用时要传入接受者的邮箱:

String strCode= ObtainCode.obtainCode("*********");

序列化和反序列化:

在User类中加入要传输的变量,实现的功能是:通过序列化将客户端的变量一次传个服务端(也可以反过来,将服务端的信息(比如服务端读取数据课库中的信息)传给客户端)。

             //序列化
            Gson gson = new Gson();
            user = gson.fromJson(responseParts[1], User.class);
            System.out.println("反序列化后: " + user);


            //反序列化
            Gson gson = new Gson();
            user = gson.fromJson(userJson, User1.class);//User1.class自动赋值

解析:将User类中的其中User是创建在客户端的一个类,User1是创建在服务端的一个类,这两段分别放在客户端和服务端。其中User类和User1类最好是一样的,当中都是成员变量和get、set方法,也可以将接收端的set方法删去,因为用不到。

隐藏的方法:

在客户端中,教师和学生的功能不相同,所以在学生端需要隐藏某些按键(比如我教的课,发布签到,作业等)。

    public class MainInterfaceController implements Initializable{
        @FXML
        private Tab test;
        @FXML
        private TabPane test1;
        public void initialize(URL location, ResourceBundle resourceBundle){
            test1.getTabs().remove(test);
        }
    }

其中URL选择第一个类。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转计算机组成原理--指令系统

目录 一、机器指令 1.1指令的一般格式 1.操作码: 2.地址码 1.2指令字长 二、操作数类型和操作类型 2.1操作数类型 2.2操作类型 三、寻址方式(重要) 3.1指令寻址 1.顺序寻址 2.跳跃寻址 3.2数据寻址 1.立即寻址 2.直接寻址 3.隐含寻址 4.间接寻址 5.寄存器寻址 …

创作星-创意大爆发!AI文案生成器让创作轻松快捷,轻松撰写出热门标题。

一、创作星-创意大爆发&#xff01;AI文案生成器让创作轻松快捷&#xff0c;轻松撰写出热门标题。 ✨使用“创作星”&#xff0c;让AI帮你生成惊艳的文案&#xff01; ✨创意大爆发&#xff01;AI文案生成器让创作轻松快捷&#xff0c;轻松撰写出热门标题。 ✨AI文案神器&…

【Linux指令④】Linux查看日历、时间、打包压缩文件、Linux中的计算器,常用热键 关机指令

Linux指令 ❀date❀cal❀findwhichwhereis ❀grep❀zip/unzip❀tar❀bc❀常用的热键❀关机&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f389;系列专…

kubectl常用命令|pod生命周期|金丝雀发布|超详细

kubectl常用命令|pod生命周期|金丝雀发布|超详细 一 kubectl常用命令1.1 查看版本信息1.2查看资源对象简写1.3查看集群信息1.4 配置kubectl自动补全1.5node节点查看日志 二 k8s基本信息查看2.1 查看 master 节点状态2.2 查看命令空间2.3 创建和删除命名空间2.4 在命名空间kube-…

python读写json文件方法详解

在我们日常使用 Python时&#xff0c;经常会使用到 json文件。那么在平时写一些小程序时&#xff0c;如何使用 json文件呢&#xff1f;今天我将介绍如何读取和写入 Json文件。 json是一种数据结构&#xff0c;它是将字符串转换成数据的一种技术。使用 json可以非常方便的将一组…

在CentOS上安装Docker的步骤

在CentOS上安装Docker的步骤如下&#xff1a; 更新系统&#xff1a; sudo yum update 添加Docker官方存储库&#xff1a; sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum-config-manag…

FL 3D segment

HarmoFL&#xff1a;在异构医学图像联邦学习中协调本地和全局漂移 多个医疗机构联合使用联邦学习&#xff08;FL&#xff09;训练模型已成为最大化数据驱动模型潜力的有前途的解决方案&#xff0c;但医学图像中的非独立和非同分布&#xff08;non-iid&#xff09;数据仍然是实…

支付系统设计三:渠道网关设计03-参数验证

文章目录 前言一、参数校验1. MessageDescription内容2. 参数验证执行器3. 字段验证处理器4. 验证器工厂5. style校验器6. 验证器接口7. 长度校验器8. 枚举类型校验器9. yml配置9.1 deduct.yml9.2 style.yml 二、幂等校验总结 前言 在《支付系统设计三&#xff1a;渠道网关设计…

linux内核编译不通过问题的两种排查方法(非正式)

目录 一、前言 二、 问题现象 三、问题排查思路1&#xff1a;问题所在处向上排查 3.1 整体思路 3.2 排查过程 3.3 资料查询 3.4 尝试动作1&#xff1a;开启相应配置项 3.4.1 检查内核配置项 3.4.2 开启配置项 3.4.3 尝试编译 四、问题排查思路2&#xff1a;从上向下排…

讯飞星火大模型体验报告

近日&#xff0c;科大讯飞召开了星火认知大模型成果发布会&#xff0c;会上表示讯飞星火大模型将突破开放式问答&#xff0c;对标ChatGPT&#xff0c;在中文能力上超过ChatGPT&#xff0c;在英文能力上与ChatGPT相当。对此&#xff0c;你怎么看&#xff1f; 笔者准备给bing/ch…

数据结构第二天:File Transfer 【树的应用:集合】

原题是英文的&#xff1a;题目详情 - 05-树8 File Transfer (pintia.cn) 我用软件翻译了一下: 我们有一个计算机网络和一系列双向连接。这些连接中的每一个都允许文件从一台计算机传输到另一台计算机。有没有可能从网络上的任何一台计算机向其他计算机发送文件? Input Specif…

STM32 学习笔记_7 定时器中断:输出比较

输出比较 电机相关比较重要。 OC Output Compare&#xff08;IC 是输入捕获&#xff0c;CC代指这两个单元&#xff09;&#xff0c;用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有&#xff0c;共用一个cnt计数器&#xff0c;高级计数…

(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例

文章目录 一&#xff1a;频域高通滤波&#xff08;1&#xff09;理想的高通滤波器&#xff08;2&#xff09;巴特沃斯高通滤波器&#xff08;3&#xff09;指数高通滤波器&#xff08;4&#xff09;梯形高通滤波器 二&#xff1a;综合案例——人像美化&#xff08;1&#xff09…

C语言函数大全-- w 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcstok 1.1 函数说明 函数声明函数功能wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串&#xff08;标记&#xff09;&#xff0c;并返回第一个标记的地…

非煤矿山电子封条建设算法 yolov8

非煤矿山电子封条建设算法模型通过yolov8网络模型AI视频智能分析技术&#xff0c;算法模型对作业状态以及出井入井人员数量变化、人员睡岗离岗等情况实时监测分析&#xff0c;及时发现异常动态&#xff0c;自动推送生成的违规截图报警信息。现代目标检测器大部分都会在正负样本…

免费下载Sketch模板素材一文搞定!

对于设计师来说&#xff0c;UI 模板素材是提高设计效率和保证设计质量的重要工具。然而&#xff0c;很多设计师在使用 Sketch 时&#xff0c;会遇到 Sketch 模板素材不足、格式不兼容或使用成本高等问题。本文将为你介绍一款资源齐全、跨平台、无需下载、免费使用的 Sketch 模板…

Tips for Deep Learning

目录 Recipe of Deep Learning Good Results on Training Data&#xff1f; New activation function Adaptive learning rate Good Results on Testing Data&#xff1f; Early Stopping Regularization Dropout Recipe of Deep Learning 我们要做的第一件事是&#x…

http协议在万维网的一生

tcp与udp的区别 http协议位于应用程序层&#xff0c;必须经过传输层进行通信 tcp即传输控制协议&#xff0c;首先通过三次握手建立连接&#xff0c;然后传输数据&#xff0c;数据传输成功后 通过四次挥手关闭连接&#xff0c;如有数据丢失则会重试保证数据传输可靠性 是一个面向…

树的前中后序以及广度优先搜索和深度优先搜索

文章目录 基本概念定义一棵树前序遍历中序遍历后序遍历BFS广度优先遍历DFS深度优先遍历 基本概念 树是一个有n个有限节点组成一个具有层次关系的集合&#xff0c;每个节点有0个或者多个子节点&#xff0c;没有父节点的节点称为根节点&#xff0c;也就是说除了根节点以外每个节…

TS38.331中need -M/R/N/S 的含义

need M&#xff1a;这种字段需要UE在不存在时维护&#xff1b;need R&#xff1a;当RRC中此字段不存在时&#xff0c;UE需要释放&#xff1b;need N&#xff1a;当此字段不存在时&#xff0c;UE不需要采取任何行动&#xff08;即UE不需要保持该字段的任何现有值&#xff09;&am…