ПЗ. Курсовой проект прототип программной системы Кадровое агентство
Скачать 1.26 Mb.
|
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Владимирский государственный университет имени Александра Григорьевича и Николая Григорьевича Столетовых» Кафедра информационных систем и программной инженерии КУРСОВОЙ ПРОЕКТ Прототип программной системы «Кадровое агентство» Выполнила: ст. гр. ЗИСТд-117 Перушин Д.Г. Принял: Тимофеев А.А. Владимир, 2022 СОДЕРЖАНИЕ Если пользователь хочет выйти из системы, то он нажимает на ссылку «Выйти». После этого он попадает на страницу, где может выйти из системы или перейти на главную страницу (рис.4). 7 7 11 5.4 Обеспечение целостности данных 17 5.4.1 Ограничения целостности 17 5.4.2 Организация распределенных транзакций 17 1. ВВЕДЕНИЕЖизнь современного человека сложно представить без информационных технологий. Сегодня никого не удивит человек с планшетом или ноутбуком, сидящий за чашкой кофе в кафе или едущий в транспорте. Мы используем компьютеры дома, на работе для делового общения, поиска информации, развлечений. Поэтому данный курсовой проект является актуальным. В данном курсовом проекте был реализован прототип программной системы «Кадровое агентство». Данную программную систему можно использовать на любом предприятии, так как везде существует необходимость поиска работников. Обычно этим занимается отдел кадров. Кроме того, ее могут использовать люди, ищущие работу. Программная система облегчает процесс поиска работы и работников. Человеку просто нужно зайти в программную систему и найти необходимую информацию по введенным критериям. Либо заполнить и оставить свою анкету. Для пользования системой человеку необходимо авторизоваться. Затем можно искать необходимую вакансию по заданным критериям. Если вакансии не оказалось или они не подошли, то пользователь может оставить анкету соискателя. 2. ПОСТАНОВКА ЗАДАЧИЗадачей курсового проекта является разработка прототипа программной системы кадрового агентства. Для достижения этой цели было необходимо разработать следующие вопросы: 1. Анализ предметной области, функциональная декомпозиция системы. 2. Модель данных, содержащая не менее 6 взаимосвязанных таблиц. 3. Структура программной системы с разделением на бизнес-логику и логику веб-интерфейса. 4. Реализация бизнес-логики и веб-интерфейса с использованием заданных технологий. 5. Обеспечение целостности данных 3. АНАЛИЗ ЗАДАЧИ И ФУНКЦИОНАЛЬНАЯ ДЕКОМПОЗИЦИЯ СИСТЕМЫ3.1 Описание предметной областиПредметной областью курсового проекта является кадровое агентство. Оно занимается поиском работников либо вакансий. В кадровом агентстве можно оставить анкету, где будут указаны все необходимые данные. Также по каким-либо критериям можно подобрать необходимую вакансию или работника. Ранее для того, чтобы найти вакансию или работника необходимо было просмотреть большое количество объявлений, узнавать у знакомых, искать объявления в разных источниках. Рисунок 1. IDEF0-диаграмма AS IS процесса поиска А с помощью данной ИС можно просто ввести критерии поиска и система сама выдаст подходящие вакансии или работников. Причем все изменения в объявления будут вноситься своевременно и, соответственно, данные будут актуальными. Кроме того, можно будет проверить, действительно ли найденный человек работал в указанной организации. Рисунок 2. IDEF0-диаграмма TO BE процесса поиска 3.2 Диаграмма прецедентовВ результате проектирования было выделено три актера: зарегистрированный пользователь, модератор, пользователь. Зарегистрированный пользователь может только войти в систему. Модератор может просматривать и удалять анкеты. Пользователь может добавлять анкету, осуществлять поиск и проверку подлинности указанных данных. Также модератеру и пользователю доступен выход из системы. Рисунок 3. Диаграмма прецедентов 3.3 Сценарий взаимодействия пользователя с системойВзаимодействие пользователя с системой происходит посредством браузера. Незарегистрированный пользователь может зайти только на главную страницу. Если пользователь входит в систему как user, то ему доступно добавление анкеты соискателя, добавление анкеты работодател поиск и проверка подлинности указанного места работы. Если пользователь входит в систему как moderator, то ему доступна страница модерации. Там он может просмотреть все анкеты и удалить их в случае необходимости. 3.4 АутентификацияПользователь заходит на сайт кадрового агентства, где нажимает на ссылку «Войти в систему» и перенаправляется на страницу входа (рис.3). Там он вводит свой логин и пароль, а затем нажимает кнопку «Войти». Также пользователь может просто вернуться на главную страницу Рисунок 4. Аутентификация 3.5 Выход из системыЕсли пользователь хочет выйти из системы, то он нажимает на ссылку «Выйти». После этого он попадает на страницу, где может выйти из системы или перейти на главную страницу (рис.4). Рисунок 5. Выход из системы 3.6 Главная страницаНа главной странице располагаются ссылки на все остальные страницы (рис.5). Рисунок 6. Главная страница 3.7 Добавление анкетыЭта страница доступна пользователям с ролью «user». Пользователю необходимо заполнить все поля, после чего он нажимает на кнопку «Добавить» (рис.6). Если добавление прошло успешно, пользователь перенаправляется на главную страницу. Рисунок 7. Добавление анкеты 3.8 Поиск и проверка подлинности введенного места работыЭта страница доступна пользователям с ролью «user». Пользователю необходимо выбрать критерии поиска и нажать на кнопку «Найти» (рис.7). После этого он будет переправлен на страницу, где будет представлена страница с найденными анкетами (рис.8). Затем можно проверить, действительно ли выбранный человек работал в указанной организации. Если человек действительно там работал, то пользователь перенаправляется на страницу, где указана причина увольнения (рис.9). Если человек не работал в указанной организации, то пользователь будет перенаправлен на страницу, где будет об этом сообщено (рис.10). Рисунок 8. Поиск Рисунок 9. Результат поиска Рисунок 10. Положительный результат проверки Рисунок 11. Отрицательный результат проверки 3.9 Страница модератораЭта страница доступна пользователям с ролью «moderator». На ней отображается список всех добавленных анкет (рис.11). Модератор может удалить те анкеты, которые не удовлетворяют требованиям. Рисунок 12. Страница модератора 4. СТРУКТУРНАЯ ОРГАНИЗАЦИЯ СИСТЕМЫ4.1 Организация веб-интерфейсаДля реализации веб-интерфейса прототипа информационной системы был использован фреймворк JavaServer Faces. Кроме того, была использована библиотека Trinidad. Рисунок 13. Поток операций 4.2 Организация бизнес-логикиБизнес-логика прототипа реализована при помощи технологии EJB. EJB – это компоненты, которые предназначены для реализации так называемой бизнес-логики приложения. В отличие от веб-компонентов, которые обеспечивают веб-интерфейс приложения, EJB-компоненты не формируют какого-либо пользовательского интерфейса. Основная задача у них – обеспечить реализацию процедур обработки данных и бизнес-правил, специфичных для приложения. EJB-компоненты формируют промежуточный слой, который обеспечивает изоляцию клиентских приложений (веб-приложений, веб-сервисов, GUI-приложений) от деталей внутренней организации данных (типа и местоположения БД, используемого для связи с ними API и их внутренней структуры), предоставляя им некоторый прикладной программный интерфейс, ориентированный на решение определенного круга задач для конкретного клиента. Были использованы сессионные EJB-компоненты и компоненты-сущности. Основной функционал: Метод AddProfile добавляет анкету. Пользователь заполняет все поля анкеты работодателя и отправляет ее в систему. При этом она добавляется в БД – InsertProfile(). Метод Search() ищет вакансию или работника, т.е. формирует список анкет, удовлетворяющих заданным критериям. При этом он вызывает методы GetProfile(). Метод Check() проверяет, действительно ли выбранный соискатель работал на указанной им работе и показывает причину его ухода, если он действительно там работал. При этом вызывается метод findAll(). Метод Delete() удаляет выбранную модератором анкету. При этом вызываeтся метод DeleteProfile. 4.3 Организация доступа к даннымДоступ к данным организован на основе технологии Java Persistence API. Спецификация Java Persistence API определяет набор прикладных интерфейсов языка Java для управления персистентностью и объектно-реляционного преобразования на платформах Java SE и Java EE. Сущность – это легкий устойчивый объект предметной области, связанный с БД с помощью аннотации @Entity. Сущности представляют работу с данными как с системой объектов, при этом состояние объектов, моделируемое их полями, отражает состояние данных в соответствующем источнике. Вызывая методы объектов, клиент изменяет их состояние. Изменение состояния объектов синхронизируется с источником данных автоматически под управлением контейнера или по требованию приложения. Клиент работает с экземпляром сущности напрямую, логика реализуется классом сущности. Модуль персистентности представляет собой средство упаковки и установки классов сущностей. Модуль персистентности позволяет отобразить управляемые с его помощью классы сущностей на единственную реляционную базу данных, определяя, таким образом, контекст для запросов и связей между сущностями. Это позволяет представить реляционную БД сложной структуры в виде композиции проблемно-ориентированных модулей персистентности. 5. РЕАЛИЗАЦИЯ КОМПОНЕНТОВ СИСТЕМЫ5.1 EJB-компоненты5.1.1 EJB-модуль RAgencyEВ данном модуле расположены классы сущностей из базы данных кадрового агентства (пакет Entity), а также stateless компоненты, обеспечивающие работу с ним (пакет DAO).Рисунок 14. EJB-модуль RAgencyE 5.1.2 EJB-модуль EmpEВ данном модуле расположены классы сущностей из базы данных работодателей, а также интерфейсы, обеспечивающие работу с ними.Рисунок 15. EJB-модуль EmpE 5.2 Веб-компоненты5.2.1 Классы управляемых биновКласс MBLogin контекста сессии необходим для реализации авторизации в системе и выхода из нее. Листинг представлен в приложении А. Класс MBaddP служит для заполнения выпадающих списков, удаления и добавления анкет, проверки подлинности введенных данных и вывода информации о предыдущей работе. Листинг представлен в приложении А. Класс MBSearch служит для заполнения выпадающих списков и выполнения поиска. 5.2.2 Cтраница addProfileНа странице addProfile происходит добавление анкеты. Пользователю нужно заполнить необходимые поля (некоторые вручную, некоторые из выпадающих списков), после чего нажать кнопку «Добавить». В результате анкета будет добавлена в БД. Листинг представлен в приложении А. 5.2.3 Страница profilesНа странице profiles модератор может просмотреть все добавленные анкеты и в случае необходимости удалить какие-либо из них. Листинг представлен в приложении А. 5.2.4 Конфигурация JSF-приложенияКонфигурирование приложения происходит с помощью файла web.xml. В Были определены две роли пользователей - moder и user и обеспечены ограничения на доступ к страницам. Метод авторизации выбран – form. Страница для авторизации – login.xhtml. Листинг представлен в приложении А. 5.3 Физическая структура баз данных5.3.1 База данных RecruitmentAgencyРисунок 16. Физическая модель БД Recruitment agency 5.3.2 База данных EmpDBРисунок 17. Физическая модель БД EmpDB 5.4 Обеспечение целостности данных 5.4.1 Ограничения целостности В базе данных организована ссылочная целостность благодаря тому, что все отношения связаны при помощи механизма внешних ключей. Поэтому невозможно удалить запись, связанную с другой записью посредством внешнего ключа. 5.4.2 Организация распределенных транзакций Транзакция – это последовательность операторов манипулирования данными, выполняющаяся как единое целое (все или ничего) и переводящая базу данных из одного целостного состояния в другое целостное состояние. Транзакция обычно начинается автоматически с момента присоединения пользователя к СУБД. Для любой реализации системы управления распределенными транзакциями используется модель обработки распределенных транзакций X/Open (X/Open DTP). Алгоритм реализованной транзакции представлен на рисунке 18. Рисунок 18. Транзакция 6. ЗАКЛЮЧЕНИЕВ результате выполнения курсового проекта был создан прототип ИС «Кадровое агентство». Были проведены анализ предметной области и функциональная декомпозиция системы, разработаны структуры баз данных и заполнены сведениями, разработана структура программной системы, произведена реализация бизнес-логики и веб-интерфейса с использованием заданных технологий. В ходе выполнения курсового проекта были решены все поставленные задачи и цели. 7. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВБудилов, В.А. Интернет-программирование на Java / В.А.Будилов – СПб.: БХВ-Петербург, 2003 Дейтел, Х.М. Технологии программирования на Java 2 / Х.М.Дейтел, П.Дж.Дейтел, С.И.Сантри – М.: ООО "Бином-Пресс", 2003 Вершинин, М.М. Java 2 Enterprise Edition. Технологии проектирования и разработкич / М.М. Вершинин, Е.Б. Иванова – СПб.: БХВ-Петербург, 2003 Генри, Д.М. JavaServer Faces: Библиотека профессионала / Дэвид М. Генри, Кей С. Хорстманн – М. : Вильямс, 2008. – 576 с. – ISBN 978-5-8459-1396-8, 978-0-13-173886-7 Тринидад - https://myfaces.apache.org/trinidad/ Транзакции - ttp://www.javaportal.ru/java/articles/distributed_transaction.html ПРИЛОЖЕНИЕ АЛистинг компонентов системыProfile.java @Entity @Table(name = "profile") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Profile.findAll", query = "SELECT p FROM Profile p"), @NamedQuery(name = "Profile.findByIDprofile", query = "SELECT p FROM Profile p WHERE p.iDprofile = :iDprofile"), @NamedQuery(name = "Profile.findByName", query = "SELECT p FROM Profile p WHERE p.name = :name"), @NamedQuery(name = "Profile.findByPhone", query = "SELECT p FROM Profile p WHERE p.phone = :phone"), @NamedQuery(name = "Profile.findByPastJob", query = "SELECT p FROM Profile p WHERE p.pastJob = :pastJob"), @NamedQuery(name = "Profile.findByExperience", query = "SELECT p FROM Profile p WHERE p.experience = :experience"), @NamedQuery(name = "Profile.findByWage", query = "SELECT p FROM Profile p WHERE p.wage = :wage"), @NamedQuery(name = "Profile.findByOtherInfo", query = "SELECT p FROM Profile p WHERE p.otherInfo = :otherInfo")}) public class Profile implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "ID_profile") private Integer iDprofile; @Basic(optional = false) @NotNull @Size(min = 1, max = 50) @Column(name = "name") private String name; // @Pattern(regexp="^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$", message="Недопустимый формат номера телефона/факса (должен иметь формат xxx-xxx-xxxx)")//if the field contains phone or fax number consider using this annotation to enforce field validation @Basic(optional = false) @NotNull @Size(min = 1, max = 15) @Column(name = "phone") private String phone; @Size(max = 50) @Column(name = "past_job") private String pastJob; @Basic(optional = false) @NotNull @Column(name = "experience") private int experience; @Basic(optional = false) @NotNull @Column(name = "wage") private int wage; @Size(max = 150) @Column(name = "other_info") private String otherInfo; @JoinColumn(name = "ID_type", referencedColumnName = "ID_type") @ManyToOne(optional = false) private Type iDtype; @JoinColumn(name = "ID_city", referencedColumnName = "ID_city") @ManyToOne(optional = false) private City iDcity; @JoinColumn(name = "ID_education", referencedColumnName = "ID_education") @ManyToOne(optional = false) private Education iDeducation; @JoinColumn(name = "ID_speciality", referencedColumnName = "ID_speciality") @ManyToOne(optional = false) private Speciality iDspeciality; public Profile() { } public Profile(Integer iDprofile) { this.iDprofile = iDprofile; } public Profile(Integer iDprofile, String name, String phone, int experience, int wage) { this.iDprofile = iDprofile; this.name = name; this.phone = phone; this.experience = experience; this.wage = wage; } public Integer getIDprofile() { return iDprofile; } public void setIDprofile(Integer iDprofile) { this.iDprofile = iDprofile; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPastJob() { return pastJob; } public void setPastJob(String pastJob) { this.pastJob = pastJob; } public int getExperience() { return experience; } public void setExperience(int experience) { this.experience = experience; } public int getWage() { return wage; } public void setWage(int wage) { this.wage = wage; } public String getOtherInfo() { return otherInfo; } public void setOtherInfo(String otherInfo) { this.otherInfo = otherInfo; } public Type getIDtype() { return iDtype; } public void setIDtype(Type iDtype) { this.iDtype = iDtype; } public City getIDcity() { return iDcity; } public void setIDcity(City iDcity) { this.iDcity = iDcity; } public Education getIDeducation() { return iDeducation; } public void setIDeducation(Education iDeducation) { this.iDeducation = iDeducation; } public Speciality getIDspeciality() { return iDspeciality; } public void setIDspeciality(Speciality iDspeciality) { this.iDspeciality = iDspeciality; } @Override public int hashCode() { int hash = 0; hash += (iDprofile != null ? iDprofile.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Profile)) { return false; } Profile other = (Profile) object; if ((this.iDprofile == null && other.iDprofile != null) || (this.iDprofile != null && !this.iDprofile.equals(other.iDprofile))) { return false; } return true; } @Override public String toString() { return "Entity.Profile[ iDprofile=" + iDprofile + " ]"; } } ProfileDAO.java @Stateless @LocalBean public class ProfileDAO { @PersistenceContext(unitName = "RAgencyE-ejbPU") private EntityManager em; public void persist(Object object) { em.persist(object); } ! public List getAllProfile() { return em.createNamedQuery("Profile.findAll").getResultList(); } public List GetAll(String type, String edu, String spec) { int e = 0; int s = 0; int t = 0; //Получаем id сущности по ее названию List resultList = em.createNamedQuery("Type.findByNameType").setParameter("nameType", type).getResultList(); List for (Type proft:lt) { t=proft.getIDtype(); } List resultList2 = em.createNamedQuery("Education.findByNameEducation").setParameter("nameEducation", edu).getResultList(); List for (Education profe:le) { e=profe.getIDeducation(); } List resultList3 = em.createNamedQuery("Speciality.findByNameSpeciality").setParameter("nameSpeciality", spec).getResultList(); List for (Speciality profs:ls) { s=profs.getIDspeciality(); } Query q = em.createQuery("SELECT p FROM Profile p WHERE p.iDtype.iDtype = ?1 and p.iDspeciality.iDspeciality = ?2 and p.iDeducation.iDeducation = ?3"); q.setParameter(1,t); q.setParameter(2,s); q.setParameter(3,e); return q.getResultList(); } public void InsertProfile(String type, String name, String city, String phone, String edu, String spec, String job, int exp, int wage, String info) { City c = null; Education e = null; Speciality s = null; Type t = null; //Получаем id сущности по ее названию List resultList = em.createNamedQuery("Type.findByNameType").setParameter("nameType", type).getResultList(); List for (Type proft:lt) { t=proft; } List resultList1 = em.createNamedQuery("City.findByNameCity").setParameter("nameCity", city).getResultList(); List for (City profc:lc) { c=profc; } List resultList2 = em.createNamedQuery("Education.findByNameEducation").setParameter("nameEducation", edu).getResultList(); List for (Education profe:le) { e=profe; } List resultList3 = em.createNamedQuery("Speciality.findByNameSpeciality").setParameter("nameSpeciality", spec).getResultList(); List for (Speciality profs:ls) { s=profs; } Profile p = new Profile(/*t,name,c,e,s,phone,job,exp,wage,info*/); p.setIDtype(t); p.setName(name); p.setIDcity(c); p.setPhone(phone); p.setIDeducation(e); p.setIDspeciality(s); p.setPastJob(job); p.setExperience(exp); p.setWage(wage); p.setOtherInfo(info); em.persist(p); } public void DeleteProfile(int id) { Query q = em.createQuery("DELETE FROM Profile p WHERE p.iDprofile = ?1").setParameter(1, id); q.executeUpdate(); } } Profiles.xhtml xmlns:trin="http://myfaces.apache.org/trinidad" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">
addProfile.xhtml xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">
Добавить анкету соискателя
|