1. 程式人生 > >Python 校園選課系統

Python 校園選課系統

1.3 定義 視圖 course 課程 判斷 admin write readme

面向對象作業——校園選課系統

角色:

學校、學員、課程、講師

要求:

1. 創建北京、上海 2 所學校

2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開

3. 課程包含,周期,價格

4. 班級關聯課程、講師

5. 創建學員時,選擇學校,關聯班級

6. 創建講師角色時要關聯學校

7. 提供三個角色視圖

7.1 學員視圖, 登陸, 查看課程、查看班級

7.2 講師視圖, 講師可查看自己教學的班級、課程。

進階需求:可管理自己的班級, 查看班級學員列表 , 修改所管理的學員的成績

7.3 管理視圖,創建講師, 創建班級,創建課程

7. 上面的操作產生的數據都通過pickle序列化保存到文件裏

一 、分析需求

  1. 創建北京、上海 2 所學校 分析:創建學校類

  2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
    分析:創建課程類,通過課程類去創建課程,並自動判斷地點,當課程為go是地點為上海,為Linux或python時地點為北京

  3. 課程包含,周期,價格 分析:課程包含的周期、價格屬性

  4. 班級關聯課程、講師 分析:可以創建班級的時候需輸入關聯的課程,創建講師的時候需輸入關聯的班級;一個班級對應一個課程 一個班級對應一個講師

  5. 創建學員時,選擇學校,關聯班級 分析:創建學員時需要輸入所屬的班級,並自動關聯課程和學校

  6. 創建講師角色時要關聯學校 分析:創建教師時根據教師所教的課程自動關聯學校

  7. 提供三個角色視圖 分析:讓用戶可選擇角色

  7.1 學員視圖, 登陸, 查看課程、查看班級 分析:學員角色可以有的功能

  7.2 講師視圖, 講師可查看自己教學的班級、課程。 分析:教師角色有的功能

          進階需求:可管理自己的班級, 查看班級學員列表 , 修改所管理的學員的成績

  7.3 管理視圖,創建講師, 創建班級,創建課程 分析:管理員有的功能

二、 readme(程序說明文件)

運行環境:python3.6
主程序為While 循環,先讓用戶選擇角色,進入所需的角色後提示選擇相應的功能
選擇功能時必須先登錄,如沒有登錄,則會跳轉讓用戶登錄

角色功能:

1 學生

(1)登錄   (2)查看班級 (3)查看課程 (4)返回上層目錄   (5)註銷

2 教師

(1)登錄   (2)查看所教的班級  (3)查看所教的課程  (4)查看班級學員   (5)返回上層目錄   (6)註銷

3 管理員

(1)登錄   (2)創建學校 (3)創建班級 (4)創建講師  (5)創建課程     (6)創建學員    (7)返回上層 (8)註銷

程序說明:

1 函數initalize用來進行初始化,創建程序所需的文件

classinfo.txt 文件用來存放班級信息,
    格式為:班級名=地點=課程=講師
    例如:s22=北京=python=taibai
courseinfo.txt 文件用來存課程信息
    格式為:課程=周期=價格=地點
    例如:python=6個月=9999=北京
managerinfo.txt 文件用來存管理員信息
    格式為:用戶名=密碼
    例如:admin=123
schoolinfo.txt 文件用來存學校信息
    格式為:學校名=地點
    例如:oldboy=北京
studentinfo.txt 文件用來存學生信息
    格式為:姓名=密碼=班級=課程
    例如:abc=123=s22=python
teacherinfo.txt 用來存教師信息
    格式為:姓名=密碼=課程=所教班級=地點
    例如:taibai=123=python=s22=北京 

2 函數 myinput 用來進行輸入,如果輸入為空則重新輸入

3 函數 login 用來進行登錄,如果登錄成則修改對應的狀態信息,並記錄用戶名

4 學校類 School 有兩個屬性,學校地點和學校名

5 班級類 Class 有四個屬性,分別為班級名稱、班級地點、班級課程、班級授課老師

6 課程類 Course 有四個屬性,分別是課程名稱、課程周期、課程價格、課程地點

7 老師類 Teacher 有一個記錄狀態的字典、四個屬性、兩個方法、一個裝飾器

字典status_dict用來記錄用戶名和登錄狀態
屬性分別為老師姓名、老師密碼、老師所教課程、所教班級
方法 view_class 用來查看課程和班級
方法 viem_student用來查看班級的學生
裝飾器decorator_t 用來進行登錄判斷,如果沒有登錄則讓用戶登錄

8 學生類 Student 有一個記錄狀態的字典、三個屬性、兩個方法、一個裝飾器

字典status_dict用來記錄用戶名和登錄狀態
方法view_class用來查看自己的班級
方法view_course用來查看自己的課程
裝飾器decorator_s 用來進行登錄判斷,如果沒有登錄則讓用戶登錄

9 管理員類 Manager 有一個記錄狀態的字典、二個屬性、五個方法、一個裝飾器

字典status_dict用來記錄用戶名和登錄狀態
方法create_school用來創建學校
方法create_course用來創建課程
方法create_class 用來創建班級
方法create_teacher用來創建教師並自動關聯地點
方法create_student用來創建學生並自動關聯課程
裝飾器decorator_s 用來進行登錄判斷,如果沒有登錄則讓用戶登錄

三、全部代碼如下

1 代碼基本信息

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# Author:zengzeng
# Version: 4.0

2 定義初始化函數,創建程序所需的文件

def initialize():
    ‘初始化,創建所需的文件‘
    print("""初始化開始...\n將創建程序所需文件:
    ‘classinfo.txt‘, ‘courseinfo.txt‘, ‘managerinfo.txt‘, 
    ‘schoolinfo.txt‘, ‘studentinfo.txt‘, ‘teacherinfo.txt‘,""")

    with open(‘classinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f1:
        f1.write(‘s22=北京=python=taibai\n‘)
    with open(‘courseinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f2:
        f2.write(‘python=6個月=9999=北京\n‘)
    with open(‘managerinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f3:
        f3.write(‘admin=123\n‘)
    with open(‘schoolinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f4:
        f4.write(‘oldboy=北京\n‘)
    with open(‘studentinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f5:
        f5.write(‘abc=123=s22=python\n‘)
    with open(‘teacherinfo.txt‘, ‘w+‘, encoding=‘utf-8‘) as f6:
        f6.write(‘taibai=123=python=s22=北京\n‘)
    print("初始化完成!")

3 定義輸入函數,用來判斷輸入是否為空

def myinput(content):
    ‘‘‘content為輸入時的提示語‘‘‘
    info = input("%s" % content).strip()
    if len(info) == 0:
        print("不能為空,請重新輸入")
        return myinput(content)
    else:
        return info

4 定義登錄函數

def login(file, role):
    "file 為存用戶信息的文件,role為類名"
    i = 0
    while i < 3:
        username = input("請輸入用戶名:").strip()
        password = input("請輸入密碼:").strip()
        with open(file, ‘r‘, encoding=‘utf-8‘) as fl:
            for line in fl:
                line_list = line.strip().split(‘=‘)
                if username == line_list[0] and password == line_list[1]:
                    print("登錄成功")
                    # 登錄成功後,記錄用戶登錄狀態
                    # global status_dict
                    role.status_dict[‘username‘] = username
                    role.status_dict[‘status‘] = True
                    return True
            else:
                print("賬號或密碼不正確,請重新輸入")
                i += 1
    else:
        print("錯誤三次,請稍後再試")
        return login()

5 定義學校類

class School:
    def __init__(self, location, school_name):
        self.location = location
        self.school_name = school_name

6 定義班級類

class Class:
    def __init__(self, class_name, class_loaction, class_course, class_teacher):
        self.class_name = class_name
        self.class_location = class_loaction
        self.class_course = class_course
        self.class_teacher = class_teacher

7 定義課程類

class Course:
    def __init__(self, course_name, course_time, course_price, course_location):
        self.course_name = course_name
        self.course_time = course_time
        self.course_price = course_price
        self.course_location = course_location

8 定義老師類

class Teacher:
    ‘‘‘定義老師類,可記錄登錄狀態,可具有查看所帶班級和所教課程的功能‘‘‘
    status_dict = {
        ‘username‘: None,
        ‘status‘: False
    }

    def __init__(self, teacher_name, teacher_passwd=‘passwd‘, teach_course=‘course‘, teach_class=‘class‘):
        self.teacher_name = teacher_name
        self.teacher_passwd = teacher_passwd
        self.teach_course = teach_course
        self.teach_class = teach_class

    def decorator_t(f):
        def inner(*args, **kwargs):
            # 判斷登錄狀態
            if Teacher.status_dict[‘status‘]:
                ret = f(*args, **kwargs)
                return ret
            else:
                print("您還沒有登陸,請輸入賬號密碼進行登陸!")
                return login(‘teacherinfo.txt‘, Teacher)

        return inner

    @decorator_t
    def view_class(self, teach_name, list_index):
        ‘‘‘查看所教的班級‘‘‘
        with open(‘teacherinfo.txt‘, encoding=‘utf-8‘) as t2:
            for line in t2:
                if line.strip().split(‘=‘)[0] == Teacher.status_dict[‘username‘]:
                    teach_course = line.strip().split(‘=‘)[list_index]
                    print("您所教的%s為:%s" % (teach_name, teach_course))
                    break
                else:
                    pass
            else:
                print("沒有查到信息")

    @decorator_t
    def view_student(self):
        ‘‘‘查看班級的學生‘‘‘
        with open(‘teacherinfo.txt‘, encoding=‘utf-8‘) as t3:
            for line in t3:
                if line.strip().split(‘=‘)[0] == Teacher.status_dict[‘username‘]:
                    teach_course = line.strip().split(‘=‘)[3]
                    with open(‘studentinfo.txt‘, encoding=‘utf-8‘) as t4:
                        user_list = []
                        for i in t4:
                            course_name = i.strip().split(‘=‘)[2]
                            user_name = i.strip().split(‘=‘)[0]
                            if course_name == teach_course:
                                user_list.append(user_name)
                        print("學員列表如下:", user_list)

9 定義學生類

class Student:
    ‘‘‘定義學生類,可記錄登錄狀態,有查看班級和課程的功能‘‘‘
    status_dict = {
        ‘username‘: None,
        ‘status‘: False
    }

    def __init__(self, student_name, student_passwd=‘passwd‘, student_class=‘class1‘):
        self.student_name = student_name
        self.student_passwd = student_passwd
        self.student_class = student_class

    def decorator_s(f):
        def inner(*args, **kwargs):
            # 判斷登錄狀態
            if Student.status_dict[‘status‘]:
                ret = f(*args, **kwargs)
                return ret
            else:
                print("您還沒有登陸,請輸入賬號密碼進行登陸!")
                return login(‘studentinfo.txt‘, Student)

        return inner

    @decorator_s
    def view_class(self):
        ‘‘‘查看自己的班級‘‘‘
        with open(‘studentinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as fl:
            for line in fl:
                line_list = line.strip().split(‘=‘)
                # 判斷用戶名
                # if stu1.student_name.upper()==line_list[0].upper():
                if Student.status_dict[‘username‘].upper() == line_list[0].upper():
                    student1 = Student(line_list[0], line_list[1], line_list[2])
                    student1.student_course = line_list[3]
                    with open(‘classinfo.txt‘, encoding=‘utf-8‘) as vcc:
                        for i in vcc:
                            class_info = i.strip().split(‘=‘)
                            if class_info[0].upper() == student1.student_class.upper():
                                class2 = Class(class_info[0], class_info[1], class_info[2], class_info[3])
                                print("您的班級為:", class2.class_name)
                                print("班級詳情如下:\n 班級名稱:%s,所教課程:%s,地點:%s,老師:%s"                                       % (class2.class_name, class2.class_course,                                          class2.class_location, class2.class_teacher))
                                break
                            else:
                                pass
                        else:
                            print("班級不存在")
                else:
                    pass

    @decorator_s
    def view_course(self):
        ‘‘‘查看自己的課程‘‘‘
        with open(‘studentinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as fl,                 open(‘courseinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as vc2:
            for line in fl:
                line_list = line.strip().split(‘=‘)
                if Student.status_dict[‘username‘].upper() == line_list[0].upper():
                    stu_class = line_list[3]
                    for i in vc2:
                        info = i.strip().split(‘=‘)
                        if info[0].upper() == stu_class.upper():
                            # course = i.split(‘=‘)[0]
                            course1 = Course(info[0], info[1], info[2], info[3])
                            print("您的課程為:", course1.course_name)
                            print("課程詳細為:\n 課名稱:%s,周期:%s,價格:%s,地點:%s"                                   % (course1.course_name, course1.course_time,                                      course1.course_price, course1.course_location))
                            break
                        else:
                            pass
                    else:
                        print("沒有此課程信息")

10 定義管理員類

class Manager:
    status_dict = {
        ‘username‘: None,
        ‘status‘: False
    }

    def __init__(self, manager_name, manager_passwd=‘passwd‘):
        self.manager_name = manager_name
        self.manager_passwd = manager_passwd

    def decorator_m(f):
        def inner(*args, **kwargs):
            # 判斷登錄狀態
            if Manager.status_dict[‘status‘]:
                ret = f(*args, **kwargs)
                return ret
            else:
                print("您還沒有登陸,請輸入賬號密碼進行登陸!")
                return login(‘managerinfo.txt‘, Manager)

        return inner

    @decorator_m
    def create_school(self):
        ‘‘‘管理員創建學校‘‘‘
        school_name = myinput("請輸入校名:")
        location = myinput("請輸入所在地點:").strip()
        school1 = School(location, school_name)
        with open(‘schoolinfo.txt‘, ‘a+‘, encoding=‘utf-8‘) as s1:
            s1.write("%s=%s\n" % (school1.school_name, school1.location))
        print("學校 %s 創建成功!" % school_name)
        print("學校名稱:%s,學校地點:%s" % (school_name, location))

    @decorator_m
    def create_course(self):
        ‘‘‘管理員創建課程‘‘‘
        course_name = myinput("請輸入課程名:").strip()
        course_time = myinput("請輸入課程周期:").strip()
        course_price = myinput("請輸入課程價格:").strip()
        course_location = myinput("請輸入課程所在地點:").strip()
        cour1 = Course(course_name, course_time, course_price, course_location)
        with open(‘courseinfo.txt‘, ‘a+‘, encoding=‘utf-8‘) as cou1:
            cou1.write("%s=%s=%s=%s\n" % (cour1.course_name, cour1.course_time,                                           cour1.course_price, cour1.course_location))
            print("創建課程 %s 成功" % cour1.course_name)
            print("課程名稱:%s,課程周期:%s,課程價格:%s,課程地點:%s"                   % (cour1.course_name, cour1.course_time, cour1.course_price, cour1.course_location))

    @decorator_m
    def create_class(self):
        ‘‘‘管理員創建班級‘‘‘
        while True:
            class_name = myinput("請輸入班級名:").strip()
            with open(‘teacherinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as cc2:
                class_name_list = cc2.readlines()
                name_info = []
                for info in class_name_list:
                    name_info.append(info.strip().split(‘=‘)[0])
                    if class_name in name_info:
                        print("班級 %s 已經存在,請重新輸入" % class_name)
                        print("已經存在班級列表:", name_info)
                    else:
                        class_location = myinput("請輸入班級所在校區:").strip()
                        class_course = myinput("請輸入班級的課程:").strip()
                        class_teacher = myinput("請輸入授課老師:").strip()
                        c1 = Class(class_name, class_location, class_course, class_teacher)
                        with open(‘classinfo.txt‘, ‘a+‘, encoding=‘utf-8‘) as cf1:
                            cf1.write(
                                "%s=%s=%s=%s\n" % (c1.class_name, c1.class_location, c1.class_course, c1.class_teacher))
                        print("創建班級 %s 成功!" % c1.class_name)
                        print("班級名稱:%s,班級地點:%s,班級課程:%s,班級教課老師:%s"                               % (c1.class_name, c1.class_location, c1.class_course, c1.class_teacher))
                        return False

    @decorator_m
    def create_teacher(self):
        ‘‘‘管理員創建老師‘‘‘
        while True:
            teacher_name = myinput("請輸入教師姓名:").strip()
            with open(‘teacherinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as t2:
                teacher_name_list = t2.readlines()
                name_info = []
                for info in teacher_name_list:
                    name_info.append(info.strip().split(‘=‘)[0])
                if teacher_name in name_info:
                    print("老師已存在,請重新輸入")
                    print("已有老師列表:", name_info)
                else:
                    teacher_passwd = myinput("請輸入教師的密碼:").strip()
                    while True:
                        ###根據老師所教課程,自動判斷所在校區,linux、python在北京,go在上海
                        teach_course = input("請輸入教師所教課程:").strip()
                        if teach_course.upper() == ‘python‘.upper() or teach_course.upper() == ‘linux‘.upper():
                            teacher_location = ‘北京‘
                        elif teach_course.upper() == ‘go‘.upper():
                            teacher_location = ‘上海‘
                        else:
                            print("輸入有誤,請重新輸入,課程只有python,linux,go")
                            return True
                        teach_class = myinput("請輸入教師所教班級:").strip()
                        t1 = Teacher(teacher_name, teacher_passwd, teach_course, teach_class)
                        with open(‘teacherinfo.txt‘, ‘a+‘, encoding=‘utf-8‘) as ct1:
                            ct1.write(‘%s=%s=%s=%s=%s\n‘ % (
                                t1.teacher_name, t1.teacher_passwd, t1.teach_course, t1.teach_class, teacher_location))
                            print("創建教師: %s 成功!並且以自動添加地點:%s" % (t1.teacher_name, teacher_location))
                            print("創建教師的信息如下:\n‘姓名‘:%s,‘密碼‘:%s,‘所教課程‘:%s,‘所教班級‘:%s,‘地點‘:%s"                                   % (t1.teacher_name, t1.teacher_passwd,                                      t1.teach_course, t1.teach_class, teacher_location))
                            return False

    @decorator_m
    def create_student(self):
        ‘‘‘管理員創建學生‘‘‘
        student_name = myinput("請輸入學員姓名:").strip()
        student_passwd = myinput("請輸入學員密碼:").strip()
        while True:
            student_class = myinput("請輸入學員所屬班級:").strip()
            with open(‘classinfo.txt‘, ‘r‘, encoding=‘utf-8‘) as c2:
                content = c2.readlines()
                class_info = []
                for info in content:
                    a = info.strip().split(‘=‘)[0].upper()
                    class_info.append(a)
                    class_course = info.strip().split(‘=‘)[2].upper()
                if student_class.upper() in class_info:
                    s1 = Student(student_name, student_passwd, student_class)
                    with open(‘studentinfo.txt‘, ‘a+‘, encoding=‘utf-8‘) as cs1:
                        cs1.write(‘%s=%s=%s=%s\n‘                                   % (s1.student_name, s1.student_passwd, s1.student_class, class_course))
                        print("學員 %s 添加成功!並自動關聯班課程%s" % (s1.student_name, class_course))
                        print("學員姓名:%s,密碼:%s,學員班級:%s"                               % (s1.student_name, s1.student_passwd, s1.student_class))
                        return False
                else:
                    print("你所輸入的班級不存在請重新輸入,或先創建班級")
                    print("現在的班級有:%s" % [line for line in class_info])

11 主程序進程

#運行初始化函數
initialize()

while True:
    # 這是主進程,控制整個程序
    # 打印首頁選擇信息
    print("""請選擇角色:
    1 學生
    2 教師
    3 管理員
    4 退出系統""")
    userchoice = input("請輸入你的選擇:").strip()
    if userchoice == ‘1‘:
        while True:
            print("""請選擇功能:
        1 登錄
        2 查看班級
        3 查看課程
        4 返回上級
        5 註銷
        """)
            stu_choice = input("請輸入你要選擇的功能:").strip()
            if stu_choice == ‘1‘:
                login(‘studentinfo.txt‘, Student)
            elif stu_choice == ‘2‘:
                Student.view_class(‘a‘)
            elif stu_choice == ‘3‘:
                Student.view_course(‘b‘)
            elif stu_choice == ‘4‘:
                break
            elif stu_choice == ‘5‘:
                Student.status_dict[‘username‘] = None
                Student.status_dict[‘status‘] = False
            else:
                print("輸入有誤,請重新輸入")
    elif userchoice == ‘2‘:
        print("This is teacher view")
        while True:
            print("""請選擇功能:
        1 登錄
        2 查看所教的班級
        3 查看所教的課程
        4 查看班級學員列表
        5 返回上級
        6 註銷
        """)
            stu_choice = input("請輸入你要選擇的功能:").strip()
            if stu_choice == ‘1‘:
                login(‘teacherinfo.txt‘, Teacher)
            elif stu_choice == ‘2‘:
                Teacher.view_class(‘a‘, ‘班級‘, 3)
            elif stu_choice == ‘3‘:
                Teacher.view_class(‘b‘, ‘課程‘, 2)
            elif stu_choice == ‘4‘:
                Teacher.view_student(‘c‘)
            elif stu_choice == ‘5‘:
                break
            elif stu_choice == ‘6‘:
                Teacher.status_dict[‘username‘] = None
                Teacher.status_dict[‘status‘] = False
                print("註銷成功")
            else:
                print("輸入有誤,請重新輸入")
    elif userchoice == ‘3‘:
        while True:
            print("""請選擇功能:
        1 登錄
        2 創建學校
        3 創建班級
        4 創建講師
        5 創建課程
        6 創建學員
        7 返回上級
        8 註銷
        """)
            manager_choice = input("請輸入所選的功能(1-8):").strip()
            if manager_choice == ‘1‘:
                login(‘managerinfo.txt‘, Manager)
            elif manager_choice == ‘2‘:
                Manager.create_school(‘a‘)
            elif manager_choice == ‘3‘:
                Manager.create_class(‘b‘)
            elif manager_choice == ‘4‘:
                Manager.create_teacher(‘c‘)
            elif manager_choice == ‘5‘:
                Manager.create_course(‘d‘)
            elif manager_choice == ‘6‘:
                Manager.create_student(‘e‘)
            elif manager_choice == ‘7‘:
                break
            elif manager_choice == ‘8‘:
                Manager.status_dict[‘username‘] = None
                Manager.status_dict[‘status‘] = False
                print("註銷成功!")
            else:
                print("輸入有誤,請重新輸入")
    elif userchoice == ‘4‘:
        print("歡迎再次使用本系統")
        exit()
    else:
        print("輸入有誤")

四、運行結果如下

1 學生視圖

1.1 主程序選擇界面

技術分享圖片

1.2 學生登錄

技術分享圖片

1.3 查看自己班級功能

技術分享圖片

1.4 註銷功能

技術分享圖片

1.5 返回上級

技術分享圖片

2 教師視圖

2.1 選擇教師界面

技術分享圖片

2.2 教師登錄界面

技術分享圖片

2.3 教師查看所帶班級

技術分享圖片

2.4 教師查看班級學員

技術分享圖片

3 管理員視圖

3.1 管理員登錄

技術分享圖片

3.2 管理員創建班級

技術分享圖片

3.3 管理員創建老師

技術分享圖片

3.4 管理員註銷

技術分享圖片

3.5 管理員返回上級

技術分享圖片

4 退出系統

技術分享圖片

Python 校園選課系統