校园教务管理系统

news2025/1/23 21:12:04

   

学年论文(课程设计)

题目    信息管理系统     

校园教务管理系统

摘要:数据库技术是现代信息科学与技术的重要组成部分,是计算机数据处理与信息管理系统的核心,随着计算机技术的发展,数据库技术已经成为网络信息化的基础。本教务管理系统就是让教务人员从繁重的工作中解放出来,使他们在使用一个软件之后能极容易的对所有教务工作进行管理。

Key words:数据库;java;教务管理;图形化设计界面

目  录

1 功能需求.......................................1

1.1 课题介绍......................................1

1.2 工具与知识......................................1

1.3 功能任务......................................1

2  概要设计.....................................2

2.1 流程图....................................2

3 详细设计与实验.................................4

3.1 java文件定义及功能   ..............4

3.2主界面描述.....................4

3.2.1登陆界面.....................4

3.2.2学生端界面....................4

3.2.3 教师端界面......................10

3.2.4 管理员界面......................12

4 测试结果.............................24

4.1 登录界面测试...................................24

4.2学生界面测试................................25

4.3教师界面测试................................28

4.4 管理员界面测试................................30

5 总结........................................36

参考文献........................................37

附录.....................................38      

1  功能需求

    1. 课题介绍

在现代,高科技的飞跃发展,人们工作习惯的改变和电脑的普及,怎样提高工作效率是人们首先考虑的问题,教务管理是一个非常繁琐与复杂的一项工作,对于学校而言,应该运用一些本地资源提高管理力度,提高工作效率。

教务管理系统是一个复杂的计算机网络信息系统,满足各类高校对现在和将来对信息资源采集,存储,处理,组织,管理和利用的需求,实现信息资源的集中管理和统一调度。为信息交流、教务管理提供一个便捷的电子化手段。

    1. 工具与知识

工具:MySQL数据库,IntelliJ IDEA 。

MySQL是一个关系型数据库管理系统,关联数据库将数据库保存在不同的表中,而不是把所有数据放在一个大仓库中,增加了速度和灵活性。MySQL所使用的SQL语言是访问数据库的最常用标准化语言。

IDEA,全称IntelliJ IDEA,是 Java 语言的集成开发环境, IDEA 在业界被公认为是最好的 java 开发工具之一,一旦用上了就会上瘾。尤其在智能代码助手、代码自动提示、重构、 J2EE 支持、 Ant JUnit CVS 整合、代码审查、创新的 GUI 设计等方面的功能可以说是超常的。强大的整合能力。比如: Git Maven Spring  .IntelliJ IDEA 主要用于支持 Java Scala Groovy 等语言的开发工 具,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和 Web 用的开发。

知识:java语言,数据库管理,sql语言

1.3功能任务

  主界面: 1)登录          2)注册

学生功能:1)查询并修改自己个人信息 2)查询本学期课表 

               3)选课、退课       4)选课结果

教师功能:1)查询、修改个人信息   2)查看选课情况

管理员功能:1)课程管理       2)教师管理

                     3)学生管理       4)密码重置

  1. 修改密码

2 概要设计

2.1  流程图

3 详细设计

3.1 java文件定义及功能

  根据实际需要我设计了4个java文件,分别是Student.java,Teacher.java,Administrator.java,Login_up.java。

Student.java是学生类

功能:查询、修改个人信息,查看课表、选课、查看老师信息、查看选课结果。

Teacher.java是教师类

功能:查询、修改个人信息,查看选课结果。

Adminstrator.java管理员类

功能:对课程、老师、学生进行增删改,重置密码、修改密码。

Login_up.java是登录和注册功能。

3.2主界面描述   

3.2.1登陆界面

 学生个人信息储存在数据库student中,包括s_id、姓名等,教师信息存储在Teacher中,包括id、姓名等个人信息。

     用户选择登录身份(学生、教师或管理员),用户名,密码,首先检查用户名在学生表(或教师表)中是否存在,不存在则提示,在进行数据库连接,若成功则密码正确,登录成功,否则密码错误。

流程如右图所示:      

 3.2.2学生端界面

在登录时,用静态变量JTname存储学生的ID。个人信息通过检索数据库表student得到(个人信息的修改也通过修改学生表完成)。

核心代码:

stmt = con.createStatement();

rs = stmt.executeQuery("select *from student where s_id=" + jTName.getText() + "");



while (rs.next()) {



    jLabel1 = new JLabel(" \n学号: " + rs.getString("s_id"));

    jLabel2 = new JLabel(" \n姓名: " + rs.getString("s_name"));

    jLabel3 = new JLabel(" \n性别: " + rs.getString("s_gender"));

    jLabel4 = new JLabel(" \n年龄: " + rs.getString("s_age"));

    jLabel5 = new JLabel(" \n专业: " + rs.getString("s_specialty"));

    jLabel6 = new JLabel(" \n生源: " + rs.getString("s_source"));



}

  核心代码:(其他字段类似)

if (!j_id.getText().isEmpty()) {

    String str = "update  student set s_id="+j_id.getText()+" where s_id="+jTName.getText()+"";

    System.out.println(str);

    try {



        stmt = con.createStatement();

        stmt.executeUpdate(str);

    } catch (SQLException ex) {

        throw new RuntimeException(ex);

    }

}


课程表通过检索选cou_stu表,输出 满足(state=1&&sid=JTname)条件的信息,再拿此信息去遍历course表,输出所有返符合条件的信息。

  核心代码:

Vector rowdata = new Vector();

 Vector titlename = new Vector();//{"学号","姓名","性别","年龄","专业"};

 titlename.add("课序号");

 titlename.add("课程名称");

 titlename.add("授课老师编号");

 titlename.add("上课时间");

 titlename.add("上课地点");

 titlename.add("周数");

 titlename.add("课程类型");

 titlename.add("学分");



 String sql_1="select distinct cid from cou_stu  where state=0 && sid="+jTName.getText();

 System.out.println(sql_1);

 stmt=con.createStatement();

 rs=stmt.executeQuery(sql_1);

 while (rs.next()) {



     System.out.println(rs.getString("cid"));

     String s = "select *from course where c_id=" + rs.getString("cid");

     System.out.println(s);

     stmt1 = con.createStatement();

     ResultSet rs_1 = stmt1.executeQuery(s);

     while (rs_1.next()) {

         Vector hang = new Vector();

         hang.add(rs_1.getString("c_id"));

         hang.add(rs_1.getString("c_name"));

         hang.add(rs_1.getString("c_teacher"));

         hang.add(rs_1.getString("c_time"));

         hang.add(rs_1.getString("c_place"));

         hang.add(rs_1.getString("c_week"));

         hang.add(rs_1.getString("c_type"));

         hang.add(rs_1.getString("c_credit"));

         rowdata.add(hang);

     }

 }

         table1 = new JTable(rowdata,titlename);

选课窗口:通过遍历所有课程,以表格的形式展示再窗口上。学生在文本框里输入课序号,点击确认选课,选课成功后子在cou_stu表中添加了学生的学号、选课的状态以及课程的编号。

核心代码:(退课类似)

  JFrame jf=new JFrame("课程库表");

    jf.setBounds(0,0,600,400);

    JTable jt1=new JTable();

    Vector titlename = new Vector();//{"学号","姓名","性别","年龄","专业"};

    titlename.add("课序号");

    titlename.add("课程名称");

    titlename.add("授课老师编号");

    titlename.add("上课时间");

    titlename.add("上课地点");

    titlename.add("周数");

    titlename.add("课程类型");

    titlename.add("学分");

    Vector rowdata=new Vector();

    stmt=con.createStatement();

    String sql="select * from course ";

    rs=stmt.executeQuery(sql);

    while (rs.next()) {

        Vector hang = new Vector();

        hang.add(rs.getString("c_id"));

        hang.add(rs.getString("c_name"));

        hang.add(rs.getInt("c_teacher"));

        hang.add(rs.getString("c_time"));

        hang.add(rs.getString("c_place"));

        hang.add(rs.getString("c_week"));

        hang.add(rs.getString("c_type"));

        hang.add(rs.getInt("c_credit"));

        rowdata.add(hang);

    }

    JTable jTable=new JTable(rowdata,titlename);//两个Vector

jTable.setEnabled(false);//显示但不可点击



    JScrollPane Scroll=new JScrollPane(jTable);

    jf.add(jTable.getTableHeader(),BorderLayout.NORTH);

    jf.getContentPane().add(Scroll,BorderLayout.CENTER);

    JMenuBar jMenuBar=new JMenuBar();

    jMenuBar.setLayout(null);



    JLabel jLabel=new JLabel("输入课序号");

    jLabel.setBounds(0,0,30,20);

    JTextField jTextField=new JTextField();

    jTextField.setBounds(100,0,10,30);

    JButton jsure=new JButton("确认选课");

    jsure.setBounds(160,0,20,15);

    jMenuBar.add(jLabel);

    jMenuBar.add(jTextField);

    jMenuBar.add(jsure);
jsure.addActionListener(new ActionListener() {

            int flag;

            @Override

            public void actionPerformed(ActionEvent e) {

                String sql = "insert into cou_stu (sid,cid) value (" + jTName.getText() + "," + jTextField.getText() + ")";

                System.out.println(sql);



                try {

                   flag= stmt.executeUpdate(sql);

                } catch (SQLException ex) {



                    JOptionPane.showConfirmDialog(null, "操作失败,下次注意!!!", "信息修改", JOptionPane.YES_NO_CANCEL_OPTION);



                    throw new RuntimeException(ex);

                }

                if (flag != 0) {

                    JOptionPane.showConfirmDialog(null, "操作成功,下次注意!!!", "信息修改", JOptionPane.YES_NO_CANCEL_OPTION);



                }

            }

});

任课老师信息:通过遍历cou_stu表,将符合(sid=JTName)条件的cid输出,在course表中遍历,将得到的一些列教师号到Teacher表中对比以表格形式输出匹配的老师的信息

核心代码:

Vector rowdata=new Vector<>();

Vector head=new Vector();

head.add("课程");

head.add("教师编号");

head.add("姓名");

head.add("性别");

head.add("电话");

head.add("学院");

String sql="select distinct cid from cou_stu where sid="+jTName.getText();

System.out.println(sql);



stmt=con.createStatement();

rs=stmt.executeQuery(sql);

while (rs.next()){

    String sql1="select  c_teacher,c_name from course where c_id="+rs.getString("cid");

    System.out.println(sql1);

    stmt1=con.createStatement();

    rs1=stmt1.executeQuery(sql1);

    while (rs1.next()){

        String sql2="select  id,name,gender,tel,college from teacher where id="+rs1.getString("c_teacher");

        System.out.println(sql2);

        stmt2=con.createStatement();

        rs2=stmt2.executeQuery(sql2);

    while (rs2.next()) {

        Vector hang = new Vector();

        hang.add(rs1.getString("c_name"));

        hang.add(rs2.getString("id"));

        hang.add(rs2.getString("name"));

        hang.add(rs2.getString("gender"));

        hang.add(rs2.getString("tel"));

        hang.add(rs2.getString("college"));

        rowdata.add(hang);

    }

    }

}

选课结果:(与任课老师模块查询方式类似,只是少了一步查询老师的信息。)

核心代码:

Vector rowdata=new Vector();

Vector headtitle=new Vector();

headtitle.add("课序号");

headtitle.add("课程名");

headtitle.add("授课老师编号");

headtitle.add("授课时间");

headtitle.add("授课地点");

headtitle.add("周次");

headtitle.add("课程类型");

headtitle.add("学分");

String sql="select distinct cid from cou_stu where state=1 && sid="+jTName.getText();

System.out.println(sql);

stmt=con.createStatement();

rs=stmt.executeQuery(sql);

while (rs.next()){

    String sql1="select * from course where c_id="+rs.getString("cid");

    System.out.println(sql1);

    stmt1=con.createStatement();

    rs1=stmt1.executeQuery(sql1);



    while(rs1.next()){

        Vector hang=new Vector();

        hang.add(rs1.getInt("c_id"));

        hang.add(rs1.getString("c_name"));

        hang.add(rs1.getString("c_teacher"));

        hang.add(rs1.getString("c_time"));

        hang.add(rs1.getString("c_place"));

        hang.add(rs1.getString("c_week"));

        hang.add(rs1.getString("c_type"));

        hang.add(rs1.getString("c_credit"));

        rowdata.add(hang);



    }



}

JTable jTable=new JTable(rowdata,headtitle);

3.2.3 教师端界面

 个人信息查询与修改与学生相同,只是在Teacher表中查询。

核心代码:

String sql = "select *from teacher where id=" + jTName.getText();

System.out.println(sql);

stmt = con.createStatement();

rs = stmt.executeQuery(sql);

while (rs.next()) {

    jLabel1.setText("教师编号:" + rs.getString("id"));

    jLabel2.setText("姓名   :" + rs.getString("name"));

    jLabel3.setText("性别   :" + rs.getString("gender"));

    jLabel4.setText("电话   :" + rs.getString("tel"));

    jLabel5.setText("出生年月:" + rs.getString("birthday"));

    jLabel6.setText("学历   :" + rs.getString("degree"));

    jLabel7.setText("职称   :" + rs.getString("pTitle"));

    jLabel8.setText("入职年份:" + rs.getString("entrytime"));

    jLabel9.setText("学院   :" + rs.getString("college"));



}
  jchange.addActionListener(new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

            jf.setVisible(false);

            change_per();

            jf.setVisible(true);

        }

    });

    jflash.addActionListener(new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

            try {

                jf.setVisible(false);

                perinfor();

            } catch (SQLException ex) {

                throw new RuntimeException(ex);

            }

        }

    });





}

  

查看选课结果,一个老师可能有多个课程,所以先遍历course表,查询符合这个(c_id=JTName)的所有课程,每个课程开一个窗口,以表格的形式展示选择该课的学生信息(方法类似学生的教师查询)。

核心代码:

Vector title=new Vector();

title.add("学号");

title.add("姓名");

title.add("性别");

title.add("年龄");

title.add("专业");

title.add("生源");



String sql="select c_id,c_name from course where c_teacher="+jTName.getText();

System.out.println(sql);

stmt=con.createStatement();

rs=stmt.executeQuery(sql);

while (rs.next()){



    String str=rs.getString("c_name");//每次开一个窗口

    JFrame jFrame=new JFrame(str);

    jFrame.setBounds(0,0,screenWidth,screenHeight);

    JMenuBar jMenuBar=new JMenuBar();

    JLabel jLabel=new JLabel("?");

    jMenuBar.add(jLabel);

    jFrame.setJMenuBar(jMenuBar);

    Vector rowdata=new Vector();



    String sql1="select distinct sid from cou_stu where cid="+rs.getString("c_id")+"&& state=1";

    System.out.println(sql1);

    stmt1=con.createStatement();

   rs1=stmt1.executeQuery(sql1);

   int count=0;

   while(rs1.next()){

       String sql2="select * from student where s_id="+rs1.getString("sid");

       System.out.println(sql2);

       stmt2=con.createStatement();

       rs2=stmt2.executeQuery(sql2);

       while (rs2.next()){

           count++;

           Vector hang=new Vector();

           hang.add(rs2.getString("s_id"));

           hang.add(rs2.getString("s_name"));

           hang.add(rs2.getString("s_gender"));

           hang.add(rs2.getString("s_age"));

           hang.add(rs2.getString("s_specialty"));

           hang.add(rs2.getString("s_source"));

           rowdata.add(hang);



       }



   }

    jLabel.setText("本次共计"+count+"名学生选择此课");

    JTable jTable=new JTable(rowdata,title);






4 测试结果

4.1登录界面测试

正常测试:

异常测试:

4.2 学生端界面测试

异常测试:

4.3  教师界面测试

正常情况:

异常情况:

4.4 管理员界面测试

异常测试:

5 总结

刚开始接触数据库,我并不理解,通过网上课程的学习,有了简单的理解,通过这个课设,我深入理解了数据库的应用和java的图形化界面设计,还偶然学会了函数式编程。在我所有的程序里,我用的最多的是数据库的查询、插入、删除、修改功能,然后也用了大量的捕获异常处理,总的来说能做出自己的系统,还教会了我一种自主学习的思想,在日后的学习中我会继续成长,开发出更具有价值的软件。

参考文献:

[1] CSDN博主「兔老大RabbitMQ」的原创文章原文链接:https://blog.csdn.net/hebtu666/article/details/115613082

[2] CSDN博主「放肆青春的博客」的原创文章原文链接:https://blog.csdn.net/qq_35038153/article/details/77113076?spm=1001.2014.3001.5506

 [3] CSDN博主「随缘。。。。」的原创文章原文链接:https://blog.csdn.net/suiyuanxiangyu/article/details/108064964?spm=1001.2014.3001.5506

附录

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

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

相关文章

docker:安装mysql以及最佳实践

文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …

Python实现FA萤火虫优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

意大利语翻译成中文怎样做比较好

近年来&#xff0c;中意两国传统友好&#xff0c;两国人民之间的交往源远流长&#xff0c;双方合作不断推进&#xff0c;国内市场对于意大利语翻译的需求日益增加。那么&#xff0c;意大利语翻译有何特点&#xff0c;意大利语翻译成中文怎样做比较好呢&#xff1f; 由于意大利语…

matlab实践(十):贝塞尔曲线

1.贝塞尔曲线 贝塞尔曲线的原理是基于贝塞尔曲线的数学表达式和插值算法。 贝塞尔曲线的数学表达式可以通过控制点来定义。对于二次贝塞尔曲线&#xff0c;它由三个控制点P0、P1和P2组成&#xff0c;其中P0和P2是曲线的起点和终点&#xff0c;P1是曲线上的一个中间点。曲线上…

Leetcode每日一题学习训练——Python3版(最小化旅行的价格总和)

版本说明 当前版本号[20231206]。 版本修改说明20231206初版 目录 文章目录 版本说明目录最小化旅行的价格总和理解题目代码思路参考代码 原题可以点击此 2646. 最小化旅行的价格总和 前去练习。 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点…

LeetCode Hot100 207.课程表

题目&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习…

人工智能在警务工作中的运用

AI 能否帮助警察打击犯罪&#xff1f; 执法部门负责维护公共安全&#xff0c;他们必须处理随之而来的所有挑战。幸运的是&#xff0c;警察可以依靠技术来处理很多工作。近几年来&#xff0c;尤其是人工智能技术在全球变成了警务工作中的一个重要部分。 随着基于 AI 的警务技术…

如何在Java中实现多条件排序

文章目录 前言一、在Java中使用Comparator接口实现多条件排序二、视频讲解总结 前言 多条件排序是一个复杂而实用的技术问题&#xff0c;它涉及到算法、数据结构等多个领域。 在实际工作中&#xff0c;我们常常需要根据多个条件对数据进行排序&#xff0c;以达到最优化的效果。…

桶排序去重

题目&#xff1a; #include<stdio.h> int main() { int a[1001], n, i, t; for (i 1;i < 1000;i) { a[i] 0;//初始化 } scanf("%d", &n);//读入n for (i 1;i < n;i)//循环读入n个图书的ISBN号 { scanf(&…

ABAP 字符串空白值保留长度或者用其他字符替代

保留空白值在字符串的长度。 DATA lv_char1 TYPE string VALUE Hello. DATA lv_char2 TYPE string VALUE World. DATA LV_CHAR3 TYPE C LENGTH 50.DATA(lv_string3) |{ lv_char1 } { lv_char2 }!|.WRITE: / lv_string3.DATA(lv_string2) lv_char1 && | { lv_char3 } …

分库分表详解

分库分表很常见&#xff0c;但这些问题90%的人都答不全 分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;也是一个非常高频的面试题。但是&#xff0c;因为很多人其实并没有非常丰富的分库分表的经验&#xff0c;所以能把…

虚拟线程原理及性能分析

一、背景 JDK21 在 9 月 19 号正式发布&#xff0c;带来了较多亮点&#xff0c;其中虚拟线程备受瞩目&#xff0c;毫不夸张的说&#xff0c;它改变了高吞吐代码的编写方式&#xff0c;只需要小小的变动就可以让目前的 IO 密集型程序的吞吐量得到提升&#xff0c;写出高吞吐量的…

甘草书店:#8 2023年11月22日 星期三「“说一套做一套”的甘草与麦田」

最近与甘草书店的投资方和意向投资方沟通&#xff0c;听取了来自不同领域不同人群的观点。他们讲的都有道理&#xff0c;但他们说的都不是甘草。就像“麦田”成立之前&#xff0c;世间没有“麦田”一样&#xff1b;“甘草”出现之前&#xff0c;世间没有也没有“甘草”。 故事…

UDP多人群聊

一&#xff0c;创建类 二&#xff0c;类 1&#xff0c;Liao类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class Liao extends JFrame{ private static fi…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

【数据结构】动态规划(Dynamic Programming)

一.动态规划&#xff08;DP&#xff09;的定义&#xff1a; 求解决策过程&#xff08;decision process&#xff09;最优化的数学方法。 将多阶段决策过程转化为一系列单阶段问题&#xff0c;利用各阶段之间的关系&#xff0c;逐个求解。 二.动态规划的基本思想&#xff1a; …

Kubernetes常用工作负载控制器

文章目录 一、常用负载控制器是什么二、Deployment控制器1.介绍2.使用流程3.应用部署4.应用升级5.滚动升级实现原理&#xff08;replicaset控制器&#xff09;6.滚动升级实现流程7.滚动升级策略8.应用实例扩容和缩容9.应用发布失败回滚10.应用下线 三、DaemonSet控制器四、Job控…

elk+kafka+filebeat

elk1 cd /opt 把filebeat投进去 tar -xf filebeat-6.7.2-linux-x86_64.tar.gz mv filebeat-6.7.2-linux-x86_64 filebeat cd filebeat/ yum -y install nginx systemctl restart nginx vim /usr/share/nginx/html/index.html this is nginx cp filebeat.yml filebeat.yml.…

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…

LLM大语言模型(一):ChatGLM3-6B本地部署

目录 前言 本机环境 ChatGLM3代码库下载 模型文件下载 修改为从本地模型文件启动 启动模型网页版对话demo 超参数设置 GPU资源使用情况 &#xff08;网页对话非常流畅&#xff09; 前言 LLM大语言模型工程化&#xff0c;在本地搭建一套开源的LLM&#xff0c;方便后续的…