java课设选择了学生成绩管理系统,在此记录一下自己做课设的一些想法和问题。
文件源码放在:
https://gitee.com/feeling-cool/java-information-system
课设开始之前先查一下需要开发工具以及存储数据的方法,自己电脑上安装的是idea,那就决定用idea编写Java程序,存储数据的方法最初是觉得用文件系统管理,我觉得文件系统的操作相对于数据库的操作会更容易开始。但是看了一下课设说明书,发现必需使用数据库,数据库也可以充当服务器端用来存储数据。这样也就可以和课设题目对应上了。数据库就选择大家做课设都在用的MySQL,MySQL本身安装也比较简单,我就找网上的教程自己安装了一下。
安装完数据库,第一步当然是新建项目,但是这次要连接数据库,所以我们需要把idea和数据库连接上,这一步我花了点时间,因为我把数据库和idea连接之后,发现无法对数据库执行增删查改操作,查了一些的资料,大致确定自己是没有导入connect j 的jar包,需要去官网下载一下connect j 的jar包,将jar包导入idea,照着网上找到的方法,把jar包导入idea再试一下能不能对已经建好的表执行增删查改,发现已经可以正常执行操作,到此为止,课设最基本当然也是最核心的对数据库的增删查改操作可以基本确定如何编写。
一切准备就绪,我们先创建自己需要存储数据的表 studentinfo1数据名称和字段长度设为(name char(10),no int , python int ,java int ,db int)的格式,就是存储姓名,学号,python成绩,java成绩,数据库成绩的表。
课设正式开始,第一个类就写对数据库操作的类。
先写最重要的数据存储,第一步需要加载一下数据库的驱动,然后连接数据库,然后就要开始写重要的sql语句了,向预先建好的表studentinfo1插入数据,用到的sql语句就是insert into studentinfo1 values(xx,xx,xx,.....)如果你只是插入一行数据,那就可以把你想添加的数据写入括号后的值里,但是我们需要很多行不同的数据,所以把这个插入功能封装成函数,当插入时,调用函数,为函数传入不同的参数,实现插入多行不同的数据。因为我在建studentinfo1,采用的是(name char(10),no int , python int ,java int ,db int)的格式,所以我们插入的值也需要满足这样的类型,所以就在封装函数是设置形式参数为String a,int b,int c,int d,int e的格式,将这些参数按顺序插入占位符的位置,我们就完成了插入函数的最重要的部分,这样在调用函数只需传入不同的参数,即可实现插入不同的数据,最后将sql语句上传至数据库即可。
class dbopra {
public void insert(String a,int b,int c,int d,int e ) throws Exception{
//Connection conn = null;
PreparedStatement ps = null;
Class.forName("com.mysql.jdbc.Driver");
String jdbc = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(jdbc, "root", "root");
String sql = "INSERT INTO studentinfo1 (name,no,python,java,db) VALUES (?,?,?,?,? )";
ps = conn.prepareStatement(sql);
ps.setString(1, a);
ps.setInt(2, b);
ps.setInt(3, c);
ps.setInt(4, d);
ps.setInt(5, e);
int insertCount = ps.executeUpdate();
}
第二个要写的就是删除数据,这个也是一样的道理,当然我依据的是根据学号删除信息,所以参数只用设置一个int就行啦。
public void delete(int b) throws Exception{
PreparedStatement ps = null;
Class.forName("com.mysql.jdbc.Driver");
String jdbc = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(jdbc, "root", "root");
String sql = "delete from studentinfo1 where no = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1,b);
int insertCount = ps.executeUpdate();
conn.close();
}
第三个要写的是查询数据,又又是一样的道理,当然我依据的还是根据学号查询信息,所以参数只用设置一个int就行啦。但是查询数据和之前不同的是我们需要返回查询到的信息,所以需要由返回值,我们需要把这个查询后得到放在设置好的容器,同时我希望依据学号,可以返回给我一个包含姓名,三个成绩的的数据类型,而getString函数得到数据库的值都是String类型,那把这些值放到一个数组里不就是刚刚好嘛,说干就干,遍历所有数据库的行,当学号等于你传给的参数时,将这一行数据存入数组,这样查询就做到了。
public String[] select(int aa) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String jdbc="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
Connection conn=DriverManager.getConnection(jdbc, "root", "root");
Statement state=conn.createStatement();
String sql="select * from studentinfo1";
ResultSet rs=state.executeQuery(sql);
String[] arrey = new String[5];
//int i = 0;
while(rs.next()){
if (Integer.parseInt(rs.getString(2) )== aa)
{
arrey[0] = rs.getString(1);
arrey[1] = rs.getString(2);
arrey[2] = rs.getString(3);
arrey[3] = rs.getString(4);
arrey[4] = rs.getString(5);
System.out.print(rs.getString(1)+" "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5));
break;
}
}
conn.close();
}
最后再来完成最后一个修改操作,这个我依然依据学号改别的数据的值,我最先想到的是将占位符设置成 “ set ? = ? where no = ?” 的形式,在将参数插入占位符的位置,完成依据学号改别的数据的操作,实操之后,不能实现修改操作,查了资料之后,也不知道为什么不能操作,但是我在之前调试的时候,我用“ set name = ? where no = ?”“ set python = ? where no = ?”都是可以执行修改操作的,然后我就将思路改变为使用if语句,如下所示
public void update(String a,int b,int c) throws Exception{
PreparedStatement ps = null;
Class.forName("com.mysql.jdbc.Driver");
String jdbc = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(jdbc, "root", "root");
if (a.equals("python"))
{
String sql = "update studentinfo1 set python = ? where no = ? ";
ps = conn.prepareStatement(sql);
ps.setInt(1, b);
ps.setInt(2, c);
int insertCount = ps.executeUpdate();
}
else if(a.equals("java"))
{
String sql = "update studentinfo1 set java = ? where no = ? ";
ps = conn.prepareStatement(sql);
ps.setInt(1, b);
ps.setInt(2, c);
int insertCount = ps.executeUpdate();
}
else if(a.equals("db"))
{
String sql = "update studentinfo1 set db = ? where no = ? ";
ps = conn.prepareStatement(sql);
ps.setInt(1, b);
ps.setInt(2, c);
int insertCount = ps.executeUpdate();
}
conn.close();
}
这样做也算间接实现修改功能了,但是需要额外加一个修改名字的操作,因为数据类型的限制。
public void updatename(String a,String b,int c) throws Exception{
PreparedStatement ps = null;
Class.forName("com.mysql.jdbc.Driver");
String jdbc = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(jdbc, "root", "root");
if (a.equals("姓名"))
{
String sql = "update studentinfo1 set name = ? where no = ? ";
ps = conn.prepareStatement(sql);
ps.setString(1, b);
ps.setInt(2, c);
int insertCount = ps.executeUpdate();
}
conn.close();
}
数据库核心的增删查改操作就写完了,那接下来就开始 “前端” 的编写了,先写最每个系统最初的界面 ———— 登录界面。
导入我们最常用swing组件和awt ,GUI的编写就开始了。
先来设置我们熟悉的组件,JTextfield ,JButton ,JLabel,JPasswordfield 一并给他填上,先设置好窗口居中,以及窗口禁止最大化。
public class run extends JFrame{
final JTextField t1 = new JTextField(20);
final JTextField t2 = new JTextField(20);
final JPasswordField t3 = new JPasswordField(20);
int input = 6;
public void init(){
setSize(580,400);
setTitle("成绩管理系统");
setDefaultCloseOperation(3);
setResizable(false);
setLocationRelativeTo(null);
JLabel l1 = new JLabel("身份:");
//t1 = new JTextField(20);
JLabel l2 = new JLabel("姓名:");
//JTextField t2 = new JTextField(20);
JLabel l3 = new JLabel("密码:");
//JTextField t3 = new JTextField(20);
//t3.setEchoChar('*');
JButton b1 = new JButton("确定");
接下来为按钮增添事件监听器,为注册和登录按钮增添事件监听器。点击注册,就可以将信息存储至loguser.txt中,在存储loguser.txt的时候,我使用的是将文本框获得的内容,以“身份,用户名,密码”的形式一行一行存入文件中。实现登录功能的思路是遍历loguser.txt文件,通过挨个判断文本框的内容是否相等,如果可以找到相等的数据,即可登录成功,登录成功即可进入相应的界面,也就是实例化student.class和teacher.class等类。当然,在设计系统的时候,我们默认六次登录机会,如果6次没有登录成功,即会自动退出系统。
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int aa = 0 ;
FileReader fr = new FileReader("E://loguser.txt");
BufferedReader br = new BufferedReader(fr);
List<String>list = new ArrayList();
String a = br.readLine();
while (a !=null)
{
list.add(a);
a = br.readLine();
}
for (int i = 0; i < list.size(); i++) {
String el = list.get(i);
//System.out.print(el);
//System.out.print(run.this.t2.getText()+String.valueOf(run.this.t3.getPassword()));
if (el.equals(run.this.t1.getText() + "," + run.this.t2.getText() + "," + String.valueOf(run.this.t3.getPassword())))
{
run.this.dispose();
if (run.this.t1.getText().equals("教师")) {
new teacher();
}
else if (run.this.t1.getText().equals("学生")) {
new student();
}
else if (run.this.t1.getText().equals("教师端管理员"))
{
new adteacher();
}
else if (run.this.t1.getText().equals("学生端管理员"))
{
new adstudent();
}
break;
}
if (!(el.equals(run.this.t1.getText() + "," + run.this.t2.getText() + "," + String.valueOf(run.this.t3.getPassword()))))
{
aa += 1;
if (aa == list.size())
{
run.this.input -= 1;
JDialog d = new JDialog();
d.setSize(100, 100);
JOptionPane.showMessageDialog(d, "登录失败!你还有"+input+"次机会", "登陆提示", ERROR_MESSAGE);
}
}
}
if (input == 0)
{
run.this.dispose();
System.exit(0);
}
}catch(Exception e1) {}
}
});
JButton b2 = new JButton("注册");
b2.setOpaque(false);
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String[] arr ={};
FileWriter fw = new FileWriter("E://loguser.txt",true);
fw.write(run.this.t1.getText());
fw.write(",");
fw.write(run.this.t2.getText());
fw.write(",");
fw.write(run.this.t3.getText());
fw.write("\r\n");
fw.close();
JDialog d = new JDialog();
d.setSize(100, 100);
JOptionPane.showMessageDialog(d, "注册成功", "注册提示",JOptionPane.PLAIN_MESSAGE);
}catch(Exception e1){}
}
});
存储实例如下图所示。
写到这登录界面和功能就写完了,剩下的事就是把组件加入面板,给窗口加入背景图片的操作。图片在网上随便找一个即可。下面是整个界面和功能的代码段。当然登录界面被我设为了整个课设的主类,剩下的类皆在主类中实例化。
public class run extends JFrame{
final JTextField t1 = new JTextField(20);
final JTextField t2 = new JTextField(20);
final JPasswordField t3 = new JPasswordField(20);
int input = 6;
public void init(){
setSize(580,400);
setTitle("成绩管理系统");
setDefaultCloseOperation(3);
setResizable(false);
setLocationRelativeTo(null);
JLabel l1 = new JLabel("身份:");
//t1 = new JTextField(20);
JLabel l2 = new JLabel("姓名:");
//JTextField t2 = new JTextField(20);
JLabel l3 = new JLabel("密码:");
//JTextField t3 = new JTextField(20);
//t3.setEchoChar('*');
JButton b1 = new JButton("确定");
b1.setOpaque(false);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int aa = 0 ;
FileReader fr = new FileReader("E://loguser.txt");
BufferedReader br = new BufferedReader(fr);
List<String>list = new ArrayList();
String a = br.readLine();
while (a !=null)
{
list.add(a);
a = br.readLine();
}
/*System.out.println(list.size());
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));*/
for (int i = 0; i < list.size(); i++) {
String el = list.get(i);
//System.out.print(el);
//System.out.print(run.this.t2.getText()+String.valueOf(run.this.t3.getPassword()));
if (el.equals(run.this.t1.getText() + "," + run.this.t2.getText() + "," + String.valueOf(run.this.t3.getPassword())))
{
//System.out.print("ok");
run.this.dispose();
//new student();
if (run.this.t1.getText().equals("教师")) {
new teacher();
}
else if (run.this.t1.getText().equals("学生")) {
new student();
}
else if (run.this.t1.getText().equals("教师端管理员"))
{
new adteacher();
}
else if (run.this.t1.getText().equals("学生端管理员"))
{
new adstudent();
}
break;
}
if (!(el.equals(run.this.t1.getText() + "," + run.this.t2.getText() + "," + String.valueOf(run.this.t3.getPassword()))))
{
aa += 1;
//System.out.println(aa);
if (aa == list.size())
{
//System.out.print(aa);
run.this.input -= 1;
JDialog d = new JDialog();
d.setSize(100, 100);
JOptionPane.showMessageDialog(d, "登录失败!你还有"+input+"次机会", "登陆提示", ERROR_MESSAGE);
}
}
}
//JDialog d = new JDialog();
//d.setSize(100, 100);
//JOptionPane.showMessageDialog(d, "登录失败!你还有"+input+"次机会", "登陆提示", ERROR_MESSAGE);
if (input == 0)
{
run.this.dispose();
System.exit(0);
}
}catch(Exception e1) {}
}
});
JButton b2 = new JButton("注册");
b2.setOpaque(false);
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String[] arr ={};
FileWriter fw = new FileWriter("E://loguser.txt",true);
fw.write(run.this.t1.getText());
fw.write(",");
fw.write(run.this.t2.getText());
fw.write(",");
fw.write(run.this.t3.getText());
fw.write("\r\n");
fw.close();
JDialog d = new JDialog();
d.setSize(100, 100);
JOptionPane.showMessageDialog(d, "注册成功", "注册提示",JOptionPane.PLAIN_MESSAGE);
}catch(Exception e1){}
}
});
JLayeredPane pa = new JLayeredPane();
JPanel p1 = new JPanel();
ImageIcon image = new ImageIcon("E://2.jpg");
JLabel ji = new JLabel(image);
p1 = (JPanel)getContentPane();
p1.add(ji);
l1.setBounds(100, 120, 30, 30);
t1.setBounds(150,120,200,30);
l2.setBounds(100, 170, 30, 30);
t2.setBounds(150,170,200,30);
l3.setBounds(100, 220, 30, 30);
t3.setBounds(150,220,200,30);
b1.setBounds(150,270,60,30);
b2.setBounds(290,270,60,30);
pa.add(p1,JLayeredPane.DEFAULT_LAYER);
pa.add(l1, JLayeredPane.MODAL_LAYER);
pa.add(l2, JLayeredPane.MODAL_LAYER);
pa.add(l3, JLayeredPane.MODAL_LAYER);
pa.add(t1, JLayeredPane.MODAL_LAYER);
pa.add(t2, JLayeredPane.MODAL_LAYER);
pa.add(t3, JLayeredPane.MODAL_LAYER);
pa.add(b1, JLayeredPane.MODAL_LAYER);
pa.add(b2, JLayeredPane.MODAL_LAYER);
setLayeredPane(pa);
setVisible(true);
}
public run()
{
init();
}
public static void main(String[] args)
{
new run();
}
}
接下来就需要写我们要实例化的类student.class和teacher.class。依然是继承JFrame的界面。用teacher.class 举例,依然是加入必须组件,在为组件增添事件监听器。由组件监听是否由事件的发生,在做出相应相应的操作。对于存储按钮,我们要做出的操作即为实例化dbopra,调用insert函数,将数据存储至数据库中。将文本框输入的文本作为插入函数的参数,就可以做到插入你输入在文本框的数据。查询,删除都是一样的道理,只需传入不同的参数。
class teacher extends JFrame{
final JTextField t1 = new JTextField(20);
final JTextField t2 = new JTextField(20);
final JTextField t3 = new JTextField(20);
final JTextField t4 = new JTextField(20);
final JTextField t5 = new JTextField(20);
public teacher()
{
init();
}
public void init()
{
setSize(580,400);
setTitle("教师端");
setDefaultCloseOperation(3);
setResizable(false);
setLocationRelativeTo(null);
//setLayout(new GridLayout(6,1));
JLabel l2 = new JLabel("学号");
//t1 = new JTextField(20);
JLabel l1 = new JLabel("姓名");
//JTextField t2 = new JTextField(20);
JLabel l3 = new JLabel("python");
JLabel l4 = new JLabel("java");
JLabel l5 = new JLabel("数据库");
JButton b1 = new JButton("存储");
b1.setOpaque(false);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try{
dbopra tdp = new dbopra();
String a = "insert into studentinfo1 values "+"("+teacher.this.t1.getText()+","+teacher.this.t2.getText()+","+teacher.this.t3.getText()+","+teacher.this.t4.getText()+","+teacher.this.t5.getText()+")";
System.out.print(a);
tdp.insert(teacher.this.t1.getText(),Integer.parseInt(teacher.this.t2.getText()),Integer.parseInt(teacher.this.t3.getText()),Integer.parseInt(teacher.this.t4.getText()),Integer.parseInt(teacher.this.t5.getText()));
JDialog d = new JDialog();
d.setSize(100,100);
JOptionPane.showMessageDialog(d,"已存入数据库","存储提示",JOptionPane.PLAIN_MESSAGE);
}catch(Exception e1){}
}
});
JButton b3 = new JButton("修改");
b3.setOpaque(false);
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
teacher.this.dispose();
new teacherup();
}
});
JButton b4 = new JButton("删除");
b4.setOpaque(false);
b4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
dbopra tdp = new dbopra();
tdp.delete(Integer.parseInt(teacher.this.t2.getText()));
JDialog d = new JDialog();
d.setSize(100,100);
JOptionPane.showMessageDialog(d, "删除成功", "删除提示",JOptionPane.PLAIN_MESSAGE);
}catch (Exception e1){}
}
});
JButton b2 = new JButton("查询");
b2.setOpaque(false);
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
//System.out.print("ok");
dbopra tdp = new dbopra();
//System.out.print("1ok");
//tdp.select(Integer.parseInt(teacher.this.t2.getText()));
String []a = tdp.select(Integer.parseInt(teacher.this.t2.getText()));
//System.out.print(a[0]);
//System.out.print(a[1]);
t1.setText(a[0]);
t2.setText(a[1]);
t3.setText(a[2]);
t4.setText(a[3]);
t5.setText(a[4]);
} catch (Exception e1) {}
}
});
JLayeredPane pa = new JLayeredPane();
JPanel p1 = new JPanel();
ImageIcon image = new ImageIcon("E://3.jpg");
JLabel jl = new JLabel(image);
p1 = (JPanel)getContentPane();
p1.add(jl);
l1.setBounds(150, 40, 30, 30);
t1.setBounds(200, 40, 220, 30);
l2.setBounds(150, 90, 30, 30);
t2.setBounds(200, 90, 220, 30);
l3.setBounds(150, 140, 60, 30);
t3.setBounds(200, 140, 220, 30);
l4.setBounds(150, 190, 30, 30);
t4.setBounds(200, 190, 220, 30);
l5.setBounds(150, 240, 60, 30);
t5.setBounds(200, 240, 220, 30);
b1.setBounds(180, 290, 60, 30);
b2.setBounds(250, 290, 60, 30);
b3.setBounds(320, 290, 60, 30);
b4.setBounds(390, 290, 60, 30);
pa.add(p1, JLayeredPane.DEFAULT_LAYER);
pa.add(l1, JLayeredPane.MODAL_LAYER);
pa.add(l2, JLayeredPane.MODAL_LAYER);
pa.add(l3, JLayeredPane.MODAL_LAYER);
pa.add(l4, JLayeredPane.MODAL_LAYER);
pa.add(l5, JLayeredPane.MODAL_LAYER);
pa.add(t1, JLayeredPane.MODAL_LAYER);
pa.add(t2, JLayeredPane.MODAL_LAYER);
pa.add(t3, JLayeredPane.MODAL_LAYER);
pa.add(t4, JLayeredPane.MODAL_LAYER);
pa.add(t5, JLayeredPane.MODAL_LAYER);
pa.add(b1, JLayeredPane.MODAL_LAYER);
pa.add(b2, JLayeredPane.MODAL_LAYER);
pa.add(b3, JLayeredPane.MODAL_LAYER);
pa.add(b4, JLayeredPane.MODAL_LAYER);
setLayeredPane(pa);
setVisible(true);
}
}
对于修改操作,我写了一个修改面板的操作,这个面板由teacherup.class完成。如果在教师端界面点击修改操作,即可实例化teacherup.clas然后跳出修改界面。来完成修改的操作。下面是效果图。
这个是实现修改面板的teacherup.class。
class teacherup extends JFrame{
final JTextField t1 = new JTextField(20);
final JTextField t2 = new JTextField(20);
final JTextField t3 = new JTextField(20);
public teacherup()
{
init();
}
public void init()
{
setSize(580,400);
setTitle("修改面板");
setResizable(false);
setLocationRelativeTo(null);
//setLayout(new GridLayout(4,1));
JLabel l1 = new JLabel("学号");
JLabel l2 = new JLabel("项目");
JLabel l3 = new JLabel("结果");
JButton b1 =new JButton("确定");
b1.setOpaque(false);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
dbopra tdp = new dbopra();
if ((teacherup.this.t2.getText()).equals("姓名"))
{
tdp.updatename(teacherup.this.t2.getText(), teacherup.this.t3.getText(), Integer.parseInt(teacherup.this.t1.getText()));
}
else {
tdp.update(teacherup.this.t2.getText(), Integer.parseInt(teacherup.this.t3.getText()), Integer.parseInt(teacherup.this.t1.getText()));
}
JDialog d = new JDialog();
d.setSize(100,100);
JOptionPane.showMessageDialog(d,"修改成功","修改提示",JOptionPane.PLAIN_MESSAGE);
teacherup.this.dispose();
new teacher();
}catch(Exception e1){}
}
});
JLayeredPane pa = new JLayeredPane();
JPanel p = new JPanel();
ImageIcon image = new ImageIcon("E://3.jpg");
JLabel jl = new JLabel(image);
p = (JPanel)getContentPane();
p.add(jl);
l1.setBounds(150, 60, 30, 30);
t1.setBounds(200, 60, 200, 30);
l2.setBounds(150, 140, 30, 30);
t2.setBounds(200, 140, 200, 30);
l3.setBounds(150, 220, 30, 30);
t3.setBounds(200, 220, 200, 30);
b1.setBounds(260, 300, 60, 30);
pa.add(p, JLayeredPane.DEFAULT_LAYER);
pa.add(l1, JLayeredPane.MODAL_LAYER);
pa.add(l2, JLayeredPane.MODAL_LAYER);
pa.add(l3, JLayeredPane.MODAL_LAYER);
pa.add(t1, JLayeredPane.MODAL_LAYER);
pa.add(t2, JLayeredPane.MODAL_LAYER);
pa.add(t3, JLayeredPane.MODAL_LAYER);
pa.add(b1, JLayeredPane.MODAL_LAYER);
setLayeredPane(pa);
setVisible(true);
}
}
这样基本就写完了,学生端和教师端基本无区别,就是减少了修改,存储,删除的权限,只具有查询功能,我就不放代码了,大家可以根据教师端删除即可。
写到这。基本系统就已经成型了。教师具备增删查改功能,学生具有查询功能,如果需要加一些对成绩的分析功能,大家可以自行添加。
暂时就写到这。菜鸡一枚,如果有错误,希望指正。