python的自学之路

student_system:

项目代码 git clone https://github.com/fatherqi/python_project.git 获取

基础

下面是一个有关student_system的系统,可以实现的功能为

1、新建学生信息
2、显示全部信息
3、查询学生信息
4、删除学生信息
5、修改学生信息
0、退出系统

以此来实现学生成绩保存查询的管理功能。

#!/usr/bin/env python3
import json
#---------------------------------------
#欢迎使用学生信息管理系统
#1、新建学生信息
#2、显示全部信息
#3、查询学生信息
#4、删除学生信息
#5、修改学生信息
#0、退出系统
#----------------------------------------
info = '''
******************************
欢迎使用学生信息管理系统
1、新建学生信息
2、显示全部信息
3、查询学生信息
4、删除学生信息
5、修改学生信息
0、退出系统
******************************
'''
print (info)

#student = [
#    {'name':'张三','语文':89,'数学':98,'英语':97,'总分':284},
#    {'name':'李四','语文':89,'数学':98,'英语':97,'总分':284} 
#]
with open('student.json',mode = 'r') as f:
    text = f.read()

student = json.loads(text)

while True:
    number = int(input ('请输入您想要查询的信息:')) 
    if number == 1:
        print ('新建学生信息')
        name = input ('请输入学生的姓名:')
        chinese = int(input ('请输入学生的语文成绩:'))
        math = int(input ('请输入学生的数学成绩:'))
        english = int(input ('请输入学生的英语成绩:'))
        total = chinese + math + english 
        student.append(
            {'name':name,'语文':chinese,'数学':math,'英语':english,'total':total}
        )
        print('已添加成功')
    elif number == 2:
        print ('显示学生信息')
        print ('姓名\t语文\t数学\t英语\t总分') 
        for students in student:
            print('{}\t{}\t{}\t{}\t{}'.format(*students.values()))
    elif number == 3:
        print ('查询学生信息')
        name = input('请输入学生姓名:')
        for students in student:
            if students['name'] == name:
                print ('姓名\t语文\t数学\t英语\t总分') 
                print('{}\t{}\t{}\t{}\t{}'.format(*students.values()))
                break 
        else:
            print('您输入的名字有误')     

    elif number == 4:
        print ('删除学生信息')
        name = input ('请输入您想删除的学生姓名:')
        for students in student:
            if students['name'] == name:
                student.remove(students) 
                print('您已删除成功')
                break 
        else:
            print('您输入的名字有误')         
    elif number == 5:
        print ('修改学生信息')
        name = input('请输入您想修改的学生名字:')
        for students in student:
            if students['name'] == name:
               chinese = int(input ('请输入学生的语文成绩:'))
               math = int(input ('请输入学生的数学成绩:'))
               english = int(input ('请输入学生的英语成绩:'))
               total = chinese + math + english 
               students['语文'] = chinese
               students['数学'] = math
               students['英语'] = english
               students['total'] = total              
               break 
        else:
            print('您输入的名字有误')           
    elif number == 0:
        print ('退出系统')
        with open('student.json',mode = 'w') as f:
            f.write(json.dumps(student,ensure_ascii = False))
        break
    else:
        print ('输入的选项错误,请重新输入')

需要注意的问题有: 

1、print('{}\t{}\t{}\t{}\t{}'.format(*students.values())),若只是将字典里面某个值打印出来,要记得使用*,否则打印出来的是列表。

2、if...break语法的使用,python和verilog不一样,当if后使用break会直接跳出if...else语句,不会执行下面的else。

3、json.dump是以json的格式写入文件,注意选项要选w,不要选a+,否则会出错。注意要倒入适量json库,读文件时要以json.loads的方式读。

5、若要使输入文件的中文不乱码,在写文件时要输入选项ensure_ascii = False

4、第一次录入需要先写入文件,否则报错,注意在查询或者写入的时候若写错名字,只能先写入后删除;或者在改写学生成绩时,只能输入全部成绩,一样的成绩不能省略。

进阶

实现的功能为:Tkinter库的使用;面向对象的思维编程

代码共分成了3个文件,分别为学生桌面管理系统.py,main.py,insert.py,db.py。如下面代码所示:

学生桌面管理系统.py

#!/usr/bin/env python3
import tkinter 
from main import MainPage

class LoginPage:
    def __init__(self,root_r):
        self.root = root_r
        self.login_frame = tkinter.Frame(self.root)
        self.login_frame.grid()
        
        self.root.title('学生信息管理系统')
        self.root.geometry('300x120')

        self.username = tkinter.StringVar()
        self.password = tkinter.StringVar()

        self.create_page()

    def create_page(self):
        
        tkinter.Label(self.login_frame,width = 8).grid(row=0,column=0)
        
        tkinter.Label(self.login_frame,text='账户').grid(row=1,column=0)
        tkinter.Entry(self.login_frame,textvariable = self.username).grid(row=1,column=1)
        
        tkinter.Label(self.login_frame,text='密码').grid(row=2,column=0)
        tkinter.Entry(self.login_frame,textvariable = self.password).grid(row=2,column=1)

        tkinter.Button(self.login_frame,text='登陆',command = self.check_login).grid(row=3,column=0)
        tkinter.Button(self.login_frame,text='退出',command = self.root.quit).grid(row=3,column=1)
        
    def check_login(self):
        print('检查登陆')
        print('用户名:',self.username.get())
        print('密码:',self.password.get())
        if self.username.get() == 'yanghongqi' and self.password.get() == '1996yanghongqi':
            print ('登陆成功')
            self.login_frame.destroy()
            MainPage(self.root)
        else:
            print('登陆失败')

root = tkinter.Tk()
login_page = LoginPage(root)
root.mainloop()

此段代码实现了如下图所示的小窗口,其中check_login函数中的if语句可以修改账户名和密码:

需要注意的问题有:

1、由于登陆后需要进入别的页面,要使用tkinter.frame函数创建root分类下的新页面,才可以destroy。

main.py

#!/usr/bin/env python3
import tkinter
from insert import  InsertFrame,SearchFrame,DeleteFrame,ModifyFrame,AboutFrame,DisplayFrame

class MainPage:
    def __init__(self,root_r):
        self.root = root_r
        self.root.title('学生信息管理系统')
        self.root.geometry('400x300')
        self.insertframe = InsertFrame(self.root)
        self.displayframe = DisplayFrame(self.root)
        self.searchframe = SearchFrame(self.root)
        self.deleteframe = DeleteFrame(self.root)
        self.modifyframe = ModifyFrame(self.root)
        self.aboutframe = AboutFrame(self.root)
        self.create_page()

    def create_page(self):
        menu = tkinter.Menu(self.root)
        file_menu = tkinter.Menu(menu, tearoff=False)
        menu.add_cascade(label='applemeun', menu=file_menu)
        file_menu.add_command(label='录入',command = self.show_insert_frame)
        file_menu.add_command(label='显示',command = self.show_display_frame) 
        file_menu.add_command(label='查询',command = self.show_search_frame)
        file_menu.add_command(label='删除',command = self.show_delete_frame)
        file_menu.add_command(label='修改',command = self.show_modify_frame)
        file_menu.add_command(label='关于',command = self.show_about_frame)
        self.root.config (menu=menu)
    
    def show_insert_frame(self):
        self.searchframe.forget() 
        self.displayframe.forget()
        self.deleteframe.forget()
        self.modifyframe.forget()
        self.aboutframe.forget()
        self.insertframe.pack()

    def show_display_frame(self):
        self.searchframe.forget()
        self.insertframe.forget()
        self.deleteframe.forget()
        self.modifyframe.forget()
        self.aboutframe.forget()
        self.displayframe.display_page()

    def show_search_frame(self):
        self.displayframe.forget()
        self.insertframe.forget()
        self.deleteframe.forget()
        self.modifyframe.forget()
        self.aboutframe.forget()
        self.searchframe.pack()

    def show_delete_frame(self):
        self.searchframe.forget()
        self.displayframe.forget()
        self.insertframe.forget()
        self.modifyframe.forget()
        self.aboutframe.forget()
        self.deleteframe.pack()

    def show_modify_frame(self):
        self.searchframe.forget()
        self.displayframe.forget()
        self.insertframe.forget()
        self.deleteframe.forget()
        self.aboutframe.forget()
        self.modifyframe.pack()

    def show_about_frame(self):
        self.searchframe.forget()
        self.displayframe.forget()
        self.insertframe.forget()
        self.deleteframe.forget()
        self.modifyframe.forget()
        self.aboutframe.pack()

此段代码实现的功能为当用户名和密码输入正确之后进入菜单栏选择查询方法,界面如下图所示:

需要注意的问题有:

1、由于苹果独特的系统,只能通过创建二级菜单,才能显示出lebal来,创建一级菜单的lebal显示不出来,window可以直接创建,并且addcase函数是不能加command选项的,只能为每个addcase加add_command。https://www.5axxw.com/questions/content/nd6qmr

2、在例化类时,会走一遍里面的函数,所以有创建小窗口之类的语句一定要注意,比如这种,search_window = tkinter.Toplevel(self.root),会在例化的时候就将小窗口显示出来,办法就是将他们放在非__init__函数中,并且在定义类时不要调用到它,用到直接调用类里面的函数。而类里面的grid函数只有在.pack()或者.grid()时才会显示窗口,例化不显示。

insert.py

#!/usr/bin/env python3
import tkinter
from db import OpenText
import time

class InsertFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        self.root = root
        self.username = tkinter.StringVar()
        self.chinese = tkinter.StringVar()
        self.math = tkinter.StringVar()
        self.english = tkinter.StringVar()
        self.create_insert_page()
        
    def create_insert_page(self):
       tkinter.Label(self,text='姓名').grid(row=1,column=0,padx=5,pady=5)
       tkinter.Entry(self,textvariable = self.username).grid(row=1,column=1,padx=5,pady=5)
       tkinter.Label(self,text='语文').grid(row=2,column=0,padx=5,pady=5)
       tkinter.Entry(self,textvariable = self.chinese).grid(row=2,column=1,padx=5,pady=5)
       tkinter.Label(self,text='数学').grid(row=3,column=0,padx=5,pady=5)
       tkinter.Entry(self,textvariable = self.math).grid(row=3,column=1,padx=5,pady=5)
       tkinter.Label(self,text='英语').grid(row=4,column=0,padx=5,pady=5)
       tkinter.Entry(self,textvariable = self.english).grid(row=4,column=1,padx=5,pady=5)
       tkinter.Button(self,text='录入',command = self.insert_login).grid(row=5,column=1)

    def insert_login(self):
        username = self.username.get()
        chinese = int(self.chinese.get())
        math = int(self.math.get())
        english = int (self.english.get()) 
        total = chinese + math + english 
        student_score = {'name':username,
                         '语文':chinese,
                         '数学':math,
                         '英语':english,
                         'total':total
                         }
        opera = OpenText()
        opera.insert(student_score)  

        self.next_insert_page()

    def next_insert_page(self):
        lebal_prompt = tkinter.Label(self,text='您已录入成功')
        lebal_prompt.grid(row=6,column=1)
        self.after(1000,lebal_prompt.destroy)


class SearchFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        self.root = root
        self.username = tkinter.StringVar()
        self.create_search_page()

    def create_search_page(self):
        tkinter.Label(self,text='姓名').grid(row=1,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.username).grid(row=1,column=1,padx=5,pady=5)
        tkinter.Button(self,text='查询',command = self.search_login).grid(row=5,column=1)
    
    def search_login(self):
        opera = OpenText()
        subject = opera.subject()
        student_value = opera.search(self.username.get())
        self.next_search_page(student_value,subject)

    def next_search_page(self,student_value,subject):

        search_window = tkinter.Toplevel(self.root)
        search_window.geometry('400x120')
        search_window.title('成绩查询')
        tkinter.Label(search_window, text=f'{subject}').pack() 
        tkinter.Label(search_window, text=f'{student_value}').pack()

class DisplayFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        self.root = root

    def display_page(self):
        display_window = tkinter.Toplevel(self.root)
        display_window.title('全部成绩')
        opera = OpenText()
        subject = opera.subject()
        students = opera.all()
        tkinter.Label(display_window,text=f'{subject}').pack()
        for student in students:
            tkinter.Label(display_window, text='{}\t{}\t{}\t{}\t{}'.format(*student.values())).pack()

class DeleteFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        self.root = root   
        self.username = tkinter.StringVar() 
        self.create_delete_page() 

    def create_delete_page(self):
        tkinter.Label(self,text='姓名').grid(row=1,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.username).grid(row=1,column=1,padx=5,pady=5)
        tkinter.Button(self,text='删除',command = self.delete_login).grid(row=5,column=1)
        
    def delete_login(self):
        opera = OpenText()
        students = opera.all() 
        self.next_delete_page(students)   
        opera.delete(self.username.get())
    
    def next_delete_page(self,students):
        label_text = tkinter.Label(self, text='')
        label_text.grid(row=6, column=1) 
        for student in students:
            if student['name'] == self.username.get(): 
                label_text.config(text="您已删除成功")
                break 
        else:
            label_text.config(text="名字输入有误")

        self.after(1000,label_text.destroy)

class ModifyFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        self.username = tkinter.StringVar()
        self.chinese = tkinter.StringVar()
        self.math = tkinter.StringVar()
        self.english = tkinter.StringVar()
        self.opera = OpenText()
        self.students = self.opera.all() 
        self.create_modify_page()
    
    def create_modify_page(self):
        tkinter.Label(self,text='姓名').grid(row=1,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.username).grid(row=1,column=1,padx=5,pady=5)
        tkinter.Label(self,text='语文').grid(row=2,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.chinese).grid(row=2,column=1,padx=5,pady=5)
        tkinter.Label(self,text='数学').grid(row=3,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.math).grid(row=3,column=1,padx=5,pady=5)
        tkinter.Label(self,text='英语').grid(row=4,column=0,padx=5,pady=5)
        tkinter.Entry(self,textvariable = self.english).grid(row=4,column=1,padx=5,pady=5)
        tkinter.Button(self,text='修改',command = self.modify_login).grid(row=5,column=1) 

    def modify_login(self):
        for student in self.students:
            if student['name'] == self.username.get():
               self.opera.modify(self.username.get(),self.chinese.get(),self.math.get(),self.english.get())  
               label_text = tkinter.Label(self, text='您已修改成功')
               label_text.grid(row=6,column=1,padx=5,pady=5)
               break 
        else:
            label_text = tkinter.Label(self, text='您输入的名字有误')
            label_text.grid(row=6,column=1,padx=5,pady=5)
        self.after(1000,label_text.destroy)    

class AboutFrame(tkinter.Frame):
    def __init__(self,root):
        super().__init__(master = root)
        tkinter.Label(self,text='杨红旗').pack()

此段代码实现的功能为当选择对应菜单时,会跳出相应的页面。比如选择录入时会显示:

录入成功会会显示‘您已录入成功’的字样,1秒后消失。

再比如选择显示时会显示:

记录成绩的文件是student.json。

db.py

#!/usr/bin/env python3
import json

class OpenText():
    def __init__(self):
        with open('practise/student_system/student.json',mode = 'r') as f:
            text = f.read()
        self.student = json.loads(text)

    def insert(self,student_score):
        self.student.append(
            student_score
        )
        self.record(self.student) 
        print('录入成功')

    def subject(self):
        return('姓名\t语文\t数学\t英语\t总分')
     
    def search(self,name):
        for students in self.student:
            if students['name'] == name:
                print('{}\t{}\t{}\t{}\t{}'.format(*students.values()))
                return('{}\t{}\t{}\t{}\t{}'.format(*students.values())) 
                break 
        else:
            print('您输入的名字有误')

    def delete(self,name):
        for students in self.student:
            if students['name'] == name:
                self.student.remove(students) 
                print('您已删除成功')
                self.record(self.student) 
                break 
        else:
            print('您输入的名字有误')

        

    def modify(self,name,chinese,math,english):
        for students in self.student:
            if students['name'] == name:
               if chinese:
                  students['语文'] = int(chinese) 
               if math:
                  students['数学'] = int(math)
               if english:
                  students['英语'] = int(english)   
               total = students['语文'] + students['数学'] + students['英语']
               students['total'] = total  
               print('您已修改成功')            
               self.record(self.student) 
               break
        else:
            print('您输入的名字有误')  
            
    def all(self):
        return self.student

    def record(self,student):
        with open('practise/student_system/student.json',mode = 'w') as f:
            f.write(json.dumps(student,ensure_ascii = False)) 

此段代码是真正将插入或者修改的学生成绩保存在文件中,并且操作成功后在终端显示。

网页版

        需要创建flask项目,Flask 是一个用于构建 Web 应用程序的轻量级 Python Web 框架。它提供了一组简单而灵活的工具,使得开发 Web 应用变得更加容易。

我用的编辑器为vscode,需要以下步骤

1、在运行flask文件的目录下,终端输入命令 python -m venv “名字”,“名字”换成文件的名字,创建虚拟环境。

2、在终端输入命令source venv/bin/activate,激活虚拟环境,venv 创建的虚拟环境目录下会包含一个特定版本的 Python 解释器。

3、在项目目录中创建一个 Python 文件。文件头:from flask import Flask。

4、在文件目录下,终端输入pip install Flask:安装Flask。

言归正传,此项目以网页的形式实现了学生系的统管理,共包含了6个文件,分别为student.py,add.html,admin.html,login.html,modify.html,bootstrap.css。其中.html后缀为网页的显示,.py为后端控制,bootstrap.css为通用的网页显示格式,从github获取即可。文件的位置如下图所示:

注意,放置html文件的文件夹一定要叫做templates。

        这里插一句关于layui模版的使用方法,首页点进去下载文件,会有一个css的文件目录,一个font的文件目录,和一个layui.js的文件,将这几个文件放在templates路径下,在<head></head>中间插入<link rel="stylesheet" href="/static/css/layui.css"> , 在<body></body>中间插入<script src="/static/layui.js"></script>即可正确使用模板内容。

student.py

from flask import Flask,render_template,request,redirect

app = Flask(__name__,static_url_path='/static')


student = [
    {'name':'张三','语文':89,'数学':98,'英语':97,'total':284},
    {'name':'李四','语文':89,'数学':98,'英语':97,'total':284} 
]

@app.route('/')
def hello_world():
    return 'hello World'

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        request.form.get('username')
        request.form.get('password')
        return redirect("/admin")
    return render_template('login.html')

@app.route('/admin')
def admin():
    return render_template('admin.html',students=student)

@app.route('/add',methods=['GET','POST'])
def add():
    if request.method == 'POST':
        username = request.form.get('username')
        chinese = request.form.get('语文')
        math = request.form.get('数学')
        english = request.form.get('英语')
        total = int(chinese) + int(math) + int(english)
        student.append({'name':username,'语文':chinese,'数学':math,'英语':english,'total':total})
        return redirect('/admin')
    return render_template('add.html')

@app.route('/delete')
def delete():
    username = request.args.get('name')
    for stu in student:
        if stu['name'] == username:
            student.remove(stu)
    return redirect('/admin')

@app.route('/modify',methods=['GET','POST'])
def modify():
    username = request.args.get('name')
    if request.method == 'POST':
        username = request.form.get('username')
        chinese = request.form.get('语文')
        math = request.form.get('数学')
        english = request.form.get('英语')
        total = int(chinese)+int(math)+int(english)

        for stu in student:
            if stu['name'] == username:
                stu['语文'] = chinese
                stu['数学'] = math
                stu['英语'] = english
                stu['total'] = total
        return redirect('/admin')

    for stu in student:
        if stu['name'] == username:
            return render_template('modify.html',student=stu)

if __name__ == '__main__':

需要注意的问题有:

1、当需要从网页获取信息时,一般在route时,要加上methods['GET','POST'],GET 用于从服务器获取资源。在这个路由中,可能用于显示一个表单,供用户填写信息;POST 用于向服务器提交数据。在这个路由中,可能用于接收用户提交的表单数据,进行处理和存储。比如在检测到用户提交姓名和密码时,可以将数据拿过来做对比再进行下一步操作。

2、redirect函数是重定向的意思;render_template是为了跳转到相应的html界面,可以接受动态数据;通常情况下,当需要展示页面时,使用 render_template;当需要在服务器端执行某个操作后,将用户导航到其他页面时,使用 redirect

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Your Page Title</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>

<body>
<form style="width: 400px;margin: 100px auto;" method="post">
<!--
  当表单的 method 属性设置为 post 时,表单数据将通过HTTP请求的消息体(body)发送到服务器。
  这使得可以发送大量的数据,且不会暴露在URL中。通常在处理用户登录、提交表单等包含敏感信息的情况下使用。
-->
    <div class="mb-3">
      <label for="exampleInputEmail1" class="form-label">用户名</label>
      <input type="text" 
             class="form-control" 
             id="exampleInputEmail1" 
             aria-describedby="emailHelp"
             name="username"
             >
             
    </div>
    <div class="mb-3">
      <label for="exampleInputPassword1" class="form-label">密码</label>
      <input type="password" 
             class="form-control" 
             id="exampleInputPassword1"
             name="password"
             >
    </div>
    <div class="mb-3 form-check">
      <input type="checkbox" class="form-check-input" id="exampleCheck1">
      <label class="form-check-label" for="exampleCheck1">记住我的登录状态</label>
    </div>
    <button type="submit" class="btn btn-primary">提交</button>
</form>
</body>
</html>

需要注意的问题有:

1、每个<>里面对应的英文字母都有特殊含义,依葫芦画瓢即可。

2、可以在网站Navs and tabs · Bootstrap v5.0查看相应的框架模板,复制到<body></body>内做相应修改即可。

显示的页面如下图所示:

注意:以上代码并未设置正确的用户名和密码,随便填写即可登录。鼠标左键点击检查元素即可查看相应状态,页面如下所示:

admin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Your Page Title</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>
<body>
<table class="table" style="width: 600px; margin: 100px auto;">
    <thead>
      <tr>
        <th scope="col">姓名</th>
        <th scope="col">语文</th>
        <th scope="col">数学</th>
        <th scope="col">英语</th>
        <th scope="col">总分</th>
        <th scope="col">操作</th>
      </tr>
    </thead>
    <tbody>
    <!--
        需要将python对象显示到浏览器上,模版语法
        jinja2(flask) numjucks(javascript)
        jinjia2可以直接在html写python的逻辑
    -->
      {% for stu in students %}
          <tr>
            <td>{{ stu.name  }}</td>
            <td>{{ stu.语文   }}</td>
            <td>{{ stu.数学   }}</td>
            <td>{{ stu.英语   }}</td>
            <td>{{ stu.total }}</td>
            <td>
                <a href="/delete?name={{stu.name}}">删除</a>
                <a href="/modify?name={{stu.name}}">修改</a>
            </td>
          </tr>
      {% endfor %}
    </tbody>
</table>

<div class="container" style="width: 600px;margin: 10px auto">
    <div class="row">
      <div class="col-4">
        <a href="/add">新增学员信息</a>
      </div>
    </div>
</div>


</body>
</html>

显示的界面如下图所示:

点击删除即可删除相应学员信息。点击修改跳到modify.html界面,点击新增学员信息即可调到add.html.

add.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>新增数据</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>

<body>
<form style="width: 400px;margin: 100px auto;" method="post">
<!--
  当表单的 method 属性设置为 post 时,表单数据将通过HTTP请求的消息体(body)发送到服务器。
  这使得可以发送大量的数据,且不会暴露在URL中。通常在处理用户登录、提交表单等包含敏感信息的情况下使用。
-->
    <div class="mb-3">
      <label for="exampleInputEmail1" class="form-label">学生姓名</label>
      <input type="text" 
             class="form-control" 
             id="" 
             name="username"
             >
             
    </div>
    <div class="mb-3">
      <label for="exampleInputPassword1" class="form-label">语文</label>
      <input type="text" 
             class="form-control" 
             id="语文"
             name="语文"
             >
    </div>
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">数学</label>
        <input type="text" 
               class="form-control" 
               id="数学"
               name="数学"
               >
    </div>
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">英语</label>
        <input type="text" 
               class="form-control" 
               id="英语"
               name="英语"
               >
    </div>

    <button type="submit" class="btn btn-primary">提交</button>
</form>
</body>
</html>

显示的界面如下图所示:

modify.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>新增数据</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>

<body>
<form style="width: 400px;margin: 100px auto;" method="post">
<!--
  当表单的 method 属性设置为 post 时,表单数据将通过HTTP请求的消息体(body)发送到服务器。
  这使得可以发送大量的数据,且不会暴露在URL中。通常在处理用户登录、提交表单等包含敏感信息的情况下使用。
-->
    <div class="mb-3">
      <label for="exampleInputEmail1" class="form-label">学生姓名</label>
      <input type="text" 
             class="form-control" 
             id="username" 
             name="username"
             value="{{student.name}}"
             >
             
    </div>
    <div class="mb-3">
      <label for="exampleInputPassword1" class="form-label">语文</label>
      <input type="text" 
             class="form-control" 
             id="语文"
             name="语文"
             value="{{student.语文}}"
             >
    </div>
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">数学</label>
        <input type="text" 
               class="form-control" 
               id="数学"
               name="数学"
               value="{{student.数学}}"
               >
    </div>
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">英语</label>
        <input type="text" 
               class="form-control" 
               id="英语"
               name="英语"
               value="{{student.英语}}"
               >
    </div>

    <button type="submit" class="btn btn-primary">修改</button>
</form>
</body>
</html>

界面显示如下图所示:

会将人名对应的成绩显示出来,在相应位置作修改即可,修改完毕即可跳到admin.html界面,看到修改后的正确信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值