第1章システム設計
どの学校も学期末にテストの得点の統計分析を行う必要があり、これらの作業はテスト後 1 週間以内に完了する必要があります。大量のパフォーマンス データの統計作業を手動で行うと、時間と労力がかかり、エラーが発生しやすくなります。ランダム コンピュータ テクノロジの急速な発展と、日常管理アプリケーションにおけるコンピュータの急速な普及により、学生の成績を管理するためにコンピュータを使用することが不可欠になっています。したがって、学校の成績入力、照会、変更のニーズを満たす、完全に機能し、安全で信頼性が高く、高速かつ便利な成績管理システムを開発する必要があります。
1.2.1 システム設計の目的
操作が簡単で、インターフェースが使いやすく、柔軟で実用的、安全で信頼性の高い生徒の成績管理システムを開発します。このシステムの開発は教師と生徒サービスを目的としており、生徒の成績の統計分析の効率を向上させ、生徒の成績管理と統計に関する教育管理者の負担を軽減し、学校の生徒の成績の標準化された管理を向上させることができます。
成績システムは生徒の成績をタイムリーに収集して整理できるため、学校の関連部門は信頼できる生徒の成績情報をタイムリーに入手でき、管理に便利です。教師にとって、自分が担当するクラスの生徒の成績を記録・集計するのに便利で、作業効率の向上、負担の軽減、指導の質の向上につながります。大量の成績データ情報の高速かつ便利な処理を実現し、成績の入力、変更、削除、クエリなどの処理要件を完了します。学生はさまざまな科目の成績を確認するのに便利です。
1.2.2 システム概要
オンラインで科目選択や成績確認ができるシステムです。Python + Flask + mysql の方法を使用すると、サーバーをデプロイすることなく、単一のマシン上でテストおよび実行できます。
フロントエンドは、インターネット上にあるフロントエンド ページのテンプレートを借用し、これをベースに修正します。主なテクノロジは html+css+js です。フロントエンドとバックエンドは別々に開発され、次のようなツールが使用されます。 postman はインターフェイスのテストに使用されます。
1.2.3 システム機能要件
- システムは管理者、教師、学生の 3 種類のユーザーに分かれており、ユーザーごとに異なる権限が与えられます。
- 学生はログインして個人情報の確認、成績の確認、パスワードの変更などができます。
- 教師はログインして、個人情報の表示、コースの管理、生徒の成績統計の収集、ログイン パスワードの変更を行うことができます。
- 管理者は、学生、教員、コース、専攻、専攻コース選択情報などの情報を追加、削除、変更、確認することができます。
- Windows10オペレーティングシステム
- PyCharm コミュニティ エディション 2022.1.1
- MySQL 8.0
第2章 需要分析
このシステムは学生の成績管理システムを開発します。生徒の学習状況を調査し、教師が指導する
状況に応じて学生の成績が分析され、学生の成績管理システムには主に3種類のユーザー役割があることが判明します。学生、
教師、管理者。それぞれの主な情報処理ニーズは次のとおりです。
管理者ユーザー
- 講師情報の追加、削除、変更、確認ができます。教師情報には、教師番号、名前、性別、生年月日が含まれます。
- 学生の基本情報の管理、学籍番号、氏名、性別、生年、出身地、入学年度、専攻番号、氏名などの学生の個人情報の追加、削除、変更、照会を実現します。
- コースの基本情報を保持し、コース情報の追加、削除、変更、照会を実現し、
コース情報には、コース番号、コース名、単位、学年、学期、教師番号、名前が含まれます。
- 専門情報を管理し、専攻番号、専攻名、学生数などの専攻の追加、削除、変更、照会を実現します。
- 専攻選択の基本情報を保持し、専攻番号、専攻名、科目番号、科目名などの科目選択情報の追加、削除、変更、照会を実現します。
学生ユーザー:
- 個人情報に関するお問い合わせ。
- 学生は、選択したコース情報と、以前に選択したコースの成績情報を確認できます。
- 学生はコースに対応する教師に問い合わせることができます。
- ログインパスワードを変更する
教師ユーザー:
- 個人情報に関するお問い合わせ。
- 教えられたコースとコースを受講した学生に関する情報を表示します。
- 学生の成績を変更し、コースの統計を表示します。
システムに関わる主なデータソースとしては、学生データ、教師データ、管理者データがあり、コース情報テーブル、専門情報テーブル、専門コース選択テーブルなどの各種帳票が生成されます。ビジネス処理要件と組み合わせたシステム データ フロー図を図に示します。
図 2-1 エンティティの説明
要件分析から得られたビジネス要件とデータ要件に従って、図 3-1 に示すようにシステムの機能構造図を定義できます。
図 3-1 学生成績管理システムの機能構成
各モジュールの詳細な機能は次のとおりです。
3.1.1 学生モジュール
- 学生は自分の学生番号を渡し、初期パスワードは学生番号です。
- 各科目のコース情報、コースの先生、コースの成績を確認します。
- 個人パスワードの変更: 入力検証後に現在のパスワードと 2 つの新しいパスワードを変更します。
3.1.2 教師モジュール
(1) 教師は教師番号を使用してログインし、初期パスワードは教師番号です。
(2) カリキュラム管理: 教師は、教えられたコースの成績を記録および修正し、異なる学年の生徒の数を数えます。
(3) 個人アカウントのパスワードを変更するには、以前のパスワードと 2 つの新しいパスワードを入力して検証し、パスワードを変更します。
3.1.3 管理者モジュール
- 管理者ログイン、ユーザー名は admin、パスワードは asdfg13579;
- 学生情報を表示し、追加、変更、削除します。
- 教師情報を表示し、追加、変更、削除します。
- コース情報を表示し、追加、変更、削除します。
- 専門情報を表示し、追加、変更、削除します。
- 専攻選択情報の確認、追加・変更・削除を行います。
3.2データベースの概念構造設計
3.2.1 概念構造
要件分析段階で得られたアプリケーション要件は、特定の DBMS でより適切かつ正確に実現できるように、最初に情報世界の構造に抽象化する必要があります。
概念構造の主な特徴:
- 物と物のつながりを含めた表示世界を忠実に反映し、ユーザーを満足させることができる
データの処理要件は現実世界のモデルにすぎません。
- わかりやすいので、パソコンに詳しくないユーザーとも意見交換ができ、ユーザーの積極的な参加が期待できます。
これがデータベース設計を成功させる鍵となります。
- 変更が容易で、アプリケーション環境やアプリケーション要件が変化した場合でも、概念モデルを簡単に変更および拡張できます。
- リレーショナル、ネットワーク、階層型などのさまざまなデータ モデルに簡単に変換できます。
概念構造はさまざまなデータ モデルの共通の基礎であり、データ モデルよりもマシンから独立しており、より抽象的であるため、より安定しています。
3.2.2 学生の成績管理システムの概念的な構造設計
ここで、設計されたシステムの要件をさらに分析し、概念構造設計の ER モデルを生成します。システムは複雑ではないため、トップダウン設計アプローチを使用できます。トップダウン設計の鍵は、システムの中核となるアクティビティを特定することです。いわゆるコア アクティビティとは、システム内の他のアクティビティがこのアクティビティを中心に展開するか、このアクティビティと密接に関連していることを意味します。中心となるアクティビティが特定されると、システムには拡張の余地が生まれます。
3.2.3 ERモデル
このシステムには主に学生、教師、管理者の 3 つのエンティティが関与しており、学生と教師は指導を通じてコンタクトを確立します。1 人の学生が複数のコースを学び、1 人の教師が複数の学生を指導できます。管理者は管理を通じて学生と教師とのコンタクトを確立します。コース、専攻、専攻コース選択、成績として、各エンティティの属性を分析および定義し、以下に示すようにエンティティ接続モデルの ER 図を確立します。
図 3-4 学生成績管理システムの ER 図
関係スキーマ:
データベースの概念モデルを次の基本的なリレーショナル スキーマに変換します。属性は主キーとしてマークされ、属性は外部キーとしてマークされます。
学生(学籍番号、氏名、性別、生年月日、出生地、入学年、専攻番号、パスワード)
先生(先生番号、名前、性別、生年月日、パスワード)
コース(コースID、コース名、学年、学期、単位数、教員ID)
専攻(職名、職名)
学生によるコース選択(学生番号、コース番号、成績)
専攻科目選択(専門職コード、コースコード)
管理者(ユーザー名、パスワード)
3.4 データベースの物理設計
3.4.1 データベーステーブルの構造
データベースには5 つのリレーショナル テーブルが含まれており、そのテーブル構造を表 3-5 ~3-10に示します。
- 学生学生テーブル:
分野 |
説明 |
値の説明 |
述べる |
学生証 |
学籍番号、主キー |
char(10)、数値 |
主キー |
学生の名前 |
学生の名前 |
varchar(20)、中国語 |
nullではない |
セックス |
性別 |
char(2)、男性|女性 |
|
生年 |
生年 |
char(4)、数値 |
|
州 |
出身県 |
varchar(20)、中国語 |
|
年を入力してください |
開始年 |
char(4)、数値 |
nullではない |
メジャーID |
特殊番号、外部キー |
char(3)、数値 |
外部キー、null ではない |
パスワード |
暗号化されたパスワード |
varchar(128) |
nullではない |
表 3-5学生テーブルの構造
- 教師 教師テーブル:
分野 |
説明 |
値の説明 |
述べる |
教師ID |
先生番号 |
char(5)、数値 |
主キー |
先生の名前 |
先生の名前 |
varchar(20)、中国語 |
nullではない |
セックス |
性別 |
char(2)、男性|女性 |
|
生年 |
生年 |
char(4)、数値 |
|
パスワード |
暗号化されたパスワード |
varchar(128) |
nullではない |
表 3-6 教師テーブルの構造
(3) コーススケジュール
分野 |
説明 |
値の説明 |
述べる |
コースID |
コース番号 |
char(5)、数値 |
主キー |
コース名 |
コースタイトル |
varchar(20)、中国語 |
nullではない |
年 |
設立年 |
char(4)、数値 |
nullではない |
学期 |
オープンセメスター |
char(2),秋|春 |
nullではない |
教師ID |
先生番号 |
char(5)、数値 |
外部キー、null ではない |
クレジット |
クレジット |
tiny int、符号なし、0~10 |
nullではない |
表 3-7 カリキュラムの構成
(4)student_course学生コース選択テーブル
分野 |
説明 |
値の説明 |
述べる |
学生証 |
学籍番号 |
char(10) 、数値 |
結合主キー、外部キー |
コースID |
コース番号 |
char(5) 、数値 |
結合主キー、外部キー |
学年 |
スコア |
tiny int 、符号なし、0~100 |
表 3-8 コース選択表の構成
- Major_course 専攻コース選択表
分野 |
説明 |
値の説明 |
述べる |
メジャーID |
プロフェッショナルナンバー |
char(3)、数値 |
結合主キー、外部キー |
コースID |
コース番号 |
char(5)、数値 |
結合主キー、外部キー |
表 3-9 専攻科目選択表の構成
(6) 管理者管理者テーブル
分野 |
説明 |
値の説明 |
述べる |
管理者名 |
ユーザー名 |
文字(15) |
主キー |
パスワード |
パスワード |
文字(128) |
nullではない |
表 3-10 管理者テーブルの構造
3.4.2 データベーステーブル作成コード
1. データベースを作成する
create database grade_manage_system;
2. データベースに入る
use grade_manage_system
3. 学生テーブルを作成する
create table student
(
student_id char(10) primary key,
student_name varchar(20) not null,
sex char(2),
birth_year char(4),
province varchar(20),
enter_year char(4) not null,
major_id char(3) not null,
password varchar(128) not null
);
4. 教師テーブルを作成する
create table teacher
(
teacher_id char(5) primary key,
teacher_name varchar(20) not null,
sex char(2),
birth_year char(4),
password varchar(128) not null
);
5. 授業スケジュールを作成する
create table course
(
course_id char(5) primary key,
course_name varchar(20) not null,
year char(4) not null,
semester char(2) not null,
teacher_id char(5) not null,
credit tinyint unsigned not null
);
6. プロフェッショナルなテーブルを作成する
create table major
(
major_id char(3) primary key,
major_name varchar(20) not null unique
);
7. 専門コース選択リストの作成
create table major_course
(
major_id char(3),
course_id char(5)
);
8. 学生のコース選択レポートカードを作成する
create table student_course
(
student_id char(10),
course_id char(5),
grade tinyint unsigned
);
- 管理テーブルの作成
create table admin
(
admin_name char(15) primary key,
password varchar(128) not null
);
第4章 システムの導入
4.1 インターフェース設計
生徒の成績管理システムのページは、Python プログラミング フラスコ ライブラリによって作成されています。このページは主に、ログイン ページ モジュール、学生ユーザー モジュール、教師ユーザー モジュール、管理者ユーザー モジュールの 4 つのモジュールに分かれています。ランディング ページは html+css+js テクノロジーで作られており、postman などのツールを使用してインターフェイスされます。他の 3 つのモジュールの下にはいくつかの小さなモジュールがあり、それぞれに数ページが含まれています。詳細なインターフェース設計は次のとおりです。
4.1.1 ログインページのデザイン
学生の成績管理システムは、ログイン ID を選択し、アカウントのパスワードを入力してログインします。管理者はユーザー名として admin を使用し、パスワードは固定値で変更できません。教師はユーザー名として教師番号を使用し、デフォルトのパスワードは教師番号であり、変更できます。生徒は使用します。ユーザー名として学生番号が使用され、パスワードはデフォルトで学生番号になりますが、これは変更可能です。ログインインターフェイスは次のとおりです。
4.1.2 学生モジュール
4.1.3 教師モジュール
4.1.4 管理者モジュール
管理者は、ユーザー名 admin とパスワード asdfg13579 を使用してログインします。
管理者が正常にログインすると、すべての学生情報の表示、学生の追加、すべての教師情報の表示、教師の追加、すべてのコース情報の表示、コースの追加、すべての専攻情報の表示、専攻の追加、専攻コース選択情報の表示を行うためのいくつかの機能インターフェイスが表示されます。 、専攻コース選択の追加
4.2 主な機能とプログラムコード
4.2.1 数据库搭建
学生成绩管理系统的实现,共需要在 MySQL 上创建一个数据库,七个表,分别
是学生表(student)、教师表(teacher)、课程表(course)、专业表
(major)、管理员表(admin)、学生选课表(student_course)、专业选课表(major_course)。
(1)创建并使用数据库
create database grade_manage_system;//
use grade_manage_system
(2)创建专业表
create table major(major_id char(3) primary key, major_name varchar(20) not null unique);//
(3)创建学生表
create table student(
student_id char(10) primary key, student_name varchar(20) not null,
sex char(2),
birth_year char(4), province varchar(20), enter_year char(4) not null,
major_id char(3) not null, password varchar(128) not null);//
alter table student add foreign key (major_id) references major (major_id) on delete cascade;//
(4)创建教师表
create table teacher(
teacher_id char(5) primary key, teacher_name varchar(20) not null,
sex char(2),
birth_year char(4), password varchar(128) not null);//
(5)创建课程表
create table course(
course_id char(5) primary key, course_name varchar(20) not null,
year char(4) not null, semester char(2) not null,
teacher_id char(5) not null,
credit tinyint unsigned not null);//
alter table course add foreign key (teacher_id) references teacher (teacher_id) on delete cascade;//
(6)创建专业选课表
create table major_course(
major_id char(3), course_id char(5));//
alter table major_course add primary key (major_id, course_id);//
alter table major_course add foreign key (major_id) references major (major_id)
on delete cascade;//
alter table major_course add foreign key (course_id) references course (course_id) on delete cascade;//
(7)创建学生选课表
create table student_course(
student_id char(10), course_id char(5), grade tinyint unsigned);//
alter table student_course add primary key (student_id, course_id);//
(8)创建添加专业选课
create trigger trigger_insert_1 after insert on major_course for each row
begin
insert into student_course (
select student_id, new.course_id, null
from student
where major_id = new.major_id
);
end//
(9)创建删除专业选课
create trigger trigger_delete_1 after delete on major_course for each row
begin
delete from student_course
where student_id in (
select student_id
from student
where major_id = old.major_id
) and course_id = old.course_id;
end//
(10)创建添加学生
create trigger trigger_insert_2 after insert on student for each row
begin
insert into student_course (
select new.student_id, course_id, null
from major_course
where major_id = new.major_id
);
end//
(11)创建删除学生
create trigger tigger_delete_2 after delete on student for each row
begin
delete from student_course
where course_id in (
select course_id
from major_course
where major_id = old.major_id
) and student_id = old.student_id;
end//
delimiter ;
4.2.2 数据库的连接
功能:使得数据库与客户端进行数据传输
代码:
-
if __name__ == '__main__': app.config['DEBUG'] = True app.config['SECRET_KEY'] = '123456' app.config['DATABASE_USER'] = 'root' app.config['DATABASE_PASSWORD'] = '1234
4.2.3 登录模块
功能:验证账号密码和对应的权限,以及跳转进入对应主页面
代码:
-
from flask import Flask from flask_login import LoginManager from app.models.session import LoginChecker from werkzeug.utils import redirect from flask_login import login_required login_manager = LoginManager() @login_manager.user_loader def load_user(user_id): if 'student' in user_id: return LoginChecker('load', 'student', user_id[7:], 'default') if 'teacher' in user_id: return LoginChecker('load', 'teacher', user_id[7:], 'default') if 'admin' in user_id: return LoginChecker('load', 'admin', user_id[5:], 'default') return None app = Flask(__name__) login_manager.init_app(app) from app.web.student import web app.register_blueprint(web) @app.route('/') def bare(): return redirect('/static/Login.html') @app.route('/static/Login.html') def html_login(): return app.send_static_file('Login.html') @app.route('/static/Student_Info.html') @login_required def html_student_info(): return app.send_static_file('Student_Info.html') @app.route('/static/Student_Scores.html') @login_required def html_student_scores(): return app.send_static_file('Student_Scores.html') @app.route('/static/Student_ChangePassword.html') @login_required def html_student_change_password(): return app.send_static_file('Student_ChangePassword.html') @app.route('/static/Teacher_Info.html') @login_required def html_teacher_info(): return app.send_static_file('Teacher_Info.html') @app.route('/static/Teacher_Courses.html') @login_required def html_teacher_courses(): return app.send_static_file('Teacher_Courses.html') @app.route('/static/Teacher_CourseInfo.html') @login_required def html_course_info(): return app.send_static_file('Teacher_CourseInfo.html') @app.route('/static/Teacher_ChangePassword.html') @login_required def html_teacher_change_password(): return app.send_static_file('Teacher_ChangePassword.html') @app.route('/static/Teacher_Statistics.html') @login_required def html_teacher_statistics(): return app.send_static_file('Teacher_Statistics.html')
4.2.4 学生菜单模块
功能:在学生页面进行不同功能页面的切换
各个功能代码如下:
- 学生登录菜单
-
from app.models.general import connect_to_sql class StudentReader: def __init__(self, student_id): self.data = read_base_information(student_id) if self.data.get('error'): return self.data = dict(self.data, **read_total_credits(student_id)) if self.data.get('error'): return self.data = dict(self.data, **read_number_of_courses(student_id)) if self.data.get('error'): return self.data = dict(self.data, **read_average_grade(student_id)) class StudentCoursesReader: def __init__(self, student_id): self.data = read_selected_courses(student_id)
- 学生查看个人信息
-
def read_base_information(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 查询学生基本信息 sql = 'select student_id, student_name, sex, birth_year, province, enter_year, major_name, s.major_id ' \ 'from student as s, major as m ' \ 'where s.student_id = %s and s.major_id = m.major_id;' % student_id cursor.execute(sql) result = cursor.fetchone() if result: data['student_id'] = result[0] data['student_name'] = result[1] data['sex'] = result[2] data['birth_year'] = result[3] data['province'] = result[4] data['enter_year'] = result[5] data['major_name'] = result[6] data['major_id'] = result[7] else: data['error'] = 'student id ' + student_id + ' not found in database' except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 学生查看课程信息及成绩
-
def read_total_credits(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select if(sum(credit) is null, 0, sum(credit)) from student as s, course as c, student_course as sc ' \ 'where s.student_id = %s and s.student_id = sc.student_id ' \ 'and c.course_id = sc.course_id and grade >= 60;' % student_id cursor.execute(sql) result = cursor.fetchone() if result: data['credits'] = int(result[0]) else: data['credits'] = 0 except Exception as e: data['error'] = str(e) finally: connection.close() return data def read_number_of_courses(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select count(course_id) from student_course ' \ 'where student_id = %s;' % student_id cursor.execute(sql) result = cursor.fetchone() if result: data['number_of_courses'] = int(result[0]) else: data['number_of_courses'] = 0 except Exception as e: data['error'] = str(e) finally: connection.close() return data def read_average_grade(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select credit, grade from student_course as sc, course as c ' \ 'where sc.student_id = %s and sc.course_id = c.course_id ' \ 'and grade is not null;' % student_id cursor.execute(sql) result = cursor.fetchall() if result: total_credit = 0 total_grade = 0 for row in result: total_credit += row[0] total_grade += row[0] * row[1] data['average_grade'] = round(float(1.0*total_grade/total_credit), 2) else: data['average_grade'] = 0 except Exception as e: data['error'] = str(e) finally: connection.close() return data def read_selected_courses(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select c.course_id, c.course_name, c.year, c.semester, t.teacher_name, c.credit, sc.grade ' \ 'from course as c, student_course as sc, teacher as t ' \ 'where sc.student_id = %s and sc.course_id = c.course_id ' \ 'and t.teacher_id = c.teacher_id;' % student_id cursor.execute(sql) result = cursor.fetchall() data['courses'] = [] for row in result: tmp = {'course_id': row[0], 'course_name': row[1], 'year': row[2], 'semester': row[3], 'teacher_name': row[4], 'credit': row[5], 'grade': row[6]} data['courses'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
4.2.5 教师菜单模块
功能:在教师页面进行不同功能页面的切换
- 教师登录页面
-
from app.models.general import connect_to_sql class TeacherReader: def __init__(self, teacher_id): self.data = read_base_information(teacher_id) if self.data.get('error'): return self.data = dict(self.data, **read_number_of_courses(teacher_id)) class TeacherCoursesReader: def __init__(self, teacher_id): self.data = read_taught_courses(teacher_id) class TeacherCourseStudentReader: def __init__(self, course_id): self.data = read_selected_students(course_id) class TeacherGradeUpdater: def __init__(self, course_id, student_id, grade): self.data = update_student_grade(course_id, student_id, grade) class CourseStatisticReader: def __init__(self, course_id): self.data = read_course_statistic(course_id)
- 教师查看个人信息
-
def read_number_of_courses(teacher_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 查询教师所授课程数量 sql = 'select count(course_id) from course ' \ 'where teacher_id = %s;' % teacher_id cursor.execute(sql) result = cursor.fetchone() if result: data['number_of_courses'] = int(result[0]) else: data['number_of_courses'] = 0 except Exception as e: data['error'] = str(e) finally: connection.close() return data
(3)教师查看授课信息
-
def read_taught_courses(teacher_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 查询教师授课列表 sql = 'select course_id, course_name, year, semester, credit ' \ 'from course ' \ 'where teacher_id = %s ' % teacher_id cursor.execute(sql) result = cursor.fetchall() data['courses'] = [] if result: for row in result: tmp = {'course_id': row[0], 'course_name': row[1], 'year': row[2], 'semester': row[3], 'credit': row[4]} data['courses'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
(4)教师查看选课学生
-
def read_selected_students(course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 查询选课学生列表 sql = 'select s.student_id, s.student_name, s.sex, m.major_name, sc.grade ' \ 'from student_course as sc, student as s, major as m ' \ 'where sc.student_id = s.student_id and s.major_id = m.major_id ' \ 'and course_id = %s ' % course_id cursor.execute(sql) result = cursor.fetchall() data['students'] = [] if result: for row in result: tmp = {'student_id': row[0], 'student_name': row[1], 'sex': row[2], 'major_name': row[3], 'grade': row[4]} data['students'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
(5)教师查看课程统计信息
-
def read_course_statistic(course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 查询某课程统计信息 sql = 'select ' \ 'count(case when grade between 0 and 59 then grade end) as \'0-59\',' \ 'count(case when grade between 60 and 69 then grade end) as \'60-69\',' \ 'count(case when grade between 70 and 79 then grade end) as \'70-79\',' \ 'count(case when grade between 80 and 89 then grade end) as \'80-89\',' \ 'count(case when grade between 90 and 100 then grade end) as \'90-100\' ' \ 'from student_course ' \ 'where course_id = %s;' % course_id cursor.execute(sql) result = cursor.fetchone() if result: data['0-59'] = int(result[0]) data['60-69'] = int(result[1]) data['70-79'] = int(result[2]) data['80-89'] = int(result[3]) data['90-100'] = int(result[4]) else: data['error'] = 'course_id ' + course_id + ' not found in database' except Exception as e: data['error'] = str(e) finally: connection.close() return data
(6)教师修改学生成绩
-
def update_student_grade(course_id, student_id, grade): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: # 更新学生某课程成绩 sql = 'update student_course ' \ 'set grade = %s ' \ 'where course_id = \'%s\' and student_id = \'%s\';' % (grade, course_id, student_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
4.2.6 管理员模块
功能:在管理员页面进行不同功能页面的切换
- 管理员管理学生模块
- 管理学生菜单
-
from app.models.general import connect_to_sql from app.models.student import StudentReader from werkzeug.security import generate_password_hash class StudentListReader: def __init__(self): data = read_student_id_list() if data.get('error'): return student_id_list = data['student_id'] self.data = {'students': []} for student_id in student_id_list: tmp = StudentReader(student_id) if tmp.data.get('error'): self.data['error'] = tmp.data['error'] return self.data['students'].append(tmp.data) class StudentUpdater: def __init__(self, student_id, student_name, sex, birth_year, province, enter_year, major_id): self.data = update_student(student_id, student_name, sex, birth_year, province, enter_year, major_id) class StudentInserter: def __init__(self, student_name, sex, birth_year, province, enter_year, major_id): self.data = insert_student(student_name, sex, birth_year, province, enter_year, major_id) class StudentDeleter: def __init__(self, student_id): self.data = delete_student(student_id)
- 删除学生信息
-
def delete_student(student_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'delete from student where student_id = \'%s\'; ' % student_id cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 添加学生信息
-
def insert_student(student_name, sex, birth_year, province, enter_year, major_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: student_id = get_new_student_id(enter_year, major_id) password = generate_password_hash(student_id['student_id']) sql = 'insert into student values ' \ '(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\'); ' \ % (student_id['student_id'], student_name, sex, birth_year, province, enter_year, major_id, password) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 查看学生信息表
-
def read_student_id_list(): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select student_id from student order by student_id;' cursor.execute(sql) data['student_id'] = cursor.fetchall() except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 修改学生信息
-
def update_student(student_id, student_name, sex, birth_year, province, enter_year, major_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'update student set student_name = \'%s\', sex = \'%s\', birth_year = \'%s\', ' \ 'province = \'%s\', enter_year = \'%s\', major_id = \'%s\' where student_id = \'%s\'; ' % \ (student_name, sex, birth_year, province, enter_year, major_id, student_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员管理教师模块
- 管理教师菜单
-
from werkzeug.security import generate_password_hash from app.models.general import connect_to_sql class TeacherListReader: def __init__(self): self.data = read_teacher_list() class TeacherIdReader: def __init__(self): self.data = read_teacher_id() class TeacherUpdater: def __init__(self, teacher_id, teacher_name, sex, birth_year): self.data = update_teacher(teacher_id, teacher_name, sex, birth_year) class TeacherInserter: def __init__(self, teacher_name, sex, birth_year): self.data = insert_teacher(teacher_name, sex, birth_year) class TeacherDeleter: def __init__(self, teacher_id): self.data = delete_teacher(teacher_id)
- 查看教师信息
-
def read_teacher_list(): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select t.teacher_id, teacher_name, sex, birth_year, count(course_id) as number_of_courses ' \ 'from teacher as t left outer join course as c ' \ 'on c.teacher_id = t.teacher_id ' \ 'group by t.teacher_id ' \ 'order by t.teacher_id;' cursor.execute(sql) result = cursor.fetchall() data['teachers'] = [] for row in result: tmp = {'teacher_id': row[0], 'teacher_name': row[1], 'sex': row[2], 'birth_year': row[3], 'number_of_courses': row[4]} data['teachers'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 删除教师信息
-
def delete_teacher(teacher_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'delete from teacher where teacher_id = \'%s\'; ' % teacher_id cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 添加教师信息
-
def insert_teacher(teacher_name, sex, birth_year): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: teacher_id = get_new_teacher_id() password = generate_password_hash(teacher_id['teacher_id']) if teacher_id.get('error'): data['error'] = teacher_id['error'] return data sql = 'insert into teacher values(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\');' \ % (teacher_id['teacher_id'], teacher_name, sex, birth_year, password) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 修改教师信息
-
def update_teacher(teacher_id, teacher_name, sex, birth_year): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'update teacher set teacher_name = \'%s\', sex = \'%s\', birth_year = \'%s\' ' \ 'where teacher_id = \'%s\'; ' % \ (teacher_name, sex, birth_year, teacher_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员管理课程模块
- 管理课程菜单
-
from app.models.general import connect_to_sql class CourseReader: def __init__(self): self.data = read_course() class SingleCourseReader: def __init__(self, course_id): self.data = read_single_course(course_id) class CourseDeleter: def __init__(self, course_id): self.data = delete_course(course_id) class CourseInserter: def __init__(self, course_name, year, semester, teacher_id, credit): self.data = insert_course(course_name, year, semester, teacher_id, credit) class CourseUpdater: def __init__(self, course_id, course_name, year, semester, teacher_id, credit): self.data = update_course(course_id, course_name, year, semester, teacher_id, credit) class CourseTeacherReader: def __init__(self, course_id): self.data = get_teacher_of_course(course_id)
- 查看课程信息
-
def read_course(): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select tmp.course_id, tmp.course_name, tmp.year, tmp.semester, tmp.teacher_id, ' \ 'tmp.credit, tmp.number_of_students, tmp.average_grade, t.teacher_name from ( ' \ 'select c.course_id, course_name, year, semester, teacher_id, credit, count(student_id), avg(grade) ' \ 'from course as c left outer join student_course as sc ' \ 'on c.course_id = sc.course_id ' \ 'group by c.course_id ' \ ') as tmp(course_id, course_name, year, semester, teacher_id, ' \ 'credit, number_of_students, average_grade), teacher as t ' \ 'where tmp.teacher_id = t.teacher_id ' \ 'order by tmp.course_id; ' cursor.execute(sql) result = cursor.fetchall() data['courses'] = [] for row in result: average_grade = row[7] if average_grade is None: average_grade = 0 tmp = {'course_id': row[0], 'course_name': row[1], 'year': row[2], 'semester': row[3], 'teacher_id': row[4], 'credit': row[5], 'number_of_students': row[6], 'average_grade': round(float(average_grade), 2), 'teacher_name': row[8]} data['courses'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 添加课程信息
-
def insert_course(course_name, year, semester, teacher_id, credit): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: course_id = get_new_course_id() if course_id.get('error'): data['error'] = course_id['error'] return data sql = 'insert into course values(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', %d);' \ % (course_id['course_id'], course_name, year, semester, teacher_id, credit) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 删除课程信息
-
def delete_course(course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'delete from course where course_id = \'%s\'; ' % course_id cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 修改课程信息
-
def update_course(course_id, course_name, year, semester, teacher_id, credit): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'update course set course_name = \'%s\', year = \'%s\', semester = \'%s\',' \ 'teacher_id = \'%s\', credit = %d where course_id = \'%s\';' \ % (course_name, year, semester, teacher_id, credit, course_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员管理专业模块
- 管理专业菜单
-
from app.models.general import connect_to_sql class MajorIdReader: def __init__(self): self.data = read_major_id() class MajorReader: def __init__(self): self.data = read_major() class SingleMajorReader: def __init__(self, major_id): self.data = read_single_major(major_id) class MajorUpdater: def __init__(self, major_id, major_name): self.data = update_major(major_id, major_name) class MajorInserter: def __init__(self, major_name): self.data = insert_major(major_name) class MajorDeleter: def __init__(self, major_id): self.data = delete_major(major_id)
- 管理员查看专业
-
def read_major(): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select m.major_id, major_name, count(student_id) as number_of_students ' \ 'from major as m left outer join student as s ' \ 'on m.major_id = s.major_id ' \ 'group by m.major_id ' \ 'order by m.major_id;' cursor.execute(sql) result = cursor.fetchall() data['majors'] = [] for row in result: tmp = {'major_id': row[0], 'major_name': row[1], 'number_of_students': row[2]} data['majors'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
- 管理员添加专业
-
def insert_major(major_name): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: major_id = get_new_major_id() if major_id.get('error'): data['error'] = major_id['error'] return data sql = 'insert into major values(\'%s\', \'%s\');' % (major_id['major_id'], major_name) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员修改专业
-
def update_major(major_id, major_name): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'update major set major_name = \'%s\' where major_id = \'%s\';' % (major_name, major_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员删除专业
-
def insert_major_course(major_id, course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'insert into major_course values(\'%s\', \'%s\');' % (major_id, course_id) cursor.execute(sql) """ sql = 'insert into student_course ( select student_id, \'%s\', ' \ 'null from student where major_id = \'%s\');' % (course_id, major_id) cursor.execute(sql) """ connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员管理专业选课
- 管理选课菜单
-
def insert_major_course(major_id, course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'insert into major_course values(\'%s\', \'%s\');' % (major_id, course_id) cursor.execute(sql) """ sql = 'insert into student_course ( select student_id, \'%s\', ' \ 'null from student where major_id = \'%s\');' % (course_id, major_id) cursor.execute(sql) """ connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员添加专业选课
-
def insert_major_course(major_id, course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'insert into major_course values(\'%s\', \'%s\');' % (major_id, course_id) cursor.execute(sql) """ sql = 'insert into student_course ( select student_id, \'%s\', ' \ 'null from student where major_id = \'%s\');' % (course_id, major_id) cursor.execute(sql) """ connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员删除专业选课
-
def delete_major_course(major_id, course_id): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: """ sql = 'delete from student_course ' \ 'where student_id in ( ' \ 'select student_id ' \ 'from student ' \ 'where major_id = \'%s\') ' \ 'and course_id = \'%s\'; ' % (major_id, course_id) cursor.execute(sql) """ sql = 'delete from major_course ' \ 'where major_id = \'%s\' and course_id = \'%s\' ' % (major_id, course_id) cursor.execute(sql) connection.commit() except Exception as e: data['error'] = str(e) connection.rollback() finally: connection.close() return data
- 管理员查看专业选课
-
def read_major_course(): connection = connect_to_sql() data = {} try: with connection.cursor() as cursor: sql = 'select m.major_id, major_name, c.course_id, course_name ' \ 'from major_course as mc, major as m, course as c ' \ 'where mc.major_id = m.major_id and mc.course_id = c.course_id ' \ 'order by m.major_id, c.course_id;' cursor.execute(sql) result = cursor.fetchall() data['major_courses'] = [] for row in result: tmp = {'major_id': row[0], 'major_name': row[1], 'course_id': row[2], 'course_name': row[3]} data['major_courses'].append(tmp) except Exception as e: data['error'] = str(e) finally: connection.close() return data
第五章 测试与总结
5.1 测试
通过调试,对各个模块的功能进行测试;
5.2 总结
本次实验我是在windows操作系统平台下完成的,应用了MySQL数据库建表,触发,删除插入.......;Python语言中的GUI图形用户界面、通过html+css+js技术进行网站搭建,使用postman等工具进行接口测试,与数据库连接〔jdbc〕等技术。较好的在规定时间内完成了老师安排给我们的任务,实验过程中尽管遇到了不少问题,但最后经过与同伴互相探讨,借阅资料,上网查阅等都使问题得到了解决。总的来说感觉数据库、flask、python语言等编程技术应用起来灵活,容易理解。历尽一个多月课程设计让我对python语言等编程技术产生了浓厚的兴趣,更重要的是增强了我学习的自信心。
我们做的题目是《学生成绩管理系统》按照老师的安排,我们先进行系统需求和系统功能设计,在确定了我们要做的学生成绩管理系统应具有哪些功能后利用visio汇出了管理系统的流程图,并且进一步利用visio的强大功能画出ER图继而生成了物理模型图以及数据库,完成了数据库设计阶段。〔包括需求分析和概要设计〕;在剩下来的几天里我们主要把精力集中在应用程序的调试及课程设计报告的书写上。通过网络、书籍等查找所需的资料。数据库局部的书写〔包括数据库、表、触发器、索引、存储过程等的创立〕以及完成ER图,物理模型图的设计转换局部。
心得与体会:
通过本次课程设计我深切的体会到学习与实践的重要性。第一、在实验的过程中我一边学习一边上机动手操作,才发现自己不懂的太多太多,以前的自己太渺小,我需要不断的在学习中成长。同时也深刻体会到自己需要在动手操作方面努力改良提高。第二、记得老师和学长们总是教导我们要学会请教别人,告诉我们请教别人能在走出社会以后更是显得尤为重要,之前我还有点不以为然,过分的相信自己。通过本次为期一个多月的课程设计我对老师和学长的话坚信不移,最后较好的完成了任务,也从中学到了不少东西。我笃信在以后的学习和成长过程中我会更加注重与他人协作,互助。
参考文献
[1]蒋睿.MySQL数据库安全研究[J].电脑知识与技术,2020,16(09):3-4+21.
[2]王珊.数据库技术与应用[M].北京:清华大学出版社,2005.
[3]贺卉珍.基于配置管理数据库的高可用架构风险发现[J].中国金融电脑
,2020(03):68-74.
[4]郑智方,李彬,刘世坤,李鹏.探究mysql的运用实例-对数据库的宏观把握[J].科技风,2020(06):129.
[5]梁相栋,郭小燕,许亮,郑鑫伟.班级文化信息管理系统的建设与开发[J].甘肃科技,2020,36(04):25-27+39.
[6]杨琳,昌明权.基于MySQL的高校党支部信息管理系统数据库设计[J].电脑知识与技术,2020,16(05):276-277+284.
[7] 洪锦魁 .Python GUI 设计:tkinter 菜鸟编程. 清华大学出版社,2019.
[8] 张晓博.基于 Python 的 SQL Server 海量数据转移的研究与实现[J].铁路计算机应用,2012.
[9]萨师煊 , 王珊 . 数据库系统概论 [M]. 北京 : 高等教育出版社 ,2002.
[10] 乔晶 . 高校学生成绩管理系统设计与实现 [J]. 电脑编程技巧与维护 ,2015(23:59-60.
[11]周文艳.谈学生成绩管理系统中的数据库设计[J].沧州师范专科学校学报, 2006, 6, 22 (2) :65-67