Главная страница
Навигация по странице:

  • Рисунок 1. IDEF0-диаграмма AS IS процесса поиска

  • Рисунок 2. IDEF0-диаграмма TO BE процесса поиска

  • Рисунок 3. Диаграмма прецедентов

  • Рисунок 4. Аутентификация

  • Рисунок 5. Выход из системы

  • Рисунок 6. Главная страница

  • Рисунок 7. Добавление анкеты

  • Рисунок 8. Поиск Рисунок 9. Результат поиска

  • Рисунок 10. Положительный результат проверки

  • Рисунок 12. Страница модератора

  • Рисунок 13. Поток операций

  • Рисунок 14. EJB-модуль RAgencyE

  • Рисунок 15. EJB-модуль EmpE

  • Рисунок 16. Физическая модель БД Recruitment agency

  • Рисунок 17. Физическая модель БД EmpDB 5.4 Обеспечение целостности данных 5.4.1 Ограничения целостности

  • 5.4.2 Организация распределенных транзакций

  • Profile . java

  • ПЗ. Курсовой проект прототип программной системы Кадровое агентство


    Скачать 1.26 Mb.
    НазваниеКурсовой проект прототип программной системы Кадровое агентство
    Дата27.03.2022
    Размер1.26 Mb.
    Формат файлаdoc
    Имя файлаPZ.doc
    ТипКурсовой проект
    #418793




    Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

    «Владимирский государственный университет

    имени Александра Григорьевича и Николая Григорьевича Столетовых»
    Кафедра информационных систем и программной инженерии

    КУРСОВОЙ ПРОЕКТ
    Прототип программной системы
    «Кадровое агентство»



    Выполнила:

    ст. гр. ЗИСТд-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.

    В была указана библиотека Trinidad. Кроме того, в была изменена главная страница на faces/index.html.

    Были определены две роли пользователей - 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. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


    1. Будилов, В.А. Интернет-программирование на Java / В.А.Будилов – СПб.: БХВ-Петербург, 2003

    2. Дейтел, Х.М. Технологии программирования на Java 2 / Х.М.Дейтел, П.Дж.Дейтел, С.И.Сантри – М.: ООО "Бином-Пресс", 2003

    3. Вершинин, М.М. Java 2 Enterprise Edition. Технологии проектирования и разработкич / М.М. Вершинин, Е.Б. Иванова – СПб.: БХВ-Петербург, 2003

    4. Генри, Д.М. JavaServer Faces: Библиотека профессионала / Дэвид М. Генри, Кей С. Хорстманн – М. : Вильямс, 2008. – 576 с. – ISBN 978-5-8459-1396-8, 978-0-13-173886-7

    5. Тринидад - https://myfaces.apache.org/trinidad/

    6. Транзакции - 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 lt = resultList;

    for (Type proft:lt)

    {

    t=proft.getIDtype();

    }

    List resultList2 = em.createNamedQuery("Education.findByNameEducation").setParameter("nameEducation", edu).getResultList();

    List le = resultList2;

    for (Education profe:le)

    {

    e=profe.getIDeducation();

    }

    List resultList3 = em.createNamedQuery("Speciality.findByNameSpeciality").setParameter("nameSpeciality", spec).getResultList();

    List ls = resultList3;

    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 lt = resultList;

    for (Type proft:lt)

    {

    t=proft;

    }

    List resultList1 = em.createNamedQuery("City.findByNameCity").setParameter("nameCity", city).getResultList();

    List lc = resultList1;

    for (City profc:lc)

    {

    c=profc;

    }

    List resultList2 = em.createNamedQuery("Education.findByNameEducation").setParameter("nameEducation", edu).getResultList();

    List le = resultList2;

    for (Education profe:le)

    {

    e=profe;

    }

    List resultList3 = em.createNamedQuery("Speciality.findByNameSpeciality").setParameter("nameSpeciality", spec).getResultList();

    List ls = resultList3;

    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">



















    Главная страница |



    Поиск |



    Выйти



    Добавить анкету соискателя





















































































































    Тип





















    Город





















    Образование







    Специальность













































































    написать администратору сайта