Автор оригинала: David Wong.
Простой способ реализовать учебный план системы управления образованием в колледжах и университетах
Ноль, анализ спроса: говорить о курсе без спроса-значит играть хулиган
Во многих университетских системах управления образованием или стороннем программном обеспечении для управления образованием имеется важная и незаменимая функция учебной программы, поскольку наиболее часто используемая функция во всем программном обеспечении управления образованием, качество учебной программы напрямую определяет пользовательский опыт этой системы. Однако мне, только что изучившему разработку программного обеспечения, кажется, что существуют некоторые трудности как во внешнем интерфейсе, так и во внутреннем коде. Думая о том, чтобы поделиться некоторыми идеями с моими друзьями, которые также разрабатывают программное обеспечение, связанное с системой управления образованием, родился этот блог.
Как показано на рисунке, это интерфейс расписания определенного программного обеспечения для управления образованием:
1、 E-R — как хранить данные (в этой статье в качестве примера взят MySQL)
1. Первый вопрос: Технический паспорт
Курс-это сущность, потому что в курсе много курсов, будет много фрагментов данных. Если существует только одна таблица данных, и каждый курс записан в таблицу как единый фрагмент данных, несомненно, будет много избыточных данных (потому что для каждого курса в курсе их название курса, класс и преподаватель одинаковы) , и возникнут другие проблемы. Например, курс-это объект. Для данных, хранящихся таким же образом, курс разбивается на несколько объектов, что неудобно для доступа к данным. Итак, как это написать? ——Таблица данных (именованная таблица курсов) должна быть создана для одного курса, а таблица данных (именованный курс? Информационная таблица) должна быть построена для одного курса. Таким образом, курс и класс являются отношениями между многими сущностями.
2. Второй вопрос: каковы поля информации о курсе
Во-первых, объявите следующие ключевые поля о представлении времени:
- Неделя (первая неделя, вторая неделя…) неделя, тип int
- Будний день (понедельник, вторник…) среда, тип int
- Время занятий (первый класс, второй класс…) начинается, тип int
Для одного и того же курса аудитория будет отличаться в разные недели и периоды, то есть для каждого курса одного и того же курса любые два из трех значений недели, периода и класса изменятся с изменением третьего значения, и по крайней мере одно из трех значений каждого курса изменится; для одного и того же курса название курса и преподавание изменятся, три значения учителей и классов будут одинаковыми. Поэтому очевидно, что должно храниться в двух таблицах данных соответственно – инварианты хранятся в таблице курса, а изменения хранятся в таблице course_info. Поля таблицы курсов: Поля в курсе? Таблица информации: Данные таблицы курса: Курс? Данные информационной таблицы:
Можно видеть, что до тех пор, пока идентификатор поля “курс” правильно указывает на объект таблицы курсов, независимо от того, как меняется время курса и класс, курс остается тем же курсом, а учитель остается тем же учителем.
3. Третья проблема: размер курса
Университетские курсы, большой класс, будут длиться несколько последовательных разделов (см. Первую картинку этой статьи). Поэтому в базе данных возникает вопрос, хранит ли каждый класс большой раздел или небольшой раздел.
- Вначале идея состояла в том, чтобы сохранить их все в виде больших разделов, по два раздела для каждого большого раздела, и разделить время суток на пять разделов. Но следующий вопрос: если занятие длится три секции, что нам делать?
- Итак, идея изменена, чтобы сохранить раздел, и класс разделен на 11 разделов. В классе есть проблема: большой раздел-это объект, и если вы сохраняете раздел, вы принудительно разделяете большой раздел на два или три объекта. Вы можете подумать, что это безобидно, но если вам нужно записать статус регистрации, три раздела-это три объекта. Таким образом, во втором классе информация о входе первого класса недействительна. Если вы хотите снова увидеть информацию о входе второго класса, вам необходимо снова войти в систему, что повлияет на работу пользователя.
- Поэтому разумный план состоит в том, чтобы разделить день на 11 разделов, и для каждого занятия сохранить начальную точку (раздел “просвещение” – это количество занятий) и продолжительность (занятие длится несколько разделов). Таким образом, решаются все вышеперечисленные проблемы: урок-это объект, а период времени достаточно детализирован.
Изменить курс? Приведите таблицу сведений следующим образом и добавьте продолжительность: Измененные данные:
Два, задний конец
С разумной базой данных в качестве поддержки, метод внутреннего запроса очень прост в написании:
- Получите регистрационную информацию этого студента с сессии
- Получите информацию о текущем времени: количество недель, недель и разделов
- Согласно информации для входа, получите идентификатор всех курсов этого студента из таблицы ассоциаций (таблица баллов, не упомянутая в этой статье), которая представляет собой массив типа int
- В соответствии с полученным массивом, выведите все курсы этого студента в таблице курсов
- Цикл, для каждого курса, в таблице course_in найдите все курсы этой недели и на этой неделе для этого студента
- Создайте новый двумерный массив в качестве учебной программы, потому что каждый день, 7 дней в неделю, есть 11 разделов, поэтому размер двумерного массива составляет 7 * 11
- В настоящее время каждый только что запрошенный урок является курсом этой недели для этого учащегося, поэтому вам нужно только заполнить данные в соответствующую позицию массива таблиц курсов в соответствии с днем недели и разделом “Начало”, а затем вы можете перенести эту таблицу курсов во внешний интерфейс.
(код использует ThinkPHP в качестве примера)
//Get the student ID
$studentId = session('studentId');
//Query all courses of this student in this semester (score table is the correlation table of students, courses and scores)
$score = new Score();
$getScore = $score->where(['course_id'=>$courseIds, 'student_id'=>$studentId])->select();
//Set up course list array
$coursetable = array('1' => array('0','0','0','0','0','0','0','0') ,
'2' => array('0','0','0','0','0','0','0','0') ,
'3' => array('0','0','0','0','0','0','0','0') ,
'4' => array('0','0','0','0','0','0','0','0') ,
'5' => array('0','0','0','0','0','0','0','0') ,
'6' => array('0','0','0','0','0','0','0','0') ,
'7' => array('0','0','0','0','0','0','0','0') ,
'8' => array('0','0','0','0','0','0','0','0') ,
'9' => array('0','0','0','0','0','0','0','0') ,
'10' => array('0','0','0','0','0','0','0','0') ,
'11' => array('0','0','0','0','0','0','0','0')) ;
//Save the course ID of all courses of this semester
$scoreIds = [];
foreach ($getScore as $score) {
array_push($scoreIds, $score->course_id);
}
//For each course, query all courses (unit: Section)
$courseinfos = Courseinfo::where(['course_id'=>$scoreIds, 'week'=>$week])->select();
//Fill in each lesson in the timetable
foreach ($courseinfos as $key => $acourseinfo) {
{
$coursetable[$acourseinfo->begin][$acourseinfo->weekday] = $acourseinfo;
}
}
//Incoming Curriculum
$this->assign('coursetable',$coursetable);Три, передний конец
1. Известно: массив 7 * 11 передается с серверной части. В соответствующей позиции есть соответствующие курсы, и значение равно нулю в позиции, где нет курса.
Поэтому просто добавьте цикл 7 * 11 на переднем конце
//Generate table by loop
//$I is the table's row, value is the section (begin), $J is the table's column, value is the day of the week (weekday)
for ($i=0; $i < 11; $i++) {
for ($j=0; $j < 7; $j++) {
If (there is a value of weekday = = $J and begin = = $I in the curriculum){
Show information about this course in this cell
}
}
}2. Решите проблему слияния ячеек
На этом рисунке мы видим, что, когда курс длится два или три раздела, в двух или трех последовательных ячейках будет отображаться информация о курсе. На самом деле в базе данных хранится только информация первого раздела. Поэтому вам нужно объединить ячейки. Используя тег rowspan таблицы HTML, вы можете легко объединять ячейки. Код перед слиянием:
| 123 | 456 | < th > before merger < / th >
| 789 | 012 | < th > before merger < / th >
Не объединяйте, когда, что равносильно отказу от записи. Эффект заключается в следующем
Код после слияния:
| 123 | 456 |
| 789 | 012 |
Когда диапазон строк изменяется на 3, вы можете видеть, что самая правая ячейка объединена. Однако на самом деле слияние-это всего лишь поверхностное утверждение. Вы, должно быть, внимательно заметили, что во второй строке и третьей строке отсутствует метка < td>, соответственно, вместо объединения ячеек диапазон строк изменяет высоту исходных ячеек. Итак, вопрос в том, почему ниже меньше одной строки < td >? Если в предыдущей строке используется диапазон строк, а следующие строки остаются неизменными, что произойдет?
| 123 | 456 | 234 |
| 789 | 012 | 567 |
Камера такая жесткая. Как только диапазон строк будет включен, верхняя ячейка “сожмет” нижнюю ячейку, чтобы переместить одну единицу вправо. Но это абсолютно недопустимо в учебной программе – невозможно показать класс со среды по четверг, потому что в первом классе их двое?!
Поэтому необходимо динамическое суждение. Как мы знаем, ячейка имеет два состояния: отображать и не отображать (не пишите эту строку, если она не отображается, или используйте CSS для определения стиля “отображение”. Когда класс равен этому стилю, ячейка не будет отображаться. В классе есть три состояния: непрерывное 2-барное, 3-барное и 4-барное. Поэтому для каждой ячейки нам нужно судить, есть ли класс с длиной, равной 2, в ячейке над ней, есть ли класс с длиной, равной 3, в ячейке над ним, и есть ли класс с длиной, равной 4, в ячейке над ним. В любом из трех вышеперечисленных случаев удовлетворительно, что эта ячейка скрыта, в противном случае это состояние отображения Но есть и другая ситуация, которую следует учитывать, то есть индекс массива не может находиться вне диапазона. Например, для ячейки в первой строке (первый раздел), если запрашивается ячейка над ней (нулевой раздел), она превысит диапазон массива, что приведет к ошибке. Поэтому первый, второй и третий разделы необходимо рассматривать отдельно. Другие разделы могут использовать циклы, поскольку они гарантируют, что индекс не будет превышен. Из-за беспорядочного кода в моем реальном проекте я не буду его публиковать. Я только предоставляю логику для реализации этой функции для вашей справки.
Четыре, резюме
На мой взгляд, самая большая трудность заключается в аспекте базы данных. Как хранить данные, как установить взаимосвязь сущностей, как хранить данные по большому разделу или по небольшому разделу в классе-все это вопросы, которые необходимо рассмотреть. Структура базы данных является краеугольным камнем системы, неразумная структура значительно увеличит сложность разработки и даже приведет к провалу проекта из-за неразумной структуры базы данных. Другая проблема заключается в оценке выходной информации внешнего интерфейса. Чтобы предотвратить ошибку ячейки, вызванную использованием диапазона строк, необходимо определить, отображается ли текущая ячейка в соответствии с данными в первых нескольких строках. Если выше есть урок, он не будет отображаться, что отлично решает проблему. Единственным недостатком является то, что было бы очень сложно писать циклы и суждения только с помощью HTML без использования внутреннего языка, поэтому я не перечислил код-если вы можете использовать js или напрямую использовать PHP – код в интерфейсе для цикла, вы можете уменьшить сложность. Может быть, не стоит упоминать, что эта функция проста перед большим парнем, но как новичку-петуху, действительно потребовалось много энергии и размышлений в течение долгого времени, вероятно, четыре или пять дней, чтобы придумать этот план.
Дорога длинная, дорога заблокирована и длинная, мы все растем.
Однажды, когда мы оглянемся на свое прошлое “я”, мы наверняка обнаружим, что в течение этого периода времени мы постоянно прогрессируем и на нашем лице счастливая улыбка.
Оригинал: “https://developpaper.com/the-realization-of-simple-curriculum-in-the-educational-administration-system-of-colleges-and-universities/”