main.py
'''
目标:做一个电子考勤系统,实现学生登录信息的增删改查、学生考勤信息的增删改查
结构:
-mian.py
-func.py
-stu_infos.csv #学生登录信息,(id,name,code) 3元组为一行记录
-attendance.csv #考勤信息 (id,name,state, time) 4元组为一行记录
'''
from func import *
def login():
info_dics = get_info('stu_infos')
print("[School Attendance] 输入用户名和密码,你有3次机会!")
for ii in range(3):
id = input('[School Attendance] User ID:')
code = input('[School Attendance] Code:')
#print(id,code)
if id in info_dics.keys():
if info_dics[id][2] == code:
return True
print("[School Attendance] 输入用户名和密码,你还有%d次机会!"%(3 - 1 - ii))
return False
def load_stu_info():
"""
样例操作,正式可以改为root管理员登录,然后批量输入、更新、删除、查询等!
:return:
"""
# 添加3个、删除1个、更改1个
if 'stu_infos.csv' in os.listdir():
os.remove('stu_infos.csv')
add_info(['2020030303', 'yaoyao', '123456'], ['2020040404', '邓大飞', 'abcdef'], ['2020050505', '洛小小', '379379'])
get_info('stu_infos')
# 删除
print(10 * '<<' + 'After deleting' + 10 * '>>')
del_info(id=['2020030303'])
get_info('stu_infos')
# 更新
print(10 * '<<' + 'After update' + 10 * '>>')
update_info('stu_infos', id='2020030303', name='瑶瑶')
update_info('stu_infos', id='2020040404', code='ABCDEF')
get_info('stu_infos')
if __name__ == '__main__':
# todo 1 调用加载学生信息函数
load_stu_info()
# 登录成功,添加考勤记录
success = login()
if success :
# todo 2 考勤数据添加功能
while True:
opr = input('[School Attendance] "新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit"')
if opr == 'add':
in_ls = input('[School Attendance] 输入id,name,state,注意以,间隔')
in_ls = in_ls.split(',')
in_ls.append(fmt)
add_info(in_ls, file = 'attendance', mode = 'a')
get_info(file='attendance')
elif opr =='del':
in_ls = input('[School Attendance] 输入想要删除的记录id:')
del_info('attendance', id = [in_ls])
get_info('attendance')
elif opr == 'get':
get_info('attendance')
elif opr == 'update':
in_ls = input('[School Attendance] 输入想要更新的记录id, property [id, name or state],new value:')
in_ls = in_ls.split(',')
fd = in_ls[1]
update_info('attendance', id_k=in_ls[0], **{in_ls[1]: in_ls[2]})
get_info('attendance')
elif opr == 'quit':
print('[School Attendance] 成功退出,再见!')
break
else:
print("[School Attendance] 登录失败,再见!")
func.py
import time
import csv
import os
import numpy as np
#import orderdict
fmt = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime())
field_dic = {'stu_infos': ['id','name','code'],
'attendance': ['id','name','state', 'time'],
}
def add_info( *record, file = 'stu_infos', mode = 'a',):
"""
增加csv的记录
:param record: 可变记录参数,每个参数为一个列表,遵从field_dic格式
:param file: 添加stu_infos或者attendance信息
:param mode: 模式,'a'追加读写、'w','r'读写,‘x'新建
:return: 无
"""
# csv的读写
with open(file + '.csv', mode, newline='', encoding='utf-8') as f: #stu_infos
wf = csv.writer(f)
for rec in record:
wf.writerow(rec)
def get_info(file = 'stu_infos'):
"""
获取csv数据信息
:param file: 选取文件
:return: 数据字典,以学生id为key,3元祖或4元组为value
"""
print("\n" + file + " 包含:")
#fields = field_dic[file]
info_dic = {}
with open(file + '.csv', newline='', encoding = 'utf-8') as fr:
csvreader = csv.reader(fr)
for row in csvreader:
print(row) #调试用打印出来
info_dic[row[0]] = row
#print(info_dic)
return info_dic
def del_info(file = 'stu_infos', id = [], ):
"""
以id号列表,制定删除列表中某记录
:param file: csv文件
:param id: 以id号制定删除的记录
:return:
"""
info_dics = get_info(file)
for ii in id:
if ii in info_dics.keys():
del info_dics[ii]
else:
print("[School Attendance] 查无此人!")
#重新存储进去
add_info(*list(info_dics.values()), file = file, mode = 'w')
def update_info(file = 'stu_infos', id_k = '', **kwargs):
'''
逐条修改记录
:param file:
:param id_k: 需要修改的id号,id_k和kwargs的id区分开
:param kwargs: 需要修改的参数
:return:
'''
info_dics = get_info(file)
fields = field_dic[file]
#print(info_dics, kwargs, id_k)
if id_k in info_dics.keys():
for (k,v) in kwargs.items():
#print(fields, k)
ind = np.argwhere(np.array(fields)==k)[0,0]
ls = info_dics[id_k]
ls[ind] = v
info_dics[id_k] = ls
#重新存储进去
add_info(*list(info_dics.values()), file = file, mode = 'a')
登录输出
stu_infos 包含:
[‘2020030303’, ‘yaoyao’, ‘123456’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
stu_infos 包含:
[‘2020030303’, ‘yaoyao’, ‘123456’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
{‘2020040404’: [‘2020040404’, ‘邓大飞’, ‘abcdef’], ‘2020050505’: [‘2020050505’, ‘洛小小’, ‘379379’]} {‘name’: ‘瑶瑶’} 2020030303
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
{‘2020040404’: [‘2020040404’, ‘邓大飞’, ‘abcdef’], ‘2020050505’: [‘2020050505’, ‘洛小小’, ‘379379’]} {‘code’: ‘ABCDEF’} 2020040404
[‘id’, ‘name’, ‘code’] code
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘ABCDEF’]
[‘2020050505’, ‘洛小小’, ‘379379’]
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘ABCDEF’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[School Attendance] 输入用户名和密码,你有3次机会!
[School Attendance] User ID:>? 20200505
[School Attendance] Code:>? 379379
[School Attendance] 输入用户名和密码,你还有2次机会!
[School Attendance] User ID:>? 202020050505
[School Attendance] Code:>? 379379
[School Attendance] 输入用户名和密码,你还有1次机会!
[School Attendance] User ID:>? 2020050505
[School Attendance] Code:>? 3
[School Attendance] 输入用户名和密码,你还有0次机会!
[School Attendance] 登录失败,再见!
正常进行增、删、改、查,退出
stu_infos 包含:
[‘2020030303’, ‘yaoyao’, ‘123456’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
stu_infos 包含:
[‘2020030303’, ‘yaoyao’, ‘123456’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
{‘2020040404’: [‘2020040404’, ‘邓大飞’, ‘abcdef’], ‘2020050505’: [‘2020050505’, ‘洛小小’, ‘379379’]} {‘name’: ‘瑶瑶’} 2020030303
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
{‘2020040404’: [‘2020040404’, ‘邓大飞’, ‘abcdef’], ‘2020050505’: [‘2020050505’, ‘洛小小’, ‘379379’]} {‘code’: ‘ABCDEF’} 2020040404
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[‘2020040404’, ‘邓大飞’, ‘ABCDEF’]
[‘2020050505’, ‘洛小小’, ‘379379’]
stu_infos 包含:
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[‘2020040404’, ‘邓大飞’, ‘abcdef’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[‘2020040404’, ‘邓大飞’, ‘ABCDEF’]
[‘2020050505’, ‘洛小小’, ‘379379’]
[School Attendance] 输入用户名和密码,你有3次机会!
[School Attendance] User ID:>? 2020050505
[School Attendance] Code:>? 379379
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? update
[School Attendance] 输入想要更新的记录id, property [id, name or state],new value:>? 2020050505,state,缺席
attendance 包含:
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
{‘2020040404’: [‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]} {‘state’: ‘缺席’} 2020050505
attendance 包含:
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? get
attendance 包含:
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? del
[School Attendance] 输入想要删除的记录id:>? 2020040404
attendance 包含:
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
[‘2020040404’, ‘邓大力’, ’ 出勤’, ‘2020-12-30-14:57:31’]
attendance 包含:
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? get
attendance 包含:
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? add
[School Attendance] 输入id,name,state,注意以,间隔>? 2020050505,dengdali,出勤
attendance 包含:
[‘2020050505’, ‘dengdali’, ‘出勤’, ‘2020-12-30-15:13:08’]
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? update
[School Attendance] 输入想要更新的记录id, property [id, name or state],new value:>? 2020050505,name,邓大力
attendance 包含:
[‘2020050505’, ‘dengdali’, ‘出勤’, ‘2020-12-30-15:13:08’]
{‘2020050505’: [‘2020050505’, ‘dengdali’, ‘出勤’, ‘2020-12-30-15:13:08’]} {‘name’: ‘邓大力’} 2020050505
attendance 包含:
[‘2020050505’, ‘dengdali’, ‘出勤’, ‘2020-12-30-15:13:08’]
[‘2020050505’, ‘邓大力’, ‘出勤’, ‘2020-12-30-15:13:08’]
[School Attendance] “新增、删除、查询、修改考勤或退出?输入add,del,get,update,quit”>? quit
[School Attendance] 成功退出,再见!
summary
- 简单的出勤系统,包括登录csv表,出勤attendance.csv表做“数据库”
- 考察简单csv读写能力,csv.reader, .writer(), .writerow();注意newline,code定参数
- 输入结构的组织,此处没有做鲁棒性、防卫性措施,比如update更新输入错误,如何检查和重输入;
- 还欠缺logging和root登录,读者有兴趣可以自己添加