手机app可以做网站吗wordpress整合discuz用户

当前位置: 首页 > news >正文

手机app可以做网站吗,wordpress整合discuz用户,网站如何注册微信公众平台 类型,推广做黄页网站系统需求简介 1.1需求分析 实现一个具体的课程管理系统。按照软件工程思路设计简化的专业课数据库#xff0c;尽量模拟现有专业课程一个学期的选课排课原型实际情况。#xff08;注#xff1a;本系统由本人单独设计、开发完成#xff09; 1.2 数据结构需求分析 课程管理…系统需求简介 1.1需求分析 实现一个具体的课程管理系统。按照软件工程思路设计简化的专业课数据库尽量模拟现有专业课程一个学期的选课排课原型实际情况。注本系统由本人单独设计、开发完成 1.2 数据结构需求分析 课程管理系统需要完成功能主要有 (1) 学生基本信息的查询学生可以对本人的系统登陆密码进行修改。 (2) 学生定制专属课表可以查看整个学期本人的课程安排包括课程名称、上课时间、上课地点、任课老师、学分等等。 (3) 学生可以进行选课专业必修课程系统会提前帮助学生们选上。 (4) 学生可以进行退课专业必修课程不允许退课。 (5) 学生可以查看自己选上的课的成绩以及各个课程的得分、绩点并给出其平均绩点但不允许查看年级其他人的成绩。 (6) 任课教师基本信息的查询老师可以对本人的系统登陆密码进行修改。 (7) 任课教师可以查看本人所任教课程信息包括课程名称、上课时间、上课地点、上课班级等等。 (8) 任课教师可以对其任教课程进行调课调课在全部课程时间无冲突下可以成功调课。 (9) 任课教师可以查看其教的每一个课程的学生名单。 (10) 任课教师可以对其教的课程的学生进行登分以及修改分数。 (11) 任课教师可以对其任教的班级成绩进行排序。 (12) 系主任拥有包括以上所有任课教师所拥有权限以及以下的额外权限。 (13) 系主任可以查看整个系的全部学生以及他们的平均绩点可以对每个班进行排名或者也可以对整个系进行排名。 (14) 系主任可以查看整个系的任教教师名单以及他们所负责的课程数目。 (15) 系主任可以查看整个学期所开设的所有课程包括这些课程的全部详细信息。 (16) 系主任可以查看每个班的课程安排表。 1.3系统功能设计 课程管理系统主要分为三个客户端登陆分别是学生、任课教师和系主任每个客户端的功能是不同的。这三个客户端的登陆拥有自己的功能实现。下面三个图分别是三个客户端的功能模块图。 图1.1 学生的客户端功能 图1.2 任课教师的客户端功能 图1.3 系主任的客户端功能 第二章 需求描述 2.1 数据流图 系统的全局数据流图 系统的全局数据流图在具体的设计工具中往往也称为第0层或顶层数据流图主要是从整体上描述系统的数据流反映系统中数据的整体流向是设计者针对用户和开发者表达出来的一个总体描述。 经过对课程管理的调查、数据的收集和信息流程分析处理明确了该系统的主要功能分别为 (1)学生 查看、修改个人信息 查看个人课表 选课、退课 查看个人成绩、绩点 (2)任课教师 查看、修改个人信息 查看任教课程信息 调整任教课程上课时间 登记、修改所教课程的学生成绩 对班级学生成绩进行排序 (3)系主任 查看、修改个人信息 查看任教课程信息 调整任教课程上课时间 登记、修改所教课程的学生成绩 对班级学生成绩进行排序 查看所有学生信息 查看所有任课教师信息 查看所有课程信息 查看所有班级课程表 图2.1 顶层数据流图 2.2 数据字典 数据流图清楚的表达了数据和处理数据的关系但是没有清楚的描述出个数据处理的细节。通过数据字典来说明数据流图中出现的元素的详细定义和描述。包括数据流、加工处理、数据存储、数据的起点和终点或外部实体等。下面是数据存储的描述。 数据存储 表2-2-1 课程组信息模块存储的描述 序号数据文件文件组成关键标识组织1课程组信息课程代码课程名称课程性质考察方式课时学分全部按课程代码排序 表2-2-2 班级模块存储的描述 序号数据文件文件组成关键标识组织1班级信息班级号班别名称班主任全部按班级号编号排序 表2-2-3 个人信息模块存储的描述 序号数据文件文件组成关键标识组织1学生信息学号姓名性别专业班别号入学日期登陆密码全部按学号编号排序2教师信息教师编号姓名性别登陆密码全部按教师号编号排序 表2-2-4 课程信息模块存储的描述 序号数据文件文件组成关键标识组织1课程信息课程号课程代码教师编号课程名称上课地点上课时间任教班级全部按课程号排序2学生选课信息课程号学号分数全部按课程号、学号编号排序3班级课程信息班级号课程号全部按班级号、课程号编号排序 第三章 概念设计 3.1 实体 由前面分析得到的数据流图和数据字典可以抽象得到实体主要有8个课程组、班级、学生、教师、课程、班级课程、课程组教师、分数。 课程组实体属性有课程代码、课程名称、课程性质、考察方式、课时、学分。班级类型实体属性有班级编号、班级名称、班主任教师号。教师实体属性有教师编号、姓名、性别、登陆密码。学生实体属性有学号、姓名、性别、专业、班级编号、入学日期、登陆密码。课程实体属性有课程号、教师编号、课程代码、课程名称、上课时间、上课地点、上课班级。班级课程实体属性有班级号、课程号、班主任。课程组教师属性有课程代码、教师号、课题组组长标记。分数实体属性有学号、课程号、分数。 3.2 系统全局E-R图 课程组实体和课程组教师实体存在归属的联系一个课程组可以包含多个教师且有一个课程组组长所以它们之间是一对多的联系(1:n)。教师实体和课程组教师实体存在归属的联系一个教师可以任教多门不同课程可以在不同课程组内所以它们之间是一对多的联系(1:n)。课程组实体和课程实体存在单对多的关系一个课程组可以开设多个该课程所以它们之间是一对多的联系1:n。教师实体和课程实体存在单对多的关系每个教师可以任教多门课程所以它们之间是一对多的联系1:n。班级实体和班级课程实体存在单对多的关系一个班级可以选择多门课程所以它们之间是一对多的联系1:n。课程实体和班级课程实体存在单对多的关系一个课程可以被多个班级同时选择所以他们之间是一对多的联系1:n。班级实体和学生实体存在单对单的关系一个班级内有多个学生所以它们之间是一对多的联系1:n。学生实体和分数实体存在单对多的关系一位学生可以选择多门课程每一门课程都有相应的分数所以它们之间是一对多的联系1:n。 图3.2.1 系统全局E-R图 3.3 概念数据模型设计 图3.3.1 课程管理系统的概念数据模型图 第四章 逻辑设计 4.1 ER图到关系模式的转换 课程管理系统功能大实体多这里列举重要的关系模式的转换过程 1课程组实体和课程组教师实体存在归属的联系一个课程组可以包含多个教师且有一个课程组组长所以它们之间是一对多的联系(1:n)。课程组教师实体和教师实体存在联系一个教师可以同时在多个课程组。设计成如下的关系模式 课程组(课程代码课程组名称课程性质考察方式总课时学分)课程组教师(课程代码教师编号组长标记)教师(教师编号名字性别主任标记登陆密码) 2班级实体和学生实体存在单对单的关系一个班级内有多个学生所以它们之间是一对多的联系1:n。 班级(班级号班级名称班主任)学生(学号姓名性别专业班级入学时间登陆密码) 3课程实体和班级课程实体存在单对多的关系一个课程可以被多个班级同时选择所以他们之间是一对多的联系1:n。设计成如下的关系模式 课程(课程号课程代码教师号课程名上课时间上课地点上课班别)班级课程(班级号课程号) 4一位学生可以选择多门课程每一门课程都有相应的分数分数实体由学号与课程号确定分数。 分数(学号课程号分数) 4.2 各个数据表的表结构设计 表4-1 数据库表清单 数据库表名关系模式名称备注group课程组课程组表group_teacher课程组教师课程组教师表teacher教师教师表class班级班级表student学生学生表course课程课程表class_course班级课程班级课程表score分数分数表 表4-2 课程组表 表4-3 课程组教师表 表4-4 教师表 表4-5 班级表 表4-6 学生表 表4-7 课程表 表4-8 班级课程表 表4-9 分数表 五 物理设计 5.1 数据库软件 SQLite是一款轻型的数据库是遵守ACID的关系型数据库管理系统它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的而且已经在很多嵌入式产品中使用了它它占用资源非常的低在嵌入式设备中可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统同时能够跟很多程序语言相结合比如 Tcl、C#、PHP、Java等还有ODBC接口同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲它的处理速度比他们都快。 官网下载sqlite3即可打开方式为-》终端-》输入sqlite3即可进入操作。 5.2 创建数据表 图5.2.1 创建教师表 图5.2.2 创建课程组表 图5.2.3 创建课程组教师表 图5.3.4 创建课程表 图5.3.5 创建班级表 图5.3.6 创建班级课程表 图5.3.7 创建学生表 图5.3.8 创建得分表 六 处理数据 6.1 数据需求 由前面分析以及课程设计提供的数据我们可以直接获得的数据主要为课程组信息、教师信息、学生信息。 课程组信息通过整理我们专业六个班级的课程表可以获得 教师信息通过整理我们专业的老师信息表可以获得 学生信息通过整理六个班级的信息可以获得。 不可以直接获得的信息主要为开设课程的信息这个进一步分析获得通过教师的数目班级的数目确定每个课程组应当开设的课程数目整理获得。 6.2 读取数据 1读取课程组信息 import os list1 os.listdir(./20-211班级课表(正式版)2020-8-27) for i in list1:data pd.read_excel(./20-211班级课表(正式版)2020-8-27/i)2读取教师信息 import pandas as pd teacher pd.read_csv(./teacher.csv)3读取学生信息 import pandas as pd name181 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18136) name182 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18241) name183 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18341) name184 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18440) name185 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18540) name186 pd.read_excel(./2018级各班花名册.xlsx,headerNone,sheet_name 计科18640)通过导入前面的表格经过简单预处理可以得到以下表格数据。 表6-3-1 课程组表(显示全部 表6-3-2 教师表(仅显示部分 表6-3-3 课程组教师表(显示全部 表6-3-4 学生表(仅显示部分 表6-3-5 班级表(显示全部 前面5个表格的数据可以通过简单的数据预处理即可获得重点阐述表6-3-6是如何处理获得的。分析课程组一共有11个与每个课程组所拥有的老师数量以及所任教的班级数量。当只有1个老师该老师需开设两个课程分别教3个班当有2个老师一人开一个课程分别教3个班当有3个老师则一人开一个课程分别教2个班。分析完毕处理数据可得需开设课程为26个课程设置如表6-3-6所示。 表6-3-6 课程表(显示全部 6.4 制作Sql语句 由前面分析得到的表格可以生成导入数据库的sql语句为了避免繁琐的操作可使用python生成大量的导入语句。注我们有八个表格其中课程表格需要智能排课后获得上课时间班级课程表格、分数表格需要课程号作为外码但我提前给出sql语句排课算法将会介绍上课时间如何得来。 处理程序如下 for index,row in name181[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});) for index,row in name182[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});) for index,row in name183[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});) for index,row in name184[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});) for index,row in name185[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});) for index,row in name186[5:].iterrows():print(fINSERT INTO student VALUES({row[1]},{row[2]},{row[3]},date(2018-09-01),计算机科学与技术,{row[1][5:]},{row[4][2:]});)图6.4.1 插入学生表语句部分) 处理程序如下 for row in course[name].value_counts().keys():k1name rowlinshi course[course[name]row][bixiu].value_counts().keys()[0]ddd course[course[name]row][duoshaojieke].value_counts().keys()[0]jilu courses_courses[courses_courses[course_name]row]print(fINSERT INTO groups VALUES({list(jilu[course_id])[0]},{name},{linshi},{list(jilu[exam_method])[0]},{list(jilu[class_hour])[0]},{list(jilu[credit])[0]});)图6.4.2 插入课程组语句 处理程序如下 import numpy as np for row in course[name].value_counts().keys():pp 0k1name rowlinshi course[course[name]row][teacher_name].value_counts().keys()jilu courses_courses[courses_courses[course_name]row]for j in linshi:ids np.array(course[course[teacher_name]j][teacher_id])[0]if pp0:print(fINSERT INTO group_teacher VALUES({list(jilu[course_id])[0]},{ids},1);)else:print(fINSERT INTO group_teacher VALUES({list(jilu[course_id])[0]},{ids},0);)pp1图6.4.4 插入课程语句 处理程序如下 for index,row in teacher.iterrows():print(fINSERT INTO teacher VALUES({row[0]},{row[1]},{1111},{row[2]},{row[4]});)图6.4.5 插入教师语句部分 处理程序如下 for index,row in all_course.iterrows():print(fINSERT INTO course VALUES({row[0]},{row[8]},{row[1]},{row[7]},{row[13]},{row[6]},{row[14]});)图6.4.6 插入课程语句部分 处理程序如下 for index,row in all_course.iterrows():for i in row[6].split(,):print(fINSERT INTO class_course VALUES({row[0]},{i});)图6.4.7 插入班级课程语句部分 处理程序如下 for index,row in all_course.iterrows():if row[9] 专业必修课程 and 181 in row[6]:for index,rowst in name181[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});) for index,row in all_course.iterrows():if row[9] 专业必修课程 and 182 in row[6]:for index,rowst in name182[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});) for index,row in all_course.iterrows():if row[9] 专业必修课程 and 183 in row[6]:for index,rowst in name183[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});) for index,row in all_course.iterrows():if row[9] 专业必修课程 and 184 in row[6]:for index,rowst in name184[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});) for index,row in all_course.iterrows():if row[9] 专业必修课程 and 185 in row[6]:for index,rowst in name185[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});) for index,row in all_course.iterrows():if row[9] 专业必修课程 and 186 in row[6]:for index,rowst in name186[5:].iterrows():num np.random.randint(50, 100)print(fINSERT INTO score VALUES({rowst[1]},{row[0]},{num});)图6.4.8 插入分数语句部分 七 智能排课算法 7.1 排课要求 1-16周周一到周五1-9节 课程安排的时间长度必须和课程学分一致同个班同个小节不能上多门课不同班同门课可能一起上同个老师不能在同一小节同时上两个课上课时间尽可能分散开不要集中于某一天减缓学生压力 7.2 准备工作 1划分每天的1-9节课为四大节白天三大节每节2课时晚上一大节每节3课时如下表7-2-1。 表7-2-1 课程表划分 星期一星期二星期三星期四星期五第一大节8:30~10:05第二大节10:25~12:00第三大节15:00~16:35第四大节18:00~20:25 2将每周2课时的课程与3课时的课程分开排课用同一套算法每周2课时的课程在白天进行排课每周3课时的课程在晚上进行排课当白天或晚上排课效率不高时再调整多余部分课程到另一时间段。 图7.2.1 每周2课时的课程 图7.2.2 每周3课时的课程 7.3 遗传算法 1我们以每周2课时的课程为例子进行下面遗传算法选课流程的介绍。我们注意到存在着只上8周的课程没有覆盖整个16周所以选择把两个8周且班级相同的课程并到一起或者有包含关系的两个课程前面8周集合元素覆盖或等于后面8周的算一个16周课程进行以下算法分析。 图7.3.1 课程合并 合并后我们需要排课的课程号如下 [101,102,108,109,110,111,112,113,114,115,116,117,118,121,122,123] 其中合并关系为117-》119118-》120121-》124122-》125123-》126 我们将每天的课程进行编号以便于下面算法的进行。 星期一星期二星期三星期四星期五第一大节8:30~10:051471013第二大节10:25~12:002581114第三大节15:00~16:353691215 表7-3-1 课程表标记 3如表7-2-1所示我们每节课安排的时间范围即为115我们需要排课的列表为[101,102,108,109,110,111,112,113,114,115,116,117,118,121,122,123]长度为16所以我们可以随机生成一个list长度为16数字范围为115这样一个列表可以表示每一门课程所安排的时间 4显然随机数的排课具有很大不确定性可能会导致一些课程冲突、课程集中某个时间段等等所以我们想要去找到一条list可以让我们的排课让老师同学们都满意 5这里引入遗传算法这里简单介绍遗传算法遗传算法是一种局部寻优算法可以根据我们定义的遗传算子通过交叉、变异等操作生成更多不同算子帮助我们在高维空间上寻找局部最优解这里的最优解的条件由我们实现者根据具体实际情况进行定义。下面给出一些基本操作 遗传算子-染色体即为一条与需排课列表长度的时间序列范围为115生成染色体时必须保证同一个时间段的课程老师、班级不能冲突否则重新生成 选择种群优胜劣汰对低于平均适应度的染色体进行交叉和突变高于平均适应度的进行保留 交叉操作选取两条父母染色体对母亲随机截取一段S直接替换父亲的该段返回拼接后的染色体 突变操作对染色体进行随机截取一段进行翻转操作突变某个点的时间值范围为115 种群进化种群内每一根染色体都有可能进行交叉和突变取决于交叉率和突变率。 7.4 适应度函数 定义适应度函数也类似于机器学习的目标函数我们需要优化它达到最优解从而获得我们的最优排课顺序。这里我们的得分函数由三部分组成 1第一部分时间段权重 根据网上部分资料一般学生课程安排有权重调整即早上的课程权重相应大些特别是第二大节课对应的下午的课程权重少些还有星期二下午不开课广州大学惯例星期五的课权重少些这里给出我定义的权重表7-4-1。第一部分得分算法染色体list点乘对应得分除以[0.9*len(list)]*100 注[0.9*len(list)]指的是全部安排在第二大节得分为满分100分。 表7-4-1 课程表权重 星期一星期二星期三星期四星期五第一大节8:30~10:050.880.880.880.880.85第二大节10:25~12:000.90.90.90.90.88第三大节15:00~16:350.8500.850.850.8 代码如下 grade {1: 0.88, 2:0.9 ,3: 0.85,4:0.88 ,5: 0.9,6: 0,7:0.88, 8:0.9, 9:0.85, 10:0.88,11:0.9,12:0.85,13:0.85,14:0.88,15:0.8} point1 0 #不同时间段不同得分权重,以全部9.0为满分权重 for i in gene:point1 grade[i] point1 point1/(len(gene) *0.9)*1002第二部分全部课程时间方差 为了保证我们的整个专业排课结果尽可能分散我们可以通过方差大小来调整我们计算以刚好15个课程铺满整个课表的方差为基准基准为ave_var np.var([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]),我们希望我们所排的课程的方差越接近于这个方差越好所以我给出的第二部分得分算法为point2 (1 - np.abs(np.var(gene) -ave_var) /ave_var) *100。 3第三部分每个班级课程时间方差 第二部分优化的所有课程我希望每个班级内部的课程也可以得到优化这里设置一个最大方差max_var np.var([1,8,15])每个班级的课程安排时间的方差也此为标准第三部分得分算法为分别计算6个班级的课程时间方差相加除以6max_var然后乘以100。 三部分得分函数总结完毕我们给予各个部分一个权重以便于我们更倾向于哪一部分时可以进行适当调整。在这里我给出本次实验所用的最终得分表示 point point1 0.8 point2 0.6* point3 7.5 排课效果 遗传算法参数选择交叉率0.4、突变率0.3、种群大小20、进化代数100 最优时间序列为[15, 14, 7, 1, 9, 4, 4, 12, 2, 2, 11, 11, 12, 10, 10, 13] 图7.5.1为遗传算法寻优局部最优解的迭代过程三部分得分最高为240局部寻优效果为216.12。图7.5.2为调课时间整理后的部分展示可以看到课程分布较均匀且时间、班级、教师完全无冲突。 图7.5.1 智能调课遗传迭代图 图7.5.2 调课时间展示部分 八 系统实现 8.1 登陆界面 学生学号密码学号后5位 教师教师号密码1111 8.2 学生界面 8.2.1 学生个人信息界面 8.2.2 学生个人课表界面 8.2.3 学生选课界面 8.2.4 学生退课界面 8.2.5 学生查看成绩界面 8.3 教师界面 8.3.1 教师信息界面 8.3.2 任教课程和调课系统界面 8.3.3 课程学生名单界面 8.3.4 登分、排分系统界面 8.4 系主任界面 8.4.1 查看所有学生界面 8.4.2 班级成绩、专业成绩排序 8.4.3 查看所有老师 8.4.4 查看所有课程 8.4.5 查看所有班级课程表