選課系統

選課系統

花了一夜寫的,可能還存在不足python

1.程序框架

2.文件夾創建

D:/選課系統
|___api
|    |___common_api.py
|___bil
|    |___common.py
|___conf
|    |___setting.py
|___core
|    |___admin.py
|    |___src.py
|    |___student.py
|    |___teacher.py
|___db
|    |___common_modles.py
|    |___modles.py
|___starts.py
|___test.py
|___選課系統.jpg
#寫的思路,先寫視圖,再根據功能需求寫接口,路徑什麼的都丟入setting.py,生成的人物的類丟modles.py,公共的課程學習等類丟入common_modles.py,後面寫功能就是寫邏輯了

3.api

1.common_api.py

import pickle
import os
def save_obj(obj):

    path = os.path.dirname(os.path.dirname(__file__))
    file_path = os.path.join(path,'db',obj.__class__.__name__)

    if not os.path.exists(file_path):
        os.mkdir(file_path)
    obj_path = os.path.join(file_path,f'{obj.name}.pkl')

    if not os.path.exists(obj_path):
        with open(obj_path,'wb') as fw:
            pickle.dump(obj,fw)
        return True
    with open(obj_path, 'wb') as fw:
        pickle.dump(obj, fw)
    return False

4.bil

1.common.py

from conf.setting import LONG_DICT
import pickle
import os

def user(user):

    def login_deco(func):

        def wrapper(*args, **kwargs):

            if LONG_DICT[user]: func()
            else: print('請先登入')

        return wrapper

    return login_deco



def read_obj(objtype,name):

    path = os.path.dirname(os.path.dirname(__file__))
    file_path = os.path.join(path,'db',objtype)

    if not os.path.exists(file_path):
        os.mkdir(file_path)
    obj_path = os.path.join(file_path,f'{name}.pkl')

    if  os.path.exists(obj_path):
        with open(obj_path, 'rb') as fr:
            read_obj = pickle.load(fr)
        return read_obj
    return False

5.conf

1.setting.py

import os
LONG_DICT = {'student':None,'teacher':None,'admin':None}

PATH = os.path.dirname(os.path.dirname(__file__))
STUDENT_FILE_PATH = os.path.join(PATH,'db','student')
TEACHER_FILE_PATH = os.path.join(PATH,'db','teacher')
ADMIN_FILE_PATH = os.path.join(PATH,'db','admin')
COURSE_FILE_PATH = os.path.join(PATH,'db','course')
SCHOOL_FILE_PATH = os.path.join(PATH,'db','school')

6.core

1.admin.py

from conf.setting import *
from bil.common import user,read_obj
from db.modles import Admin,Teacher,Course,School

#註冊功能
def register():
    print('歡迎使用註冊功能')
    while True:
        print('輸入Q退出')
        register_name = input('請輸入你的名字')
        register_pwd = input('請輸入你的密碼')

        if register_name=='Q' or register_pwd =='Q':
            print('退出成功')
            return False

        admin = Admin(register_name,register_pwd)

        if admin.save():
            print('註冊成功')
            return True
        else:
            print('帳戶已存在')
            continue

#登入功能
def login():
    print('歡迎使用登入功能')
    while True:
        print('輸入Q退出')
        login_name = input('請輸入你的名字')
        login_pwd = input('請輸入你的密碼')

        if login_name == 'Q' or login_pwd == 'Q':
            print('退出成功')
            return False

        if not os.path.exists(ADMIN_FILE_PATH):
            os.mkdir(ADMIN_FILE_PATH)

        path = os.path.join(ADMIN_FILE_PATH,f'{login_name}.pkl')
        if not os.path.exists(path):
            print('帳號不存在')
            continue

        info_obj = read_obj('admin',login_name)

        if info_obj.pwd == login_pwd:
            print('登入成功')
            LONG_DICT['admin'] = login_name

            return True
        else:
            print('密碼錯誤')
            continue



#建立學習功能
@user('admin')
def found_school():
    print('歡迎使用建立學校功能')
    while True:

        print('輸入Q退出')
        name = input('請輸入學校的名字')
        pwd = input('請輸入學校的地址')

        if name == 'Q' or pwd == 'Q':
            print('退出成功')
            return False

        obj = School(name, pwd)

        if obj.save():
            print('建立成功')
            return True
        else:
            print('帳戶已存在')
            continue

#建立老師功能
@user('admin')
def found_teacher():
    print('歡迎使用建立老師功能')
    while True:

        print('輸入Q退出')
        name = input('請輸入老師的名字')
        pwd = input('請輸入你的密碼')

        if name=='Q' or pwd =='Q':
            print('退出成功')
            return False

        obj = Teacher(name,pwd)

        if obj.save():
            print('建立成功')
            return True
        else:
            print('帳戶已存在')
            continue

#建立課程功能
@user('admin')
def found_course():
    print('歡迎使用建立課程功能')
    while True:

        print('輸入Q退出')
        name = input('請輸課程的名字')


        if name == 'Q' :
            print('退出成功')
            return False

        obj = Course(name)

        if obj.save():
            print('建立成功')
            return True
        else:
            print('已存在')
            continue

#功能字典
action ={
    '1':register,
    '2':login,
    '3':found_school,
    '4':found_teacher,
    '5':found_course,
}

#終端顯示功能字典
msg = '''
------------------
|    1:註冊帳號   |
|    2:登入帳號   |
|    3:建立學校   |
|    4:建立老師   |
|    5:建立課程   |
|    Q:退出功能   |
------------------
'''


#管理員視圖運行
def admin_action():
    while True:

        print(msg)
        chiose = input('請選擇')

        if chiose == 'Q': print('退出成功') ; break
        elif chiose in action: action[chiose]()
        else:print('請好好輸入') ; continue

2.src.py

from core.student import student_action
from core.teacher import teacher_action
from core.admin import admin_action
action ={
    '1':student_action,
    '2':teacher_action,
    '3':admin_action,
}

#終端顯示功能字典
msg = '''
------------------
|    1:學生       |
|    2:老師       |
|    3:管理員     |
|    Q:退出功能   |
------------------
'''


#主界面視圖運行
def run():
    while True:

        print(msg)
        chiose = input('請選擇')

        if chiose == 'Q': print('退出成功') ; break
        elif chiose in action: action[chiose]()
        else:print('請好好輸入') ; continue

3.student.py

from conf.setting import *
from bil.common import user,read_obj
from db.modles import Student,Course

#註冊功能
def register():
    print('歡迎使用註冊功能')
    while True:
        print('輸入Q退出')
        register_name = input('請輸入你的名字')
        register_pwd = input('請輸入你的密碼')

        if register_name=='Q' or register_pwd =='Q':
            print('退出成功')
            return False

        obj = Student(register_name,register_pwd)

        if obj.save():
            print('註冊成功')
            return True
        else:
            print('帳戶已存在')
            continue
#登入功能
def login():
    print('歡迎使用登入功能')
    while True:
        print('輸入Q退出')
        login_name = input('請輸入你的名字')
        login_pwd = input('請輸入你的密碼')

        if login_name == 'Q' or login_pwd == 'Q':
            print('退出成功')
            return False

        if not os.path.exists(STUDENT_FILE_PATH):
            os.mkdir(STUDENT_FILE_PATH)

        path = os.path.join(STUDENT_FILE_PATH, f'{login_name}.pkl')
        if not os.path.exists(path):
            print('帳號不存在')
            continue

        info_obj = read_obj('student', login_name)

        if info_obj.pwd == login_pwd:
            print('登入成功')
            LONG_DICT['student'] = login_name

            return True
        else:
            print('密碼錯誤')
            continue

#選擇學校功能
@user('student')
def choose_school():
    print('歡迎使用選擇學校功能')
    while True:
        print('輸入Q退出')

        if not os.path.exists(SCHOOL_FILE_PATH):
            os.mkdir(SCHOOL_FILE_PATH)

        lis = os.listdir(SCHOOL_FILE_PATH)
        if lis == []:
            print('沒有學校,請讓管理員建立學校')
            return False

        while True:
            print('學校名稱:')
            for school_name in lis:
                print(f'\t\t{school_name[:-4]}')

            name = input('請輸入學校的名字')

            if name == 'Q':
                print('退出成功')
                return False

            if read_obj('school',name):

                obj_student = read_obj('student',LONG_DICT['student'])
                obj_student.school = name
                obj_student.save()
                print('選擇學校成功')
                return True

            else:
                print('學校不存在')
                continue


#選擇課程功能
@user('student')
def choose_course():
    print('歡迎使用選擇課程功能')
    print('輸入Q退出')

    if not os.path.exists(COURSE_FILE_PATH):
        os.mkdir(COURSE_FILE_PATH)

    lis = os.listdir(COURSE_FILE_PATH)
    if lis == []:
        print('沒有課程,請讓管理員建立課程')
        return False

    while True:
        print('課程名字:')
        for course_name in lis:
            print(f'\t\t{course_name[:-4]}')

        name = input('請輸入學校的名字')

        if name == 'Q':
            print('退出成功')
            return False

        if read_obj('course', name):

            obj_student = read_obj('student', LONG_DICT['student']) #type:Student
            obj_student.course.append(name)
            obj_student.save()

            course_obj = read_obj('course', name) #type:Course
            obj_student.add_course(course_obj)
            course_obj.save()

            print('選擇課程成功')
            return True

        else:
            print('學校不存在')
            continue

#查當作績功能
@user('student')
def check_score():
    print('歡迎使用查當作績功能')
    obj_student = read_obj('student', LONG_DICT['student']) #type:Student

    if obj_student.score :
        print(f'你的成績是{obj_student.score }')
        return True
    print('你沒有成績')

#功能字典
action ={
    '1':register,
    '2':login,
    '3':choose_school,
    '4':choose_course,
    '5':check_score,
}

#終端顯示功能字典
msg = '''
------------------
|    1:註冊帳號   |
|    2:登入帳號   |
|    3:選擇學校   |
|    4:選擇課程   |
|    5:查當作績   |
|    Q:退出功能   |
------------------
'''


#學生視圖運行
def student_action():
    while True:

        print(msg)
        chiose = input('請選擇')

        if chiose == 'Q': print('退出成功') ; break
        elif chiose in action: action[chiose]()
        else:print('請好好輸入') ; continue


if __name__ == '__main__':
    student_action()

4.teacher.py

from conf.setting import *
from bil.common import user,read_obj
from db.modles import Student,Course


#登入功能
def login():
    print('歡迎使用登入功能')
    while True:
        print('輸入Q退出')
        login_name = input('請輸入你的名字')
        login_pwd = input('請輸入你的密碼')

        if login_name == 'Q' or login_pwd == 'Q':
            print('退出成功')
            return False

        if not os.path.exists(TEACHER_FILE_PATH):
            os.mkdir(TEACHER_FILE_PATH)

        path = os.path.join(TEACHER_FILE_PATH, f'{login_name}.pkl')
        if not os.path.exists(path):
            print('帳號不存在')
            continue

        info_obj = read_obj('teacher', login_name)

        if info_obj.pwd == login_pwd:
            print('登入成功')
            LONG_DICT['teacher'] = login_name

            return True
        else:
            print('密碼錯誤')
            continue

#查看學生
@user('teacher')
def check_student():
    print('歡迎使用查看學生功能')

    print('輸入Q退出')

    if not os.path.exists(STUDENT_FILE_PATH):
        os.mkdir(STUDENT_FILE_PATH)

    lis = os.listdir(STUDENT_FILE_PATH)
    if lis == []:
        print('沒有學生')
        return False

    while True:
        print('學生帳號:')
        for course_name in lis:
            print(f'\t\t{course_name[:-4]}')

        name = input('請輸入學生的名字')

        if name == 'Q':
            print('退出成功')
            return False

        if read_obj('student', name):
            student_obj = read_obj('student', name) #type:Student
            print(f'學生帳號:{student_obj.name}\n'
                  f'學生密碼:{student_obj.pwd}\n'
                  f'學生學校:{student_obj.school}\n'
                  f'學生課程:{student_obj.course}\n'
                  f'學生成績:{student_obj.score}\n')
            return True
        else:
            print('學生帳號不存在')


#查看課程
@user('teacher')
def check_course():
    print('歡迎使用查看課程功能')


    if not os.path.exists(COURSE_FILE_PATH):
        os.mkdir(COURSE_FILE_PATH)

    lis = os.listdir(COURSE_FILE_PATH)
    if lis == []:
        print('沒有課程')
        return False
    else:
        print('課程名稱:')
        for course_name in lis:
            print(f'\t\t{course_name[:-4]}')

    wait = input('輸入任意鍵退出\n')

#選擇課程功能
@user('teacher')
def choose_course():
    print('歡迎使用選擇課程功能')

    print('輸入Q退出')

    if not os.path.exists(COURSE_FILE_PATH):
        os.mkdir(COURSE_FILE_PATH)

    lis = os.listdir(COURSE_FILE_PATH)
    if lis == []:
        print('沒有課程')
        return False
    else:
        print('課程名稱:')
        for course_name in lis:
            print(f'\t\t{course_name[:-4]}')

    name = input('請輸入課程的名字')

    if name == 'Q':
        print('退出成功')
        return False

    if read_obj('course', name):

        obj_teacher = read_obj('teacher', LONG_DICT['teacher'])
        obj_teacher.course.append(name)
        obj_teacher.save()

        course_obj = read_obj('course', name)  # type:Course
        obj_teacher.add_course(course_obj)
        course_obj.save()

        print('課程選擇成功')

    else:
        print('課程不存在')


#修改爲績
@user('teacher')
def revision_score():
    print('歡迎使用修改爲績功能')

    print('輸入Q退出')

    if not os.path.exists(STUDENT_FILE_PATH):
        os.mkdir(STUDENT_FILE_PATH)

    lis = os.listdir(STUDENT_FILE_PATH)
    if lis == []:
        print('沒有學生')
        return False
    else:
        print('學生名稱:')
        for course_name in lis:
            print(f'\t\t{course_name[:-4]}')

    name = input('請輸入學生的名字')

    if name == 'Q':
        print('退出成功')
        return False

    if read_obj('student', name):

        student_obj = read_obj('student', name)   #type:Student

        score = input('請輸入學生的成績')

        student_obj.score =  score

        student_obj.save()

    else:
        print('學生不存在')
#功能字典
action ={
    '1':login,
    '2':check_student,
    '3':check_course,
    '4':choose_course,
    '5':revision_score,
}

#終端顯示功能字典
msg = '''
------------------
|    1:登入帳號   |
|    2:查看學生   |
|    3:查看課程   |
|    4:選擇課程   |
|    5:修改爲績   |
|    Q:退出功能   |
------------------
'''


#老師視圖運行
def teacher_action():
    while True:

        print(msg)

        chiose = input('請選擇')

        if chiose == 'Q': print('退出成功') ; break
        elif chiose in action: action[chiose]()
        else:print('請好好輸入') ; continue

7.db

1.common_modles.py

'''
基類:
    保存


學校類:姓名、地址、課程列表
    添加課程

課程類:姓名、學生列表
    添加學生
    添加老師
'''
from api.common_api import save_obj

#基類
class Base:

    #存對象
    def save(self):
        return save_obj(self)



#定義學校
class School(Base):

    def __init__(self,name,addr):
        self.name = name
        self.addr = addr
        self.course = []
        self.teacher = []
        self.student = []

    def add_course(self,Course):
        self.course.append(Course)

#定義課程
class Course(Base):

    def __init__(self, name):
        self.name = name
        self.studet_list = []
        self.teacher_list = []

    def add_studet(self,Student):
        self.studet_list.append(Student)

    def add_teacher(self,Teacher):
        self.teacher_list.append(Teacher)

2.modles.py

'''
基類:
    保存


管理員類:姓名、密碼
    建立學校
    建立課程
    建立老師

老師類:姓名、密碼、課程列表
    添加課程
    修改分數

學生類:姓名、密碼、學校、課程列表、分數
    獲取學校
    選擇學校
    添加課程
'''
from db.common_modles import *

#建立學生
class Student(Base):

    def __init__(self,name,pwd):
        self.name = name
        self.pwd = pwd
        self.school = None
        self.course = []
        self.score = None

    def check_school(self):
        return self.school

    def choose_school(self,obj):
        self.school = obj.name

    def add_course(self,Course):
        Course.add_studet(self)


class Teacher(Base):

    def __init__(self,name,pwd):
        self.name = name
        self.pwd = pwd
        self.course = []
        self.school = None



    def revision_score(self,Student,score):
        Student.score = score

    def add_course(self,Course):
        Course.add_teacher(self)


class Admin(Base):

    def __init__(self,name,pwd):
        self.name = name
        self.pwd = pwd

    def found_school(self,name,addr):
        School(name,addr)

    def found_teacher(self,name,pwd):
        Teacher(name,pwd)

    def found_course(self,name):
        Course(name)

8.starts.py(運行程序)

from core.src import run
if __name__ == '__main__':
    run()

9.test.py(生成第2裏面的樹狀圖)

import os
def dirsTree():
    PATH = os.path.dirname(__file__)
    print(PATH)
    lis = os.listdir(PATH)
    if lis != None:
        for a in lis:
            print(f'|___{a}')
            if '.' not in a:
                a_path = os.path.join(PATH,a)
                lis_2 = os.listdir(a_path)
                if lis_2 != None:
                    for b in lis_2:
                        if b != '__pycache__':
                            print(f'|    |___{b}')
dirsTree()
相關文章
相關標籤/搜索