Разработка сайта по составлению комплектации компьютера
Создание удобного сайта, где можно заказать все нужные устройства для сборки компьютера. Реализация методики тестирования программного продукта. Отладка программы. Модификация кода программы с целью улучшения ее эффективности. Руководство пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.03.2022 |
Размер файла | 3,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)»
Московский техникум космического приборостроения
Специальность: 09.02.05 Прикладная информатика
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по теме:
Разработка сайта по составлению комплектации компьютера
Москва 2021
«Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)»
Московский техникум космического приборостроения
УТВЕРЖДАЮ
Председатель ПЦК спец. 09.02.03
Н.А. Жилкина
«___» ________________2019 г.
ЗАДАНИЕ
на выполнение курсового проекта
по профессиональному модулю «МДК 03.01 СиППООН»
Студент Мазаев Г.Ю. ТИ-71
График выполнения работы: 25% к 4 нед., 50% к 8 нед., 75% к 12 нед., 100% к 15 нед.
1 Тема курсового проекта
Разработка сайта по составлению комплектации компьютера____________________
2 Техническое задание
Создать сайт, на котором происходит выполнение сборки компьютера и его приобретение______________________________________
3 Оформление курсового проекта
3.1 Расчетно-пояснительная записка на____листах формата А4.
3.2 Перечень графического материала КП (плакаты, схемы, чертежи и т.п.) - схемы алгоритма
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
1. Постановка задачи
2. Структура сайта
3. Отладка программы
4. Оптимизация программы
5. Тестирование программы
6. Руководство пользователя
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Листинг
ВВЕДЕНИЕ
На сегодняшний день у каждого в доме существует тот или иной компьютер. Будь то ПК, ноутбук, смартфон. Без этого всего невозможно представить нашу современную жизнь. Фотографии, заметки, часы, календари, социальные сети: можно сказать, что вся наша жизнь уже записана и оцифрована.
Мой курсовой проект посвящен комплектации компьютера, поэтому в дальнейшем я буду говорить о ПК.
Многие могли сталкиваться с проблемой, когда покупать готовый, собранный ПК намного дороже, ежели его собирать самому, или нужно обновить (заменить) один из девайсов, но если проблем с внешними устройствами не наблюдается практически никаких, то вот с внутренними могут возникнуть сложности. У процессора и материнской платы могут быть разные сокеты, какая-то часть новых внутренних устройств не будет поддерживать старые, или же просто банально блок питания не сможет выдержать систему. Таких проблем можно описать очень много.
Поэтому мною было принято решение создать удобный сайт, где можно понять или же сразу заказать все нужные устройства.
сайт сборка компьютер тестирование программный
1. Постановка задачи
Целью разработки курсового проекта является разработка сайта по составлению комплектации компьютера. Реализовать методику тестирования программного продукта.
2. Структура сайта
jQuery
bootstrap.js |
|
bootstrap.min.js |
|
jquery-1.11.2.min.js |
|
modernizr-2.8.3-respond-1.4.2.min.js |
|
npm.js |
|
datepicker.js |
|
main.js |
|
plugins.js; |
CSS
bootstrap.css |
|
bootstrap.min.css |
|
bootstrap-theme.css |
|
bootstrap-theme.min.css |
|
fontAwesome.css |
|
light-box.css |
|
templatemo-main.css |
HTML
Index.html |
3. Отладка программы
Отладка программы представляет собой процесс локализации и исправления ошибок. Локализацией называют процесс определения оператора программы, выполнение которого вызвало нарушение нормального вычислительного процесса. Для исправления ошибки необходимо определить ее причину, то есть определить оператор или фрагмент, содержащий ошибку. Отладка программы занимает значительную часть рабочего времени программиста, нередко большую, чем составление программы. Практически любая программа перед началом отладки содержит как минимум одну ошибку.
В соответствии с этапом обработки, на котором проявляются ошибки, различают следующие виды ошибок:
1) синтаксические ошибки (ошибки, обнаруживаемые компилятором при выполнении синтаксического и частично семантического анализа);
2) ошибки компоновки (ошибки, обнаруживаемые компоновщиком при объединении модулей программы);
3) ошибки выполнения (ошибки, обнаруживаемые ОС, аппаратными средствами или пользователем при выполнении программы).
Сайт содержал некоторые несущественные визуальные ошибки, которые были исправлены сиюминутно. Также было несколько пересборок для правильного отображения информации потому, что каждый раз приходило что-то новое на ум.
4. Оптимизация программы
Оптимизация программы - это процесс модификации кода программы с целью улучшения ее эффективности.
Основной задачей программирования является создание правильных, а не эффективных программ. Зачастую для повышения производительности программ большую значимость имеют такие факторы, как:
- четко выработанные требования к программе до начала ее разработки;
- хорошая архитектура программы;
- хорошо спроектированные модули;
- правильно выбранный компилятор со встроенными средствами оптимизации.
Ввиду данных факторов основной целью разработки являлось создание правильной, хорошо спроектированной программы.
В большинстве случаев к оптимизации следует приступать только после того, как программа создана и выдает требуемые результаты. В противном случае можно получить не просто неудобочитаемый код и неработающую программу, но еще и неоптимизированное решение. Однако неизвестно, насколько эффективной будет программа, оптимизированная после ее разработки, поэтому определять требования к эффективности следует на стадии проектирования.
Несмотря на вышеперечисленные факты, оптимизация оказывается очень полезной, когда программа работает правильно. Производя небольшие изменения в некоторых фрагментах кода, называемых критическими областями, оптимизация помогает повысить эффективность программы в несколько раз.
Так как современные ЭВМ отличаются высоким быстродействием, то оптимизация отдельных, редко встречающихся, операторов является бесполезной тратой времени. Однако повышение эффективности на мощных машинах можно получить за счет правильной оптимизации циклов и операторов, находящихся внутри тела циклов.
5. Тестирование программы
Тестирование - это набор процедур и действий, предназначенных для демонстрации правильности работы программы в заданных режимах и внешних условиях. Цель тестирования - выявить наличие ошибок или убедительно продемонстрировать их отсутствие.
Процесс тестирования проходит в 3 этапа:
- проверка поведения программы в нормальных условиях;
- проверка поведения программы в экстремальных условиях;
- проверка поведения программы в исключительных ситуациях.
Каждый из этапов предполагает задание определенного, характерного для данного этапа набора данных.
5.1 Тестирование в нормальных условиях
Успешный ввод данных, для обратной связи и выбор нужных компонентов (Скриншот 1):
Скриншот - 1
5.2 Тестирование в экстремальных условиях
Провести проверку в экстремальных условиях невозможно в связи с невозможностью выбора неверных данных
5.3 Тестирование в исключительных ситуациях
Произвести тестирование исключительных ситуациях в данной программе невозможно, так как в ней используется защита от ошибок, исключающая возможность ввода неправильных данных.
Так как тестирование в нормальных, экстремальных условиях и исключительных ситуациях не выявило наличие ошибок, можно сказать, что программа работает правильно.
6. Руководство пользователя
Вводим нужный URL , для входа на сайт или пользуемся поисковиком(Скриншот 2):
Скриншот 2.
Далее слева выбираем нужную группу, в каждой можно выбрать разные компоненты компьютера(Скриншот 3):
Скриншот - 3.
Далее у нас подгружаются списки, из которых можно собрать готовый компьютер (все детали не конфликтуют друг с другом) (Скриншот 4):
Скриншот - 4
Хочу отметить, что на разных вкладках - разные комплектующие, вот например, комплектующие от 100 000 до 150 000 в сумме(Скриншот 8):
Скриншот - 8.
После заполнения данных о компьютере - следует заполнить данные о себе, для связи и утверждения заказа, а также договора об оплате (Скриншот 5):
Скриншот - 5.
Далее кликаем на кнопочку SEND NOW (Скриншот - 6) и данные будут отправляться на сервер в том виде, в котором будет нужно магазину:
Скриншот - 6.
Так должна выглядеть полностью заполненная страница, для того, чтобы клиенту можно было ответить по существу(Скриншот 7):
Скриншот - 7
ЗАКЛЮЧЕНИЕ
Целью разработки данного курсового проекта являлось разработка сайта комплектации ПК.
В ходе написания данной курсовой работы были получены практические навыки в области проектирования программы. Программа разрабатывалась с использованием стратегии анализа сообщений, реализующей метод нисходящей разработки. Анализ основывался на изучении потоков данных, обрабатываемых программой. Опыт, полученный при написании работы, подтвердил необходимость в первую очередь правильной выработки требований к программе и грамотного подхода к ее проектированию перед началом написания кода.
Заявленные цели разработки полностью достигнуты, однако, возможный недостаток, невозможность предложения добавления товара в ассортимент или же невозможность выбрать компонент из комплектации «от 100 000 р до 150 000 р» в том же «от 250 000 р»
Код сайта не имеет необходимые комментарии, однако имеет хорошую структуру, которая позволяет любому, кто знаком с языком понять то, что там прописано.
Результатом проведенной работы является правильно спроектированной сайт, а также работающий, эффективный, отлаженный и корректно отвечающий тестам соответствующих условий тестирования интерфейс.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
· JavaScript и jQuery. Интерактивная Веб-Разработка. Джон Дакетт;
· JQuery. Подробное руководство по продвинутому JavaScript. Бер Бибо, Иегуда Кац;
· HTML&CSS. Разработка и дизайн веб-сайтов. Джон Дакетт;
· CSS. Быстрый старт Луис Лазарис.
Листинг
Main.Js:
jQuery(document).ready(function($) {
'use strict';
$(window).load(function() { // makes sure the whole site is loaded
$(".seq-preloader").fadeOut(); // will first fade out the loading animation
$(".sequence").delay(500).fadeOut("slow"); // will fade out the white DIV that covers the website.
})
$(function() {
function showSlide(n) {
// n is relative position from current slide
// unbind event listener to prevent retriggering
$body.unbind("mousewheel");
// increment slide number by n and keep within boundaries
currSlide = Math.min(Math.max(0, currSlide + n), $slide.length-1);
var displacment = window.innerWidth*currSlide;
// translate slides div across to appropriate slide
$slides.css('transform', 'translateX(-' + displacment + 'px)');
// delay before rebinding event to prevent retriggering
setTimeout(bind, 700);
// change active class on link
$('nav a.active').removeClass('active');
$($('a')[currSlide]).addClass('active');
}
function bind() {
$body.bind('false', mouseEvent);
}
function mouseEvent(e, delta) {
// On down scroll, show next slide otherwise show prev slide
showSlide(delta >= 0 ? -1 : 1);
e.preventDefault();
}
$('nav a, .main-btn a').click(function(e) {
// When link clicked, find slide it points to
var newslide = parseInt($(this).attr('href')[1]);
// find how far it is from current slide
var diff = newslide - currSlide - 1;
showSlide(diff); // show that slide
e.preventDefault();
});
$(window).resize(function(){
// Keep current slide to left of window on resize
var displacment = window.innerWidth*currSlide;
$slides.css('transform', 'translateX(-'+displacment+'px)');
});
// cache
var $body = $('body');
var currSlide = 0;
var $slides = $('.slides');
var $slide = $('.slide');
// give active class to first link
$($('nav a')[0]).addClass('active');
// add event listener for mousescroll
$body.bind('false', mouseEvent);
})
$('#form-submit .date').datepicker({
});
$(window).on("scroll", function() {
if($(window).scrollTop() > 100) {
$(".header").addClass("active");
} else {
//remove the background property so it comes transparent again (defined in your css)
$(".header").removeClass("active");
}
});
});
Plugins.js:
jQuery(document).ready(function($){
var slidesWrapper = $('.cd-hero-slider');
//check if a .cd-hero-slider exists in the DOM
if ( slidesWrapper.length > 0 ) {
var primaryNav = $('.cd-primary-nav'),
sliderNav = $('.cd-slider-nav'),
navigationMarker = $('.cd-marker'),
slidesNumber = slidesWrapper.children('li').length,
visibleSlidePosition = 0,
autoPlayId,
autoPlayDelay = 5000;
//upload videos (if not on mobile devices)
uploadVideo(slidesWrapper);
//autoplay slider
setAutoplay(slidesWrapper, slidesNumber, autoPlayDelay);
//on mobile - open/close primary navigation clicking/tapping the menu icon
primaryNav.on('click', function(event){
if($(event.target).is('.cd-primary-nav')) $(this).children('ul').toggleClass('is-visible');
});
//change visible slide
sliderNav.on('click', 'li', function(event){
event.preventDefault();
var selectedItem = $(this);
if(!selectedItem.hasClass('selected')) {
// if it's not already selected
var selectedPosition = selectedItem.index(),
activePosition = slidesWrapper.find('li.selected').index();
if( activePosition < selectedPosition) {
nextSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, selectedPosition);
} else {
prevSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, selectedPosition);
}
//this is used for the autoplay
visibleSlidePosition = selectedPosition;
updateSliderNavigation(sliderNav, selectedPosition);
updateNavigationMarker(navigationMarker, selectedPosition+1);
//reset autoplay
setAutoplay(slidesWrapper, slidesNumber, autoPlayDelay);
}
});
}
function nextSlide(visibleSlide, container, pagination, n){
visibleSlide.removeClass('selected from-left from-right').addClass('is-moving').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
visibleSlide.removeClass('is-moving');
});
container.children('li').eq(n).addClass('selected from-right').prevAll().addClass('move-left');
checkVideo(visibleSlide, container, n);
}
function prevSlide(visibleSlide, container, pagination, n){
visibleSlide.removeClass('selected from-left from-right').addClass('is-moving').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
visibleSlide.removeClass('is-moving');
});
container.children('li').eq(n).addClass('selected from-left').removeClass('move-left').nextAll().removeClass('move-left');
checkVideo(visibleSlide, container, n);
}
function updateSliderNavigation(pagination, n) {
var navigationDot = pagination.find('.selected');
navigationDot.removeClass('selected');
pagination.find('li').eq(n).addClass('selected');
}
function setAutoplay(wrapper, length, delay) {
if(wrapper.hasClass('autoplay')) {
clearInterval(autoPlayId);
autoPlayId = window.setInterval(function(){autoplaySlider(length)}, delay);
}
}
function autoplaySlider(length) {
if( visibleSlidePosition < length - 1) {
nextSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, visibleSlidePosition + 1);
visibleSlidePosition +=1;
} else {
prevSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, 0);
visibleSlidePosition = 0;
}
updateNavigationMarker(navigationMarker, visibleSlidePosition+1);
updateSliderNavigation(sliderNav, visibleSlidePosition);
}
function uploadVideo(container) {
container.find('.cd-bg-video-wrapper').each(function(){
var videoWrapper = $(this);
if( videoWrapper.is(':visible') ) {
// if visible - we are not on a mobile device
var videoUrl = videoWrapper.data('video'),
video = $('<video loop><source src="'+videoUrl+'.mp4" type="video/mp4" /><source src="'+videoUrl+'.webm" type="video/webm" /></video>');
video.appendTo(videoWrapper);
// play video if first slide
if(videoWrapper.parent('.cd-bg-video.selected').length > 0) video.get(0).play();
}
});
}
function checkVideo(hiddenSlide, container, n) {
//check if a video outside the viewport is playing - if yes, pause it
var hiddenVideo = hiddenSlide.find('video');
if( hiddenVideo.length > 0 ) hiddenVideo.get(0).pause();
//check if the select slide contains a video element - if yes, play the video
var visibleVideo = container.children('li').eq(n).find('video');
if( visibleVideo.length > 0 ) visibleVideo.get(0).play();
}
function updateNavigationMarker(marker, n) {
marker.removeClassPrefix('item').addClass('item-'+n);
}
$.fn.removeClassPrefix = function(prefix) {
//remove all classes starting with 'prefix'
this.each(function(i, el) {
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = $.trim(classes.join(" "));
});
return this;
};
});
/*!
* Lightbox v2.9.0
* by Lokesh Dhakar
*
* More info:
* http://lokeshdhakar.com/projects/lightbox2/
*
* Copyright 2007, 2015 Lokesh Dhakar
* Released under the MIT license
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
*/
// Uses Node, AMD or browser globals to create a module.
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require('jquery'));
} else {
// Browser globals (root is window)
root.lightbox = factory(root.jQuery);
}
}(this, function ($) {
function Lightbox(options) {
this.album = [];
this.currentImageIndex = void 0;
this.init();
// options
this.options = $.extend({}, this.constructor.defaults);
this.option(options);
}
// Descriptions of all options available on the demo site:
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
Lightbox.defaults = {
albumLabel: 'Image %1 of %2',
alwaysShowNavOnTouchDevices: false,
fadeDuration: 600,
fitImagesInViewport: true,
imageFadeDuration: 600,
// maxWidth: 800,
// maxHeight: 600,
positionFromTop: 50,
resizeDuration: 700,
showImageNumberLabel: true,
wrapAround: false,
disableScrolling: false,
/*
Sanitize Title
If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
This will free you to add html tags, such as links, in the caption.
If the caption data is user submitted or from some other untrusted source, then set this to true
to prevent xss and other injection attacks.
*/
sanitizeTitle: false
};
Lightbox.prototype.option = function(options) {
$.extend(this.options, options);
};
Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
};
Lightbox.prototype.init = function() {
var self = this;
// Both enable and build methods require the body tag to be in the DOM.
$(document).ready(function() {
self.enable();
self.build();
});
};
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
// that contain 'lightbox'. When these are clicked, start lightbox.
Lightbox.prototype.enable = function() {
var self = this;
$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
self.start($(event.currentTarget));
return false;
});
};
// Build html for the lightbox and the overlay.
// Attach event handlers to the new DOM elements. click click click
Lightbox.prototype.build = function() {
var self = this;
$('<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
// Cache jQuery objects
this.$lightbox = $('#lightbox');
this.$overlay = $('#lightboxOverlay');
this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
this.$container = this.$lightbox.find('.lb-container');
this.$image = this.$lightbox.find('.lb-image');
this.$nav = this.$lightbox.find('.lb-nav');
// Store css values for future lookup
this.containerPadding = {
top: parseInt(this.$container.css('padding-top'), 10),
right: parseInt(this.$container.css('padding-right'), 10),
bottom: parseInt(this.$container.css('padding-bottom'), 10),
left: parseInt(this.$container.css('padding-left'), 10)
};
this.imageBorderWidth = {
top: parseInt(this.$image.css('border-top-width'), 10),
right: parseInt(this.$image.css('border-right-width'), 10),
bottom: parseInt(this.$image.css('border-bottom-width'), 10),
left: parseInt(this.$image.css('border-left-width'), 10)
};
// Attach event handlers to the newly minted DOM elements
this.$overlay.hide().on('click', function() {
self.end();
return false;
});
this.$lightbox.hide().on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
return false;
});
this.$outerContainer.on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
return false;
});
this.$lightbox.find('.lb-prev').on('click', function() {
if (self.currentImageIndex === 0) {
self.changeImage(self.album.length - 1);
} else {
self.changeImage(self.currentImageIndex - 1);
}
return false;
});
this.$lightbox.find('.lb-next').on('click', function() {
if (self.currentImageIndex === self.album.length - 1) {
self.changeImage(0);
} else {
self.changeImage(self.currentImageIndex + 1);
}
return false;
});
this.$nav.on('mousedown', function(event) {
if (event.which === 3) {
self.$nav.css('pointer-events', 'none');
self.$lightbox.one('contextmenu', function() {
setTimeout(function() {
this.$nav.css('pointer-events', 'auto');
}.bind(self), 0);
});
}
});
this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
self.end();
return false;
});
};
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
Lightbox.prototype.start = function($link) {
var self = this;
var $window = $(window);
$window.on('resize', $.proxy(this.sizeOverlay, this));
$('select, object, embed').css({
visibility: 'hidden'
});
this.sizeOverlay();
this.album = [];
var imageNumber = 0;
function addToAlbum($link) {
self.album.push({
link: $link.attr('href'),
title: $link.attr('data-title') || $link.attr('title')
});
}
// Support both data-lightbox attribute and rel attribute implementations
var dataLightboxValue = $link.attr('data-lightbox');
var $links;
if (dataLightboxValue) {
$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
for (var i = 0; i < $links.length; i = ++i) {
addToAlbum($($links[i]));
if ($links[i] === $link[0]) {
imageNumber = i;
}
}
} else {
if ($link.attr('rel') === 'lightbox') {
// If image is not part of a set
addToAlbum($link);
} else {
// If image is part of a set
$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
for (var j = 0; j < $links.length; j = ++j) {
addToAlbum($($links[j]));
if ($links[j] === $link[0]) {
imageNumber = j;
}
}
}
}
// Position Lightbox
var top = $window.scrollTop() + this.options.positionFromTop;
var left = $window.scrollLeft();
this.$lightbox.css({
top: top + 'px',
left: left + 'px'
}).fadeIn(this.options.fadeDuration);
// Disable scrolling of the page while open
if (this.options.disableScrolling) {
$('body').addClass('lb-disable-scrolling');
}
this.changeImage(imageNumber);
};
// Hide most UI elements in preparation for the animated resizing of the lightbox.
Lightbox.prototype.changeImage = function(imageNumber) {
var self = this;
this.disableKeyboardNav();
var $image = this.$lightbox.find('.lb-image');
this.$overlay.fadeIn(this.options.fadeDuration);
$('.lb-loader').fadeIn('slow');
this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
this.$outerContainer.addClass('animating');
// When image to show is preloaded, we send the width and height to sizeContainer()
var preloader = new Image();
preloader.onload = function() {
var $preloader;
var imageHeight;
var imageWidth;
var maxImageHeight;
var maxImageWidth;
var windowHeight;
var windowWidth;
$image.attr('src', self.album[imageNumber].link);
$preloader = $(preloader);
$image.width(preloader.width);
$image.height(preloader.height);
if (self.options.fitImagesInViewport) {
// Fit image inside the viewport.
// Take into account the border around the image and an additional 10px gutter on each side.
windowWidth = $(window).width();
windowHeight = $(window).height();
maxImageWidth = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - 120;
// Check if image size is larger then maxWidth|maxHeight in settings
if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
maxImageWidth = self.options.maxWidth;
}
if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) {
maxImageHeight = self.options.maxHeight;
}
// Is there a fitting issue?
if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
imageWidth = maxImageWidth;
imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
$image.width(imageWidth);
$image.height(imageHeight);
} else {
imageHeight = maxImageHeight;
imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
$image.width(imageWidth);
$image.height(imageHeight);
}
}
}
self.sizeContainer($image.width(), $image.height());
};
preloader.src = this.album[imageNumber].link;
this.currentImageIndex = imageNumber;
};
// Stretch overlay to fit the viewport
Lightbox.prototype.sizeOverlay = function() {
this.$overlay
.width($(document).width())
.height($(document).height());
};
// Animate the size of the lightbox to fit the image we are showing
Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
var self = this;
var oldWidth = this.$outerContainer.outerWidth();
var oldHeight = this.$outerContainer.outerHeight();
var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
function postResize() {
self.$lightbox.find('.lb-dataContainer').width(newWidth);
self.$lightbox.find('.lb-prevLink').height(newHeight);
self.$lightbox.find('.lb-nextLink').height(newHeight);
self.showImage();
}
if (oldWidth !== newWidth || oldHeight !== newHeight) {
this.$outerContainer.animate({
width: newWidth,
height: newHeight
}, this.options.resizeDuration, 'swing', function() {
postResize();
});
} else {
postResize();
}
};
// Display the image and its details and begin preload neighboring images.
Lightbox.prototype.showImage = function() {
this.$lightbox.find('.lb-loader').stop(true).hide();
this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
this.updateNav();
this.updateDetails();
this.preloadNeighboringImages();
this.enableKeyboardNav();
};
// Display previous and next navigation if appropriate.
Lightbox.prototype.updateNav = function() {
// Check to see if the browser supports touch events. If so, we take the conservative approach
// and assume that mouse hover events are not supported and always show prev/next navigation
// arrows in image sets.
var alwaysShowNav = false;
try {
document.createEvent('TouchEvent');
alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
} catch (e) {}
this.$lightbox.find('.lb-nav').show();
if (this.album.length > 1) {
if (this.options.wrapAround) {
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
}
this.$lightbox.find('.lb-prev, .lb-next').show();
} else {
if (this.currentImageIndex > 0) {
this.$lightbox.find('.lb-prev').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev').css('opacity', '1');
}
}
if (this.currentImageIndex < this.album.length - 1) {
this.$lightbox.find('.lb-next').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-next').css('opacity', '1');
}
}
}
}
};
// Display caption, image number, and closing button.
Lightbox.prototype.updateDetails = function() {
var self = this;
// Enable anchor clicks in the injected caption html.
// Thanks Nate Wright for the fix. @https://github.com/NateWr
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
this.album[this.currentImageIndex].title !== '') {
var $caption = this.$lightbox.find('.lb-caption');
if (this.options.sanitizeTitle) {
$caption.text(this.album[this.currentImageIndex].title);
} else {
$caption.html(this.album[this.currentImageIndex].title);
}
$caption.fadeIn('fast')
.find('a').on('click', function(event) {
if ($(this).attr('target') !== undefined) {
window.open($(this).attr('href'), $(this).attr('target'));
} else {
location.href = $(this).attr('href');
}
});
}
if (this.album.length > 1 && this.options.showImageNumberLabel) {
var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
} else {
this.$lightbox.find('.lb-number').hide();
}
this.$outerContainer.removeClass('animating');
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
return self.sizeOverlay();
});
};
// Preload previous and next images in set.
Lightbox.prototype.preloadNeighboringImages = function() {
if (this.album.length > this.currentImageIndex + 1) {
var preloadNext = new Image();
preloadNext.src = this.album[this.currentImageIndex + 1].link;
}
if (this.currentImageIndex > 0) {
var preloadPrev = new Image();
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
}
};
Lightbox.prototype.enableKeyboardNav = function() {
$(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this));
};
Lightbox.prototype.disableKeyboardNav = function() {
$(document).off('.keyboard');
};
Lightbox.prototype.keyboardAction = function(event) {
var KEYCODE_ESC = 27;
var KEYCODE_LEFTARROW = 37;
var KEYCODE_RIGHTARROW = 39;
var keycode = event.keyCode;
var key = String.fromCharCode(keycode).toLowerCase();
if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {
this.end();
} else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {
if (this.currentImageIndex !== 0) {
this.changeImage(this.currentImageIndex - 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(this.album.length - 1);
}
} else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {
if (this.currentImageIndex !== this.album.length - 1) {
this.changeImage(this.currentImageIndex + 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(0);
}
}
};
// Closing time. :-(
Lightbox.prototype.end = function() {
this.disableKeyboardNav();
$(window).off('resize', this.sizeOverlay);
this.$lightbox.fadeOut(this.options.fadeDuration);
this.$overlay.fadeOut(this.options.fadeDuration);
$('select, object, embed').css({
visibility: 'visible'
});
if (this.options.disableScrolling) {
$('body').removeClass('lb-disable-scrolling');
}
};
return new Lightbox();
}));
/*
* MIXITUP - A CSS3 and JQuery Filter & Sort Plugin
* Version: 1.5.5
* License: Creative Commons Attribution-NoDerivs 3.0 Unported - CC BY-ND 3.0
* http://creativecommons.org/licenses/by-nd/3.0/
* This software may be used freely on commercial and non-commercial projects with attribution to the author/copyright holder.
* Author: Patrick Kunka
* Copyright 2012-2013 Patrick Kunka, Barrel LLC, All Rights Reserved
*
* http://mixitup.io
*/
(function($){
// DECLARE METHODS
var methods = {
// "INIT" METHOD
init: function(settings){
return this.each(function(){
var browser = window.navigator.appVersion.match(/Chrome\/(\d+)\./),
ver = browser ? parseInt(browser[1], 10) : false,
chromeFix = function(id){
var grid = document.getElementById(id),
parent = grid.parentElement,
placeholder = document.createElement('div'),
frag = document.createDocumentFragment();
parent.insertBefore(placeholder, grid);
frag.appendChild(grid);
parent.replaceChild(grid, placeholder);
frag = null;
placeholder = null;
};
if(ver && ver == 31 || ver == 32){
chromeFix(this.id);
};
// BUILD CONFIG OBJECT
var config = {
// PUBLIC PROPERTIES
targetSelector : '.mix',
filterSelector : '.filter',
sortSelector : '.sort',
buttonEvent: 'click',
effects : ['fade', 'scale'],
listEffects : null,
easing : 'smooth',
layoutMode: 'grid',
targetDisplayGrid : 'inline-block',
targetDisplayList: 'block',
listClass : '',
gridClass : '',
transitionSpeed : 600,
showOnLoad : 'all',
sortOnLoad : false,
multiFilter : false,
filterLogic : 'or',
resizeContainer : true,
minHeight : 0,
failClass : 'fail',
perspectiveDistance : '3000',
perspectiveOrigin : '50% 50%',
animateGridList : true,
onMixLoad: null,
onMixStart : null,
onMixEnd : null,
// MISC
container : null,
origOrder : [],
startOrder : [],
newOrder : [],
origSort: [],
checkSort: [],
filter : '',
mixing : false,
origDisplay : '',
origLayout: '',
origHeight : 0,
newHeight : 0,
isTouch : false,
resetDelay : 0,
failsafe : null,
// CSS
prefix : '',
easingFallback : 'ease-in-out',
transition : {},
perspective : {},
clean : {},
fade : '1',
scale : '',
rotateX : '',
rotateY : '',
rotateZ : '',
blur : '',
grayscale : ''
};
if(settings){
$.extend(config, settings);
};
// ADD CONFIG OBJECT TO CONTAINER OBJECT PER INSTANTIATION
this.config = config;
// DETECT TOUCH
$.support.touch = 'ontouchend' in document;
if ($.support.touch) {
config.isTouch = true;
config.resetDelay = 350;
};
// LOCALIZE CONTAINER
config.container = $(this);
var $cont = config.container;
// GET VENDOR PREFIX
config.prefix = prefix($cont[0]);
config.prefix = config.prefix ? '-'+config.prefix.toLowerCase()+'-' : '';
// CACHE 'DEFAULT' SORTING ORDER
$cont.find(config.targetSelector).each(function(){
config.origOrder.push($(this));
});
// PERFORM SORT ON LOAD
if(config.sortOnLoad){
var sortby, order;
if($.isArray(config.sortOnLoad)){
sortby = config.sortOnLoad[0], order = config.sortOnLoad[1];
$(config.sortSelector+'[data-sort='+config.sortOnLoad[0]+'][data-order='+config.sortOnLoad[1]+']').addClass('active');
} else {
$(config.sortSelector+'[data-sort='+config.sortOnLoad+']').addClass('active');
sortby = config.sortOnLoad, config.sortOnLoad = 'desc';
};
sort(sortby, order, $cont, config);
};
// BUILD TRANSITION AND PERSPECTIVE OBJECTS
for(var i = 0; i<2; i++){
var a = i==0 ? a = config.prefix : '';
config.transition[a+'transition'] = 'all '+config.transitionSpeed+'ms ease-in-out';
config.perspective[a+'perspective'] = config.perspectiveDistance+'px';
config.perspective[a+'perspective-origin'] = config.perspectiveOrigin;
};
// BUILD TRANSITION CLEANER
for(var i = 0; i<2; i++){
var a = i==0 ? a = config.prefix : '';
config.clean[a+'transition'] = 'none';
};
// CHOOSE GRID OR LIST
if(config.layoutMode == 'list'){
$cont.addClass(config.listClass);
config.origDisplay = config.targetDisplayList;
} else {
$cont.addClass(config.gridClass);
config.origDisplay = config.targetDisplayGrid;
};
config.origLayout = config.layoutMode;
// PARSE 'SHOWONLOAD'
var showOnLoadArray = config.showOnLoad.split(' ');
// GIVE ACTIVE FILTER ACTIVE CLASS
$.each(showOnLoadArray, function(){
$(config.filterSelector+'[data-filter="'+this+'"]').addClass('active');
});
// RENAME "ALL" CATEGORY TO "MIX_ALL"
$cont.find(config.targetSelector).addClass('mix_all');
if(showOnLoadArray[0] == 'all'){
showOnLoadArray[0] = 'mix_all',
config.showOnLoad = 'mix_all';
};
// FADE IN 'SHOWONLOAD'
var $showOnLoad = $();
$.each(showOnLoadArray, function(){
$showOnLoad = $showOnLoad.add($('.'+this))
});
$showOnLoad.each(function(){
var $t = $(this);
if(config.layoutMode == 'list'){
$t.css('display',config.targetDisplayList);
} else {
$t.css('display',config.targetDisplayGrid);
};
$t.css(config.transition);
});
// WRAP FADE-IN TO PREVENT RACE CONDITION
var delay = setTimeout(function(){
config.mixing = true;
$showOnLoad.css('opacity','1');
// CLEAN UP
var reset = setTimeout(function(){
if(config.layoutMode == 'list'){
$showOnLoad.removeStyle(config.prefix+'transition, transition').css({
display: config.targetDisplayList,
opacity: 1
});
} else {
$showOnLoad.removeStyle(config.prefix+'transition, transition').css({
display: config.targetDisplayGrid,
opacity: 1
});
};
// FIRE "ONMIXLOAD" CALLBACK
config.mixing = false;
if(typeof config.onMixLoad == 'function') {
var output = config.onMixLoad.call(this, config);
// UPDATE CONFIG IF DATA RETURNED
config = output ? output : config;
};
},config.transitionSpeed);
},10);
// PRESET ACTIVE FILTER
config.filter = config.showOnLoad;
// BIND SORT CLICK HANDLERS
$(config.sortSelector).bind(config.buttonEvent,function(){
if(!config.mixing){
// PARSE SORT ARGUMENTS FROM BUTTON CLASSES
var $t = $(this),
sortby = $t.attr('data-sort'),
order = $t.attr('data-order');
if(!$t.hasClass('active')){
$(config.sortSelector).removeClass('active');
$t.addClass('active');
} else {
if(sortby != 'random')return false;
};
$cont.find(config.targetSelector).each(function(){
config.startOrder.push($(this));
});
goMix(config.filter,sortby,order,$cont, config);
};
});
// BIND FILTER CLICK HANDLERS
$(config.filterSelector).bind(config.buttonEvent,function(){
if(!config.mixing){
var $t = $(this);
// PARSE FILTER ARGUMENTS FROM BUTTON CLASSES
if(config.multiFilter == false){
// SINGLE ACTIVE BUTTON
$(config.filterSelector).removeClass('active');
$t.addClass('active');
config.filter = $t.attr('data-filter');
$(config.filterSelector+'[data-filter="'+config.filter+'"]').addClass('active');
} else {
// MULTIPLE ACTIVE BUTTONS
var thisFilter = $t.attr('data-filter');
if($t.hasClass('active')){
$t.removeClass('active');
// REMOVE FILTER FROM SPACE-SEPERATED STRING
var re = new RegExp('(\\s|^)'+thisFilter);
config.filter = config.filter.replace(re,'');
} else {
// ADD FILTER TO SPACE-SEPERATED STRING
$t.addClass('active');
config.filter = config.filter+' '+thisFilter;
};
};
// GO MIX
goMix(config.filter, null, null, $cont, config);
};
});
});
},
// "TOGRID" METHOD
toGrid: function(){
return this.each(function(){
var config = this.config;
if(config.layoutMode != 'grid'){
config.layoutMode = 'grid';
goMix(config.filter, null, null, $(this), config);
};
});
},
// "TOLIST" METHOD
toList: function(){
return this.each(function(){
var config = this.config;
if(config.layoutMode != 'list'){
config.layoutMode = 'list';
goMix(config.filter, null, null, $(this), config);
};
});
},
// "FILTER" METHOD
filter: function(arg){
return this.each(function(){
var config = this.config;
if(!config.mixing){
$(config.filterSelector).removeClass('active');
$(config.filterSelector+'[data-filter="'+arg+'"]').addClass('active');
goMix(arg, null, null, $(this), config);
};
});
},
// "SORT" METHOD
sort: function(args){
return this.each(function(){
var config = this.config,
$t = $(this);
if(!config.mixing){
$(config.sortSelector).removeClass('active');
if($.isArray(args)){
var sortby = args[0], order = args[1];
$(config.sortSelector+'[data-sort="'+args[0]+'"][data-order="'+args[1]+'"]').addClass('active');
} else {
$(config.sortSelector+'[data-sort="'+args+'"]').addClass('active');
var sortby = args, order = 'desc';
};
$t.find(config.targetSelector).each(function(){
config.startOrder.push($(this));
});
goMix(config.filter,sortby,order, $t, config);
};
});
},
// "MULTIMIX" METHOD
multimix: function(args){
return this.each(function(){
var config = this.config,
$t = $(this);
multiOut = {
filter: config.filter,
sort: null,
order: 'desc',
layoutMode: config.layoutMode
};
$.extend(multiOut, args);
if(!config.mixing){
...
Подобные документы
Выбор инструментальных и программных средств для создания сайта. Структура программного продукта. Создание сайта при помощи программы WordPress. Тестирование разработанной программы. Разработка структуры и дизайна сайта. Наполнение сайта контентом.
курсовая работа [1,0 M], добавлен 09.01.2014Исследование классификации, средств реализации и разработки сайтов. Сравнительная характеристика конструкторов сайтов. Руководство пользователя. Заполнение материалом и отладка работы страниц. Травмирующие и вредные факторы для пользователя компьютера.
дипломная работа [2,6 M], добавлен 22.01.2015Разработка структуры базы данных сайта. Установка и настройка требуемого программного обеспечения. Анализ интерфейса программы. Создание формы обратной связи. Формирование дизайна, соответствующего требованиям заказчика. Выбор методики тестирования.
дипломная работа [2,0 M], добавлен 22.03.2018Основные требования к составу и параметрам технических средства. Верификация программного продукта. Расширение функционала программы и его реализация. Отладка и тестирование программного продукта. Тестирование программы в граничных и реальных условиях.
курсовая работа [1,3 M], добавлен 29.12.2014Понятие web-сайта и его типы. Обзор программ для создание web-сайта. Описание конструктора Jimdo. Алгоритм создания сайта для ОАО "Каменск-Уральский литейный завод" с целью уведомления посетителей о выпускаемой продукции. Руководство пользователя.
курсовая работа [3,8 M], добавлен 05.06.2015Характеристика структуры, программного обеспечения и основных бизнес–процессов ЗАГСа. Разработка базы данных и структуры сайта для молодоженов. Управление аккаунтом пользователя, описание страниц сайта. Расчёт экономических затрат на создание сайта.
дипломная работа [448,5 K], добавлен 14.01.2013Возможности среды программирования delphi при разработке приложения с визуальным интерфейсом. Разработка спецификации программного обеспечения и на ее основе кода программного продукта. Отладка программы "трассировкой", ее тестирование и оптимизация.
курсовая работа [501,4 K], добавлен 07.12.2016Создание Web-сайта "Расчет коммунальных услуг ЖКХ", факторы, определяющие принятое решение. Математический алгоритм программного продукта, техническое обеспечение. Результаты тестирования сайта gkh-tariff.ru для учета затрат ЖКХ, внедрение в Интернет.
курсовая работа [147,6 K], добавлен 01.03.2013Проектирование информационной системы для удобного ведения учета товара. Функциональная модель предметной области. Обоснование выбора языка программирования. Описание программы, руководство пользователя. Протокол тестирования программного продукта.
курсовая работа [537,6 K], добавлен 18.09.2014Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.
дипломная работа [1,5 M], добавлен 12.06.2009Разработка и программная реализация сайта и базы данных, наполнение базы данных тестовой информацией о товарах. Инструментальные средства создания сайта. Организация тестирования сайта, модуль визуализации интерфейса. Создание запросов в базе данных SQL.
курсовая работа [1,4 M], добавлен 24.12.2012Общее описание разрабатываемого веб-сайта. Создание модуля учета средств для разработки программного продукта. Разработка дизайна. Редактирование веб-сайта в CMS Worspress. Разработка методических указаний для продукта. Система управления базами данных.
дипломная работа [1,8 M], добавлен 10.07.2017Понятие web-сайта и их типы. Программы для создания web-сайта. Описание структуры проекта. Алгоритм создания сайта. Описание конструктора Jimdo. Языки программирования серверного выполнения. Создание полнофункционального веб-сайта для ОАО "КУЛЗ".
курсовая работа [3,5 M], добавлен 05.06.2015Теоретические основы разработки web-сайта. Сбор и анализ данных для качественной реализации программного продукта. Разработка модели сайта магазина детских игрушек. Графическое оформление страниц. Выбор средств и технологий, тестирование и отладка.
курсовая работа [349,2 K], добавлен 09.04.2015Формулировка требований к разработке и оформлению информационного сайта предприятия. Описание архитектуры сайта, меню навигации и алгоритма работы, листинг программного кода. Выбор серверной части и процесс отладки. Методы продвижения сайта в Интернете.
курсовая работа [4,6 M], добавлен 18.01.2014Выбор средства реализации программного продукта. Разработка программного комплекса (ПК). Руководство администратору и пользователю к нему. CMS Joomla - программа, включающая в себя различные инструменты для изготовления веб-сайта. Обработка ошибок в ПК.
курсовая работа [695,6 K], добавлен 19.06.2010Проектирование модульной структуры программы сетевого мессенджера, назначение модуля "frmMsg". Разработка главной формы и интерфейса пользователя программы. Проектирование модуля формы "About". Разработка методики тестирования и отладка программы.
курсовая работа [606,7 K], добавлен 19.01.2012Структура и внутреннее содержание разрабатываемого сайта, основные требования к нему, потребители и целевая аудитория, дизайн и стилистика. Создание прототипа сайта консалтинговой компании "Финанс-консалт" с помощью программного продукта Axure RP PRo.
контрольная работа [1,1 M], добавлен 10.01.2016Сравнение языка Php с другими языками программирования web-приложений. Язык разметки гипертекстовых страниц Html. Технология Macromedia Flash, её преимущества и недостатки. Этапы создания флеш-сайта, руководство пользователя и листинг программы.
дипломная работа [2,3 M], добавлен 04.10.2013Определение целевой аудитории и схема логической связи между страницами, анализ персонального сайта Джима Керри. Создание собственного сайта с целью самопрезентации, его дизайн и план тестирования. Выбор программных средств для реализации проекта.
дипломная работа [6,5 M], добавлен 15.06.2013