精华内容
下载资源
问答
  • 学生信息管理系统(读取文件) 1. 设计目的 1.1巩固和加深对C语言课程基本知识的理解和掌握 1.2利用C语言进行基本的软件设计与开发 1.3了解部分管理信息系统的开发流程 1.4加强自己的团队协作和分析问题的能力 1.5...

    学生信息管理系统(读取文件)

    感想:怎么说呢,自己慢慢做了两个周,

    代码都是手打的,

    也算是对自己曾经选择计算机的一个尊重,

    毕竟以后上万行的代码也要练习的。

    很水的一个题目,

    只怪自己的水平太差劲了......

    1.    设计目的

    1.1巩固和加深对C语言课程基本知识的理解和掌握

    1.2利用C语言进行基本的软件设计与开发

    1.3了解部分管理信息系统的开发流程

    1.4加强自己的团队协作和分析问题的能力

    1.5掌握C语言编程和程序调试的基本技能

    1.6熟悉编译器的基本操作与对错误警告的理解和改正

    1.7提高运用C语言解决实际问题的能力

    1.8掌握书写程序设计说明文档的能力


    2.    功能描述

    2.1人性化的分级菜单操作界面

    2.2可录入信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail

    2.3学生信息可以进行综合浏览,或者自定义排序方式浏览

    2.4以菜单的形式对学生的信息进行录入,并可以写入文件

    2.5屏幕显示区域不同操作有不同的字体颜色

    2.6对已存在的信息进行多次更改,但是没有完成对已存在信息的删除操作


    3.    总体设计

    3.1选题构思过程

    选择学生信息管理系统这个题目后,并不是着急的去敲代码,而是对自己的思路首先有一个框图构架,选择用什么函数,哪些函数需要自己自定义实现,以及对代码的简化等,这一步真的是最不简单的,毕竟第一次没有任何经验与思路。除此之外,我个人的基础还不是很好,如指针与链表,文件等内容。

    3.2用到的知识

    自定义函数;文件的写入与读取;结构体;冒泡排序算法;控制台操作(百度);全局与局部变量的设定;对程序的注释等。


    运行效果:


    代码:

    /******************************************************************************************************
    题目三:学生信息管理系统设计
    	学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。
    	试设计一学生信息管理系统,使之能提供以下功能:
    	系统以菜单方式工作
    	学生信息录入功能(学生信息用文件保存)---输入
    	学生信息浏览功能---输出
    	查询、排序功能---算法
    	按学号查询
    	按姓名查询
    	学生信息的删除与修改(可选项)
    ********************************************************************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <windows.h>
    #define MIN_C 100//每个数据对应字符串类型占据的大小
    #define MAX_G 1000//学生信息量大小
    
    int i_entry;//学生的人数统计
    FILE *fp;//文件指针
    
    struct student {
    	char stuid[MIN_C];//学生学号
    	char name[MIN_C];//学生姓名
    	char age[3];//学生年龄
    	char gender[MIN_C];//学生性别
    	char birth[MIN_C];//学生出生日期
    	char add[MIN_C];//学生地址
    	char tle[MIN_C];//学生电话
    	char email[MIN_C];//学生邮箱
    } DATA[MAX_G];
    
    struct student temp;//用于排序的中间变量
    
    void init() {//文件的初始化读取
    	while (!feof(fp)) {
    		fscanf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", DATA[i_entry].stuid, DATA[i_entry].name, DATA[i_entry].age,
    		       DATA[i_entry].gender, DATA[i_entry].birth, DATA[i_entry].add, DATA[i_entry].tle, DATA[i_entry].email);
    		i_entry++;
    	}
    }
    
    void file_save() {//信息以文件格式录入函数
    	fprintf(fp, "%s\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", DATA[i_entry].stuid, DATA[i_entry].name,DATA[i_entry].age,
    	        DATA[i_entry].gender, DATA[i_entry].birth, DATA[i_entry].add, DATA[i_entry].tle, DATA[i_entry].email);
    }
    
    void RED() {//控制台调整前景色为红色
    	HANDLE kai_1 = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(kai_1, FOREGROUND_INTENSITY | FOREGROUND_RED); // 为红色
    }
    
    void GREEN() {//控制台调整前景色为绿色
    	HANDLE kai_2 = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(kai_2, FOREGROUND_INTENSITY | FOREGROUND_GREEN);// 为绿色
    }
    
    void LIGHT() {//控制台调整前景色为强光
    	HANDLE kai_2 = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(kai_2, FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);// 为强光
    }
    
    void notice() {//提示信息
    	RED();
    	puts("\t\t\t1.学生综合信息录入");
    	puts("\t\t\t2.学生综合信息浏览");
    	puts("\t\t\t3.综合信息排序浏览");
    	puts("\t\t\t4.学生个人信息查询");
    	puts("\t\t\t5.学生综合信息修改");
    	printf("\t\t\t0. 退  出  系  统\n");
    	GREEN();
    	printf("请键入:");
    }
    
    void entry() {//学生信息的录入
    	int flag,i;
    	system("cls");
    	init();
    	flag=1;
    	puts("***************>>>>>>当前模式为学生信息录入状态<<<<<<*************");
    	printf("请输入学生学号:");
    	flag=1;//标识变量,用以判断该信息是否已存在
    	scanf("%s",&DATA[i_entry].stuid);
    	for(i=0; i<i_entry; i++) //判断输入数据的正误,即文件中是否已存在该信息
    		if(strcmp(DATA[i].stuid,DATA[i_entry].stuid)==0) {
    			flag=0;
    			break;
    		}
    	if(flag==1) {
    		printf("请输入学生姓名:");
    		scanf("%s",DATA[i_entry].name);
    		printf("请输入学生年龄:");
    		scanf("%s",DATA[i_entry].age);
    		printf("请输入学生性别:");
    		scanf("%s",DATA[i_entry].gender);
    		printf("请输入学生出生年月日(以/隔开):");
    		scanf("%s",DATA[i_entry].birth);
    		printf("请输入学生联系地址:");
    		scanf("%s",DATA[i_entry].add);
    		printf("请输入学生联系电话:");
    		scanf("%s",DATA[i_entry].tle);
    		printf("请输入学生联系邮箱:");
    		scanf("%s",DATA[i_entry].email);
    		file_save();
    	}
    	if(flag==0)
    		puts("该学号已经存在,如需修改请转到修改命令!");
    }
    
    void Change(int x) {//学生信息的更改提示内容
    	printf("请输入修改后的学生学号:");
    	scanf("%s",DATA[x].stuid);
    	printf("请输入修改后的学生姓名:");
    	scanf("%s",DATA[x].name);
    	printf("请输入修改后的学生年龄:");
    	scanf("%s",DATA[x].age);
    	printf("请输入修改后的学生性别:");
    	scanf("%s",DATA[x].gender);
    	printf("请输入修改后的学生出生年月日(以/隔开):");
    	scanf("%s",DATA[x].birth);
    	printf("请输入修改后的学生联系地址:");
    	scanf("%s",DATA[x].add);
    	printf("请输入修改后的学生联系电话:");
    	scanf("%s",DATA[x].tle);
    	printf("请输入修改后的学生联系邮箱:");
    	scanf("%s",DATA[x].email);
    	puts("数据修改完成!");
    	file_save();
    }
    
    void case5() {//信息更改
    	int flag,i,t;
    	system("cls");
    	puts("***************>>>>>>当前模式为学生信息修改状态<<<<<<*************");
    	LIGHT();
    	printf("选定检索方式:1.学号检索\t2.姓名检索.   请键入:");
    	GREEN();
    	flag=0;
    	scanf("%d",&t);
    	if(t==2) {
    		init();
    		LIGHT();
    		printf("请输入需要修改的学生姓名:");
    		scanf("%s",&DATA[i_entry].name);
    		GREEN();
    		for(i=0; i<i_entry; i++) //判断输入数据的正误
    			if(strcmp(DATA[i].name,DATA[i_entry].name)==0) {
    				flag=1;
    				break;
    			}
    		if(flag==1) {
    			Change(i);
    		}
    		if(flag==0)
    			puts("该姓名不存在,请检查输入是否有误!");
    	}
    	if(t==1) {
    		LIGHT();
    		init();
    		printf("请输入需要修改的学生学号:");
    		scanf("%s",&DATA[i_entry].stuid);
    		GREEN();
    		for(i=0; i<i_entry; i++) //判断输入数据的正误
    			if(strcmp(DATA[i].stuid,DATA[i_entry].stuid)==0) {
    				flag=1;
    				break;
    			}
    		if(flag==1) {
    			Change(i);
    		}
    		if(flag==0)
    			puts("该学号不存在,请检查输入是否有误!");
    	}
    }
    
    void i_printf() {//学生信息的输出
    	int i;
    	printf("学号\t姓名\t年龄\t性别\t出生年/月/日\t联系地址\t联系电话\t联系邮箱");
    	printf("\n");
    	for(i=0; i<i_entry; i++) {
    		printf("%-18s",&DATA[i].stuid);
    		printf("%-16s",DATA[i].name);
    		printf("%-4s",&DATA[i].age);
    		printf("%-6s",DATA[i].gender);
    		printf("%-12s",&DATA[i].birth);
    		printf("%-16s",DATA[i].add);
    		printf("%-16s",DATA[i].tle);
    		printf("%-15s\n",DATA[i].email);
    	}
    }
    
    void case1() {//当键入数字 1 之后的执行情况
    	int flag;
    	flag=1;
    	while(flag) {
    		entry();
    		LIGHT();
    		printf("提示:1,继续录入;0,录入完成.是否继续录入:");
    		GREEN();
    		scanf("%d",&flag);
    		i_entry++;
    	}
    }
    
    void case2() {
    	puts("***************>>>>>>当前模式为学生信息浏览状态<<<<<<*************");
    	i_printf();
    }
    
    void stuid_sort() {//学号排序 冒泡排序算法
    	int r,t;
    	system("cls");
    	puts("***************>>>>>>当前模式以学号排序后浏览状态<<<<<<*************");
    	//struct student temp;
    	for(r=1; r<i_entry; r++) {
    		for(t=0; t<i_entry-r; t++) {
    			if(strcmp(DATA[t+1].stuid, DATA[t].stuid)<0) {//学号由低到高
    				temp=DATA[t+1];
    				DATA[t+1]=DATA[t];
    				DATA[t]=temp;
    			}
    		}
    	}
    }
    
    void name_sort() {//姓名排序 冒泡排序算法
    	int j,k;
    	system("cls");
    	puts("***************>>>>>>当前模式以姓名排序后浏览状态<<<<<<*************");
    	//struct student temp;
    	for(j=1; j<i_entry; j++) {
    		for(k=0; k<i_entry-j; k++) {
    			if(strcmp(DATA[k+1].name,DATA[k].name)<0) {
    				temp=DATA[k+1];
    				DATA[k+1]=DATA[k];
    				DATA[k]=temp;
    			}
    		}
    	}
    }
    
    void case3() {
    	int v;
    	LIGHT();
    	printf("提示:1,按照学号排序;2,按照姓名排序.请键入:");
    	GREEN();
    	scanf("%d",&v);
    	if(v==1) {
    		stuid_sort();
    		i_printf();
    	}
    	if(v==2) {
    		name_sort();
    		i_printf();
    	}
    }
    
    void stuid_find() {//学号查找 利用strcmp()函数
    	int i,flag=0,k;
    	char wqs[MIN_C];
    	k=1;
    	system("cls");
    	puts("***************>>>>>>当前模式以学号查询信息状态<<<<<<*************");
    	while(k) {
    		printf("请键入学生学号: ");
    		scanf("%s",wqs);
    		for(i=0; i<i_entry; i++)
    			if(strcmp(DATA[i].stuid,wqs)==0) {
    				printf("%-18s",&DATA[i].stuid);
    				printf("%-16s",DATA[i].name);
    				printf("%-4s",&DATA[i].age);
    				printf("%-6s",DATA[i].gender);
    				printf("%-12s",&DATA[i].birth);
    				printf("%-16s",DATA[i].add);
    				printf("%-16s",DATA[i].tle);
    				printf("%-15s\n",DATA[i].email);
    				flag=1;
    			}
    		if(flag==0)
    			puts("未查找到该同学信息,如需录入信息请重新键入命令.");
    		LIGHT();
    		puts("请按照文字提示键入命令:");
    		printf("\t\t1.继续查询\n\t\t0.退出查询\n请键入命令:");
    		GREEN();
    		scanf("%d",&k);
    	}
    }
    
    void name_find() {//姓名查找 利用函数strcmp()==0 的特性
    	int i,flag=0,k;
    	char wqs[MIN_C];
    	k=1;
    	system("cls");
    	puts("***************>>>>>>当前模式以姓名查询信息状态<<<<<<*************");
    	while(k) {
    		printf("请键入学生姓名: ");
    		scanf("%s",wqs);
    		for(i=0; i<i_entry; i++)
    			if(strcmp(DATA[i].name,wqs)==0) {
    				printf("%-18s",&DATA[i].stuid);
    				printf("%-16s",DATA[i].name);
    				printf("%-4s",&DATA[i].age);
    				printf("%-6s",DATA[i].gender);
    				printf("%-12s",&DATA[i].birth);
    				printf("%-16s",DATA[i].add);
    				printf("%-16s",DATA[i].tle);
    				printf("%-15s\n",DATA[i].email);
    				flag=1;
    			}
    		if(flag==0)
    			puts("未查找到该同学信息,如需录入信息请重新键入命令.");
    		LIGHT();
    		puts("请按照文字提示键入命令:");
    		printf("\t\t1.继续查询\n\t\t0.退出查询\n请键入命令:");
    		GREEN();
    		scanf("%d",&k);
    	}
    }
    
    void case4() {
    	int v;
    	LIGHT();
    	printf("提示:1,按照学号查询;2,按照姓名查询.请键入:");
    	GREEN();
    	scanf("%d",&v);
    	if(v==1) {
    		stuid_find();
    	}
    	if(v==2) {
    		name_find();
    	}
    }
    
    void deal() {//主要处理函数
    	int k,flag,p;
    	p=1;
    	notice();
    	flag=1;
    	while(flag) {
    		if(p>1)
    			notice();
    		scanf("%d",&k);
    		system("cls");
    		switch(k) {
    			case 0: {
    				puts("温馨提醒:");
    				puts("\t    ^…………^……^^谢谢您的支持,欢迎再次使用!^^……^…………^ ");
    				puts("\t*******学生基本信息已保存在当前目录文件 student_data.txt 下********");
    				flag=0;
    				LIGHT();
    				break;
    			}
    			case 1: {
    				case1();
    				break;
    			}
    			case 2: {
    				case2();
    				break;
    			}
    			case 3: {
    				case3();
    				break;
    			}
    			case 4: {
    				case4();
    				break;
    			}
    			case 5: {
    				case5();
    				break;
    			}
    			default: {
    				RED();
    				printf("请正确键入命令前数字!\n");
    				GREEN();
    				break;
    			}
    		}
    		p=1103;
    		puts("\n");
    	}
    }
    
    int main() {
    	if ((fp = fopen("student_data.txt", "r+")) == NULL) {
    		fp = fopen("student_data.txt", "w+");
    	}
    	init();//文件的初始化读入
    	GREEN();//控制台颜色为绿色
    	printf(" >************欢 迎 您 使 用 学 生 信 息 管 理 系 统(正式版1.0.1)************<\n");
    	printf(">*************     请键入以下命令行所对应的数字进行操作:     *************<\n");
    	printf(">*************   请确定正确退出程序,否则文件将不被正常保存.     *************<\n");
    	deal();//处理数据
    	fclose(fp);//文件正常关闭
    	return 0;
    }
    



    展开全文
  • 首页放置古代学生向老师行礼的PPT背景图片。左侧填写八礼四仪PPT标题文字。界面卡通可爱。 PowerPoint模板内容页,使用了小学生日常礼仪PPT插图,搭配文明礼仪主题班会PPT文字排版。 《八礼四仪》小学生文明礼仪教育...
  • 为了更好的让读者了解到整个项目的设计流程,我将项目拆分成几个部分来就行解说,这一小节是一个总述,主要介绍课设的整个框架和最终效果,代码我会放到后面的github链接,欢迎大家star。如果有...

    写在前面

    这个项目是Java课程的课设,一共花了5天的时间去完成它,在这期间感谢一些博主的帮助,让我了解到了一些新的技术知识,所以打算写这一系列博客来介绍一整个课设项目,也为了帮助之后的人,如有错误,请联系我。

    为了更好的让读者了解到整个项目的设计流程,我将项目拆分成几个部分来就行解说,这一小节是一个总述,主要介绍课设的整个框架和最终效果,代码我会放到后面的github链接上,欢迎大家star。如果有一些参考没有加上联系,希望大家可以联系我,因为写的时候查的比较快,没有记录到博主的链接,敬请谅解!!!

    一、用到的技术栈

    Java基础

    JavaFX项目技术

    Java文件的读写

    JSON格式

    一些简单的设计思想(个人拙见)

    二、具体博客的拆分讲解

    总体介绍,项目成果展示

    项目所需要的环境安装教程(JavaFX 一些需要的jar包)

    实体类、异常的设计

    课设功能的工具设计

    主界面登陆的设计

    学生界面和功能设计

    管理员的界面和功能设计

    教师界面和功能设计

    整个项目遇到的问题和总结

    三、项目的结构

    整体结构

    9f11066f8e76067c740afda2b21e5a5d.png

    在controller里面是放界面的控制器的,主要就是写每个见面对应的功能。每一个fx文件里面都会对应一个controller,类似于mybatis里面的mapper和xml相互对应。里面分为了4个部分登陆、管理员、学生、教师。

    24fc03aa3f8e7835b08767baf096da6f.png

    db里面是模拟数据库的,因为课设要求使用Java读写文件,所以这里我没使用数据库mysql等技术。如果使用数据库会更加的简单一些,因为他返回的数据很容易转化为对象,不需要考虑太多,对于数据的操作就是使用sql语句完成,目前技术封装的挺好!文件操作就得自己写工具去操作读写文件。

    13c2467b3916872ab8e5d923ecfd5ec4.png

    dto中是存放返回到界面上的数据对象,因为每一个对象并不是每一个成员属性都需要返回到前端,所以使用这些对象去转化会更加的方便理解。

    933c6ae67fd904fb59923f05f7950be4.png

    images里面存放的是课设所需要的一些小图标(很多命名不规范,因为找到图直接放入文件夹中)

    9626e2f5647cce41eac55b44812197be.png

    myException是自己的自定义异常处理类,其实不用异常处理也可以(最好使用,但是在可视化中没有具体用到,可以防止程序异常结束),但是为了了解课程就写了一下。

    295bdb8160f05a678cb2aa0e10c3d9e7.png

    pojo中存放的是实体类,对应数据库中的每一个表(模拟的)相当于一个对象里面有很多个属性。

    d70788732330eb7f0d3352182de066eb.png

    utils里面是写的一些工具类,是主要的功能开发的地方,基本上所有的功能都在这些工具里面实现的,使用的时候直接调用工具就可以了(还是挺方便的)

    bb1c79bc3bed11f3fae23618557bb614.png

    view里面是存放的是使用JavaFX编写的fxml文件显示出来的页面,也是分为登陆、管理员、学生、教师模块

    b45e0d6f536ab2aa0baac19859abf133.png

    Main是主程序入口,Test是写工具时候的测试类,然后就是题目啦

    90ef8e663c01d9aea988399e215c7b24.png

    最后是使用的外部jar包,一个是JavaFX必须的开发sdk里面的lib文件夹作为jar引入项目中,另一个是fastjson方便将对象转为json格式

    6fee1087b7b01b7eb08ac858631ae124.png

    四、项目展示

    登陆界面

    76f702bcfe43be99a9c77f7b1d839eb4.png

    管理员界面

    d6209e49de36895c60b7dc318794a905.png

    e684080ca4cf0c96f9f7aea6029ce423.png

    7a257b625f3d6ccbe5ed2986e920631b.png

    7874346440b457622e13f50a08bfd91f.png

    教师界面

    9141c7a4afa17ae39e9304c01ba7e3b6.png

    a56bce6dfb1604dcc07fcb3be27c44e0.png

    9006badd32eed7656c60d8fb1512b537.png

    5153043ebb3230be04fdf3d966e96ed2.png

    学生界面

    bd3c6f9d3ab2f374828dee56ad59d51f.png

    五、小总结

    第一篇已经完成,就简单的介绍一下课设的结构和项目成果的展示,为了方便大家选择是否需要这个技术。后面我会把完整的代码放到GitHub上,欢迎大家star!!!

    关于本篇的其他的章节

    本文地址:https://blog.csdn.net/qq_44761250/article/details/110940928

    希望与广大网友互动??

    点此进行留言吧!

    展开全文
  • 前两天胜利日放假,把以前用java写的学生信息管理系统用python重新写了一遍,以便于帮助python的学习。好了,废话不多说,首先进行需求分析,下面是我根据需求画的系统结构图:纯手工制图。。。。。画的不好请谅解...

    最近公司搬办公室,杂七杂八的事情比较多,又碰上业务要上线了。。。很多事情堆到一起来做,导致最近没什么时间学习,写博客。前两天胜利日放假,把以前用java写的学生信息管理系统用python重新写了一遍,以便于帮助python的学习。

    好了,废话不多说,首先进行需求分析,下面是我根据需求画的系统结构图:

    纯手工制图。。。。。画的不好敬请谅解。从上图来看,整个系统分为main,add,delete,change,select,sort,io,print共八个模块,实现了对学生信息的增删改查排的功能,将结果储存到student.txt文件中去。

    学生信息的数据结构我将其设计为一个学生的一条记录用一个列表来存储,这个列表包含的信息为:学号,姓名,年龄,成绩,地址这些字段。同时,所有学生的记录又结合成一个列表,这样,这个列表就存储了所有学生的信息。

    下面是我的源代码以及对该源代码的分析,以供大家借鉴参考以及自己的记录。(PS:由于本人学习Python的时间比较短,代码难免有写的比较渣的地方,希望各位大神轻喷(^-^!!!))cat main.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import add

    import delete

    import change

    import select

    import sort

    file_path= 'student.txt'       #首先定义数据的存储路径,这里定义为当前程序锁在目录的根目录中

    def main():                    #在main函数中使用while循环来获取用户的输入信息

    while True:

    print(u"welcome to student information management system!")

    print(u"you can use input:add;delete;change;select;sort;quit")

    keyword=raw_input("please input what you want to operation:")

    if keyword=="quit":                      #由于python中没有类似于switch case的方式来实现多项选择,本来打算使用dict来实现这个功能的,但是按照网上的方式,死活无法达到想要的功能,于是,逼得没办法咬咬牙,用if elif来代替switch case的功能,请大神轻喷哈!

    exit(0)

    elif keyword=="add":

    add.index(file_path)

    elif keyword=="delete":

    delete.index(file_path)

    elif keyword=="change":

    change.index(file_path)

    elif keyword=="select":

    select.index(file_path)

    elif keyword=="sort":

    sort.index(file_path)

    else:

    print(u"please input correct option!")

    '''

    else:                                    #这一段实现有问题。。。无法达到目标。

    option={"add":add.index(file_path),

    "delete":delete.index(file_path),

    "change":change.index(file_path),

    "select":select.index(file_path),

    "sort":sort.index(file_path)}

    option.get(keyword,"your input is wrong,please input again!")()

    '''

    if __name__ == '__main__':

    main()cat add.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import io

    def index(file_path):                #这个函数是用来被main调用,实现添加记录的功能,通过这个函数来与用户交互,将获取到的数据通过io写入到文件中。

    while True:

    print(u"please input a student information like:number name age score address")

    print(u"If you want to break,please input quit!")

    keyword=raw_input(u"please input what you want:")

    if keyword=="quit":

    break

    else:

    addline=add()

    addline.addinfo(keyword.split(" "),file_path)

    class add:                           #这里定义了一个类,主要用来实现将获取到的一条记录传到io中,写入文件。

    def __init__(self):

    print(u"we will input this student's information")

    def addinfo(self,student,file_path):

    read=io.io()

    read.add(student,file_path)cat delete.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import io

    def index(file_path):                 #同理,这里也是通过与用户交互,获取到用户想要删除的记录的学号,然后交给delete类来实现删除记录的功能。(ps:这里少了一个判断用户输入的信息是否被成功执行的功能,时间仓促,没有完善哈。)

    while True:

    print(u"please input that you want to delete student's number!")

    print(u"If you want to break,please input quit!")

    keyword=raw_input(u"please input what you want:")

    if keyword=="quit":

    break

    else:

    deleteline=delete()

    deleteline.deleteinfo(keyword,file_path)

    class delete:                        #这个类通过io获取到所有学生信息,然后将用户想要删除的学生学号进行匹配,假如匹配到,则删除该条记录。

    def deleteinfo(self,number,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    for i in information:

    if i[0] == number:

    information.remove(i)

    read.write(information,file_path)cat change.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import io

    def index(file_path):                #这里通过交互获取到用户想要修改的学生的学号,然后传递给change类。

    while True:

    print(u"please input that you want to change student's number!")

    print(u"If you want to break,please input quit!")

    keyword=raw_input(u"please input what you want:")

    if keyword=="quit":

    break

    else:

    changeline=change()

    changeline.changeinfo(keyword,file_path)

    class change:                        #这里通过从io中获取学生信息,存储到list中,然后遍历list,获取到匹配学号的记录,然后获取到用户想要修改后的数据,将其写入到list中,最后再将这个新的List存入到文件中(PS:这里卡了我好久,因为文件中的学生记录是一条记录存储一行,需要在记录的最后面添加上换行符,但是修改后的数据是没有换行符的,为了将换行符添加进去,我想了很多办法,最后才想到直接将输入的字符串和换行符进行链接,然后再存储到list中去。。。。。。表示真想狠狠抽自己嘴巴子。。。)

    def changeinfo(self,number,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    for i in information:

    if i[0] == number:

    print(u"please input the student's information that you want to change like:number name age score address")

    keyword=raw_input(u"please input what you want:")

    keyword=keyword+'\n'

    information[information.index(i)]=keyword.split(" ")

    read.write(information,file_path)cat select.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import io

    import printstudent

    def index(file_path):                #通过交互,获取到用户想要查询的学生的学号,然后传入select类中进行查找。

    while True:

    print(u"please input that you want to select student's number!")

    print(u"If you want to break,please input quit!")

    keyword=raw_input(u"please input what you want:")

    if keyword=="quit":

    break

    else:

    selectline=select()

    selectline.selectinfo(keyword,file_path)

    class select:                        #通过获取到用户想要查找的记录的学号,同时获取到学生信息列表,然后将其传入到printstudent块中进行处理。

    def selectinfo(self,number,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    printstudent.selectstudent(number,information)cat sort.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    import io

    import printstudent

    def index(file_path):                #同样的,通过交互获取到用户想要通过什么方式进行排序,可选择的有学号,年龄,成绩。

    while True:

    print(u"please input what keyword that you want to sort,you can choose 'number'or'age'or'score'those keywords")

    print(u"If you want to break,please input quit!")

    keyword=raw_input(u"please input what you want:")

    if keyword=="quit":

    break

    elif keyword=="number":

    numbersort=sortstudent()

    numbersort.numbersort(file_path)

    elif keyword=="age":

    agesort=sortstudent()

    agesort.agesort(file_path)

    elif keyword=="score":

    scoresort=sortstudent()

    scoresort.scoresort(file_path)

    else:

    print(u"please input currect keyword")

    class sortstudent:                #通过index函数调用类中不同的排序关键字对应的方法,可以对学生信息通过关键字进行排序。(PS:我觉得这部分写的比较繁琐,可能可以进行更简化的操作,提高代码重用率,可是目前我没想到更好的办法。。。抱歉哈。。。)这里提到了sorted函数,这个函数可以对传入进去的列表进行排序,生成一个新的列表副本,同时里面还可以使用lambda对应列表嵌套进行排序,这个功能是一个很实用的功能,只想说好顶赞!!!

    def numbersort(self,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    sorted_information=sorted(information,key=lambda student:student[0])

    printstudent.printstudent(sorted_information)

    def agesort(self,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    sorted_information=sorted(information,key=lambda student:student[2])

    printstudent.printstudent(sorted_information)

    def scoresort(self,file_path):

    read=io.io()

    information=[]

    information=read.read(information,file_path)

    sorted_information=sorted(information,key=lambda student:student[3])

    printstudent.printstudent(sorted_information)cat printstudent.py

    #__author__ = 'Administrator'

    # -*- coding: utf-8 -*-

    def printstudent(information):                #这个没什么好说的,对查询和排序传过来的列表进行排序,其中,主要需要注意格式化输出。这里面使用了%+20s,其中的+20是占位20的宽度,数据向右对齐。由于排序和查询输出结构不一样,于是写了两个输出函数来实现(个人感觉这里也可以进行精简)。。。

    for i in information:

    print("number: %+20s" %str(i[0]))

    print("name:   %+20s" %str(i[1]))

    print("age:    %+20s" %str(i[2]))

    print("score:  %+20s" %str(i[3]))

    print("address:%+20s" %str(i[4]))

    def selectstudent(num,information):

    for i in information:

    if i[0]==num:

    print("number: %+20s" %str(i[0]))

    print("name:   %+20s" %str(i[1]))

    print("age:    %+20s" %str(i[2]))

    print("score:  %+20s" %str(i[3]))

    print("address:%+20s" %str(i[4]))cat io.py

    #__author__ = 'huxianglin'

    # -*- coding: utf-8 -*-

    class io:                #这部分是写的最纠结的,最开始由于对文件操作不熟悉,总是无法实现正确的换行写入操作。。。。。最开始选择逃避的办法,一条一条插入数据,后面发现写不下去了,还是需要写出写入文件的正确办法,在网上找了好久的资料终于在最后想到了在每个列表的末尾添加换行符来解决操作,于是,就有了上面那个修改数据后怎么添加换行符的操作。。。(PS:总觉得这种方式是拆东墙补西墙的感觉。。。碰到一个问题,解决一个,然后因为改动,又出现了新的问题。。。)这里一条一条插入数据使用了print的重定向功能,这样就自动在每条数据的最后面添加了换行符。

    def read(self,information,file_path):

    with open(file_path,'r') as f:

    for line in f:

    information.append(line.split(' '))

    return  information

    def write(self,information,file_path):

    f=open(file_path,'w')

    for line in information:

    f.write(' '.join(line))

    f.close()

    def add(self,information,file_path):

    f=open(file_path,'a')

    print>>f,' '.join(information)

    f.close()cat student.txt

    127 guojianlin 23 98 shenzhen

    123 huxianglin 21 99 shenzhen

    126 huxianglin 25 95 shenzhen

    124 huxianglin 26 97 shenzhen

    125 huxianglin 24 96 shenzhen

    129 huxianglin 28 92 shenzhen

    128 huxianglin 27 91 shenzhen

    122 huxianglin 25 93 shenzhen

    131 huxianglin 21 95 shenzhen

    上面是文件里面存储的信息,随便刷的。。。总结来看这次小的程序设计做的磕磕绊绊主要是由于对python不熟悉的原因,有很多想法就是不知道该如何实现。。。QAQ果然我还是练得太少了!!!

    但是在这次重写过程中,我发现python确实开发速度比起java来要快不少,特别是处理文件类的操作,list,dict简直就是python的大杀器,以前我实现这个功能用java写的,差不多有500行代码才实现,用python实现这个功能才用了200行左右的代码就搞定了,这还是在我对python不怎么熟悉的基础上,由以上对比可以看出,pyhthon开发确实比java等这些语言开发速度快多了。这也给了我继续将python学下去的信心!!!学习的路上总会碰到沟沟坎坎,坚持下去,终能走到终点!加油,各位共勉之!

    展开全文
  • 基于JSP的学生管理系统

    万次阅读 多人点赞 2018-06-03 11:23:24
    由于是新手学习,当中的代码格式不够规范,还请各位多多包含。本项目已经在Github中开源,请各位大佬Star,Folk,Issue。 项目的总结构如图   数据库表: 所有表:   login表结构: ...

                                    -----------2019年6月1日更新-----------  

      

    很感谢大家的阅读,不过在这里希望能够提几点学习前的问题。第一,其实我是不太建议各位去学习这一篇文章,毕竟这是我刚刚接触JavaWeb时写的项目,所以代码质量是不太好的,容易会出现Bug,再加上在JSP中写Java代码在开发中是不规范的,我是为了应付当时的作业才这样做。我更建议大家去看一下我另外一个项目:《基于Servlet的学生管理系统》,这里是基于这个项目,换一种技术进行重写的,里面有更多逻辑上的优化,排版也更舒服。如果希望进阶学习的话可以看下我的另外一篇文章:《【机房报修管理系统】1.简介篇 机房报修管理系统简介》,由于工作原因比较忙总是补不上前端篇的文章,可能在以后会填上这个坑的,在这里再次感谢各位读者的阅读,依然是那句话:“如果有疑问的地方,先百度,不行就写评论提问,最后没反应就发送邮件”。如果发送邮件三天内都没有回应,可能是我查阅邮件后忘了或者您的邮件被系统认为垃圾邮件导致我看不到,请重新发送或者写评论提示以下,一般写评论后我的邮箱是会收到邮件的。

                                    -----------2019年5月6日更新-----------

    时隔一年更新,发现有很多人在看本文章,也有不少人提出疑惑,由于我已经在上班,空闲时间不多,所以不能够及时给你们解答,在这里先说一声抱歉。其次有很多同学在部署后出现以下问题 ,出现原因已经写在评论中,请查看,也感谢这位热心的同学的解答。

    一、摘要

     

            本系统前端是基于HTML+CSS+Bootstrap,后端基于纯JSP制作而成。由于是新手学习,当中的代码格式不够规范,还请各位多多包含。本项目已经在Github中开源,请各位大佬Star,Folk,Issue。

    项目的总结构如图

     

    数据库表:

    所有表:

     

    login表结构:

     

    studentinfo表结构:

             

     

    GitHub地址:我的GitHub

     

    二、安装环境

     

    • 操作系统:MicroSoft Windows 10 1709
    • JAVA版本:1.8.0_172
    • 前端:HTML+CSS+JavaScript+BootStrap 4.0
    • 后端:Tomcat 8.5+JSP

    三、实现功能和部分界面预览

     

    • 管理员登录系统
    • 学生资料的增加、修改、删除、查询
    • 管理员账号密码重置
    • 管理员退出系统
    • 登录界面
    • 主界面
    • 添加学生资料
    • 查询界面
    • 密码重置界面

    四、安装方法

     

     

    1. 方法一:
    1. 访问我的GitHub:点击打开链接
    2. 下载我的项目(Down Zip)
    3. 解压后打开eclipse,File->Open Projects From File System,点击Directory选择刚刚解压出来的文件夹,点击finsh就行了。
    4. 使用Mysql命令执行我项目下MySQL文件夹里面的StudentManagementByWeb.sql脚本文件,还原数据库。
    5. 修改我项目下所有访问数据库的账号和密码的java语句,root改为自己的Mysql账户名,123456改为自己的Mysql相对应的密码。如这样的
    6. 看看项目环境是失效,如果失效通常项目都会有个红色小X的,只需要右键项目->Build Path->configure Build Path修复相对于失效的环境就行了。
    7. 运行TomCat,项目搭建完毕(账号和密码都是:admin)。
    8. 如果出现登录了正确的账号和密码后跳转的页面是空白,请按照第七点的第四小点进行操作。

    方法二:

     

    1. 访问我的GitHub:我的GitHub
    2. 复制圈中的地址
    3. 打开Eclipse,File->Import,选择如图,然后按next
    4. 选择 clone URI,点击next
    5. 把复制的地址粘贴到URI栏,eclipse会自动补全下面的信息,然后不断点击next或Finsh直到项目导入。
    6. 执行方法一的步骤4~8
    7. 完成项目搭建。

     

     

     

    五、关键代码段和思想

     

    1.如何连接MySQL数据库?

    如DAOCheckLogin.jsp中的部分代码

    request.setCharacterEncoding("UTF-8");
    	String user = request.getParameter("user");
    	String password = request.getParameter("password");
    	String sqlQuery = "SELECT * FROM stumanagementbyweb.login WHERE user='"+user+"'AND password='"+password+"'";
    	try{
    		Class.forName("com.mysql.cj.jdbc.Driver");
    		Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/stumanagementbyweb","root","123456");//创建一个Connection对象,DriverManager.getConnection("MySQL地址","MySQL账户名","MySQL密码");
    		Statement sql = con.createStatement();//创建一个动作
    		ResultSet rs = sql.executeQuery(sqlQuery);//把执行的结果放入到结果集中
    		if(rs.next()){//遍历整个结果集,如果有下一行返回TRUE,没有则返回false
    			session.setAttribute("user", user);
    			session.setAttribute("id", rs.getString(1));
    			response.sendRedirect("frame.jsp");
    		}else{
    			out.print("<script language='JavaScript'>alert('您的用户名或密码有误,请重新输入或者注册');window.location.href='Login.html'</script>");
    		}
    		con.close();
    	}catch(SQLException e){
    		e.printStackTrace();
    	}

    2.如何把数据库所有的数据显示在表格中?

        思想:先遍历学生信息数据表的每一行,然后使用JSP中的out.print()。

        做法:在Contain.jsp中有如下的代码段:

    while(rs.next()){
    			out.print("<tr>");
    			out.print("<td>"+rs.getString(1)+"</td>");
    			out.print("<td>"+rs.getString(2)+"</td>");
    			out.print("<td>"+rs.getString(3)+"</td>");
    			out.print("<td>"+rs.getString(4)+"</td>");
    			out.print("<td>"+rs.getString(5)+"</td>");
    			out.print("<td>"+rs.getString(6)+"</td>");
    			out.print("<td>"+rs.getString(7)+"</td>");
    			out.print("<td><a href='AlertStudent.jsp?id="+rs.getString(1)+"'><button class='btn btn-primary'>修改</button></a><a href='DaoDelete.jsp?id="+rs.getString(1)+"' onclick='javascript:return del();'><button class='btn btn-danger'>删除</button></a></td>");
    			out.print("</tr>");
    		}

    当中的while(rs.next())就是遍历了学生信息表的每一行,所以利用rs.getString()来获取当前行的某一列,如第一列为rs.getString(1)如此类推。由于我在插入JSP代码是在HTML的表格<table></table>的范围中,所以能把所有信息以表格的形式列出来。

    3.如何做到按一下修改按钮能够跳转到相应的页面并且显示修改的信息?

    思想:在Contain.jsp中在遍历每一行数据时我都在超链接处留下一个相对应的id,让每一行的id通过URL进行传值,然后在DaoAlertStudent.jsp获取到相应的id,再进行数据库查询,从而得出当前行的信息。

    做法:

    out.print("<td><a href='AlertStudent.jsp?id="+rs.getString(1)+"'><button class='btn btn-primary'>修改</button></a><a href='DaoDelete.jsp?id="+rs.getString(1)+"' onclick='javascript:return del();'><button class='btn btn-danger'>删除</button></a></td>");

    在此行代码中,我做了一个有超链接的按钮,超链接的地址指向AlertStudent.jsp,但是我在地址的后面还写了?id="+rs.getString(1),这样一来可以把当前行的id传给AlertStudent.jsp,只要在AlertStudent.jsp中写request.getParameter("id");就能够获得当前行的id。利用id进行数据库查询,得出当前行的信息,再把各个信息放在相对应的表单控件中就可以完成信息展示。

    4.如何做到选择院部的时候专业的内容相对应会改变?

    这种功能是通过JavaScript实现的,这样能减少访问数据库的次数。

    这里要感谢以下文章地址的作者,我是仿照他的代码进行修改

    点击打开链接

    我仿照的代码,出自AddStudent.jsp

    var librarians = ['机电工程学院', '电子信息学院', '工商管理学院', '财经管理学院', '汽车工程学院'];
    		var choice = ['---请选择---'];
    		var electromeChanical = ['数控技术', '模具设计与制造', '机械制造与自动化', '机电设备维修与管理', '工业机器人', '电气自动化', '机械设计与制造'];
    		var electronicInformation = ['工业设计', '艺术设计', '光伏工程技术', '光伏发电技术与应用', '物联网应用技术', '计算机应用技术', '通讯技术', '电子信息工程技术'];
    		var businessCircles = ['物流管理', '电子商务', '市场营销', '国际贸易实务', '工商企业管理', '商务管理'];
    		var financialManagement = ['会计', '金融管理与实务', '财务管理', '酒店管理', '旅游管理'];
    		var automobileEngineering = ['食品营养与检测', '汽车技术服务与营销', '汽车检测与维修技术'];
    
    		var professional = new Array;
    		professional[0] = choice;
    		professional[1] = electromeChanical;
    		professional[2] = financialManagement;
    		professional[3] = businessCircles;
    		professional[4] = electronicInformation;
    		professional[5] = automobileEngineering;
    
    		function add_option(select, option) {
    			var target = document.getElementById(select);
    			for(var i = option.length - 1; i >= 0; i--) {
    				var add_option = document.createElement("option");
    				add_option.text = option[i];
    				target.add(add_option, null);
    				target.lastChild.setAttribute("value", option[i]);
    			}
    
    		}
    		add_option("college", librarians);
    
    		document.getElementById("college").addEventListener("change", function() {
    
    			var selevted_college = document.getElementById("college");
    			var selected_major = document.getElementById("major");
    
    			for(var i = selected_major.length - 1; i >= 0; i--) {
    				selected_major.remove(i);
    			}
    			var selected = selevted_college.selectedIndex;
    			if(selected == 0) {
    				add_option("major", professional[0]);
    			} else {
    				add_option("major", professional[selected]);
    			}
    		})

     

    5.如何防止访问者绕过登录界面访问其他页面?

    思想:在一开始登录的时候检查用户是否正确,如果正确就建立一个session的会话,每个页面在进行操作之前都需要检查session会话是否为空,若为空则使用JavaScript提示需要登录并且强制跳转回登录界面。

    做法:在DaoCheckLogin.jsp中检查输入的账号和密码是否正确,如果正确就执行一条语句session.setAttribute("user", user);,这条语句的意思是将user这个对象保存在session作用域中,而Session的生命周期是Session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当Session超过时间限制后,Session注销而失效。

    然后在每个页面的在执行JSP语句之前先检查user这个对象是否为空

     

    if((String)session.getAttribute("user")==null){
    			out.print("<script language='JavaScript'>alert('请先登录!');window.location.href='Login.html'</script>");
    		}

    如果user为空则输出一个JavaScript语句,弹出窗口说“请先登录!”并且强制跳转回登录页面。

    附上DaoCheckLogin.jsp代码:

    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
    
    	request.setCharacterEncoding("UTF-8");
    	String user = request.getParameter("user");
    	String password = request.getParameter("password");
    	String sqlQuery = "SELECT * FROM stumanagementbyweb.login WHERE user='"+user+"'AND password='"+password+"'";
    	try{
    		Class.forName("com.mysql.cj.jdbc.Driver");
    		Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/stumanagementbyweb","root","123456");
    		Statement sql = con.createStatement();
    		ResultSet rs = sql.executeQuery(sqlQuery);
    		if(rs.next()){
    			session.setAttribute("user", user);
    			session.setAttribute("id", rs.getString(1));
    			response.sendRedirect("frame.jsp");
    		}else{
    			out.print("<script language='JavaScript'>alert('您的用户名或密码有误,请重新输入或者注册');window.location.href='Login.html'</script>");
    		}
    		con.close();
    	}catch(SQLException e){
    		e.printStackTrace();
    	}
    %>
    </body>
    </html>

     

     

     

    6.如何做到按左侧的侧边导航栏,网页能够在导航栏的右侧显示(如主界面)?

    思想:这里涉及到了HTML的框架布局,可以点击此超链接查看相关内容   点击打开链接,设计好框架后把相应的网页放进框架中,导航栏那里的超链接的target属性记得是要填你想要显示框架的name属性的属性值。不然他会默认刷新超链接所在的当前框架。

    做法:下面是我的frame.html代码(注意在框架页里面,框架不能在body元素中,必须要删除body元素,不然会不显示):

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <%
    if((String)session.getAttribute("user")==null){
    	out.print("<script language='JavaScript'>alert('请先登录!');window.location.href='Login.html'</script>");
    }
    %>
    <frameset rows="10%,*" frameborder="0" framespacing="10">
    		<frame src="Top.jsp" noresize="noresize" scrolling="yes" />
    		<frameset cols="30%,*">
    			<frame src="Left_nav.html" noresize="noresize" />
    			<frame src="Contain.jsp" name="contain" />
    		</frameset>
    	</frameset>
    </html>

    大概的布局图就是这样:

    我的Left_nav.html代码如下:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
    		<script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
    		<script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    		<style type="text/css">
    			ul{
    				width: 200px;
    				height: 200px;
    				float: right;
    				margin-top: 30px;
    				
    			}
    		</style>
    	</head>
    	<body>
    		<ul class="nav nav-pills nav-stacked">
    			<li><a href="Contain.jsp" target="contain">学生管理</a></li>
    			<li><a href="AdminPasswordReset.jsp" target="contain">账号密码重置</a></li>
    			<li><a href="SystemExit.jsp" target="_parent">退出系统</a></li>
    		</ul>
    
    	</body>
    </html>

    我的超链接的target属性都是指向了contain,跳转的时候只有contain这个框架镜像刷新,这样就能做到问题的效果。

     

    7.如果我的元素在框架中,但是我需要实现整个页面进行刷新或者跳转,我该怎样实现?

    做法:一般来说,如果元素在框架中,如果不设置某些属性,当超链接跳转的时候只会在当前框架刷新,不会整个页面刷新,如果需要实现整个网页刷新,对应不同的情况有不同方法。

    超链接:

    <a href="SystemExit.jsp" target="_parent">退出系统</a>

    target的属性值必须是“_parent”,属性解释请看下图或点击超链接        点击打开链接

     

    JavaScript:

    <script type='text/javascript'>window.parent.frames.location.href='Login.html';</script>

    详细解释可以看这位作者的文章:点击打开链接

     

     

    8.如何实现类似于百度分页的分页效果?

        思想:首先得要有两个概念,最大页和最小页,这个最小页(minPages)和最大页(maxPages)是用于接下来循环的边界(以下的什么当前页(pagesNo)-3,当前页(pagesNo)+3中的数字可以任意设置,看你分页需要有多长的需求,数字越大,分页显示的数字就越多)。最小页需要判断当浏览的当前页(pagesNo)-3页的时候是否小于0时,如果小于0便会越界,因为没有页数是负数的,所以需要检查当前页(pagesNo)-3页的时候如果小于0时,就需要把最小页变为1,如果不是小于0,则最小页为当前页-3页。最大页同理,如果当前页(pagesNo)+3页如果越过数据库所有数据所呈现的页数(pagesCount),则最大页只能是等于数据库所能所能提供的最大页数,否则最大页就是当前页+3。最后循环显示页数就能得到这样的效果。

        做法:

                代码出自Contain.jsp,可以对应上面的思想进行分析,下面有判断是否是当前页,如果是当前页则添加高亮css的class属性。

    pagesCount = (lastRow % pageSize == 0) ? (lastRow / pageSize) : (lastRow / pageSize +1);
    int minpages = (pagesNo - 3 >0) ? (pagesNo - 3) : 1;//使用了三目运算符
    int maxpages = (pagesNo + 3 >= pagesCount) ? (pagesCount) : (pagesNo+3);
    for(int i = minpages;i <=maxpages ;i++){
        if(i == pagesNo){//判断是否是当前页
            out.print("<li class='page-item active'>");
    	out.print("<a class='page-link' href='Contain.jsp?pages="+i+"'>"+i+"</a>");
    	out.print("</li>");
    	}else{
    	out.print("<li class='page-item'>");
    	out.print("<a class='page-link' href='Contain.jsp?pages="+i+"'>"+i+"</a>");
    	out.print("</li>");
    	}
    							
        }

     

    9.如何实现分页当前页高亮效果?

        由于我是使用BootStrap,里面有一个class属性:.active,把这个属性放到相对应的class中就可以了,详情可以参考代码Contain.jsph和上面的第八点。也可以参考以下网址:点击打开链接

     

     

    六、关于编程过程遇到的坑

    1.明明html页面修改后提交到Tomcat,但是页面还是没有改变?

    答:这是由于浏览器里面优先读取了缓存,即记录下你之前登录过这个系统的样式,浏览器这样做是为了能让网页访问速度更快,但是在这里却变成了绊脚石。解决方法有两个

        (1)设置HTML页面不缓存

                可以在HTML开头使用以下语句使HTML不缓存

    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache" content="no-cache">

        (2)每次进入更新HTML页面的时候使用CTRL+F5进行刷新,这样能不通过缓存进行刷新。

     

    七、不足之处

        1.没有实现将所有查询到的数据分页显示,如果没有分页显示,现在数据库的数据量少还可以,但是一旦数据库有上千条数据,在显示的时候会导致一页往下拉全是数据,这样用户用起来体验就不好了。

    <-------------------------------------------------2018年6月4日更新--------------------------------------------->

    分页查询已经实现,请示通过数据库指定行数查询+id传值的方法就能够实现,详情看我GitHub源码的Contain.jsp。

    改动后发现了新的Bug:

    如果我的数据库有上千行语句,以每页显示10行来计算,需要100页,也就是100格,可是屏幕的空间根本不能够容下一行1000格的空间,所以分页元素极有可能会溢出。所以现在的解决思路是像百度那样分页,按下第10页,然后第10页移到中间,如此类推。

    选中第10页前:

    选中第10页后:

    <-------------------------------------------------2018年6月7日更新--------------------------------------------->

    修复了了上面分页的Bug,能够像百度的分页那样自动扩展页数并且增添了当前页高亮的效果。效果图如下:

    第一页

    第四页

    第八页

        2.界面比较简单,毕竟理科生没有艺术细胞。在这里打个广告需要前端美工一名,没有工资

        3.开发过于随意,没有计划性。不管三七二十一先写了再说

        4.在登录界面第一次输入正确密码的时候,跳转时网页空白,控制台报错。

    页面:

    控制台:

             解决方法:我参考的方法:点击打开链接 这个是因为我选的JDBC版本太高(8.0),所以导致数据库的时区出错。解决方法可以在命令行登录了MySQL数据库,输入一下命令行:

    set global time_zone='+8:00';

     

    八、总结

            最近的JSP课程讲到了数据库的连接,然后我就试着用单纯的JSP来写这个学生资料管理系统,怎么说呢,我在以前有用过Java+Swing的形式做过一个学生管理系统的经验,项目地址:点击打开链接。所以这一次的项目我是按照上一次的经验做成的。虽然说代码量不大,估计前端+后端就700~800行,可是一个人兼顾前端和后端是真的累,以后要找个会前端的帮忙背锅(笑),花了大概3~4天的空闲时间,这次的开发也挺随性的,想到什么就写什么,完全没有开发流程的规范,在实现点击修改按钮就能修改当前行的功能时,还想了一早上都不知怎样实现,然后突然灵感一来,想到<form></form>能通过get方法让URL来传值,超链接也可以仿照get方法来传学号的值,再通过查询数据库就能获得当前的值了(其实直接把所有的内容通过传值获得,那就能减轻数据库的负担,这种方法更好,但是安全性不高),所以有时编程知识面和灵感也很重要。

            这一次的开发虽然是按照旧的经验做的,但是也学到很多东西,如BootStrap框架的使用,JavaScript的使用,等等。巩固了上课的内容,充实了自己,自己亲手把东西做出来后也是挺有成就感的,可能下次的作品还是学生管理系统,只是编程了使用各种框架,实现前端和后端分离的学生管理系统,还敬请期待。

     

     

    展开全文
  • 最近在练习一个学生管理系统的项目,需要有一个初始的有大量数据学生表。参考 https://blog.csdn.net/yeyu_xing/article/details/108844330 生成随机学生信息的RandInfo类 学生信息有:姓名、性别、年龄、班级、住址...
  • 彼らは みな この大学の学生ですか? 高橋:はい、そうですよ。 林:書庫は どこですか? 高橋:書庫はそこです。その右側は貸し出し室です。ご案内しましょう。 林:蔵書は多いですね。 高橋:この図書館では日本語の本...
  • 诗词竖着写的格式(例: 题临安邸 )

    千次阅读 2021-06-18 11:01:46
    竖写诗的格式1、写内容,由右到左 ,由到下写 ,没有标点符号, 直接往下写, 写完后,另起一列 ,空一格; 2、内容写完后写诗名、作者、落款(用较小的字), 后面空 一格,然后盖章 ,注意图章不要太大 ,章的大小...
  • 此篇是基于一篇而改进的(高级版) 编写过程:
  • 中国书法的书写格式

    2021-06-14 05:36:19
    其他作品格式一般都写在左边,如分两行落款,则款写在前行,下款写在后行;若单行落款,则款写在半部,下款写在下半部,以示礼貌。单款和双款都不能和正文平齐,要有参差,才不致平板,一般上下都要空出几个字...
  • C语言课程设计学生通讯录管理系统设计 一、题目内容的描述 学生通讯录管理系统设计 设计一个学生通信录,学生通迅录数据信息构成内容可自行设计(如:姓名、家庭地址、邮政编码、电话号码等等),通信录数据类型定义为...
  • NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。 问题,我们有Wifi,蓝牙这一系列的交互的方式,那为什么要用NFC? 制造成本低。只需要把一块NFC功能模块搭载到移动终端就可以使用。 安全性...
  • 此乃07届计算机系毕业生标准合格论文,包括内容规范和文章字体格式等,其他院校可能略有不同,请参考
  • 点击上方“Python高校”,关注文末干货立马到手近日,“武大学生用代码敲出樱花绽放”登热搜,网友直呼“太优秀了”。细看视频你会发现,每个像素都是“武...
  • 第1关:输入5个学生的数学、语文、英语3门课程的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩 任务描述 本关任务:输入5 个学生的数学、语文、英语 3 门课程的成绩,计算并输出每一门课程的平均成绩...
  • 学生信息管理系统分为三个部分 项目展示 源码分析 项目打包 现在展示的是对原有系统进行二次开发的结果。为2.0版本。 一、界面设计 1、新建项目 新建项目的时候选择Windows窗体应用程序 2、工具箱的使用 ...
  • 计算机专业刚毕业的学生,如何写简历呢?

    千次阅读 多人点赞 2020-12-31 13:52:00
    计算机相关毕业生如何写简历前言亲爱的大学生朋友们,你们好!我是泰斗贤若如,你们还在为不会写简历而发愁吗?不要慌,我专门给大家请来了救兵,一位资深架构师亲自教你如何写简历。hsm_comp...
  • @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //(a)使用命令行参数,输入学生名单,和 班级名称 // 使用格式: java ...
  • 问卷调查表格式范本篇一:调查问卷的基本格式及范文调查问卷的基本格式:1、称呼加问候语2、访问员介绍3、简明介绍此次调查的目的4、说明作答的意义5、说明作答该问卷没有负面影响6、致谢7、单位和日期范文:关于...
  • (2017-03-03 银河统计) 利用计算机模拟仿真各类信息管理系统,学习、体验信息组织与...学生人数男生性别比例生成学生注册信息库 注:可以重新设置学生人数和男生性别比例,点击“生成学生注册信息库”按钮生成...
  • 截至2019年,全国大学生GIS应用技能大赛已经举办了八届。举办学校如下:第一 举办届数 举办学校 1 滁州学院 广西师范学院 西北师范大学 华东师范...
  • 完成对学生信息的管理功能:增加,删除,修改,查找(本演示项目目的是为了入门SpringBoot,所以不会花费时间在前端界面,所以开发出程序为api接口,使用 postman 可以很方便的发送各种请求到一些接口来...
  • 一、功能要求 1、要求实现输入对应的字母(不区分大小写)选择相关的功能: a:查询所有学生信息, b:添加学生信息 , c:根据学生id修改学生分数信息, d:根据学生id删除学生信息, q: 退出程序! 二、需运用的...
  • 《C语言学生选课管理系统》由会员分享,可在线阅读,更多相关《C语言学生选课管理系统(35页珍藏版)》请在人人文库网上搜索。1、档命唇窄蛊酥袖瞧眩筛滓疑傻陪支丈停尊夯员翌界亢禾幽桃龟伦渐剪畏侗鹿殃豌抵刺堪脯材...
  • 学生信息管理系统(三)——界面分析

    千次阅读 热门讨论 2014-07-05 21:39:38
      在上两篇博客中,我们分别对系统的功能和数据库进行了分析,今天我们就开始实战了,并对这个系统进行进一步的分析。 ...我们的程序设计分为两步...请期待下篇博客《学生信息管理系统(四)——模块分析》
  • 记录一个咸鱼大学生三个月的奋进生活017复习Java(学生信息管理系统05所有菜单功能的实现)实现MenuListener菜单功能按钮监听器再在MainFrame主界面动态挂靠菜单功能方法下将每个功能按钮都添加MenuListener监听器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,026
精华内容 810
关键字:

学生敬上格式