Проектирование и разработка веб-приложения на основе технологий Symfony Framework
История развития веб-технологий и существующие проблемы. Назначение и установка Symfony Framework. Создание приложения на основе технологий Symfony Framework. Установка дополнительных библиотек через composer, верстка шаблона, настройка сервисов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 05.07.2017 |
Размер файла | 712,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
$rate += $newReview->getRate();
++$count;
}
$rate = round($rate / $count, 1);
$this->setRate($rate);
return $this;
}
publicfunctionremoveReview(Review $review)
{
$this->reviews->removeElement($review);
return $this;
}
publicfunctiongetRate()
{
return $this->rate;
}
publicfunctionsetRate(float $rate)
{
$this->rate = $rate;
return $this;
}
publicfunctiongetIntRate()
{
return (int) $this->getRate();
}
publicfunctionsetMultiplayer(bool $multiplayer)
{
$this->multiplayer = $multiplayer;
return $this;
}
publicfunctiongetMultiplayer()
{
return $this->multiplayer;
}
publicfunctiongetDiscount()
{
return $this->discount;
}
publicfunctionsetDiscount($discount)
{
$this->discount = $discount;
return $this;
}
publicfunctionremoveDiscount()
{
$this->discount = null;
return $this;
}
publicfunctiongetDiscountPrice()
{
if ($this->getDiscount()) {
$discountPrice = $this->getPrice() - $this->discount->getValue() * $this->getPrice() / 100;
} else {
$discountPrice = $this->getPrice();
}
return (int) $discountPrice;
}
publicfunctiongetIsDiscount()
{
return $this->getDiscountPrice() != $this->getPrice();
}
publicfunctiongetBasketProducts()
{
return $this->basketProducts;
}
publicfunctiongetBuyCount()
{
return $this->buyCount;
}
publicfunctionsetBuyCount($buyCount)
{
$this->buyCount = $buyCount;
return $this;
}
publicfunctiongetLastBuy()
{
return $this->lastBuy;
}
publicfunctionsetLastBuy(\DateTime $lastBuy)
{
$this->lastBuy = $lastBuy;
return $this;
}
publicfunctiongetIsReleased()
{
return $this->isReleased;
}
publicfunctionsetIsReleased(bool $isReleased)
{
$this->isReleased = $isReleased;
return $this;
}
publicfunctiongetIsFavorite(User $user = null)
{
if ($user == null) {
returnfalse;
}
$favorites = $user->getFavoriteGames();
foreach ($favorites as $favorite) {
if ($favorite->getId() == $this->getId()) {
returntrue;
}
}
returnfalse;
}
publicfunctiongetReviewCount()
{
return $this->reviews->count();
}
publicfunctiongetIsRus()
{
return $this->isRus;
}
publicfunctionsetIsRus(bool $isRus)
{
$this->isRus = $isRus;
return $this;
}
publicfunctiongetKeysCount()
{
return $this->getKeys()->count();
}
}
Листинг 21. КласссущностиGame
Приложение C. РепозиторийGameRepositoryсущностиGame
<?
namespace Difuks\DazzleBundle\Repository;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
classGameRepositoryextends EntityRepository
{
publicfunctioncount(): int
{
$db = $this->createQueryBuilder('t');
return $db
->select('count(t.id)')
->getQuery()
->getSingleScalarResult();
}
publicfunctionmaxPrice()
{
$db = $this->createQueryBuilder('t');
return $db
->select('MAX(t.price)')
->getQuery()
->getSingleScalarResult();
}
publicfunctionminPrice()
{
$minPrice = $this->getEntityManager()
->createQuery(
'SELECT
round(MIN(CASE WHEN g.discount IS NULL THEN g.price ELSE (g.price - g.price * d.value / 100) END),1)
FROM DifuksDazzleBundle:Game g
LEFT JOIN DifuksDazzleBundle:Discount d
WHERE g.discount = d'
)
->getSingleScalarResult();
return $minPrice;
}
publicfunctionmaxAgeRest()
{
$db = $this->createQueryBuilder('t');
return $db
->select('MAX(t.ageRestrictions)')
->getQuery()
->getSingleScalarResult();
}
publicfunctionminAgeRest()
{
$db = $this->createQueryBuilder('t');
return $db
->select('MIN(t.ageRestrictions)')
->getQuery()
->getSingleScalarResult();
}
publicfunctionfindByFilter(array $filter = [], array $sort = [], int $page = 1, $count = 9)
{
$query = $this->createQueryBuilder('g');
$actualPrice = 'CASE WHEN g.discount IS NULL THEN g.price ELSE (g.price - g.price * d.value / 100) END';
$query->select("g, $actualPrice AS HIDDEN price");
$query
->leftJoin('DifuksDazzleBundle:Discount', 'd', Join::WITH, 'g.discount = d');
if (isset($filter['price']['min'])) {
$minPrice = $filter['price']['min'];
$query->andWhere("$actualPrice>= $minPrice");
}
if (isset($filter['price']['max'])) {
$maxPrice = $filter['price']['max'];
$query->andWhere("$actualPrice<= $maxPrice");
}
if (isset($filter['age']['min'])) {
$ageMin = $filter['age']['min'];
$query->andWhere("g.ageRestrictions >= $ageMin");
}
if (isset($filter['age']['max'])) {
$ageMax = $filter['age']['max'];
$query->andWhere("g.ageRestrictions <= $ageMax");
}
if (isset($filter['rate']['min'])) {
$rateMin = $filter['rate']['min'];
$query->andWhere("g.rate >= $rateMin");
}
if (isset($filter['rate']['max'])) {
$rateMax = $filter['rate']['max'];
$query->andWhere("g.rate <= $rateMax");
}
if (isset($filter['isReleased'])) {
$query->andWhere('g.isReleased = TRUE');
}
if (isset($filter['isDiscount'])) {
$query->andWhere('g.discount IS NOT NULL');
}
if (isset($filter['genre'])) {
$query->andWhere(':genres MEMBER OF g.genres');
$query->setParameter('genres', $filter['genre']);
}
$order = $sort['order'];
$by = $sort['by'];
if ($order == 'price') {
$query->addOrderBy('price', $by);
} else {
$query->addOrderBy("g.$order", $by);
}
$games = $query->getQuery()->setMaxResults($count * $page)->setFirstResult(($page - 1) * $count)->getResult();
$totalCount = count($query->select('g.id')->orderBy('g.id')->getQuery()->getResult());
return [
'elements' => $games,
'page' => [
'count' => ceil($totalCount / $count),
'current' => $page,
],
];
}
publicfunctiongetDisocuntGames()
{
$db = $this->createQueryBuilder('g');
$db->where('g.discount IS NOT NULL')->setFirstResult(0)->setMaxResults(10);
return $db->getQuery()->getResult();
}
}
Листинг 22. РепозиторийGameRepositoryсущности Game
Приложение D. Класс генерации формы на основе сущности
<?
namespace Difuks\DazzleBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Feedback.
*
* @ORM\Table(name="feedback")
* @ORM\Entity()
*/
classFeedback
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @Assert\NotBlank()
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var string
*
* @Assert\NotBlank()
* @Assert\Email()
* @ORM\Column(name="email", type="string", length=255, nullable=false)
*/
private $email;
/**
* @var string
*
* @Assert\NotBlank()
* @ORM\Column(name="text", type="text", length=255, nullable=false)
*/
private $text;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime")
*/
private $date;
publicfunction__construct()
{
$this->date = new \DateTime();
}
publicfunctiongetId()
{
return $this->id;
}
publicfunctiongetName()
{
return $this->name;
}
publicfunctionsetName(string $name)
{
$this->name = $name;
}
publicfunctiongetEmail()
{
return $this->email;
}
publicfunctionsetEmail(string $email)
{
$this->email = $email;
}
publicfunctiongetText()
{
return $this->text;
}
publicfunctionsetText(string $text)
{
$this->text = $text;
}
publicfunctiongetDate()
{
return $this->date;
}
publicfunctionsetDate(\DateTime $date)
{
$this->date = $date;
}
}
Листинг 22. СущностьFeedback
<?
namespace Difuks\DazzleBundle\Form;
use Difuks\DazzleBundle\Entity\Feedback;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
classFeedbackTypeextends AbstractType
{
publicfunctionbuildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, [
'label' =>'Имя',
'required' =>false,
'mapped' =>true,
])
->add('email', EmailType::class, [
'label' =>'Email',
'required' =>false,
])
->add('text', TextareaType::class, [
'label' =>'Текстобращения',
'required' =>false,
])
;
}
publicfunctionconfigureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Feedback::class,
]);
}
}
Листинг 23. Класс генерации формы обратной связи
Приложение E. Маршруты и контроллер публичной части сайта
index:
path: /
defaults: { _controller: DifuksDazzleBundle:Public:index }
genres:
path: /genres/
defaults: { _controller: DifuksDazzleBundle:Public:genres }
catalog_all:
path: /catalog/
defaults: { _controller: DifuksDazzleBundle:Public:catalog }
catalog:
path: /catalog/{code}
defaults: { _controller: DifuksDazzleBundle:Public:catalog }
product:
path: /product/{code}
defaults: { _controller: DifuksDazzleBundle:Public:product, code: default }
basket:
path: /basket/
defaults: { _controller: DifuksDazzleBundle:Public:basket }
feedback:
path: /feedback/
defaults: { _controller: DifuksDazzleBundle:Public:feedback }
unsubscribe:
path: /unsubscribe/{hash}
defaults: { _controller: DifuksDazzleBundle:Public:unsubscribe }
Листинг 24. Конфигурация маршрутов публичной части
<?
declare(strict_types=1);
namespace Difuks\DazzleBundle\Controller;
use Difuks\DazzleBundle\Entity\Feedback;
use Difuks\DazzleBundle\Entity\Game;
use Difuks\DazzleBundle\Entity\Genre;
use Difuks\DazzleBundle\Entity\Subscribes;
use Difuks\DazzleBundle\Form\FeedbackType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
classPublicControllerextends Controller
{
publicfunctionindexAction(): Response
{
return $this->render('DifuksDazzleBundle:Public:index.html.twig');
}
publicfunctiongenresAction(): Response
{
$genres = $this->getDoctrine()->getRepository(Genre::class)->findBy([], ['id' =>'ASC']);
$totalCount = $this->getDoctrine()->getRepository(Game::class)->count();
return $this->render('DifuksDazzleBundle:Public:genres.html.twig', ['genres' => $genres, 'totalCount' => $totalCount]);
}
publicfunctioncatalogAction(Genre $genre = null): Response
{
return $this->render('DifuksDazzleBundle:Public:catalog.html.twig', ['genre' => $genre]);
}
publicfunctionproductAction(Game $game): Response
{
return $this->render('DifuksDazzleBundle:Public:product.html.twig', ['game' => $game]);
}
publicfunctionbasketAction(): Response
{
return $this->render('@DifuksDazzle/Public/basket.html.twig');
}
publicfunctionfeedbackAction(): Response
{
$form = $this->createForm(FeedbackType::class);
return $this->render('@DifuksDazzle/Public/feedback.html.twig', ['form' => $form->createView()]);
}
publicfunctionunsubscribeAction(Subscribes $subscribe): Response
{
$this->get('difuks.dazzle.social_service')->unSubscribe($subscribe);
return $this->render('@DifuksDazzle/Public/unsubscribe.html.twig');
}
}
Листинг 25. Контроллер публичной части сайта
Приложение F. Сервис для работы с корзиной и заказами. Настройкасервисов
<?
namespace Difuks\DazzleBundle\Services;
use Difuks\DazzleBundle\Entity\Basket;
use Difuks\DazzleBundle\Entity\BasketProduct;
use Difuks\DazzleBundle\Entity\Game;
use Doctrine\ORM\EntityManager;
use Symfony\Component\DependencyInjection\Container;
classOrderService
{
protected $container;
protected $pass;
protected $pass2;
protected $login;
protected $em;
protected $mailer;
publicfunction__construct(Container $container, EntityManager $em, \Swift_Mailer $mailer)
{
$this->container = $container;
$this->mailer = $mailer;
$this->em = $em;
$this->login = $container->getParameter('robokassa.login');
$this->pass = $container->getParameter('robokassa.password');
$this->pass2 = $container->getParameter('robokassa.password2');
}
/**
* Получает url для перевода в систему оплаты.
*
* @param int $id id заказа
* @param float $sum сумма заказа
*
* @return string url
*/
publicfunctiongetUrl(int $id, float $sum): string
{
$descr = 'Оформление заказа №'.$id;
$crc = md5("$this->login:$sum:$id:$this->pass");
$url = "https://auth.robokassa.ru/Merchant/Index.aspx?MrchLogin=$this->login&".
"OutSum=$sum&InvId=$id&Description=$descr&SignatureValue=$crc&IsTest=1";
return $url;
}
/**
* Обрабатывает результат запроса от службы оплаты.
*
* @param int $id id заказа
* @param float $sum сумма заказа
* @param string $crc хэш
*
* @throws \Exception в случае несовпадения хэша
*/
publicfunctionsetResult(int $id, float $sum, string $crc): void
{
$crc = strtoupper($crc);
$myCrc = strtoupper(md5("$sum:$id:$this->pass2"));
if ($myCrc != $crc) {
thrownew \Exception('Неверныеданныеоплаты. Хеш '.$myCrc.' и '.$crc.' несовпадают');
}
$basket = $this->em->getRepository(Basket::class)->find($id);
$fromEmail = $this->container->getParameter('mailer_user');
if ($basket->getPaymentState() != 2) {
$this->sendEmailAboutPay($basket, $fromEmail);
$this->refreshGamesRate($basket);
$basket->setPaymentState(2);
$this->em->persist($basket);
$this->em->flush();
}
}
/**
* Отправляет email об успешной оплате.
*
* @param Basket $basket
* @param string $email
*/
protectedfunctionsendEmailAboutPay(Basket $basket, string $email): void
{
$body = [];
$keys = $basket->getKeys();
/*
* @var Key
*/
foreach ($keys as $key) {
$body[$key->getGame()->getName()][] = $key->getKey();
}
$message = \Swift_Message::newInstance()
->setSubject('Покупкаигр')
->setFrom($email)
->setTo($basket->getUser()->getEmail())
->setBody($this->container->get('templating')->render(
'@DifuksDazzle/Email/keys.send.html.twig',
['body' => $body]
),
'text/html');
$this->mailer->send($message);
}
/**
* Обновляет количество покупок игры, а так же дату последней покупки.
*
* @param Basket $basket
*/
protectedfunctionrefreshGamesRate(Basket $basket): void
{
$products = $basket->getProducts();
foreach ($products as $product) {
$game = $product->getGame();
$currentCount = ($game->getBuyCount()) ?: 0;
$game->setBuyCount($currentCount + $product->getQuantity());
$game->setLastBuy(new \DateTime());
$this->em->persist($game);
$this->em->flush();
}
}
/**
* Обрабатывает запрос на странице завершения оплаты.
*
* @param int $id id заказа
* @param float $sum сумма заказа
* @param string $crc хэш
*
* @throws \Exception в случае несовпадения хэша
*
* @return string текст с результатом
*/
publicfunctiongetDone(int $id, float $sum, string $crc): string
{
$crc = strtoupper($crc);
$myCrc = strtoupper(md5("$sum:$id:$this->pass"));
if ($myCrc != $crc) {
thrownew \Exception('Неверныеданныеоплаты. Хеш '.$myCrc.' и '.$crc.' несовпадают');
}
$basket = $this->em->getRepository(Basket::class)->find($id);
if (isset($basket)) {
if ($basket->getPaymentState() != 2) {
$basket->setPaymentState(1);
$this->em->persist($basket);
$this->em->flush();
}
return'Операция прошла успешно. После проведения оплаты ключи отправят вам на email. Спасибо за покупку!';
} else {
return'Нет заказа с таким номером';
}
}
/**
* Получает текущую корзину пользователя.
*
* @return Basket
*/
publicfunctiongetCurrentBasket(): Basket
{
$user = $this->container->get('security.token_storage')->getToken()->getUser();
$basket = $this->em->getRepository(Basket::class)->getCurrentBasketByUser($user);
return $basket;
}
/**
* Добавляет необходимое количество игр в корзину. Возвращает оставшееся количество ключей.
*
* @param Basket $basket
* @param Game $game
* @param int $quantity
*
* @return int
*/
publicfunctionaddToBasket(Basket $basket, Game $game, int $quantity): int
{
$basket->addGame($game, $quantity);
$this->em->persist($basket);
$this->em->flush();
return $game->getKeysCount();
}
/**
* Изменят количество находящейся в корзине игр
*
* @param BasketProduct $basketProduct
* @param int $quantity
*/
publicfunctionchangeBasketProductCount(BasketProduct $basketProduct, int $quantity): void
{
$basketProduct->getBasket()->changeGameCount($basketProduct->getGame(), $quantity);
$this->em->persist($basketProduct);
$this->em->flush();
}
/**
* Удаляетигруизкорзины.
*
* @param BasketProduct $basketProduct
*/
publicfunctiondeleteBasketProduct(BasketProduct $basketProduct): void
{
$basket = $basketProduct->getBasket();
$basket->removeProduct($basketProduct);
if ($basket->getProductCount() == 0) {
$this->em->remove($basket);
} else {
$this->em->persist($basket);
}
$this->em->flush();
}
/**
* Удаляет старые корзины.
*
* @param int $notPayDay количество дней для удаления корзин в статусе неоплачено
* @param int $payDay количество дней для удаления корзин в статусе ожидания оплаты
*
* @return int число удалённых корзин
*/
publicfunctionclearOldBasket(int $notPayDay, int $payDay): int
{
$oldBaskets = $this->em
->getRepository(Basket::class)
->getOldBaskets(
$notPayDay,
$payDay
);
$count = count($oldBaskets);
foreach ($oldBaskets as $basket) {
$this->em->remove($basket);
}
$this->em->flush();
return $count;
}
}
Листинг 26. Сервис для работы с корзиной и заказами
services:
difuks.dazzle.file.twig.extension:
class: Difuks\DazzleBundle\Extension\Twig\FileExtension
arguments: ['@service_container']
tags:
- { name: twig.extension }
difuks.dazzle.flush_handler:
class: Difuks\DazzleBundle\EventHandler\FlushHandler
arguments: ['@swiftmailer.mailer.cron', '@service_container']
tags:
- { name: doctrine.event_listener, event: onFlush }
difuks.dazzle.authentication_handler:
class: Difuks\DazzleBundle\EventHandler\AuthenticationHandler
arguments: ['@router', '@security.authorization_checker']
difuks.dazzle.order_service:
class: Difuks\DazzleBundle\Services\OrderService
arguments: ['@service_container', '@doctrine.orm.entity_manager', '@swiftmailer.mailer.moment']
difuks.dazzle.social_service:
class: Difuks\DazzleBundle\Services\SocialService
arguments: ['@service_container', '@doctrine.orm.entity_manager']
difuks.dazzle.form.registration:
class: Difuks\DazzleBundle\Form\RegistrationType
tags:
- { name: form.type, alias: difuks_dazzle_user_registration }
difuks.dazzle.form.profile:
class: Difuks\DazzleBundle\Form\ProfileType
tags:
- { name: form.type, alias: difuks_dazzle_user_profile }
Листинг 27. Файл настройки собственных сервисов
Приложение F. Класс консольной команды очистки заброшенных корзин
<?
declare(strict_types=1);
namespace Difuks\DazzleBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
classClearOldBasketCommandextends ContainerAwareCommand
{
protectedfunctionconfigure()
{
$this->addOption('not-pay-day', null, InputOption::VALUE_REQUIRED, 'Количестводнейдляудалениекорзинсостатусом 0', 1);
$this->addOption('pay-day', null, InputOption::VALUE_REQUIRED, 'Количестводнейдляудалениекорзинсостатусом 1', 3);
$this
->setName('difuks:dazzle:basket:clear-old')
->setDescription('Очищает старые корзины')
->setHelp('Очищает корзины со статусом 0 (старее одного дня) и 1 (старее трёх дней)');
}
protectedfunctionexecute(InputInterface $input, OutputInterface $output)
{
$notPayDay = (int) $input->getOption('not-pay-day');
$payDay = (int) $input->getOption('pay-day');
$count = $this->getContainer()->get('difuks.dazzle.order_service')->clearOldBasket($notPayDay, $payDay);
$output->writeln((new \DateTime())->format('d.m.Y H:i:s')." Remove $count baskets");
}
}
Листинг 28. Класс консольной команды очистки заброшенных корзин
Приложение G. Функциональный тест виджета добавления в корзину и конфигурация PHPUnit
<?
namespace Difuks\DazzleBundle\Tests\Functional\Controller;
use Difuks\DazzleBundle\Tests\Functional\BaseControllerTest;
classWidgetControllerTestextends BaseControllerTest
{
publicfunctiontestProductSliderWidget()
{
$crawler = $this->client->request('GET', '/');
$gameButtons = $crawler->filter('button:contains("Вкорзину")');
$this->assertTrue($gameButtons->count() >0, 'Ни одной доступной для покупки игры');
if ($gameButtons->count()) {
$this->checkUrl('/ajax/add-to-basket/'.$gameButtons->first()->attr('data-id'));
$answer = json_decode($this->client->getResponse()->getContent(), true);
$this->assertTrue(isset($answer['error']) && $answer['error'] == true, 'Добавлениевкорзинудоступнонеавторизованномупользователю');
$this->logIn();
$this->checkUrl('/ajax/add-to-basket/'.$gameButtons->first()->attr('data-id'));
$this->logout();
}
}
}
Листинг 29. Функциональный тест виджета добавления в корзину
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="app/autoload.php"
>
<php>
<ini name="error_reporting" value="-1" />
<server name="KERNEL_DIR" value="app/" />
</php>
<testsuites>
<testsuite name="Project Test Suite">
<directory>src/Difuks/DazzleBundle/Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>src</directory>
<exclude>
<directory>src/*Bundle/Resources</directory>
<directory>src/*/*Bundle/Resources</directory>
<directory>src/*/Bundle/*Bundle/Resources</directory>
</exclude>
</whitelist>
</filter>
</phpunit>
Листинг 30. КонфигурационныйфайлPHPUnit
Размещено на Allbest.ru
Подобные документы
Обзор существующих технологий разработки программного обеспечения. Описание платформы NET Framework. Принцип работы платформы: компиляция исходного кода; процесс загрузки и исполнения кода; IL-код и верификация. Новые возможности платформы NET Framework.
реферат [30,7 K], добавлен 01.03.2011Разработка программного приложения по учету договоров с поставщиками и клиентами для строительного предприятия. Особенности использования технологии Net Framework 2.0 в алгоритмически-логическом аспекте на основе реляционной базы, управляемой языком SQL.
курсовая работа [3,0 M], добавлен 25.06.2011Изучение сведений o плaтфopме .NET Framework. Характеристика метoдов дocтупa к бaзaм дaнныx. Рaзpaбoтка пpилoжения "Пocтaвкa и pеaлизaция пpoгpaммнoгo oбеcпечения", coдеpжaщего бaзу дaнныx и pacкpывaющего вcе acпекты paзpaбoтки бaзы дaнныx нa языке C+.
курсовая работа [1,8 M], добавлен 12.12.2011Розробка гри "Арканоід", з можливістю гри, як одного та і двох гравців одночасно на одному гральному полі, за допомогою Visual Studio 2008 з XNA Framework. Аналіз предметної галузі. Опис концептуальної моделі. Реалізація взаємодії між гравцем та системою.
курсовая работа [5,5 M], добавлен 21.01.2010Общие сведения о платформе Microsoft NET Framework. Разработка приложения "Поставка и реализация программного обеспечения", содержащего базу данных о каталогах адресов в Internet. Описание логической структуры. Требования к техническому обеспечению.
курсовая работа [2,4 M], добавлен 28.06.2011Выбор языка и среды программирования, технологий доступа и взаимодействия с источниками данных. Требования к разработке информационной системы. Проектирование базы данных информационной системы учета и взаимодействующего с ней приложения .NET Framework.
курсовая работа [1,3 M], добавлен 17.05.2013Разработка программного решения по созданию мобильного приложения. Изучение технологий для разработки приложений. Анализ работы торговых агентов. Обоснование выбора языка программирования. Проектирование интерфейса структуры и верстка, листинг программы.
дипломная работа [2,2 M], добавлен 08.06.2017Описание платформы NET Framework. База данных Microsoft Access. Разработка Windows приложения. Модель программирования Windows Forms. Функциональное назначение программы. Входные и выходные данные. Требования к техническому и программному обеспечению.
курсовая работа [2,2 M], добавлен 15.03.2015Характеристика и состав Microsoft Solution Framework. Модель команды, её характеристики. Цели качества команды проекта. Модель процессов, её содержание. Принципы управления рисками. Утверждение целей и границ, плана проекта. Модель приложений MSF.
презентация [752,5 K], добавлен 10.05.2013История развития средств создания и демонстрации компьютерных презентаций. Краткий обзор программных средств: MS Power Point, Open Office Impress, iWork и некоторых online – сервисов. Проектирование и разработка презентации на основе собственного шаблона.
курсовая работа [7,5 M], добавлен 19.12.2012