python----选课系统

第一次自己做一个系统,还是很开心哒~~

知识点记录

1、类的静态方法

@staticmethod
def get_name():
    b = common.get_obj_name(settings.db_type[1])
    return b

与类对象无关,可直接通过类名进行调用

2、pickle模块

可存储的数据类型:

  1. 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
  2. 由任何原生类型组成的列表,元组,字典和集合。
  3. 函数,类,类的实例

常用的方法

  • pickle.dump(obj, file, protocol=None,)

  注解:将对象obj保存到文件file中去。

     protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。

     file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以'w'方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。

  • pickle.load(file)

  注解:从file中读取一个字符串,并将它重构为原来的python对象。
  file:类文件对象,有read()和readline()接口。

  • pickle.dumps(obj[, protocol])

作用:将obj对象序列化为string形式,而不是存入文件中

obj:想要序列化的obj对象

protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本

  • pickle.loads(string)

作用:从string中读出序列化前的obj对象

3、truncate

def db_fileopen_write(db_type,db_id,db_write):
    path = os.path.join(settings.db_path,db_type,db_id)
    f = open(path,'wb')
    f.seek(0)#用于将指针指到文件开头处
    f.truncate()
    pickle.dump(db_write,f)
    f.close()

此处用于删除文件之前原有的内容,用于更新类对象状态

truncate() 方法语法如下:

fileObject.truncate([size])   

size -- 可选,如果存在则文件从开头截断为指定字节。

一、系统目录

二、实现代码

 2.1  bin

2.1.1 run.py

程序的入口

from src import main

if __name__ == '__main__':

    main.main()
View Code

2.2 confg

2.2.1 settings

配置文件

import os
import sys


#path路径
BASIC_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASIC_PATH)
db_path = os.path.join(BASIC_PATH,'db')
teacher_path = os.path.join(db_path,'teacher_db')

#define类型
db_type={
    1:'teacher_db',
    2:'les_db',
    3:'students_db',
    4:'class_db'
}

auth_type = {
    1:'学生',
    2:'管理员'
}

#string
condition = False

manager_name = 'admin'
manager_passwd = '1234'

welcome = '''
-------------------------%s-------------------------------
'''

welcome1 = welcome%'欢迎登录选课系统'
welcome2 = welcome%'欢迎进入选课系统'

admin_choice = '''
作为管理员,您有以下选择:
   1、添加新老师
   2、添加新课程
   3、添加新班级
   4、退出登陆
'''

noteach_choice = '''
   1、添加新教师
   2、查看现有教师
'''

students_choice ={1:'''
   1、学员注册
   2、学员登陆
   3、返回上一级
''',
                  2:'''
    1、选择班级
    2、查看班级详情
    3、查看课程情况
    4、退出登录
                  '''
                  }

main_choice =  '''
    1、管理员
    2、学生
'''
View Code

2.3 db

以一个对象为一个文件的方式存放类对象,名称为该对象的id号

例:

2.3.1 class_db

2.3.2 les_db

2.3.3 studengts_db

2.3.4 teacher_db

 2.4 lib

2.4.1 common

存放常用且通用的函数

import uuid
from confg import settings
import os
import pickle

#获得唯一ID号
def get_id():
    m = str(uuid.uuid1())
    return m

#db_type:对象类别,db_id:对象id号,读取db包下相应的类对象,并返回
def db_fileopen_read(db_type,db_id):
    path = os.path.join(settings.db_path,db_type,db_id)
    f = open(path,'rb')
    m = pickle.load(f)
    f.close()
    return m

#将db_type类型的对象db_write,以其id号为名称存入相应数据库包中
def db_fileopen_write(db_type,db_id,db_write):
    path = os.path.join(settings.db_path,db_type,db_id)
    f = open(path,'wb')
    f.seek(0)
    f.truncate()
    pickle.dump(db_write,f)
    f.close()

#以列表的形式返回某db_type类型下所有文件的id号
def get_id_list(db_type):
    path = os.path.join(settings.db_path,db_type)
    db_list = os.listdir(path)
    n = 0
    for i in db_list:
        if i == '__init__.py':
            del db_list[n]
        n += 1
    return db_list

#以列表形式返回某db_type类型下的所有类对象
def get_object(db_type):
    db_list = get_id_list(db_type)
    b = []
    for i in db_list:
        obj =db_fileopen_read(db_type,i)
        b.append(obj)
    return b

#以列表形式返回某db_type类型下所有对象的名字
def get_obj_name(db_type):
    m = get_object(db_type)
    # print(m)
    obj_name=[]
    for i in m:
        obj_name.append(i.name)
    return obj_name

#展示列表信息
def show_list(li):
    for i in li:
        print(i)

#通过类对象的名字返回类对象本身
def name_obj(db_type,name):
    obj = get_object(db_type)
    for i in obj:
        if name == i.name:
            return i
        else:
            return False

#验证密码是否正确
def athu(db_passwd,passwd):
    if db_passwd == passwd:
        settings.condition =True
        print(settings.welcome1)
        return True
    else:
        return False
View Code

2.4.2 modle

定义类,类中常有的静态方法:

get_all:得到该类下的所有对象

get_name:得到该类下的所有对象名称

普通方法:

introduction:介绍类对象的基本情况

from confg import settings
from lib import common

class Teacher:
    def __init__(self,name,sex,age):
        self.name = name
        self.age = age
        self.sex = sex
        self.id = common.get_id()
    @staticmethod
    def get_all():
        a= common.get_object(settings.db_type[1])
        return a
    @staticmethod
    def get_name():
        b = common.get_obj_name(settings.db_type[1])
        return b

class Classes:
    def __init__(self,name,lesson):
        self.name = name
        self.lesson = lesson
        self.id = common.get_id()
    @staticmethod
    def get_all():
        a= common.get_object(settings.db_type[4])
        return a
    @staticmethod
    def get_name():
        b = common.get_obj_name(settings.db_type[4])
        return b
    def introduction(self):
        print('班级名称:%s'
              %self.name)
        print('班级应上的课程有:')
        for i in self.lesson:
            print(i.name)
    def lesson_list(self):
        les_name_list = []
        for i in self.lesson:
            les_name_list.append(i.name)
        return les_name_list


class Student:
    def __init__(self,name,passwd,sex,age):
        self.name = name
        self.passwd = passwd
        self.sex = sex
        self.age = age
        self.id = common.get_id()
        self.cls = None

class Lessons:
    def __init__(self,name,time,cost,teacher):
        self.name = name
        self.time = time
        self.cost = cost
        self.teacher = teacher
        self.id = common.get_id()
    @staticmethod
    def get_all():
        b = common.get_object(settings.db_type[2])
        return b
    @staticmethod
    def get_name():
        a = common.get_obj_name(settings.db_type[2])
        return a
    def introduction(self):
        print('''课程详情:
                 课程名称:%s
                 上课时间:%s
                 上课老师:%s'''%(self.name,self.time,self.teacher.name))
View Code

2.5 src

2.5.1 admin.py

管理员视图

from confg import settings
from lib import modle,common

def create_tea():
    while 1:
        name  = input('请输入新加入老师的姓名:')
        sex = input('请输入%s老师的性别:'%name)
        age = input('请输入%s老师的年龄:'%name)
        new_teacher = modle.Teacher(name,sex,age)
        common.db_fileopen_write(settings.db_type[1],new_teacher.id,new_teacher)
        print('成功录入新老师%s'%name)
        m = int(input('继续录入新老师?(是:1;否:0)'))
        if m == 0:
            break
        return new_teacher

def create_les():
    while 1:
        name = input('请输入新课程的名称:')
        time = input('新课程的开课时间:')
        cost = input('一学期的费用:')
        tea = modle.Teacher.get_all()
        tea_name = input('请输入授课老师:')
        teanamelist = modle.Teacher.get_name()
        if tea_name not in teanamelist:
            print('系统中没有%s老师的记录,您有以下选择:%s'%(tea_name,settings.noteach_choice))
            c1 = input('请选择:')
            if c1 == '1':
                new_tea = create_tea()
                new_les = modle.Lessons(name,time,cost,new_tea)
                common.db_fileopen_write(settings.db_type[2],new_les.id,new_les)
                print('成功添加新课程')
            elif c1 == '2':
                print('有%s位老师可以选择,如下:'%len(tea))
                for i in teanamelist:
                    print(i)
                tea_choice = input('请选择:')
                teacher = modle.Teacher.get_all()
                cho_tea = teacher[tea_choice]
                new_les = modle.Lessons(name,time,cost,cho_tea)
                common.db_fileopen_write(settings.db_type[2],new_les.id,new_les)
                print('成功添加新课程')
        else:
            for i in tea:
                if tea_name == i.name:
                    common.db_fileopen_write(settings.db_type[2],i.id,i)
                    print('成功添加新课程')
        m = int(input('继续添加新课程?(是:1;否:0)'))
        if m == 0:
            break

def creat_class():
    while 1:
        cls_name = input('请输入新班级的名字')
        print('有以下课程可供选择:')
        les_name = modle.Lessons.get_name()
        common.show_list(les_name)
        les_list = []
        while 1:
            les_choice = input('请选择(输入exit退出):')
            if les_choice == 'exit':
                break
            else:
                if les_choice in les_name:
                    les_list.append(les_choice)
                else:
                    print('%s课程还未存在。'%les_choice)
        les_obj_list = modle.Lessons.get_all()
        cls_les_list = []
        for i in les_obj_list:
            if i.name in les_list:
                cls_les_list.append(i)
        new_cls = modle.Classes(cls_name,cls_les_list)
        common.db_fileopen_write(settings.db_type[4],new_cls.id,new_cls)
        print('成功添加班级!')
        m = int(input('继续添加班级?(是:1;否:0)'))
        if m == 0:
            break

def admin_main():
    settings.condition = True
    print(settings.welcome1)
    while 1 :
        print(settings.admin_choice)
        m=int(input('请选择:'))
        if m == 1:
            create_tea()
        elif m == 2:
            create_les()
        elif m == 3:
            creat_class()
        elif m == 4:
            settings.condition = False
            break
View Code

学生视图

from confg import settings
from lib import modle,common
import re


def student_zhuce():
    while 1 :
        name= input('请输入您的姓名:')
        passwd1 = input('请输入您的密码:')
        n = 3
        m = 0
        while n>0:
            passwd2 = input('请再次输入您的密码:')
            if passwd1 == passwd2:
                xinxi = input('请输入您的基本信息:性别以及年龄,请以‘,’分隔')
                sex,age = re.split(r'',xinxi)
                new_student = modle.Student(name,passwd1,sex,age)
                common.db_fileopen_write(settings.db_type[3],new_student.id,new_student)
                m = 1
                print('注册成功!')
                break
            else:
                print('输入错误')
                n -= 1
        if m == 1:
            break

def auth_stu():
    if settings.condition is not False:
        print('您已登录')
    else:
        stu_name = input('请输入您的名字:')
        stu_passwd = input('请输入您的密码')
        obj = common.name_obj(settings.db_type[3],stu_name)
        if obj is not False:
            passwd = obj.passwd
            stu = common.athu(passwd,stu_passwd)
            if stu:
                print('登陆成功')
                settings.condition = True
                return obj
            else:
                print('登陆失败')
                return False
        else:
            print('登录失败')
            return False


def stu_cls(stu):
     if stu.cls is None:
            print('现有以下班级:')
            cls_list = modle.Classes.get_name()
            for i in cls_list:
                print(i)
            choice_cls = ''
            while 1:
                choice_cls = input('请输入选择的班级')
                if choice_cls not in cls_list:
                    print('输入错误,请重新输入')
                else:
                    break
            cls = common.name_obj(settings.db_type[4],choice_cls)
            stu.cls = cls
            common.db_fileopen_write(settings.db_type[3],stu.id,stu)
            print('选择成功')
     else:
            print('您已经在%s班级中了'%stu.cls.name)

def see_lesson(stu):
    print('您所要上的课程:')
    for i in stu.cls.lesson:
        print(i.name)
    while 1:
        see_les = input('请输入您想要查看的课程:(输入exit退出)')
        less_name_list = stu.cls.lesson_list()
        if see_les == 'exit':
            break
        elif see_les in less_name_list:
            see_les_obj = common.name_obj(settings.db_type[2],see_les)
            see_les_obj.introduction()
            break
        else:
            print('输入错误')

def student_main():
    while 1:
        print('作为学生,您有以下选择:%s'%settings.students_choice[1])
        stu_choice = int(input('请输入您的选择:'))
        if stu_choice == 1:
            student_zhuce()
        elif stu_choice == 2:
            stu = auth_stu()
            if stu is not False:
                while 1:
                    print('你有以下选择:%s'%settings.students_choice[2])
                    stu_choice2 = int(input('请选择:'))
                    if stu_choice2 == 1:
                        stu_cls(stu)
                    elif stu_choice2 == 2:
                        if stu.cls is not None:
                            stu.cls.introduction()
                        else:
                            print('您还未选择班级')
                    elif stu_choice2 == 3:
                        if stu.cls is not None:
                            see_lesson(stu)
                        else:
                            print('您还未选择班级,无法查看课程')
                    elif stu_choice2 == 4:
                        settings.condition = False
                        break
                    else:
                        print('输入错误')

        elif stu_choice == 3:
            break
        else:
            print('输入错误')
View Code

主逻辑视图

from src import admin
from src import student
from confg import settings

def main():
    print(settings.welcome2)
    while 1:
        print(settings.main_choice)
        shengfen = int(input('您的身份是:'))
        if shengfen == 1:
            admin.admin_main()
        elif shengfen == 2:
            student.student_main()
View Code

 三、运行效果

主界面

3.1 管理员视图

3.1.1 添加新老师

3.1.2 添加新课程

3.1.3 添加新班级

3.2 学生视图

3.2.1 学员注册

 

3.2.2 学员登录

3.2.3 选择班级

3.2.4 查看班级详情

3.2.5 查看课程情况

3.3 返回上一级

 

posted @ 2018-11-12 20:00  yujin123456  阅读(319)  评论(0编辑  收藏  举报