python基于Tkinter实现人员管理系统

作者:XL不吃辣 时间:2021-05-01 10:07:19 

前言

Tkinter是python内置的标准GUI库,基于Tkinter实现了简易人员管理系统,所用数据库为Mongodb

代码

时间宝贵!直接上代码!


from tkinter import *
from tkinter.messagebox import *
from tkinter import ttk
import pymongo
import tkinter as tk
import re
import time
import datetime

import pandas as pd
from tkinter import filedialog
from PIL import ImageTk,Image
import tkinter

#连接数据库
client = pymongo.MongoClient(host="localhost", port=27017)
db = client.sys
col = db.user
#创建窗口
root = Tk()
root.geometry('900x700')
root.title('人员管理系统')
#表头
img =Image.open(r'C:\Users\apple\Desktop\image.jpg')
img = img.resize((900,68),Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
top=Label(root, text='人员管理系统',image=img,fg='black',font=('楷体', 20),compound='center', bitmap='error')
top.pack(ipady=0,side=TOP, fill='x')
#变量
sid = StringVar()
name = StringVar()
age = StringVar()
salary = StringVar()
phone = StringVar()
birthday = StringVar()

#控制函数

def add():
   global info
   info=Toplevel()
   info.title("添加信息")
   info.geometry('400x400')
   button1=Button(info, text="确认",command=appendInfo,font=("黑体", 12)).place(relx=0.4, rely=0.8, width=100)
   Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1)
   Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1)
   Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1)
   Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1)
   Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1)
   Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1)
   text1=Entry(info, textvariable=sid).place(relx=0.3, rely=0.1, relwidth=0.45, height=25)
   sid.set("")
   text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25)
   name.set("")
   text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25)
   age.set("")
   text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25)
   salary.set("")
   text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25)
   phone.set("")
   text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25)
   birthday.set("")
   info.bind('<Return>',pas8)
#     info.bind_all('<KeyPress-Up>',movetriangle)
#     info.bind_all('<KeyPress-Down>',movetriangle)
#     info.bind_all('<KeyPress-Left>',movetriangle)
#     .bind_all('<KeyPress-Right>',movetriangle)

def pitch_on():
   global info
   info=Toplevel()
   info.title("删除信息")
   info.geometry('400x400')
   Label(info, text="是否确定删除以下信息",font=('楷体', 15)).place(relx=0.2, rely=0.01, relwidth=0.6)
   Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1)
   Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1)
   Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1)
   Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1)
   Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1)
   Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1)
   text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25)
   sid.set(sf[0])
   text2=Entry(info, textvariable=name,state='disable').place(relx=0.3, rely=0.2, relwidth=0.45, height=25)
   name.set(sf[1])
   text3=Entry(info, textvariable=age,state='disable').place(relx=0.3, rely=0.3, relwidth=0.45, height=25)
   age.set(sf[2])
   text4=Entry(info, textvariable=salary,state='disable').place(relx=0.3, rely=0.4, relwidth=0.45, height=25)
   salary.set(sf[3])
   text5=Entry(info, textvariable=phone,state='disable').place(relx=0.3, rely=0.5, relwidth=0.45, height=25)
   phone.set(sf[4])
   text6=Entry(info, textvariable=birthday,state='disable').place(relx=0.3, rely=0.6, relwidth=0.45, height=25)
   birthday.set(sf[5])
   button1=Button(info, text="确认",command=deleteInfo).place(relx=0.2, rely=0.8, width=100)
   button2=Button(info, text="关闭",command=des).place(relx=0.6, rely=0.8, width=100)
   info.bind('<Return>',pas33)

def information2():
   global info
   info=Toplevel()
   info.title("详细信息")
   info.geometry('400x400')
   button1=Button(info, text="更新信息",command=updateInfo).place(relx=0.4, rely=0.8, width=100)
   Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1)
   Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1)
   Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1)
   Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1)
   Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1)
   Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1)
   text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25)
   sid.set(sf[0])
   text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25)
   name.set(sf[1])
   text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25)
   age.set(sf[2])
   text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25)
   salary.set(sf[3])
   text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25)
   phone.set(sf[4])
   text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25)
   birthday.set(sf[5])
   info.bind('<Return>',pas11)

def des():
   info.destroy()

def information(event):
   item=dataTreeview.selection()
   itemvalues=dataTreeview.item(item,'values')
   global info
   info=Toplevel()
   info.title("详细信息")
   info.geometry('400x400')
   button1=Button(info, text="更新信息",command=updateInfo).place(relx=0.4, rely=0.8, width=100)

Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1)
   Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1)
   Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1)
   Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1)
   Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1)
   Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1)
   text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25)
   sid.set(itemvalues[0])
   text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25)
   name.set(itemvalues[1])
   text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25)
   age.set(itemvalues[2])
   text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25)
   salary.set(itemvalues[3])
   text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25)
   phone.set(itemvalues[4])
   text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25)
   birthday.set(itemvalues[5])

def isVaildDate(date):
       try:
           time.strptime(date, "%Y-%m-%d")
           return True
       except:
           return False

def showAllInfo():
   x = dataTreeview.get_children()
   for item in x:
       dataTreeview.delete(item)
   lst=col.find({},{'_id':0})
   for item in lst:
       i=list(item.values())
       dataTreeview.insert("", 1, text="line1", values=i)
def pas1(self):
   showAllInfo()

def pas2(self):
   add()

def pas3(self):
   pitch_on()

def pas33(self):
   deleteInfo()

def pas4(self):
   information2()

def pas5(self):
   searchInfo()

def pas55(self):
   search()

def pas6(self):
   impInfo()

def pas7(self):
   exp()

def pas8(self):
   appendInfo()

def pas9(self):
   global sf
   sf=dataTreeview.selection()
   sf=dataTreeview.item(sf,'values')

def pas10(self):
   expInfo()

def pas11(self):
   updateInfo()

def appendInfo():
   flag=1
   if sid.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if sid.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       sid.set("")
       flag=0

if name.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0

if age.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if age.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       age.set("")
       flag=0

if salary.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if salary.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       salary.set("")
       flag=0

if phone.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if phone.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       phone.set("")
       flag=0

if birthday.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if isVaildDate(str(birthday.get())) == False:
       showerror(title='提示', message='格式错误')
       birthday.set("")
       flag=0
   if flag==1:
       x = dataTreeview.get_children()
       for item in x:
           dataTreeview.delete(item)
       list1 = {
               "work_number":sid.get(),
               "name":name.get(),
               "age":age.get(),
               "salary":salary.get(),
               "phone":phone.get(),
               "birthday":birthday.get()
           }
       col.insert_one(list1)
       lst=col.find({},{'_id':0})
       for item in lst:
           i=list(item.values())
           dataTreeview.insert("", 1, text="line1", values=i)
       info.destroy()

def deleteInfo():
   lst=list(col.find({},{'_id':0}))
   num = sid.get()
   flag = 0
   for i in range(len(lst)):
       if str(num)==str(lst[i].get("work_number")):
           flag = 1
           col.delete_one({'work_number':num})
           break

x = dataTreeview.get_children()
   for item in x:
       dataTreeview.delete(item)

lst=col.find({},{'_id':0})
   for item in lst:
       i=list(item.values())
       dataTreeview.insert("", 1, text="line1", values=i)
   info.destroy()

#更新操作
def updateInfo():
   sid_1 = sid.get()
   name_1 = name.get()
   age_1 = age.get()
   salary_1 = salary.get()
   phone_1 = phone.get()
   birthday_1 = birthday.get()
   flag=1
   if sid.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if sid.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       sid.set("")
       flag=0

if name.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0

if age.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if age.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       age.set("")
       flag=0

if salary.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if salary.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       salary.set("")
       flag=0

if phone.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if phone.get().isdigit() == False:
       showerror(title='提示', message='格式错误')
       phone.set("")
       flag=0

if birthday.get() == "":
       showerror(title='提示', message='输入不能为空')
       flag=0
   if isVaildDate(str(birthday.get())) == False:
       showerror(title='提示', message='格式错误')
       birthday.set("")
       flag=0
   if flag==1:
       up={
           "work_number":sid_1,
           "name":name_1,
           "age":age_1,
           "salary":salary_1,
           "phone":phone_1,
           "birthday":birthday_1
       }

old=col.find_one({'work_number': sid_1},{"_id": 0})
       col.update_one(old, {'$set':up})
       x = dataTreeview.get_children()
       for item in x:
           dataTreeview.delete(item)
       lst=col.find({},{'_id':0})
       for item in lst:
           i=list(item.values())
           dataTreeview.insert("", 1, text="line1", values=i)
       showinfo(title='提示', message='更新成功!')
       des()

#搜索页面
def search():
   global info
   info=Toplevel()
   info.title("搜索信息")
   info.geometry('400x400')
   button1=Button(info, text="确认搜索",command=searchInfo).place(relx=0.4, rely=0.8, width=100)
   Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1)
   Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1)
   Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1)
   Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1)
   Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1)
   Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1)
   text1=Entry(info, textvariable=sid).place(relx=0.3, rely=0.1, relwidth=0.45, height=25)
   sid.set("")
   text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25)
   name.set("")
   text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25)
   age.set("")
   text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25)
   salary.set("")
   text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25)
   phone.set("")
   text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25)
   birthday.set("")
   info.bind('<Return>',pas5)
#搜索操作    
def searchInfo():
   lst=list(col.find({},{'_id':0}))
   sid_1 = sid.get()
   name_1 = name.get()
   age_1 = age.get()
   salary_1 = salary.get()
   phone_1 = phone.get()
   birthday_1 = birthday.get()
   flag=1
#     if sid.get().isdigit() == False:
# #         showerror(title='提示', message='格式错误')
#         sid.set("")
#         flag=0
#     if age.get().isdigit() == False:
# #         showerror(title='提示', message='格式错误')
#         age.set("")
#         flag=0
#     if salary.get().isdigit() == False:
# #         showerror(title='提示', message='格式错误')
#         salary.set("")
#         flag=0

#     if phone.get().isdigit() == False:
# #         showerror(title='提示', message='格式错误')
#         phone.set("")
#         flag=0
#     if isVaildDate(str(birthday.get())) == False:
# #         showerror(title='提示', message='格式错误')
#         birthday.set("")
#         flag=0
#     if flag==0:
#         showerror(title='提示', message='格式错误')
   if flag==1:
       fla = 0
       v=[]
       for i in range(len(lst)):
           if sid_1==str(lst[i].get("work_number")):
               fla = 1
               v.append(lst[i].values())
               continue
           elif name_1==lst[i].get("name"):
               fla = 1
               v.append(lst[i].values())
               continue
           elif age_1==lst[i].get("age"):
               fla = 1
               v.append(lst[i].values())
               continue
           elif salary_1==lst[i].get("salary"):
               fla= 1
               v.append(lst[i].values())
               continue
           elif phone_1==lst[i].get("phone"):
               fla = 1
               v.append(lst[i].values())
               continue
           elif birthday_1==lst[i].get("birthday"):
               fla= 1
               v.append(lst[i].values())
               continue
       if fla == 0:
           showerror(title='提示', message='无此信息,搜索失败!')
       x = dataTreeview.get_children()
       for item in x:
           dataTreeview.delete(item)
       for i in v:
           dataTreeview.insert("", 1, text="line1", values=list(i))
       des()

def impInfo():
   root1 = Tk()
   root1.withdraw()
   Folderpath = filedialog.askdirectory() #获得选择好的文件夹
   Filepath = filedialog.askopenfilename() #获得选择好的文件
   data=pd.read_csv(Filepath)

for i in range(len(data.values)):
       j=list(data.values[i])
       lst=col.find({},{'_id':0})
       flag=0
       for item in lst:
           i=list(item.values())
           if str(j[0])== str(i[0]):
               flag=1
               break
       if flag==0:
           list1 = {
                   "work_number":str(j[0]),
                   "name":j[1],
                   "age":j[2],
                   "salary":j[3],
                   "phone":j[4],
                   "birthday":j[5]
               }
           col.insert_one(list1)
   showinfo(title='提示', message='导入成功,可刷新!')

x = dataTreeview.get_children()
   for item in x:
       dataTreeview.delete(item)
   lst=col.find({},{'_id':0})
   for item in lst:
       i=list(item.values())
       dataTreeview.insert("", 1, text="line1", values=i)

def xFunc(event):
   a=xVariable.get()  

def exp():
   global info
   info=Toplevel()
   info.title("保存信息")
   info.geometry('500x200')
   button1=Button(info, text="确认备份",command=expInfo).place(relx=0.4, rely=0.8, width=100)
   Label(info, text="路径:",font=("黑体", 10)).place(relx=0.05, rely=0.2, relwidth=0.2)
   button2=Button(info, text="选择本地",command=selection).place(relx=0.8, rely=0.2, width=70)
   Label(info, text="文件名:",font=("黑体", 10)).place(relx=0.05, rely=0.4, relwidth=0.2)
   com = ttk.Combobox(info, textvariable=xVariable)
   com.place(relx=0.8, rely=0.4, width=70)
   com["value"] = (".csv", ".html", ".xlsx",".xls")    # #给下拉菜单设定值
   com.current(2)
   com.bind("<<ComboboxSelected>>", xFunc)     # #给下拉菜单绑定事件
   text1=Entry(info, textvariable=path).place(relx=0.25, rely=0.2, relwidth=0.5, height=25)
   text2=Entry(info, textvariable=file_name).place(relx=0.25, rely=0.4, relwidth=0.5, height=25)
   info.bind('<Return>',pas10)

def selection():
   root2 = Tk()
   root2.withdraw()
   Folderpath = filedialog.askdirectory() #获得选择好的文件夹
   path.set(str(Folderpath))

def expInfo():
   lst=col.find({},{'_id':0})
   df =  pd.DataFrame(list(lst))
   ftp=xVariable.get()
   file = path.get()+'/'+file_name.get()+xVariable.get()  
   print(file)
   if ftp=='.csv':
       df.to_csv(file,index=False,header=True)
   elif ftp=='.xlsx':
       df.to_excel(file,index=False,header=True)
   elif ftp=='.xls':
       df.to_excel(file,index=False,header=True)
   elif ftp=='.html':
       df.to_html(file,index=False,header=True)
   showinfo(title='提示', message='备份成功!')
   des()

path = StringVar()
file_name = StringVar()
xVariable = tkinter.StringVar()
#页面布局            
Button(root, text="刷新信息",command=showAllInfo,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.15, width=120,height=50)
root.bind('<F3>',pas1)
Button(root, text="添加信息",command=add,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.25, width=120,height=50)
root.bind('<F4>',pas2)
Button(root, text="删除信息",command=pitch_on,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.35, width=120,height=50)
root.bind('<BackSpace>',pas3)
Button(root, text="更新信息",command=information2,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.45, width=120,height=50)
root.bind('<Control-A>',pas4)
Button(root, text="搜索信息",command=search,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.55, width=120,height=50)
root.bind('<Control-S>',pas55)
Button(root, text="导入数据",command=impInfo,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.65, width=120,height=50)
root.bind('<Control-D>',pas6)
Button(root, text="导出数据",command=exp,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.75, width=120,height=50)
root.bind('<Control-W>',pas7)

dataTreeview = ttk.Treeview(root, show='headings',height=20, column=('sid', 'name', 'age','salary','phone','birthday'))
dataTreeview.column('sid', width=10, anchor="center")
dataTreeview.column('name', width=10, anchor="center")
dataTreeview.column('age', width=10, anchor="center")
dataTreeview.column('salary', width=10, anchor="center")
dataTreeview.column('phone', width=10, anchor="center")
dataTreeview.column('birthday', width=10, anchor="center")
style_value = ttk.Style()
style_value.configure("dataTreeview", rowheight=20, font=("微软雅黑", 30))
dataTreeview.tag_configure('tag_odd',background="red",foreground="blue")
dataTreeview.tag_configure('tag_even',background="black",foreground="orange")
scrollBar=Scrollbar(width=20)
scrollBar.pack(side=RIGHT,fill=Y)
scrollBar.config(command=dataTreeview.yview)

dataTreeview.heading('sid', text='工号')
dataTreeview.heading('name', text='姓名')
dataTreeview.heading('age', text='年龄')
dataTreeview.heading('salary', text='薪水')
dataTreeview.heading('phone', text='电话')
dataTreeview.heading('birthday', text='生日')
dataTreeview.bind('<Double-Button-1>',information)
dataTreeview.bind('<ButtonRelease-1>',pas9)
x = dataTreeview.get_children()
for item in x:
   dataTreeview.delete(item)
lst=col.find({},{'_id':0})
for item in lst:
   i=list(item.values())
   dataTreeview.insert("", 1, text="line1", values=i)
dataTreeview.place(relx=0.2,rely=0.1, relwidth=0.78,relheight=20)

root.mainloop()

效果展示

python基于Tkinter实现人员管理系统

来源:https://blog.csdn.net/m0_55762164/article/details/121497501

标签:python,人员,管理系统
0
投稿

猜你喜欢

  • asp用err.raise自定义错误信息

    2007-09-12 19:38:00
  • 关于javascript DOM事件模型的两件事

    2024-05-13 09:37:11
  • Vue.js 2.5新特性介绍(推荐)

    2024-05-13 09:09:00
  • CSS Menu导航菜单下载网站整理

    2007-10-21 19:49:00
  • python 多线程实现多任务的方法示例

    2021-04-12 08:36:05
  • Python中的 enumerate和zip详情

    2022-10-22 23:48:30
  • XML简易教程之二

    2008-09-05 17:19:00
  • Windows10下 python3.7 安装 facenet的教程

    2022-06-21 11:17:01
  • git如何合并某个分支的某次提交(cherry-pick)

    2023-01-09 16:29:20
  • Mac下通过brew安装指定版本的nodejs教程

    2024-05-03 15:56:11
  • 详解python里的命名规范

    2023-02-11 20:07:02
  • 在thinkphp5.0路径中实现去除index.php的方式

    2024-05-11 09:54:34
  • MySQL语句中的主键和外键使用说明

    2024-01-28 12:49:33
  • MySQL 连接与管理

    2011-09-10 15:52:42
  • python通过http上传文件思路详解

    2022-02-08 12:48:30
  • Python利用VideoCapture读取视频或摄像头并进行保存

    2022-12-06 18:26:27
  • 原生js实现autocomplete插件

    2024-04-17 09:44:55
  • MySQL单表查询常见操作实例总结

    2024-01-20 05:47:17
  • js中的for如何实现foreach中的遍历

    2024-04-29 13:19:37
  • Python的Django框架中的Context使用

    2023-09-19 15:29:24
  • asp之家 网络编程 m.aspxhome.com