Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Топ:
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Дисциплины:
2017-06-25 | 390 |
5.00
из
|
Заказать работу |
Запуск разработанного Web-приложения и надёжность его работы без сбоев должно обеспечивать аппаратное обеспечение. Любая компьютерная программа для нормальной работы должна располагать определенным количеством ресурсов и, если таких ресурсов по каким-либо причинам не хватает, программа может потерять часть своей функциональности, либо при критической нехватке ресурсов полностью утратить работоспособность.
Управление Web-приложением осуществляется посредством навигационного меню, поэтому для полноценного функционирования программного товара необходимо наличие манипулятора мышь.
Физическое размещение системы в целом и расположение её отдельных подсистем представлено на диаграмме размещения в соответствии с рисунком 6.3.1.
Рисунок 6.3.1 - Диаграмма размещения
Технические характеристики компьютера, на котором проводилось тестирование:
· процессор Intel Core i5-2500 3.3 GHz;
· 4,00 ГБ оперативной памяти, DDR3;
· видеокарта AMD ATI HD6470M.
Приветствуется изменение указанных характеристик в сторону увеличения. Изменение характеристик в сторону уменьшения не желательно, поскольку это приведет к значительному снижению работоспособности Web-приложения. Для правильности работы сайта, рекомендуется использовать браузер Google Chrome версии 31 и выше.
Руководство пользователя
Для работы с Web-приложением необходим доступ к сети интернет.
Для работы с интернет-магазином необходимо ввести в адресную строку адрес моего интернет-магазина и нажать на Enter. После этого загрузится главная страница сайта в соответствии с рисунком 6.4.1.
Рисунок 6.4.1 – Главная страница.
Для регистрации необходимо нажать на кнопку «Авторизация». После этого откроется страница «Авторизация» соответствии с рисунком 6.4.2.
Рисунок 6.4.2 – страница «Авторизация».
На этой странице необходимо нажать кнопку «Регистрация», появится форма для регистрации, в которой необходимо заполнить все поля и нажать кнопку «Зарегистрироваться». Все поля являются обязательными для заполнения. Если поля оставить не заполненными, то отобразится ошибка в соответствии с рисунком 6.4.3.
Рисунок 6.4.3 – Сообщение об ошибке.
Если введенный логин совпадет с уже зарегистрировавшимся пользователем, то на экране отобразится сообщение об ошибке в соответствии с рисунком 6.4.4.
Рисунок 6.4.4 – Сообщение об ошибке.
После правильного ввода всех необходимых данных откроется страница «Каталог» в соответствии с рисунком 6.4.5.
Рисунок 6.4.5 – страница «Каталог».
Для того что бы заказать товар необходимо выбрать категорию. Откроется страница со списком товаров в категории, в соответствии с рисунком 6.4.6.
Рисунок 6.4.6 – Страница категории «Товары для котов».
На этой странице под необходимым товаром в поле необходимо указать нужное число единиц товара и нажать кнопку «Добавить в корзину». Затем с помощью главного меню перейти на страницу «Корзина», в соответствии с рисунком 6.4.7.
Рисунок 6.4.7 – Страница «Корзина».
На этой странице необходимо выбирать ваш регион и ввести адрес. В зависимости от стоимости заказа и выбранного региона будет выведена информация о стоимости доставки товаров. Если пользователя все устраивает необходимо нажать на кнопку «Подтвердить заказ».
Заключение
В процессе проектирования курсового проекта был разработан интернет-магазин по продажам товаров для домашних животных.
Интернет-магазин предназначен для продажи различных товаров через интернет. Областью применения данного Web-приложения выступает интернет-торговля.
Создание данного интернет-магазина позволит продвигать и продавать товары, уменьшить издержки на рекламу и приобрести дополнительный рынок сбыта своего товара, расширить клиентскую аудиторию и, как следствие, увеличение прибыли.
Интернет-магазин имеет удобный и понятный интерфейс, благодаря которому не требуется излишних усилий в освоении работы с сайтом. Вся информация не содержит ничего лишнего.
Результаты проверки показали, что система работает без ошибок, имеется возможность работы с веб-сайтом во всех популярных браузерах.
В результате разработки курсового проекта были отточены навыки в дизайне сайтов, проектировки интерфейсов, разработке логотипов. Приобретены практические умения JavaScript, HTML и CSS верстки сайтов.
Список литературы
1. Node.js Разработка серверных веб-приложений на JavaScript/ Дэвид Хэррон Изд-во: ДМК Пресс, 2012 – 146 с.
2. Изучаем JavaScript // Майкл Моррисон — СПб.: Питер, 2012. — С.608
3. Титтел Эд, Бурмейстер Мэри. HTML 4 для "чайников". 6-е издание. М.: Из-дательский дом “Диалектика -Вильямс” – 2009. - 368с.
4. Веб-приложения на JavaScript. Год: 2012. // Маккоу — СПб.: Питер, 2012. — С.560 608.
5. Большая книга CSS3. // Дэвид Макфарланд. — СПб.: Питер, 2014. — С. 608.
6. HTML5 и CSS3. Веб-разработка по стандартам нового поколения // Брайан Хоган — СПб.: Питер, 2014. — С. 272.
7. Лебедев А. Руководство Лебедев А. – Москва.: Издательство Студии Артемия Лебедева, 2011. – 452 с.
8. Спейнауэр С. Справочник Web-мастера. СПб.: BHV, 1997. – 368 с.
9. Ратшиллер Т., Геркен Т. PHP4: разработка Web-приложений. - СПб: Питер, 2001. - 384 с.
10. Томсон Л., Веллинг Л. Разработка Web-приложений на PHP и MySQL. - К.: "ДиаСофт", 2001. - 672 с
11. Яргер Р., Риз Дж., Кинг Т. MySQL и mSQL. Базы данных для небольших предприятий и Интернета. - СПб: Символ-Плюс, 2000 - 560 с.
12. Орлов С.Д. Технологии разработки программного обеспечения. Учеб. пособие. 2-е изд. СПб.: Питер, 2003. – 480 с.
Приложение
Листинг файла package.json
{
Листинг файла config.js
module.exports = {
Листинг файла createDB.js
var mongoose = require ('./lib/mongoose');async.series([
open,
dropDatabase,
requireModels,
createUsers,
createCategory,
createGoods
], function (err) {
console. log(arguments);
});
function open (callback) {
mongoose. connection. on ('open', callback);
}
function dropDatabase (callback) {
var db = mongoose. connection. db;
db.dropDatabase(callback);
}
function requireModels (callback) {
require ('./models/user');
require ('./models/category');
require ('./models/goods');
async.each(Object.keys(mongoose. models), function (modelName, callback) {
mongoose. models [modelName].ensureIndexes(callback);
}, callback);
}
function createUsers (callback) {
var users = [
{ username: 'Вася', password: 'supervasya' },
{ username: 'Петя', password: '123' },
{ username: 'admin', password: 'thetruehero' }
];
async.each(users, function (userData, callback) {
var user = new mongoose. models. User (userData);
user.save(callback);
}, callback);
}
function createCategory (callback) {
var categories = [
{ id: 0, name: 'Товары для собак', img: 'dogs.jpg' },
{ id: 1, name: 'Товары для котов', img: 'cats.jpg' }
];
async.each(categories, function (categoryData, callback) {
var category = new mongoose. models. Category (categoryData);
category.save(callback);
}, callback);
}
function createGoods (callback) {
var goods = [
{ id: 0, category: 0, price: 10, name: 'Корм для собак Чаппи', img: 'dogs1.jpg' },
{ id: 1, category: 0, price: 20, name: 'Корм для собак Trainer Natural Mini Adult', img: 'dogs2.jpg' },
{ id: 2, category: 1, price: 30, name: 'Корм Brit Care Crazy для котят', img: 'cats1.jpg' },
{ id: 3, category: 0, price: 40, name: 'Корм для собак Acana PACIFICA DOG', img: 'dogs3.jpg' },
{ id: 4, category: 1, price: 50, name: 'Корм для кошек Gourmet Кусочки в соусе', img: 'cats2.jpg' },
{ id: 5, category: 1, price: 60, name: 'Консервированный корм для кошек Friskies', img: 'cats3.jpg' },
];
async.each(goods, function (goodsData, callback) {
var good = new mongoose. models. Goods (goodsData);
good.save(callback);
}, callback);
}
Листинг файла error.js
var util = require ('util');// ошибки для выдачи посетителю
function HttpError (status, message) {
Error.apply(this, arguments);
Error.captureStackTrace(this, HttpError);
this. status = status;
this. message = message || http. STATUS_CODES [status] || "Error";
}
util.inherits(HttpError, Error);
HttpError. prototype. name = 'HttpError';
exports. HttpError = HttpError;
Листинг файла index.js
'use strict';const http = require ('http'),
express = require ('express'),
cookieParser = require ('cookie-parser'),
bodyParser = require ('body-parser'),
favicon = require ('serve-favicon'),
config = require ('./config'),
path = require ('path');
var app = express(), port, server;
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(cookieParser());
app.use(bodyParser. urlencoded ({ limit: '<100mb>' }));
app.use(require ('./middleware/session'));
app.use(require ('./middleware/sendHttpError'));
app.use(require ('./middleware/loadUser'));
port = config. port || 49001;
app.set('port', port);
server = http.createServer(app);
server. on ('error', serverError);
server. on ('listening', serverListening);
require ('./routes')(app);
app.use(express. static (path.join(__dirname, 'public')));
server.listen(port);
require ('./createDB');
function serverError (error) {
if (error. syscall!== 'listen') {
throw error;
}
var bind = typeof port === 'string'? 'Pipe ' + port: 'Port ' + port;
if (error.code === 'EACCES') {
console. error(bind + ' requires elevated privileges');
process.exit(1);
} else if (error.code === 'EADDRINUSE') {
console. error(bind + ' is already in use');
process.exit(1);
} else {
throw error;
}
}
function serverListening () {
var address = server. address (),
bind = typeof address === 'string'? 'pipe ' + address: 'port ' + address.port;
console. log('Listening on ' + bind);
}
Листинг файла routes.js
var path = require('path'),module.exports = function (app) {
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname + '/public/template/index.html'));
});
app.post('/register', require('./routes/register').post);
app.post('/login', require('./routes/login').post);
app.get('/login', checkAuth, require('./routes/login').get);
app.post('/logout', require('./routes/logout').post);
app.get('/categories', checkAuth, require('./routes/categories').get);
app.post('/goods', checkAuth, require('./routes/goods').post);
};
Листинг файла lib/mongoose.js
var mongoose = require ('mongoose');mongoose.connect(config. mongodb. main);
module.exports = mongoose;
Листинг файла lib/session_store.js
const session = require ('express-session');module.exports = function (mongoose) {
return new MongoStore({ mongooseConnection: mongoose. connection })
};
Листинг файла middleware/checkAuth.js
module.exports = function (req, res, next) {next();
};
Листинг файла middleware/loadUser.js
var User = require ('../models/user'). User;module.exports = function (req, res, next) {
req.user = res. locals. user = null;
if (!req. session. user) return next();
User.findById(req. session. user, function (err, user) {
if (err) return next(err);
req.user = res. locals. user = user;
next();
});
};
Листинг файла middleware/sendHttpError.js
module.exports = function (req, res, next) {
Листинг файла middleware/session.js
var session = require ('express-session'),module.exports = session({
secret: config. session,
name: 'sid',
resave: false,
saveUninitialized: false,
cookie: {
maxAge: null
},
store: sessionStore
});
Листинг файла models/category.js
var util = require ('util');var mongoose = require ('../lib/mongoose'),
Schema = mongoose.Schema;
var schema = new Schema({
id: {
type: Number,
required: true
},
name: {
type: String,
required: true
},
img: {
type: String,
required: true
}
});
exports. Category = mongoose.model('Category', schema);
Листинг файла models/goods.js
var util = require ('util');var mongoose = require ('../lib/mongoose'),
Schema = mongoose.Schema;
var schema = new Schema({
id: {
type: Number,
required: true
},
name: {
type: String,
required: true
},
img: {
type: String,
required: true
},
price: {
type: Number,
required: true
},
category: {
type: Number,
required: true
},
quantity: {
type: Number,
required: true,
default: 0
}
});
exports. Goods = mongoose.model('Goods', schema);
Листинг файла models/user.js
var crypto = require ('crypto');var mongoose = require ('../lib/mongoose'),
Schema = mongoose.Schema;
var schema = new Schema({
username: {
type: String,
unique: true,
required: true
},
hashedPassword: {
type: String,
required: true
},
salt: {
type: String,
required: true
},
created: {
type: Date,
default: Date.now
}
});
schema. methods. encryptPassword = function (password) {
return crypto. createHmac ('sha1', this. salt). update (password). digest ('hex');
};
schema.virtual('password')
.set(function (password) {
this. _plainPassword = password;
this. salt = Math. random() + '';
this. hashedPassword = this. encryptPassword(password);
})
.get(function () {
return this. _plainPassword;
});
schema. methods. checkPassword = function (password) {
return this. encryptPassword(password) === this. hashedPassword;
};
schema. statics. authorize = function (username, password, callback) {
var User = this;
async.waterfall([
function (callback) {
User.findOne({ username: username}, callback);
},
function (user, callback) {
if (user) {
if (user.checkPassword(password)) {
callback(null, user);
} else {
callback(new AuthError ("Неправильный пароль"));
}
} else {
callback(new AuthError ("Пользователь с таким логином не зарегистрирован"));
}
}
], callback);
};
schema. statics. register = function (username, password, repeat, callback) {
var User = this;
async.waterfall([
function (callback) {
User.findOne({ username: username}, callback);
},
function (user, callback) {
if (user) {
callback(new AuthError ("Такой пользователь уже зарегистрирован"));
} else {
if (password === repeat) {
var user = new User({ username: username, password: password});
user.save(function (err) {
if (err) return callback(err);
callback(null, user);
});
} else {
callback(new AuthError ("Пароли не совпадают"));
}
}
}
], callback);
};
exports. User = mongoose.model('User', schema);
function AuthError (message) {
Error.apply(this, arguments);
Error.captureStackTrace(this, AuthError);
this. message = message;
}
util.inherits(AuthError, Error);
AuthError. prototype. name = 'AuthError';
exports. AuthError = AuthError;
Листинг файла public/app.js
'use strict';angular
.module('myApp', [ 'ui.router' ])
.config([ '$stateProvider', '$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$stateProvider.state('home', {
url: '/home',
templateUrl: 'template/home.html',
pageTitle: 'Главная',
params: {}
}).state('chat', {
url: '/chat',
templateUrl: 'template/chat.html',
pageTitle: 'Чат',
params: {}
}).state('login', {
url: '/login',
templateUrl: 'template/login.html',
pageTitle: 'Вход',
params: {}
}).state('logout', {
url: '/logout',
pageTitle: 'Выход',
params: {},
controller: function ($http, $state) {
$http({ method: 'POST', url: '/logout' });
$state.go('home');
window. location. reload();
}
}).state('categories', {
url: '/categories',
templateUrl: 'template/categories.html',
pageTitle: 'Каталог',
params: {},
resolve:{
access: function ($http){
return $http({ method: 'GET', url: '/login' }).then(function (res) {
return res;
}, function (res) {
return res;
});
},
}
}).state('goods', {
url: '/goods',
templateUrl: 'template/goods.html',
pageTitle: 'Товары',
params: {
category: null
},
resolve:{
access: function ($http){
return $http({ method: 'GET', url: '/login' }).then(function (res) {
return res;
}, function (res) {
return res;
});
},
}
}).state('cart', {
url: '/cart',
templateUrl: 'template/cart.html',
pageTitle: 'Корзина',
params: {
category: null
},
resolve:{
access: function ($http){
return $http({ method: 'GET', url: '/login' }).then(function (res) {
return res;
}, function (res) {
return res;
});
},
}
}).state('about', {
url: '/about',
templateUrl: 'template/about.html',
pageTitle: 'О нас',
params: {}
}).state('shipping', {
url: '/shipping',
templateUrl: 'template/shipping.html',
pageTitle: 'Доставка',
params: {}
}).state('profile', {
url: '/profile',
templateUrl: 'template/profile.html',
pageTitle: 'Личный кабинет',
params: {}
});
$urlRouterProvider.otherwise('/home');
$stateProvider.state("otherwise", { url: '/otherwise' });
}])
.run([ '$state', '$rootScope', '$stateParams', 'userService', '$http',
function ($state, $rootScope, $stateParams, userService, $http) {
$rootScope. $state = $state;
$rootScope. $stateParams = $stateParams;
$rootScope.$on("$includeContentLoaded", function () {
$ ('body'). scrollTop (0);
});
$rootScope.$on('$stateChangeSuccess', function () {
userService.navChange();
});
$http({
url: "/login",
method: "GET"
}).then(function (res) {
userService. username = res.data. username;
}, function (res) {
userService. username = false;
});
}])
.service('userService', function () {
return {
goods: null,
username: null,
order: {}
};
})
.controller('navController', function ($state, userService, $http, $scope, $rootScope) {
var vm = this;
userService.navChange = function () {
var tabs = {
home: { name: 'Главная', url: 'home', active: false },
login: { name: 'Авторизация', url: 'login', active: false },
logout: { name: 'Выход', url: 'logout', active: false },
categories: { name: 'Каталог', url: 'categories', active: false },
cart: { name: 'Корзина', url: 'cart', active: false },
about: { name: 'О нас', url: 'about', active: false },
profile: { name: 'Личный кабинет', url: 'profile', active: false },
shipping: { name: 'Доставка', url: 'shipping', active: false }
};
if (tabs[$state. current. name ]) {
tabs[$state. current. name ]. active = true;
} else {
tabs[ 'categories' ]. active = true;
}
if (userService. username) {
vm. tabs = [tabs. home, tabs. about, tabs. shipping, tabs. categories, tabs. cart, tabs. profile, tabs. logout ];
} else {
vm. tabs = [tabs. home, tabs. about, tabs. shipping, tabs. login ];
}
}
})
.controller('homeController', function ($state, $scope, $rootScope) {
var vm = this;
})
.controller('aboutController', function ($state, $scope, $rootScope) {
var vm = this;
})
.controller('shippingController', function ($state, $scope, $rootScope) {
var vm = this;
})
.controller('profileController', function ($state, $scope, $rootScope) {
var vm = this;
})
.controller('loginController', function ($state, $http, userService, $scope, $rootScope) {
var vm = this;
vm. loginRegister = true;
vm.registerForm = function () {
vm. loginRegister = false;
vm. error = false;
};
vm.loginForm = function () {
vm. loginRegister = true;
vm. error = false;
};
vm.register = function () {
if (vm. password === vm. repeat) {
$http({
url: "/register",
method: "POST",
headers: {
"content-type": 'application/x-www-form-urlencoded'
},
data: 'username=' + vm. username + '&password=' + vm. password + '&repeat=' + vm. repeat
}).then(function (res) {
userService. username = vm. username;
userService.navChange();
$state.go('categories');
}, function (res) {
if (res.status === 403) {
vm. error = res.data.message;
} else {
$state.go('error');
}
});
} else {
vm. error = 'Введенные пароли не совпадают';
}
};
vm.login = function () {
$http({
url: "/login",
method: "POST",
headers: {
"content-type": 'application/x-www-form-urlencoded'
},
data: 'username=' + vm. username + '&password=' + vm. password
}).then(function (res) {
userService. username = vm. username;
userService.navChange();
$state.go('categories');
}, function (res) {
if (res.status === 403) {
vm. error = res.data.message;
} else {
$state.go('error');
}
});
}
})
.controller('categoriesController', function ($state, $http, $scope, $rootScope) {
var vm = this;
$state. current. resolve.access($http).then(function (res){
if (res.status === 401) {
vm. error = res.data.error;
}
});
$http({
url: "/categories",
method: "GET"
}).then(function (res) {
vm. categories = res.data;
}, function (res) {
vm. error = res.data.error;
});
vm.openCategory = function (id) {
$state.go('goods', { category: id })
};
})
.controller('goodsController', function ($state, $http, $scope, $rootScope, $stateParams, userService) {
var vm = this;
$state. current. resolve.access($http).then(function (res){
if (res.status === 401) {
vm. error = res.data.error;
}
});
$http({
url: "/goods",
method: "POST",
headers: {
"content-type": 'application/x-www-form-urlencoded'
},
data: 'category=' + $stateParams. category
}).then(function (res) {
var good, i;
vm. goods = res.data;
for (good in userService. order) {
for (i = 0; i < vm. goods. length; i++) {
if (vm. goods [i].id == good) {
vm. goods [i]. quantity = userService. order [good];
}
}
}
}, function (res) {
$state.go('home');
});
vm.addToCart = function (id, price, quantity) {
userService. order [id] = quantity;
}
})
.controller('cartController', function ($state, $http, $scope, $rootScope, $stateParams, userService) {
var vm = this;
vm. all = 0;
vm. state = 0;
vm. locations = [{ name: 'Минск' },{ name: 'Минская область' },{ name: 'Беларусь' }];
$state. current. resolve.access($http).then(function (res){
if (res.status === 401) {
vm. error = res.data.error;
}
});
$http({
url: "/goods",
method: "POST"
}).then(function (res) {
var good, i;
vm. goods = res.data;
vm. shipping = 0;
for (good in userService. order) {
for (i = 0; i < vm. goods. length; i++) {
if (vm. goods [i].id == good) {
vm. goods [i]. quantity = userService. order [good];
}
}
}
for (i = 0; i < vm. goods. length; i++) {
vm. all += vm. goods [i]. quantity * vm. goods [i]. price;
}
vm.locationChange();
}, function (res) {
$state.go('home');
});
vm.locationChange = function () {
if (vm. state. name === "Минская область") {
if (vm. all < 200) {
vm. shipping = 20;
} else {
vm. shipping = 0;
}
} else if (vm. state. name === "Беларусь") {
if (vm. all < 500) {
vm. shipping = 50;
} else {
vm. shipping = 0;
}
} else {
if (vm. all < 100) {
vm. shipping = 10;
} else {
vm. shipping = 0;
}
}
vm. resume = vm. all + vm. shipping;
}
});
Листинг файла public/template/about.html
< div ng-controller="aboutController as vm" >
Листинг файла public/template/cart.html
< div ng-controller="cartController as vm" ></ div >
< div class="form-group" >
< button class="btn btn-primary btn-block" >Подтвердить заказ</ button >
</ div >
</ form >
</ div >
</ div >
Листинг файла public/template/categories.html
< div ng-controller="categoriesController as vm" >
Листинг файла public/template/goods.html
< div ng-controller="goodsController as vm" >
Листинг файла public/template/home.html
< div ng-controller="homeController as vm" >
Листинг файла public/template/index.html
<!DOCTYPE html >< link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" >
< link rel="stylesheet" href="/bootstrap.css" />
< script src="/jquery-3.2.1.min.js" ></ script >
< script src="/angular.js" ></ script >
< script src="/angular-ui-router.js" ></ script >
< script src="/app.js" ></ script >
</ head >
< body >
< div class="container" >
< div ng-controller="navController as vm" >
< ul class="nav nav-pills nav-fill border-bottom-1 mt-2 mb-5" >
< img class="logo" src="/img/logo.jpg" >
< li class="nav-item" ng-repeat=" nav in vm.tabs" >
< a class="nav-link {{ nav. active? 'active': ''}}" ui-sref="{{ nav. url}}" >{{ nav. name}}</ a >
</ li >
</ ul >
</ div >
< div ui-view ></ div >
</ div >
< footer class="footer" >
< div class="container" >
< span class="text-muted" >г. Минск, пр. Независимости 46, "Наш зоомагазин". 2017</ span >
</ div >
</ footer >
</ body >
</ html >
Листинг файла public/template/login.html
< div ng-controller="loginController as vm" >Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!