python程序:学校考勤系统

44 篇文章 0 订阅
18 篇文章 1 订阅

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登录,读者有兴趣可以自己添加
  • 3
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值