精华内容
下载资源
问答
  • C课设高校人员信息管理系统附全部代码.doc1BigWork 设计报告报告题目 高校人员信息管理系统 作者所在系部 计算机科学与工程系 作者所在专业 计算机科学与技术 作者所在班级 作 者 姓 名 指导教师姓名 完 成 时 间 ...

    253b171540df25e1b84436cbe50dfc72.gifC课设高校人员信息管理系统附全部代码.doc

    1BigWork 设计报告报告题目 高校人员信息管理系统 作者所在系部 计算机科学与工程系 作者所在专业 计算机科学与技术 作者所在班级 作 者 姓 名 指导教师姓名 完 成 时 间 2013-6-20 2一目的与要求1、目的(1)要求学生能够熟练掌握 C语言的基本知识和技能。(2)基本掌握面向对象程序设计的基本思路和方法。(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。2、基本要求(1)要求利用面向对象的方法以及 C的编程思想来完成系统的设计。 (2)在系统的设计中,要求运用面向对象的机制(继承、派生及多态性)来实现系统功能,并且要建立清晰的类层次关系。 (3)在系统设计中要分析和定义各个类,每个类中要有各自的数据成员和成员函数。(4)主函数中提供菜单选项,并给出足够的选择信息以及提示信息。(5) 程序具有一定的健壮性,不会因为用户的输入错误引起程序运行错误而中断执行。3、创新要求在基本要求达到后,可根据实际情况进行创新设计,如根据查找结果进行修改的功能及设计出比较友好的界面等。二验收方式未定。三课设报告在完成验收之后,提交课设报告。其中报告中需包括系统设计要求,设计思路,系统功能模块图,系统流程图,类的层次图(包括类成员列表) ,调试过程,关键程序代码,总结,参考书目等。另外,课设报告要严格遵守模板文件的格式要求,思路清晰,内容详实丰富。四成绩评定占期末成绩的 20五说明1、每位同学在以下的题目中任选一个来完成。2、学生应严格遵守课堂秩序,按时上机,认真完成各项任务。3、上机前做好充分的准备,包括事先写好主要程序代码,以保证充分利用上机的时间调试程序。4、每位同学各自独立完成自己的题目,禁止抄袭或拷贝。35、必须按规定时间上交课设报告。六课设题目题目 1 “高校人员信息管理系统”1、问题描述某高校,主要人员有领导、教师和学生,共有的信息包括编号、姓名、性别、年龄。其中领导还应包含的信息有任职部门(学院、各系部) 、职称;教师还应包含的信息有职称、任职时间、专业;学生还应包含的信息有所在班级、所在宿舍等。某高校有四类员工教师、实验员、行政人员,教师兼行政人员;共有的信息包括编号、姓名、性别、年龄等。其中,教师还包含的信息有所在系部、专业、职称;实验员还包含的信息由所在实验室、职务;行政人员还包含的信息有政治面貌、职称等。2、功能要求(1)基本功能1 添加功能程序能够任意添加上述四类人员的记录,可提供选择界面供用户选择所要添加的人员类别,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。2 查询功能可根据编号、姓名等信息对已添加的记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。3 显示功能可显示当前系统中所有记录,每条记录占据一行。4 编辑功能可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。5)删除功能主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空”并返回操作;否则,输入要删除的人员的编号或姓名,根据所输入的信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存。6 统计功能能根据多种参数进行人员的统计。例如,统计四类人员数量以及总数,或者统计男、女员工的数量,或者统计某年龄段人员的数量等。7)保存功能可将当前系统中各类人员记录存入文件中,存入方式任意。8)读取功能可将保存在文件中的人员信息读入到当前系统中,供用户进行使用。4摘 要在当前的学校人员管理体制下,高等学校不但要有浓厚的学风气息、雄厚的师资力量、先进精良硬件设备,与此同时,作为先进科学技术和优秀文化的承载者和传播者,更需要有一个执行效率高并且便于操作的现代信息化管理系统,以实现对高校各类人员进行添加、查找、修改、删除、统计、保存、读取等动态管理的目的。本文利用 Microsoft Visual C6.0 的 ADO 编写程序,实现了高校对实验员、教师、行政人员、教师兼行政人员的管理操作。本系统主要有四个管理模块实验员管理系统、教师管理系统、行政人员管理系统、教师兼行政人员管理系统。已经过全面的系统测试,能够很好的运行,达到了预期的效果。关键词系统设计 类 信息目 录摘要 第 1 章 绪 论 11.1 课程设计的目的 11.2 课程设计的背景和意义 11.1.1 课程设计的背景 11.1.2 课程设计的意义 11.3 课程设计环境 1第 2 章 需求分析 22.1 问题描述 .22.2 功能需求 .22.3 问题的解决方案 .3第 3 章 系统设计 43.1 数据设计 .453.1.1 类设计 .43.1.2 类之间关系 .53.2 结构设计 63.2.1 系统流程图 .63.2.2 界面设计 .6第 4 章 系统实现 94.1 类实现 .94.2 函数实现 .114.3 主函数 实现 .21第 1 章 绪论1.1 课程设计的目的(1)要求学生能够熟练掌握 C语言的基本知识和技能。(2)基本掌握面向对象程序设计的基本思路和方法。(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。1.2 课程设计的背景和意义1.2.1 课程设计的背景 1. 理论研究基础(1)综合 C编程知识,结合实际加以应用。(2)参考课本对课本熟悉,应用类、数组等内容。2. 技术层面的支持安装 Microsoft Visual C 6.0 集成开发环境。1.2.2 课程设计的意义综合复习C面向对象程序设计的所有知识点,进一步熟练面向对象程序的开发方法和流程,提高学生独立分析问题和解决问题的能力,培养学生的中、小型实践项目开发能力。6让我们提前感受到编写软件的过程和解决问题的方法。1.3 课程设计环境软件环境Microsoft Visual C 6.0 集成开发环境。硬件环境图书馆七楼机房,笔记本电脑。第 2 章 需求分析2.1 问题描述某高校有四类员工教师、实验员、行政人员,教师兼行政人员;共有的信息包括编号、姓名、性别、年龄等。其中,教师还包含的信息有所在系部、专业、职称;实验员还包含的信息由所在实验室、职务;行政人员还包含的信息有政治面貌、职称等2.2 功能要求基本功能1 添加功能程序能够任意添加上述四类人员的记录,可提供选择界面供用户选择所要添加的人员类别,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。2 查询功能可根据编号、姓名等信息对已添加的记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。3 显示功能可显示当前系统中所有记录,每条记录占据一行。4 编辑功能可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。5)删除功能主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空”并返回操作;否则,输入要删除的人员的编号或姓名,根据所输入的信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存。6 统计功能能根据多种参数进行人员的统计。例如,统计四类人员数量以及总数,或者统计男、女员工的数量,或者统计某年龄段人员的数量等。7)保存功能可将当前系统中各类人员记录存入文件中,存入方式任意。78)读取功能可将保存在文件中的人员信息读入到当前系统中,供用户进行使用。2.3 问题的解决方案根据系统功能要求,可以将问题解决分为以下步骤 1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;2)分析系统中的各个实体及它们之间的关系; 3)根据问题描述,设计系统的类层次; 4)完成类层次中各个类的描述; 5)完成类中各个成员函数的定义; 6)完成系统的应用模块; 7)功能调试; 8)完成系统总结报告。第 3 章 系统设计3.1 数据设计3.1.1 类设计此系统共设计了九个类基类(class CCommon),实验员类(class Cassistant),教师类(class Cteacher),行政人员类(class Ccution),教师兼行政人员类(class Ctea_ )基类中有int number;编号string name;姓名string sex;性别int age;年龄实验员类中添加了8string laboratory;所在实验室string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _laboratory,string _positionnumber _number;name _name;sex _sex;age _age;laboratory _laboratory;position _position;输入实验员数据void output;Cassistant析构函数friend int find_nuCassistant assistant, int _nu, int friend int find_naCassistant assistant, string _na, int friend void addCassistant assistant, int _fa;friend void deleCassistant assistant, int _fa;9friend void closefileCassistant assistant ,int friend void _statisticsCassistant assistant, int 教师类中添加了string department;所在系部string profession;专业string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _department,string _profession,string _positionnumber _number;name _name;sex _sex;age _age;department _department;profession _profession;position _position;输入教师数据void output;输出教师数据Cteacher10析构函数friend int find_nuCteacher teacher, int _nu, int friend int find_naCteacher teacher, string _na, int friend void addCteacher teacher, int _fa;friend void deleCteacher teacher, int _fa;friend void closefileCteacher teacher ,int friend void _statisticsCteacher teacher, int 行政人员类中添加了string politics;政治面貌string position;职称void setint _number,string _name,string _sex,int _age,string _politics,string _positionnumber _number;name _name;sex _sex;age _age;politics _politics;position _position;输入行政人员数据void output;11Ccution析构函数friend int find_nuCcution cution, int _nu, int friend int find_naCcution cution, string _na, int friend void addCcution cution, int _fa;friend void deleCcution cution, int _fa;friend void closefileCcution cution ,int friend void _statisticsCcution cution, int 教师兼行政人员类添加了string politics;政治面貌string department;所在系部string profession;专业string position;职称void setint _number,string _name,string _sex,int _age,string _politics,string _department,string _profession,string _positionnumber _number;name _name;sex _sex;age _age;politics _politics;12department _department;profession _profession;position _position;输行政人员兼教师数据void output;Ctea_析构函数friend int find_nuCtea_ tea_, int _nu, int friend int find_naCtea_ tea_, string _na, int friend void addCtea_ tea_, int _fa;friend void deleCtea_ tea_, int _fa;friend void closefileCtea_ tea_ ,int friend void _statisticsCtea_ tea_, int 3.1.2 类之间的关系基 基类(class CCommon)实验员类(class Cassistant),教师类(class Cteacher),行政人员类(class Ccution),教师兼行政人员类(class Ctea_ )3.1.3 函数设计在四个管理类中定义了以下相同函数,功能如其后所说_add; 实现该类记录的添加;_query; 实现该类记录的查询_display; 实现该类所有记录的显示;13_edit; 实现该类记录的修改;_delete;实现该类记录的删除; _statistics; 实现该类记录的统计; XX_put; 退出 Opefile读出Closefile写入3.2 结构设计3.2.1 系统流程图图 313.2.2 界面设计第 4 章 系统实现4.1 类实现对于基类的定义class CCommon公有类人员类教师类 实验员类行政人员类教师兼行政人员类14protectedint number;编号string name;姓名string sex;性别int age;年龄;class Cteacherpublic CCommon教师类protectedstring department;所在系部string profession;专业string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _department,string _profession,string _positionnumber _number;name _name;sex _sex;age _age;department _department;15profession _profession;position _position;输入教师数据void output;Cteacher析构函数friend int find_nuCteacher teacher, int _nu, int friend int find_naCteacher teacher, string _na, int friend void addCteacher teacher, int _fa;friend void deleCteacher teacher, int _fa;friend void closefileCteacher teacher ,int friend void _statisticsCteacher teacher, int ;class Cassistantpublic CCommon实验员类protectedstring laboratory;所在实验室string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _laboratory,string _position16number _number;name _name;sex _sex;age _age;laboratory _laboratory;position _position;输入实验员数据void output;Cassistant析构函数friend int find_nuCassistant assistant, int _nu, int friend int find_naCassistant assistant, string _na, int friend void addCassistant assistant, int _fa;friend void deleCassistant assistant, int _fa;friend void closefileCassistant assistant ,int friend void _statisticsCassistant assistant, int ;class Ccutionpublic CCommon行政人员类protected17string politics;政治面貌string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _politics,string _positionnumber _number;name _name;sex _sex;age _age;politics _politics;position _position;输入行政人员数据void output;Ccution析构函数friend int find_nuCcution cution, int _nu, int friend int find_naCcution cution, string _na, int friend void addCcution cution, int _fa;friend void deleCcution cution, int _fa;18friend void closefileCcution cution ,int friend void _statisticsCcution cution, int ;class Ctea_public CCommon行政人员兼教师类protectedstring politics;政治面貌string department;所在系部string profession;专业string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _politics,string _department,string _profession,string _positionnumber _number;name _name;sex _sex;age _age;politics _politics;department _department;profession _profession;position _position;19输入行政人员兼教师数据void output;Ctea_析构函数friend int find_nuCtea_ tea_, int _nu, int friend int find_naCtea_ tea_, string _na, int friend void addCtea_ tea_, int _fa;friend void deleCtea_ tea_, int _fa;friend void closefileCtea_ tea_ ,int friend void _statisticsCtea_ tea_, int ;4.2 函数实现对于在四个管理类中定义了相同的函数,以教师类为例添加功能void _addCteacher *teacher, int string name,sex,department,profession,position;cout请输入“name;if“0“ namebreak;coutsex;ifsex “M“sex “W“coutage;coutdepartment;coutprofession;coutposition; teachert.setnumber,name,sex,age,department,profession,position;t;break;elsecoutflag;if1 flag2 flagbreak;elsecoutnu;iffind_nuteacher,nu,t choice;22ifchoice 2break;whilechoice 1break;case 2姓名查询docoutna;iffind_nateacher,na,tchoice;ifchoice 2break;whilechoice 1break;int find_nuCteacher teacher, int _nu, int fori0;ichoice; switchchoicecase 1coutnum;forint i0;ichoice;switchchoicecase 124forint ji;jname;forint i0;ichoice;switchchoicecase 1forint ji;j26using namespace std;include“head.h“void statistics_all数据统计行数statistics_teacher;statistics_assistant;statistics_cution;statistics_tea_;void muencout“;int mainint i;while1muen;cini;switchicase 1 teacher_manage; break;教师case 2 assistant_manage; break;实验员case 3 cution_manage; break;行政case 4 tea__manage; break;教师兼行政case 5 statistics_all; break;统计default coutusing namespace std;/*-共有类-*/class CCommon公有类protectedint number;编号string name;姓名string sex;性别int age;年龄;/***教师类*/class Cteacherpublic CCommon教师类protectedstring department;所在系部28string profession;专业string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _department,string _profession,string _positionnumber _number;name _name;sex _sex;age _age;department _department;profession _profession;position _position;输入教师数据void output;Cteacher析构函数friend int find_nuCteacher teacher, int _nu, int friend int find_naCteacher teacher, string _na, int friend void addCteacher teacher, int _fa;friend void deleCteacher teacher, int _fa;friend void closefileCteacher teacher ,int friend void _statisticsCteacher teacher, int ;void teacher_manage;/*29-**实验员类-*/class Cassistantpublic CCommon实验员类protectedstring laboratory;所在实验室string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _laboratory,string _positionnumber _number;name _name;sex _sex;age _age;laboratory _laboratory;position _position;输入实验员数据void output;Cassistant析构函数friend int find_nuCassistant assistant, int _nu, int friend int find_naCassistant assistant, string _na, int friend void addCassistant assistant, int _fa;30friend void deleCassistant assistant, int _fa;friend void closefileCassistant assistant ,int friend void _statisticsCassistant assistant, int ;void assistant_manage;/*-**-行政人员类*/class Ccutionpublic CCommon行政人员类protectedstring politics;政治面貌string position;职称publicvoid setint _number,string _name,string _sex,int _age,string _politics,string _positionnumber _number;name _name;sex _sex;age _age;politics _politics;position _position;输入行政人员数据void output;Ccution

    展开全文
  • //友员管理类 }; void Person::Input() //设置函数 { cout编号:";cin>>num; cout姓名:";cin>>name; cout性别:";cin>>sex; cout年龄:";cin>>age; } void Person::Input1() { cout姓名:";cin>>name; cout性别:";cin>>...

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    class Person //基类

    {

    protected:

    double num;

    string name;

    string sex;

    int age;

    public:

    Person(){num=0;name="0";sex="0";age=0;}//基类构造函数

    virtual void Input(); //设置函数

    virtual void Input1();

    virtual void Show(); //输出成员信息

    virtual void Output(ofstream &out)=0; //写入文件函数

    virtual void Set(ifstream &in); //文件读取函数

    virtual int Jisuan()=0; //统计人数

    friend class Node; //友员结点类

    friend class Manage; //友员管理类

    };

    void Person::Input() //设置函数

    {

    cout<>num;

    cout<>name;

    cout<>sex;

    cout<>age;

    }

    void Person::Input1()

    {

    cout<>name;

    cout<>sex;

    cout<>age;

    }

    void Person::Show() //输出成员信息

    {

    cout<

    }

    void Person::Set(ifstream &in) //文件读取函数

    {

    in>>num>>name>>sex>>age;

    }

    int Person::Jisuan()

    {

    return -4;

    }

    class Leader:public Person

    {private:

    string depart;

    string title;

    public:

    Leader() //领导类构造函数

    {depart="0";title="0";}

    void Input(); //设置函数

    void Show(); //输出成员信息

    void Output(ofstream &out); //写入文件函数

    void Set(ifstream &in); //文件读取函数

    int Jisuan(); //统计人数

    };

    void Leader::Input() //设置函数

    {

    Person::Input();

    cout<>depart;cout<>title;

    }

    void Leader::Show() //输出成员信息

    {

    Person::Show();

    cout<

    }

    void Leader::Output(ofstream &out) //写入文件函数

    {

    intNo=1;

    out<

    }

    void Leader::Set(ifstream &in) //文件读取函数

    {

    in>>num>>name>>sex>>age>>depart>>title;

    }

    int Leader::Jisuan()

    {

    return -1;

    }

    class Teacher:public Person

    {private:

    string title;

    double time;

    string zhuanye;

    public:

    Teacher() //教师类构造函数

    {title="0";time=0;zhuanye="0

    展开全文
  • 基于Java的人员信息管理系统

    千次阅读 2021-03-05 19:37:25
    基于Java的人员信息管理系统介绍实现类(Person)实现类(Menu)实现类(Input)实现类(Operator)实现类(Test) 介绍 利用Java有关知识,解决有关人员信息(编号,姓名,年龄…。等等)的存储,以及进行简单的增加,删除,...

    介绍

    利用Java有关知识,解决有关人员信息(编号,姓名,年龄…。等等)的存储,以及进行简单的增加,删除,修改,查询数据…等等操作。

    实现类(Person)

    编写一个人员类进行对存储人员属性的初始化,包括(编号,姓名,年龄),以及制定各个人员之间的比较规则。
    代码展示:

    package InformationSystem;
    
    import java.io.Serializable;
    
    public class Person implements Serializable,Comparable<Person>{
    	private int id; //人员编号
    	private String name; //人员姓名
    	private int age;//人员年龄
    	public Person(){};
    	public Person(int id,String name,int age){ //初始化
    		this.id=id;
    		this.name=name;
    		this.age=age;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		// TODO Auto-generated method stub
    		return "编号:"+this.getId()+",姓名:"+this.getName()+",年龄:"+this.getAge();
    	}
    	
    	@Override
    	public int compareTo(Person o) { //制定比较规则
    		if(this.id<o.id){
    			return -1;
    		}else if(this.id>o.id){
    			return 1;
    		}else{
    			return 0;
    		}
    	}
    }
    
    

    实现类(Menu)

    用于方便使用者与控制台交互,采用文字排版,来显示功能提醒。
    代码展示:

    package InformationSystem;
    
    public class Menu {
    
    	public static void show(){
    		System.out.println("欢迎使用大数据信息管理系统");
    		System.out.println("******1.增加数据*****");
    		System.out.println("******2.删除数据*****");
    		System.out.println("******3.修改数据*****");
    		System.out.println("******4.查看数据*****");
    		System.out.println("******5.系统退出*****");
    	}
    }
    

    实现类(Input)

    用于捕获用户的输入内容,根据输入内容的类型进行不同方法的使用,同时制约了输入内容的格式一致以及规定了年龄的范围等。
    代码展示:

    package InformationSystem;
    import java.util.*;
    public class Input {
    	private Scanner scan;
    	public Input(){
    		scan = new Scanner(System.in);
    	}
    	//编写一个方法,用来获取用户输入的任何的内容
    	public String getString(String info){
    		System.out.println(info);
    		return scan.nextLine();
    	}
    	//编写一个方法,用来用户用户输入的整数,我们判断格式,如果格式不正确则重新输入
    	public int getInt(String info,String error){
    		//获取用户输入的内容
    		String str = getString(info);
    		//对用户输入的内容判断其格式是否满足需求
    		while(!str.matches("\\d+")){
    			System.out.println(error);
    			str = getString(info);
    		}
    		return Integer.parseInt(str);
    	}
    	//编写一个方法,用来获取用户的年龄
    	public int getAge(String info,String error1,String error2){
    		int age = getInt(info, error1);
    		while(!(age>0&&age<120)){
    			System.out.println(error2);
    			age = getInt(info, error1);
    		}
    		return age;
    	}
    }
    
    

    实现类(Operator)

    用于实现整体的展示,和对人员数据的存储,读取以及执行增删改查操作等。是项目的核心。
    代码展示:

    package test.ManagerSystem;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    
    
    
    public class Operator{
    	private Input input;
    	private File file=null;
    	private ArrayList<Person> alist=null;
    	private boolean flag;
    	public Operator(){
    		input=new Input();
    		file=new File("E:"+File.separator+"王伯文"+File.separator+"person.txt");
    		alist=new ArrayList<Person>();
    		flag=true;
    	}
    	public void operator(){
    		while(flag){
    			Menu.show();
    			int choice=input.getInt("输入数字来选择功能!", "只能是数字!");
    			switch(choice){
    			case 1://增加数据
    				int id=getMaxID()+1;
    				String name=input.getString("请输入你要增加人员的姓名!");
    				int age=input.getAge("请输入你要增加的人员年龄", "年龄只能是数字", "超过人类正常年龄!");
    				Person per=new Person(id,name,age);
    				alist.add(per);
    				update();
    				break;
    			case 2://删除数据
    				select();
    				if(alist.size()>0){
    					for(Person p:alist){
    						System.out.println(p);
    					}
    				}
    				else{
    					System.out.println("暂无数据!");
    				}
    				int deleteid=input.getInt("请输入你要删除人员的id", "只能为数字!");
    				if(checkID(deleteid)){
    					for(int index=0;index<alist.size();index++){
    						if(alist.get(index).getId()==deleteid){
    							alist.remove(index);
    							break;
    						}
    					}
    					update();
    				}
    				else{
    					System.out.println("人员不存在!");
    				}
    				break;
    			case 3://修改数据
    				select();
    				if(alist.size()>0){
    					for(Person p:alist){
    						System.out.println(p);
    					}
    				}
    				else{
    					System.out.println("暂无数据!");
    				}
    				int updateId=input.getInt("请输入你要修改的人员id", "只能是数字!");
    				if(checkID(updateId)){
    					String updateName=input.getString("请输入你要修改成的姓名");
    					int updateAge=input.getAge("请输入你要修改成的年龄", "年龄只能是整数", "年龄超出正常人水平");
    					for(Person person:alist){
    						if(person.getId()==updateId){
    							person.setName(updateName);
    							person.setAge(updateAge);
    							break;
    						}
    					}
    					update();
    				}
    				else{
    					System.out.println("您要修改的人员不存在!");
    				}
    				break;
    			case 4://查询数据
    				select();
    				if(alist.size()>0){
    					for(Person p:alist){
    						System.out.println(p);
    					}
    				}
    				else{
    					System.out.println("暂无数据!");
    				}
    				break;
    			case 5:
    				System.out.println("系统退出成功!");
    				System.exit(0);
    				break;
    				default:
    					System.out.println("没有此选项!");
    					break;
    			}
    		}
    	}
    	public void select(){
    		ObjectInputStream ois=null;
    		try {
    			ois=new ObjectInputStream(new FileInputStream(file));
    			alist=(ArrayList<Person>)ois.readObject();
    		} catch (FileNotFoundException e) {
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			if(ois!=null){
    				try {
    					ois.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	
    	public int getMaxID(){
    		int id=0;
    		select();
    		if(alist.size()>0){
    			Collections.sort(alist);
    			return alist.get(alist.size()-1).getId();
    		}
    		return id;
    	}
    	
    	public void update(){
    		ObjectOutputStream ops=null;
    		try {
    			ops=new ObjectOutputStream(new FileOutputStream(file));
    			ops.writeObject(alist);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			if(ops!=null){
    				try {
    					ops.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	
    	public boolean checkID(int id){
    		boolean flag=false;
    		for(Person p:alist){
    			if(p.getId()==id){
    				flag=true;
    				break;
    			}
    		}
    		return flag;
    	}
    }
    
    
    

    注意:在执行增删改查操作的前提都要查看是否有数据,才能进行下一步操作的执行。删除和修改都是根据我们的编号来进行操作,大大降低了检索难度和资源的浪费。

    实现类(Test)

    实现整体功能的入口
    代码展示:

    package InformationSystem;
    
    public class test {
    
    	public static void main(String[] args) {
    		Operator op=new Operator();
    		op.operator();;
    	}
    }
    
    

    结果展示:

    查询数据:

    增加数据:
    在这里插入图片描述
    删除数据:
    在这里插入图片描述

    修改数据:
    在这里插入图片描述
    系统退出:
    在这里插入图片描述

    操作环境以及信息

    系统环境:windows 10 专业版
    语言:Java
    开发工具:eclipse

    展开全文
  • //如果班级号为空,则表明是查询所有学生信息的请求,反之则是根据班级号查询该班所有学生信息 if(classNo != null){ studentList = studentService.selectByCondition("", "", classNo); }else{ studentList = ...

    一、视频展示

    https://www.bilibili.com/video/BV1pU4y1J7wc

    二、项目介绍

    1、技术与工具

    开发工具IntelliJ IDEA
    数据库MySQL 5.7
    前端技术Jquery 、 Bootstrap 、echarts、thymeleaf
    后台技术SpringBoot、MyBatis

    2、项目目录介绍

     具体介绍如下:

    (1)程序代码的存放目录——src下的java

    component登录拦截器
    config静态资源拦截
    controller负责在页面和程序之间传输数据的,做页面的跳转
    dao负责对数据向数据库增删改查的操作
    entity实体类。一般与数据库中的属性值基本保持一致
    service负责业务模块的应用逻辑设计
    utils工具包。包括验证码、分页插件等

    (2)资源文件的存放目录——resources

    Mapper存放Mabtis的映射文件
    static存放静态资源文件,包括图片、css文件、js文件
    tempaltes存放前端所有的页面。

    (3)测试类的目录——test 

    (4)maven的配置文件——pom.xml 

    三、关键技术

    1、分页插件

    需求:系统中的数据可能会有多条。当数据量较少的时候可以在一页上展示,但是如果数据量很大,则应该使用分页的方式来显示数据。

    (1)分页插件的依赖包

            <!--分页插件-->
    		<dependency>
    			<groupId>com.github.pagehelper</groupId>
    			<artifactId>pagehelper</artifactId>
    			<version>4.1.6</version>
    		</dependency>

    (2)分页插件的工具类

    Page类

    public class Page {
    
        private int start; //开始页数
        private int count; //每页显示个数
        private int total; //总个数
        private String param; //参数
    
        private static final int defaultCount = 5; //默认每页显示5条
    
        public int getStart() {
            return start;
        }
        public void setStart(int start) {
            this.start = start;
        }
        public int getCount() {
            return count;
        }
        public void setCount(int count) {
            this.count = count;
        }
    
        public Page (){
            count = defaultCount;
        }
        public Page(int start, int count) {
            this();
            this.start = start;
            this.count = count;
        }
    
        public boolean isHasPreviouse(){
            if(start==0)
                return false;
            return true;
        }
        public boolean isHasNext(){
            if(start==getLast())
                return false;
            return true;
        }
    
        public int getTotalPage(){
            int totalPage;
            // 假设总数是50,是能够被5整除的,那么就有10页
            if (0 == total % count)
                totalPage = total /count;
                // 假设总数是51,不能够被5整除的,那么就有11页
            else
                totalPage = total / count + 1;
    
            if(0==totalPage)
                totalPage = 1;
            return totalPage;
    
        }
    
        public int getLast(){
            int last;
            // 假设总数是50,是能够被5整除的,那么最后一页的开始就是45
            if (0 == total % count)
                last = total - count;
                // 假设总数是51,不能够被5整除的,那么最后一页的开始就是50
            else
                last = total - total % count;
            last = last<0?0:last;
            return last;
        }
    
        @Override
        public String toString() {
            return "Page [start=" + start + ", count=" + count + ", total=" + total + ", getStart()=" + getStart()
                    + ", getCount()=" + getCount() + ", isHasPreviouse()=" + isHasPreviouse() + ", isHasNext()="
                    + isHasNext() + ", getTotalPage()=" + getTotalPage() + ", getLast()=" + getLast() + "]";
        }
        public int getTotal() {
            return total;
        }
        public void setTotal(int total) {
            this.total = total;
        }
        public String getParam() {
            return param;
        }
        public void setParam(String param) {
            this.param = param;
        }
    
    }
    

    PageHelperConfig类

    @Configuration
    public class PageHelperConfig {
     
        @Bean
        public PageHelper pageHelper() {
            PageHelper pageHelper = new PageHelper();
            Properties p = new Properties();
            p.setProperty("offsetAsPageNum", "true");
            p.setProperty("rowBoundsWithCount", "true");
            p.setProperty("reasonable", "true");
            pageHelper.setProperties(p);
            return pageHelper;
        }
    }

    (3)分页插件在业务逻辑中的使用方式

    以查询所有学生信息为例演示分页插件的使用:

    @RequestMapping("/studentList")
        public String studentList(Model model, Page page, String classNo){
            //分页插件
            PageHelper.offsetPage(page.getStart(),page.getCount());
            //结果集
            List<Student> studentList = new ArrayList<>();
            //如果班级号为空,则表明是查询所有学生信息的请求,反之则是根据班级号查询该班所有学生信息
            if(classNo != null){
                studentList = studentService.selectByCondition("", "", classNo);
            }else{
                studentList = studentService.selectAll();
            }
            //根据学号得到每个学生的选课数
            for (Student student : studentList){
                List<String> stringList = studentService.selectClassCount(student.getStuNo());
                student.setClassCount(stringList.size());
            }
            //得到记录总数
            int total = (int) new PageInfo<>(studentList).getTotal();
            //设置页的总数
            page.setTotal(total);
            //向页面返回数据
            model.addAttribute("page",page);
            model.addAttribute("studentList", studentList);
            return "student/student";
        }

    (4)页面显示

    <table class="table table-striped table-bordered text-center" style="margin-top:80px" th:if="${studentList != null}">
    							<thead>
    								<tr>
    									<th class="text-center">头像</th>
    									<th class="text-center">学号</th>
    									<th class="text-center">姓名</th>
    									<th class="text-center">性别</th>
    									<th class="text-center">班级</th>
    									<th class="text-center">手机号</th>
    									<th class="text-center">选课数量</th>
    									<th class="text-center">操作</th>
    								</tr>
    							</thead>
    							<tbody>
    								<tr th:each="student : ${studentList}">
    									<td><img th:src="@{${student.icon}}" alt="点击查看头像" class="img-circle" style="width: 30px; height: 30px;"></td>
    									<td th:text="${student.stuNo}"></td>
    									<td th:text="${student.name}"></td>
    									<td th:text="${student.gender==0} ? '女' : '男'"></td>
    									<td th:text="${student.classNo}"></td>
    									<td th:text="${student.phone}"></td>
    									<td><a th:href="@{/curriculum/curriculumList(stuNo=${student.stuNo})}">[[${student.classCount}]]</span></a></td>
    									<td>
    										<a th:href="@{/student/studentDetail(id=${student.id})}"><span class="glyphicon glyphicon-pencil"
    														 style="margin-right:10px"></span></a>
    										<a th:href="@{/student/deleteStudent(id=${student.id})}"><span class="glyphicon glyphicon-trash"></span></a>
    									</td>
    								</tr>
    							</tbody>
    						</table>
    						<div class="row text-center" th:if="${studentList != null}">
    							<div class="col-sm-6 col-sm-offset-2">
    								<ul class="pagination">
    									<li><a th:href="@{/student/studentList(start = 0)}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
    									<li th:each="number:${#numbers.sequence(1,page.totalPage)}"><a th:href="@{/student/studentList(start=${(number-1)*page.count})}" th:text="${number}"></a></li>
    									<li><a  th:href="@{/student/studentList(start=${page.last})}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
    								</ul>
    							</div>
    
    						</div>

    2、用户头像的上传与存储

    需求:学生的个人信息中包含了头像,上传的头像存储在本地目录。同样,在页面也需显示出来。

     (1)页面上传头像

    <form class="form-horizontal " th:action="@{/student/addStudent}" enctype="multipart/form-data" method="post">
    			<div class="form-group"  style="margin-top: 10px;">
    				<label for="exampleInputFile"  class="col-sm-3 control-label col-sm-offset-1">头像</label>
    				<div class="col-sm-8">
    					<div class="custom-file">
    						<input type="file"  name="file" class="custom-file-input" id="exampleInputFile">
    					</div>
    				</div>
    			</div>
    ...
    </form>

    (2)存储头像

    @RequestMapping("/addStudent")
        public String addStudent(RedirectAttributes attributes, Student student, MultipartFile file, String province, String city, String district){
            //学生头像
            String filePath = "D:/Java/项目/MyDo/schoolmanagement/src/main/resources/static/userImg";
            String fileName = file.getOriginalFilename();
            File targetFile = new File(filePath, fileName);
            targetFile.getParentFile().mkdirs();
            try {
                file.transferTo(targetFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
            student.setIcon("/userImg/"+fileName);
            //学生地址
            String address = province + ":" + city + ":" + district;
            student.setAddress(address);
            //插入数据库
            studentService.insertStudent(student);
            attributes.addFlashAttribute("msg", "添加成功");
            return "redirect:/student/studentList";
        }
    

    (3)更换头像

    @RequestMapping("/modifyStudent")
        public String modifyStudent(RedirectAttributes attributes, Student student, MultipartFile file, String province, String city, String district){
            //学生头像。如果页面提交过来的不为空,则替换,如果为空,则仍然是源头像
            if (!file.isEmpty()) {
                /**
                 * 上传图片
                 */
                //图像存放路径
                String filePath = "D:/Java/项目/MyDo/schoolmanagement/src/main/resources/static/userImg";
                //图片名称
                String fileName = file.getOriginalFilename();
                File targetFile = new File(filePath, fileName);
                //创建文件路径
                targetFile.getParentFile().mkdirs();
                targetFile.delete();
                try {
                    file.transferTo(targetFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                student.setIcon("/userImg/"+fileName);
            }else {
                //设置源头像
                Student searchStudent = studentService.selectById(student.getId());
                student.setIcon(searchStudent.getIcon());
            }
            //学生地址
            String address = province + ":" + city + ":" + district;
            student.setAddress(address);
            studentService.updateStudent(student);
            attributes.addFlashAttribute("msg", "修改成功");
            return "redirect:/student/studentList";
        }

    3、登录验证码

    需求:在用户登陆系统时,需要输入验证码,并在后台完成验证。

     (1)页面逻辑

    <div class="input-group mb-3">
                    <img id="imgVerify" th:src="@{/getVerify}" alt="更换验证码" height="30" width="170"
                         onclick="getVerify(this);">
                    <input type="tel" class="form-control" placeholder="验证码" maxlength="4" style="float:right;width: 40%;left: 0;margin-top: 14px;"
                           name="verifyInput" id="verify" onfocus="modifyLabel()">
                </div>
    
    //获取验证码
        function getVerify() {
            $("#imgVerify").attr("src", '/getVerify?' + Math.random());//jquery方式
        }
       function modifyLabel(){
            $(".tip-area").css("display", "none");
        }

    (2)工具类

    RandomValidateCodeUtil类

    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.util.Random;
    
    public class RandomValidateCodeUtil {
     
     
        public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key
        private String randString = "0123456789";//随机产生只有数字的字符串 private String
        //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
        //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
        private int width = 95;// 图片宽
        private int height = 25;// 图片高
        private int lineSize = 40;// 干扰线数量
        private int stringNum = 4;// 随机产生字符数量
     
        private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
     
        private Random random = new Random();
     
        /**
         * 获得字体
         */
        private Font getFont() {
            return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
        }
     
        /**
         * 获得颜色
         */
        private Color getRandColor(int fc, int bc) {
            if (fc > 255)
                fc = 255;
            if (bc > 255)
                bc = 255;
            int r = fc + random.nextInt(bc - fc - 16);
            int g = fc + random.nextInt(bc - fc - 14);
            int b = fc + random.nextInt(bc - fc - 18);
            return new Color(r, g, b);
        }
     
        /**
         * 生成随机图片
         */
        public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
            HttpSession session = request.getSession();
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
            Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
            g.fillRect(0, 0, width, height);//图片大小
            g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
            g.setColor(getRandColor(110, 133));//字体颜色
            // 绘制干扰线
            for (int i = 0; i <= lineSize; i++) {
                drowLine(g);
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= stringNum; i++) {
                randomString = drowString(g, randomString, i);
            }
            logger.info(randomString);
            //将生成的随机字符串保存到session中
            session.removeAttribute(RANDOMCODEKEY);
            session.setAttribute(RANDOMCODEKEY, randomString);
            g.dispose();
            try {
                // 将内存中的图片通过流动形式输出到客户端
                ImageIO.write(image, "JPEG", response.getOutputStream());
            } catch (Exception e) {
                logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);
            }
     
        }
     
        /**
         * 绘制字符串
         */
        private String drowString(Graphics g, String randomString, int i) {
            g.setFont(getFont());
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                    .nextInt(121)));
            String rand = String.valueOf(getRandomString(random.nextInt(randString
                    .length())));
            randomString += rand;
            g.translate(random.nextInt(3), random.nextInt(3));
            g.drawString(rand, 13 * i, 16);
            return randomString;
        }
     
        /**
         * 绘制干扰线
         */
        private void drowLine(Graphics g) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(13);
            int yl = random.nextInt(15);
            g.drawLine(x, y, x + xl, y + yl);
        }
     
        /**
         * 获取随机的字符
         */
        public String getRandomString(int num) {
            return String.valueOf(randString.charAt(num));
        }
    }

    Picverigyaction类

    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @RestController
    public class Picverifyaction {
        private final static Logger logger = LoggerFactory.getLogger(Picverifyaction.class);
     
        /**
         * 生成验证码
         */
        @RequestMapping(value = "/getVerify")
        public void getVerify(HttpServletRequest request, HttpServletResponse response) {
            try {
                response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
                response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
                response.setHeader("Cache-Control", "no-cache");
                response.setDateHeader("Expire", 0);
                RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
                randomValidateCode.getRandcode(request, response);//输出验证码图片方法
            } catch (Exception e) {
                logger.error("获取验证码失败>>>>   ", e);
            }
        }
     
    
     
    }

    (3)登录处理

    @PostMapping("/login")
        public ModelAndView login(User user, @RequestParam String verifyInput, HttpSession session, RedirectAttributes attributes){
            //验证码
            String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");
            ModelAndView mv = new ModelAndView();
            //验证码校验
            if (random == null) {
                System.out.println("验证码错误");
                mv.addObject("msg", "验证码错误");
                mv.setViewName("index");
                return mv;
            }
            //判断验证码是否相等
            if(random.equals(verifyInput)){
                //根据用户名和密码查询用户
                User loginUser = userService.selectByNameAndPwd(user);
                if(loginUser != null){
                    //查询成功,判断身份是否相等
                    if(loginUser.getIdentity() != user.getIdentity()){
                        //不相等,则提示信息
                        mv.addObject("msg", "你不是"+(user.getIdentity() == 1 ? "管理员" : "用户"));
                        mv.setViewName("index");
                    }else{
                        //相等,登陆成功
                        // session.setAttribute("loginUsername", user.getName());
                        session.setAttribute("user", user);
                        mv.setViewName("main");
                    }
                } else{
                    //查询失败,提示未注册
                    mv.addObject("msg", "当前用户未注册");
                    mv.setViewName("index");
                }
            }else{
                //验证码错误。,返回登录页
                System.out.println("验证码错误");
                mv.addObject("msg", "验证码错误");
                mv.setViewName("index");
            }
            // mv.setViewName("main");
            return mv;
        }

    4、Hutool导出数据

    需求:页面显示了信息列表,如果需要导出列表数据,需要点击导出按钮。

    (1)页面

    <div class="text-center" style="display:block;margin-bottom: 20px;">
    					<a class="btn btn-primary col-sm-1" style="margin-right:10px" th:href="@{/user/toPage(url='/teacher/addTeacher')}"><span class="glyphicon glyphicon-plus" style="margin-right: 10px;"></span>添加</a>
    					<a class="btn btn-warning col-sm-1" th:href="@{/teacher/exportTeacherData}"><span class="glyphicon glyphicon-upload" style="margin-right: 10px;"></span>导出</a>
    					<label class="pull-right" style="margin-right:20px"  th:if="${teacherList != null}">共有数据[[${page.total}]]条</label>
    
    				</div>

    (2)后台处理请求

        @RequestMapping("/exportTeacherData")
        public void exportTeacherData(HttpServletResponse response) throws UnsupportedEncodingException {
            //从数据库中查询到数据
            List<Teacher> teacherList = teacherService.selectAll();
            for(Teacher teacher : teacherList){
                teacher.setClassCount(curriculumService.selectByTeacherNo(teacher.getTeacherNo()).size());
            }
            // 通过工具类创建writer,默认创建xls格式
            ExcelWriter writer = ExcelUtil.getWriter();
            //自定义标题别名
            writer.addHeaderAlias("teacherNo", "教工号");
            writer.addHeaderAlias("name", "教师姓名");
            writer.addHeaderAlias("age", "年龄");
            writer.addHeaderAlias("gender", "性别(0 男 1 女)");
            writer.addHeaderAlias("professor", "职称");
            writer.addHeaderAlias("phone", "手机号");
            writer.addHeaderAlias("email", "邮箱");
            writer.addHeaderAlias("classCount", "带课数");
            //只导出设置了别名的列
            writer.setOnlyAlias(true);
            // 合并单元格后的标题行,使用默认标题样式
            writer.merge(7, "教师信息");
            // 一次性写出内容,使用默认样式,强制输出标题
            writer.write(teacherList, true);
            //out为OutputStream,需要写出到的目标流
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //dateString.xls是弹出下载对话框的文件名,用日期作为文件名称
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);
            response.setHeader("Content-Disposition","attachment;filename="+dateString+".xls");
            ServletOutputStream out= null;
            try {
                out = response.getOutputStream();
                writer.flush(out, true);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            finally {
                // 关闭writer,释放内存
                writer.close();
            }
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }

    5、webjars使用

    (1)介绍

            WebJars是将客户端(浏览器)资源(JavaScript,Css等)打成jar包文件,以对资源进行统一依赖管理。WebJars的jar包部署在Maven中央仓库上。

    (2)目的

    统一管理静态资源

    (3)实现方式(以Bootstrap、jquery、echart为例)

    pom.xml

            <dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>bootstrap</artifactId>
    			<version>3.3.5</version>
    		</dependency>
    		<dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>jquery</artifactId>
    			<version>3.6.0</version>
    		</dependency>
            <dependency>
    			<groupId>org.webjars.bower</groupId>
    			<artifactId>echarts</artifactId>
    			<version>4.7.0</version>
    		</dependency>

    页面中使用:

    		<!-- Bootstrap core CSS -->
    		<link th:href="@{/webjars/bootstrap/3.3.5/css/bootstrap.css}" rel="stylesheet">
    		<script th:src="@{/webjars/jquery/3.6.0/jquery.min.js}"></script>
    
    		<script th:src="@{/webjars/bootstrap/3.3.5/js/bootstrap.js}"></script>
    		<script th:src="@{/webjars/echarts/4.7.0/dist/echarts.js}"></script>

    6、公共请求的页面跳转

    需求:在后台逻辑中有的请求只是为了跳转页面,通过设置公共请求对这些跳转请求进行统一处理。如下:

        /**
         * 跳转至学生分析页面
         * @return
         */
        @RequestMapping("/studentAnalysis")
        public String studentScore(){
            return "/student/studentAnalysis";
        }

    处理公共请求的映射方法:

    /**
         * 公共请求的处理
         * @param request
         * @return
         */
        @RequestMapping(value = "/toPage",method = RequestMethod.GET)
        public  String toPage(HttpServletRequest request){
            //获取请求参数
            String url= request.getParameter("url");
            return  url;
        }

    使用方式:在请求页面时携带url参数

    教师页面:点击按钮,跳转至添加教师页面。

    <a class="btn btn-primary col-sm-1" style="margin-right:10px" th:href="@{/user/toPage(url='/teacher/addTeacher')}"><span class="glyphicon glyphicon-plus" style="margin-right: 10px;"></span>添加</a>
    

    顶部菜单栏的退出功能:

    <ul class="dropdown-menu text-center">
                    <li class="text-center" ><a href="#">修改密码</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/user/toPage(url='index')}">退出</a></li>
                </ul>

    7、session的使用

    需求:用户登陆成功之后,在顶部菜单栏显示欢迎XXX登录。

    登录逻辑中的处理:

    session.setAttribute("user", user);

     页面中使用session:

    <li><a >欢迎[[${session.user.name}]]登录</a></li>

    8、echarts与后台的交互

    需求:对信息以图表化形式显示在页面上。

     (1)页面

    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    	<head>
    		<meta charset="utf-8">
    		<title>课程分析</title>
    		<!-- Bootstrap core CSS -->
    		<link th:href="@{/webjars/bootstrap/3.3.5/css/bootstrap.css}" rel="stylesheet">
    		<script th:src="@{/webjars/jquery/3.6.0/jquery.min.js}"></script>
    
    		<script th:src="@{/webjars/bootstrap/3.3.5/js/bootstrap.js}"></script>
    		<script th:src="@{/webjars/echarts/4.7.0/dist/echarts.js}"></script>
    	</head>
    	<body>
    		<!-- 导航 -->
    		<div th:replace="commons/bar::topbar"></div>
    		<!-- 主题内容 -->
    		<div class="container-fluid">
    			<div class="page-main">
    				<ol class="breadcrumb">
    					<li>课程信息</li>
    					<li>课程分析</li>
    				</ol>
    				<div class="row">
    					<div class="">
    						<div id="leftGraph" style="height: 400px" class="col-sm-5 col-sm-offset-1"></div>
    						<div id="rightGraph" style="height: 400px" class="col-sm-5 col-sm-offset-1"></div>
    					</div>
    				</div>
    
    			</div>
    		</div>
    		</div>
    		<div th:replace="commons/footer::footer"></div>
    	</body>
    `
    	<script type="text/javascript">
    		$(function () {
    			$.ajax({
    				type : "get",   //请求方式
    				url : "http://localhost:8082/curriculumGrade",  //后端controller层路径
    				contentType: 'application/json',
    				success:function(data){
    
    					var leftDom = document.getElementById("leftGraph");
    					var leftChart = echarts.init(leftDom);
    					var leftOption;
    					leftOption = {
    						title : {
    							show:true,//显示策略,默认值true,可选为:true(显示) | false(隐藏)
    							text: '课程等级',
    						},
    						xAxis: {
    							type: 'category',
    							data: data.names
    						},
    						yAxis: {
    							type: 'value'
    						},
    						series: [{
    							data: data.grades,
    							type: 'bar',
    							showBackground: true,
    							backgroundStyle: {
    								color: 'rgba(43, 114, 180, 0.2)'
    							}
    						}]
    					};
    					if (leftOption && typeof leftOption === 'object') {
    						leftChart.setOption(leftOption);
    					}
    				},
    				error:function(data){
    					console.log("error")
    					console.log(data)
    				}
    			})
    			$.ajax({
    				type : "get",   //请求方式
    				url : "http://localhost:8082/curriculumTime",  //后端controller层路径
    				contentType: 'application/json',
    				success:function(data){
    					console.log(data)
    					var arr = [];
    					for(var i=0; i < data.hours.length; i++){
    						arr.push({"value":data.counts[i], "name":data.hours[i]});
    					}
    					console.log(arr);
    					var rightDom = document.getElementById("rightGraph");
    					var rightChart = echarts.init(rightDom);
    
    					var rightOption;
    					rightOption = {
    						title: {
    							text: '课时数量',
    							left: 'center'
    						},
    						tooltip: {
    							trigger: 'item'
    						},
    						legend: {
    							orient: 'vertical',
    							left: 'left',
    						},
    						series: [
    							{
    								name: '访问来源',
    								type: 'pie',
    								radius: '50%',
    								data:arr,
    								emphasis: {
    									itemStyle: {
    										shadowBlur: 10,
    										shadowOffsetX: 0,
    										shadowColor: 'rgba(0, 0, 0, 0.5)'
    									}
    								}
    							}
    						]
    					};
    
    					if (rightOption && typeof rightOption === 'object') {
    						rightChart.setOption(rightOption);
    					}
    				},
    				error:function(data){
    					console.log("error")
    					console.log(data)
    				}
    
    
    			})
    		});
    
    		
    
    	</script>
    </html>
    

    (2)后台处理 

    /**
         * 课程等级
         * @return
         */
        @RequestMapping("/curriculumGrade")
        public Map<String, Object> curriculumGrade(){
            List<Curriculum> curriculumList = curriculumService.selectAll();
            String[] names = new String[curriculumList.size()];
            int[] grades = new int[curriculumList.size()];
            int i = 0;
            for(Curriculum curriculum :curriculumList){
                names[i] = curriculum.getClassName();
                grades[i] = curriculum.getClassGrade();
                i++;
            }
            Map<String, Object> map = new HashMap<>();
            map.put("names", names);
            map.put("grades", grades);
            return map;
        }
    
        /**
         * 课程课时
         * @return
         */
        @RequestMapping("/curriculumTime")
        public Map<String, Object> curriculumTime(){
            List<Curriculum> curriculumList = curriculumService.selectAll();
            Map<Integer, Integer> myMap = new HashMap<>();
            for(Curriculum curriculum : curriculumList){
                if(myMap.containsKey(curriculum.getClassHour())){
                    myMap.put(curriculum.getClassHour(), myMap.get(curriculum.getClassHour())+1);
                }else{
                    myMap.put(curriculum.getClassHour(), 1);
                }
            }
            System.out.println(myMap);
            int[] hours = new int[myMap.size()];
            int[] counts = new int[myMap.size()];
            int i = 0;
            for (Map.Entry<Integer, Integer> entry : myMap.entrySet()) {
                hours[i] = entry.getKey();
                counts[i] = entry.getValue();
                i++;
            }
            Map<String, Object> map = new HashMap<>();
            map.put("hours", hours);
            map.put("counts", counts);
            return map;
        }

    9、省市区三级联动

    需求:添加学生的时候,选择学生的家庭住址

    页面实现:

    <div class="form-group" style="margin-top: 10px;">
    				<label class="col-sm-3 control-label col-sm-offset-1">家庭住址</label>
    				<div class="col-sm-8 form-inline">
    					<div id="distpicker" >
    						<div class="form-group col-sm-offset-1 col-sm-3" style="margin-right: 10px;">
    							<label class="sr-only" for="province">Province</label>
    							<select class="form-control" id="province" name="province"></select>
    						</div>
    						<div class="form-group  col-sm-offset-1  col-sm-3" >
    							<label class="sr-only" for="city">City</label>
    							<select class="form-control" id="city" name="city"></select>
    						</div>
    						<div class="form-group col-sm-offset-1  col-sm-3"  style="margin-right: 10px;">
    							<label class="sr-only" for="district">District</label>
    							<select class="form-control" id="district" name="district"></select>
    						</div>
    						<div class="form-group">
    							<button class="btn btn-primary" id="reset" type="button">Reset</button>
    						</div>
    					</div>
    				</div>
    			</div>
    
    <script src="/js/distpicker.data.js"></script>
    <script src="/js/distpicker.js"></script>
    <script>
    var _distpicker = $('#distpicker');
    
    	_distpicker.distpicker({
    		province: '浙江省',
    		city: '杭州市',
    		district: '上城区'
    	});
    
    	$('#reset').click(function () {
    		_distpicker.distpicker('reset');
    	});
    </script>
    
    

    10、日期控件

    需求:学生生日的选择通过日历控件。

     页面中的定义:

    <div class="form-group" style="margin-top: 10px;">
        <label class="col-sm-3 control-label col-sm-offset-1">生日</label>
        <div class="col-sm-8 username-area">
            <input type="text" class="form-control" id="date" name="birth">
        </div>
    </div>
    $("#date").datetime({
    		type: "date",
    		value: [2019, 9, 31],
    		success: function(res) {
    			console.log(res)
    		}
    	})

     注:在省市区三级联动和日历控件中用了自定义的css以及一些js文件,可在源码中查看,这里不再罗列。

    11、thymeleaf提取公共页面

    需求:每个页面都有顶部菜单栏,因此提取作为公共部分,然后在所需引入即可。

    topbar.html:

    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!-- 导航 -->
    <nav class="navbar navbar-default navbar-static-top  navbar-inverse" th:fragment="topbar">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#slide-left">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <label  class="navbar-brand">高校人员信息管理</label>
        </div>
        <ul class="nav navbar-nav nav-menu" style="margin-right: 25px;">
            <li ><a th:href="@{/user/toPage/(url='/main')}">首页</a></li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">学生培养
                    <span class="caret"></span></a>
                <ul class="dropdown-menu text-center">
                    <li class="text-center"><a th:href="@{/student/studentList}">学生列表</a></li>
    
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/student/studentAnalysis}">学生分析</a></li>
                </ul>
            </li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">教师风采
                    <span class="caret"></span></a>
                <ul class="dropdown-menu text-center">
                    <li class="text-center"><a th:href="@{/teacher/teacherList}">教师列表</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/teacher/teacherAnalysis}">教师分析</a></li>
                </ul>
            </li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">课程信息
                    <span class="caret"></span></a>
                <ul class="dropdown-menu text-center">
                    <li class="text-center"><a th:href="@{/curriculum/curriculumList}">课程列表</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/curriculum/curriculumAnalysis}">课程分析</a></li>
                </ul>
            </li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">班级信息
                    <span class="caret"></span></a>
                <ul class="dropdown-menu text-center">
                    <li class="text-center"><a th:href="@{/class/classAllList}">班级列表</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/class/classAnalysis}">班级分析</a></li>
                </ul>
            </li>
            <li><a href="">关于</a></li>
    
        </ul>
    
        <ul class="nav navbar-nav navbar-right pull-right" style="margin-right: 40px;">
            <li><a >欢迎[[${session.user.name}]]登录</a></li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">我的
                    <span class="caret"></span></a>
                <ul class="dropdown-menu text-center">
                    <li class="text-center" ><a href="#">修改密码</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="text-center"><a th:href="@{/user/toPage(url='index')}">退出</a></li>
                </ul>
            </li>
        </ul>
    
    </nav>
    </body>
    </html>

    footer.html:

    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>$Title$</title>
    </head>
    <body>
    <footer class="footer" style="background-color:#1C1C1C;color:white;height:80px;line-height:30px" th:fragment="footer">
        <div class="container text-center">
            <p>版权所有:YHT China &nbsp;&nbsp;&nbsp;电话:029-12345678<br />地址:陕西省西安市 &nbsp;&nbsp;&nbsp; 邮编:123456</p>
        </div>
    </footer>
    </body>
    </html>

    这两个文件都在templates的commons文件下。

    引入公共部分:

    <div th:replace="commons/bar::topbar"></div>
    <div th:replace="commons/footer::footer"></div>

    12、MD5加密

    需求:对用户的密码进行MD5加密,提高安全性。

    (1)工具类MD5Utils

    public class MD5Utils {
        public static String stringToMD5(String plainText) {
            byte[] secretBytes = null;
            try {
                secretBytes = MessageDigest.getInstance("md5").digest(
                        plainText.getBytes());
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException("没有这个md5算法!");
            }
            String md5code = new BigInteger(1, secretBytes).toString(16);
            for (int i = 0; i < 32 - md5code.length(); i++) {
                md5code = "0" + md5code;
            }
            return md5code;
        }
    }

    (2)注册时MD5加密

     user.setPassword(MD5Utils.stringToMD5(user.getPassword()));

    13、RedirectAttributes

    需求:在重定向之后需要携带参数跳转页面。

    如下:在添加班级之后将提示信息传递到classList页面。

    /**
         * 添加班级信息
         * @param classEntity
         * @param attributes
         * @return
         */
        @RequestMapping("/addClass")
        public String addCurriculum(ClassEntity classEntity, RedirectAttributes attributes){
            //插入数据
            classService.insertClass(classEntity);
            attributes.addFlashAttribute("msg", "添加成功");
            return "redirect:/class/classAllList";
        }
    

    四、总结

    一定要仔细,特别是复制粘贴的时候。在这个项目中,其实出现的问题都是因为自己不仔细,所以才出现的。

    五、代码地址

    https://github.com/MyBestThought/schoolmanagement

    欢迎大家指点!!!

    展开全文
  • 这个系统的主要有三个角色权限,管理员、老师、学生,系统功能模块包括用户管理、班级信息管理、教师信息管理、学生信息管理、科目信息管理、成绩信息管理。 根据本系统的研究现状和发展趋势,系统从需求分析、结构...
  • 1)创建一个双向链表,该链表由Node和List类组成,Node类用于创建结点,List类负责整个链表的管理工作,需要定义指定的成员函数,用于实现对人员信息的增删改查。 2) 从List类派生出Set类,定义成员运算符重载函数,...
  • # 第一题:设计一个全局变量,来保存很多个学生信息;学生(学号, 姓名,年龄);思考要用怎样的结构来保存;# 第二题:在第一题基础上,完成:让用户输入一个新的学生信息(学号,姓名,年龄);你将其保存在全局变量...
  • 这个系统的主要有三个角色权限,管理员、老师、学生,系统功能模块包括用户管理、班级信息管理、教师信息管理、学生信息管理、科目信息管理、成绩信息管理。 根据本系统的研究现状和发展趋势,系统从需求分析、结构...
  • #创建教师 表 CREATE TABLE `teacher`( `tid` INT(4) PRIMARY KEY COMMENT'教师编号', `teaName` VARCHAR(50) NOT NULL COMMENT'教师姓名' )ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='教师信息表'; #创建`score...
  • 1.1开发背景我们现在管理员工的信息方式有多种,比如说,有写在纸上放在文件夹里的,有做成excel表格的,也有记录在WORD文档中或打印出来的,等等很多种形式。对于记录在WORD文档中或打印出来的方式,比较方便,...
  • 面对这样庞大的信息量,就需要有学生信息管理系统来提高学生管理工作的效率 任务概述 需求分析通过详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。...
  • Python校园信息管理系统

    千次阅读 2021-12-13 22:51:02
    学校人员信息包含学生和老师两类,学生基本信息有学号、姓名、性别、专业、班级、年龄、入学时间,详细信息还包括修课名称及成绩;老师基本信息有工号、姓名、性别、专业、入职时间、职称,详细信息还包括授课名称及...
  • 这篇文章主要为大家详细介绍了使用python实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现学生信息管理系统的具体代码,供...
  • 学生信息管理系统毕业论文

    千次阅读 2020-12-20 14:44:11
    1 摘 要 随着 21 世纪的到来,人们更...本文主要讲述了利用 Java 来开发一套学生信息管理系统的设计方法。该 系统采用多个模块, 实现了学生成绩、基本信息的录入、修改、和查询等功能。 关键词: 学生信息 Java 数据库
  • 员工信息管理系统(含附源代码)西安郵電學院 目: 员 工 信 息 管 理 系 统系部名称:电信系专业名称:电子科学与技术班 级:科技0701班内序号:33学生姓名 :贾 春 阳指导教师:黄茹时间:2008年6月10日 至2008年6月...
  • 第一章 课题背景1.1开发背景随着校园...设计开发高效的社团管理系统就显得颇为重要。为了提高效率,充分利用计算机资源,同时也让我们把我们所学的只是运用到实际生活中,锻炼开发设计项目的经验,尤其是我们计算...
  • 内容简介:毕业设计 基于数据库的学生信息管理系统,共65页,16557字,附毕业设计综合材料,数据库,英文文献及翻译,源代码摘要随着高校规模的不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长,庞大...
  • php师资信息管理系统

    2021-04-26 11:52:06
    综合这些要求,该系统至少应该具有以下几个功能:经过我们实际调查、可行性和系统分析,我组现已总结出师资信息管理系统的数据流程.该系统完成后将具备如下功能:教师各种信息的输入,包括输入,输出,修改等;教师...
  • 一、设计说明1、功能结构2、项目架构3、包及Java类说明4、数据库设计二、功能实现1、登陆2、系统主界面登陆时调用LoginServlet,该Servlet完成相应的...3、添加学生信息4、学生信息维护5、根据学号查找学生当学生...
  • 系统特色:干净简洁,可以实现用户的登录和账号管理(包括学生、教师)并实现对课堂的签到(可以记录签到的时间,并且过了时间自动将学生时间复位)可以对人员进行基本上的管理,可以将本节课的记录导出为txt文档。...
  • 河北农业大学本科毕业设计开题报告题 目: 学生信息管理系统学 院: 现代科技学院学生姓名:专 业:计算机科学与技术1002班班级学号:指导教师姓名:指导教师职称: 教授2014年3 月15 日学生姓名专业班级计算机科学...
  • android学生信息管理系统的报告基于Android的学生...学生信息管理系统 随着学校的教育教学改革的发展,学生信息管理的数字化是整个学校教务管理中重要部分,是否实现这一步关系到学校办学整体效率的高低。开发学...
  • 学生宿舍管理系统正是在学校全面提高学校信息化能力的背景下提出的。本系统在访问方式方面采用的是B/S模式,开发语言选择的为Java,后台数据库使用的是MYSQL。首先,用户分为管理员、宿舍管理员和学生。其次,又根据...
  • 校友信息管理系统

    千次阅读 2021-04-27 20:44:03
    校友信息管理系统作为一种方便校友之间联系的实用系统便应运而生。通过提供完善的校友信息管理服务和规范校友信息的管理,可以达到增进校友之间、校友与母校之间的感情,方便校友联系的目的。我
  • 《学生信息管理系统java课程设计(含源代码)》由会员分享,可在线阅读,更多相关《学生信息管理系统java课程设计(含源代码)(43页珍藏版)》请在人人文库网上搜索。1、JAVA程序设计 课程设计报告课 题: 学生信息管理...
  • 455ss百度文库理学院Shoole of Sciences课程设计报告设计名称:综合训练学生姓名:xxxxx学生学号:xxxxx所在班级:xxxxx所在专业:信息与计算科学指导教师:xxxxxx设计场所:理学院机房设计时间:第七学期课程设计...
  • __ _.l l- IC=】同校计算机实验室信息管理系统设计口文/王龙 (辽宁对外经贸学院实验中心辽宁 大连 )[提要] 近年来,随着高校扩招_ T -作的不本走科学发展的道路才能系统的管理计算机统设计目标: ( 1 )功能完善,...
  • python实现学生信息管理系统 #!/usr/bin/env python # -*- coding:utf-8 -*- import re import os # 主函数 def main(): ctrl = True while (ctrl): menu() option = input("请选择:") option_str = re.sub...
  • sportmeetingmanagementsystem(高校运动会信息管理系统)摘要:该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统,系统以IntelliJ IDEA作为开发工具,采用了Java语言和MySQL数据库来实现。...
  • 高校职工信息管理系统(MFC实现) 课程设计任务书 一、任务 开发“高校职工信息管理系统”软件。 二、基本要求 使用面向对象的系统分析和设计,开发基于MFC对话框的C++语言应用软件。 三、任务陈述 高校设有党委...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,898
精华内容 18,359
关键字:

高校人员信息管理系统