Разработка web-приложения "Виртуальная тестирующая среда "Познай себя"" для педагогов-психологов БагГУ
Обоснование технических приемов программирования, сущность функционального, полного тестирования. Проведение расчета прогнозируемой цены и прибыли на программное средство. Характеристика и особенности экономической целесообразности проведения мероприятия.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 10.12.2016 |
Размер файла | 2,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
– производить отключение питания во время выполнения активной задачи; производить частые переключения питания;
– допускать попадание влаги на поверхность системного блока (процессора), монитора, рабочую поверхность клавиатуры, дисководов, принтеров и др. устройств;
– включать сильноохлажденное (принесенное с улицы в зимнее время) оборудование;
– производить самостоятельно вскрытие и ремонт оборудования.
7.4 Требования безопасности в аварийных ситуациях
Программист обязан:
– во всех случаях обнаружения обрыва проводов питания, неисправности заземления и других повреждений электрооборудования, появления запаха гари немедленно отключить питание и сообщить об аварийной ситуации руководителю и дежурному электрику;
– при обнаружении человека, попавшего под напряжение, немедленно освободить его от действия тока путем отключения электропитания и до прибытия врача оказать потерпевшему первую медицинскую помощь;
– при любых случаях сбоя в работе технического оборудования или программного обеспечения немедленно вызвать представителя инженерно-технической службы эксплуатации вычислительной техники;
– в случае появления рези в глазах, резком ухудшении видимости, - невозможности сфокусировать взгляд или навести его на резкость, появлении боли в пальцах и кистях рук, усилении сердцебиения немедленно покинуть рабочее место, сообщить о происшедшем руководителю работ и обратиться к врачу;
– при возгорании оборудования отключить питание и принять меры к тушению очага пожара при помощи углекислотного или порошкового огнетушителя, вызвать пожарную команду и сообщить о происшествии руководителю работ.
7.5 Требования безопасности по окончании работы
По окончании работ программист обязан соблюдать следующую последовательность выключения вычислительной техники:
– произвести закрытие всех активных задач;
– выполнить парковку считывающей головки жесткого диска (если не предусмотрена автоматическая парковка головки);
– убедиться, что в дисководах нет дискет;
– выключить питание системного блока (процессора);
– выключить питание всех периферийных устройств;
– отключить блок питания.
По окончании работ программист обязан осмотреть и привести в порядок рабочее место, повесить халат в шкаф и вымыть с мылом руки и лицо.
ЗАКЛЮЧЕНИЕ
В данном дипломном проекте были подробно рассмотрены особенности и этапы создания web-приложения. И на основе представленного теоретического материала был разработан сайт для педагогов-психологов.
При этом мною были решены следующие задачи:
– ознакомление с современными Интернет-технологиями и их использование в настоящей разработке;
– изучение программного инструментария, применяемого для разработки и создания web-приложения;
– выявление и учёт методов и способов представления на web-страницах различных видов информации;
– ознакомление с основными правилами и рекомендациями по разработке и созданию web-приложения;
– определение структуры web-страниц;
– поддержка мобильных устройств;
– кроссбраузерность;
– быстрая загрузка;
– обеспечена отказоустойчивость web-приложения.
Результатом выполненного проекта является созданная web-приложения «Виртуальная тестирующая среда «Познай себя»». С помощью которого теперь студенты смогут пройти требуемые тесты онлайн, а педагоги-психологи получить отчет в удобном виде. Система позволяет осуществлять интерактивный поиск информации, предоставить в удобном виде все последние новости и предстоящие мероприятия. Существует возможность на прямую задать интересующий вопрос педагогам-психологам, реализованного через форму обратной связи.
В ходе тестирования web-приложения удостоверились в правильности его функционирования. Продемонстрирована высокая производительность web-сервера и скорость загрузки страницы как на мобильном устройстве, так и на персональном компьютере. Отклонений от нормальной работы не обнаружено.
В рамках дипломного проекта были проанализированы нормативные требования к организации охраны труда.
Были произведены экономические расчёты. Они показали, что разработанный программный продукт позволяет сэкономить время, затрачиваемое на обработку тестов и распространение информации, а также предоставить информацию в свободном доступе. В дальнейшем, возможно расширение функциональности web-приложения.
СПИСОК ИСПОЛЬЗОВАНЫХ ИСТОЧНИКОВ
1. Node.js в действии / М.С. Кантелон [и др.] - СПб.: Питер. - 2014. - 540c.
2. Борисенко, А. А. Web-дизайн. Просто как дважды два. / А. А. Борисенко. - М.: Эксмо, 2008. - 320 с.
3. Глушаков, С. В. - Программирование Web-страниц. - Харьков: Фолио, 2005. - 390 с.
4. ГОСТ 19.402-2000 Описание программы. Требования к содержанию, оформлению и контролю качества;
5. ГОСТ 19.404-79 Единая система программной документации. Пояснительная записка. Требования к содержанию и оформлению;
6. ГОСТ 2.105-98 Единая система конструкторской документации. Общие требования к текстовым документам;
7. ГОСТ 7.32-2001 Система стандартов по информации, библиотечному и издательскому делу. Отчёт о научно-исследовательской работе. Структура и правила оформления;
8. Гудман, Д.К. JavaScript Библия пользователя / Д.К. Гудман. - 4-е изд., - Диалектика, 2003. - 960 с.
9. Кох, С. Введение в JavaScript для мага / С.П. Кох. - М., 1997. - 78с.
10. Крокфорд, Д. JavaScript: сильные стороны / Д. Крокфорд. - СПб.: Питер, 2012 - 176с.
11. Никсон, Р. Создаем динамические web-сайты с помощью PHP, MySQL и JavaScript / Р. Никсон. - П.: Питер, 2011. - 496 с.
12. Пауэрс Ш. Изучаем Node.js / Ш. Пауэрс. - СПб.:Питер, 2014. - 400с.: - (Серия «Бестселлеры O'Reilly»).
13. Прохоренок, Н. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера / Н. Прохоренок. - СПб.: БХВ - Петербург., 2010. - 900 с.
14. Рева, О.Н. JavaScript в кармане / О.Н. Рева. - Apress, 2010. - 342 с.
15. Рейсиг, Д. JavaScript Профессиональные приемы программирования / Д. Рейсинг. - П.: Питер, 2008. - 352 с.
16. Рейчел Эндрю CSS. 100 и 1 совет. - Символ-Плюс, 2010. - 336 с.
17. Спека, М.В. Создание Web-сайтов. Самоучитель. - Диалектика, 2009. - 233 с.
18. Фланагон Д.Н JavaScript: Подробное руководство / Д.Н. Фланагон. - Питер, 2008. - 982 с.
19. Хеник, Б.Н. HTML и CSS Путь к совершенству / Б.Н. Хеник. - Питер, 2011. - 336 с.
20. Хоган, Б HTML5 и CSS3. Веб-разработка по стандартам нового поколения/ Б. Хоган - СПб.: Питер, 2012. - 270с.
21. Хольцшлаг, М.В. Языки HTML и CSS для создания Web-сайтов / Хольцшлаг, М.В., Молли Е. - Триумф, 2007. - 203 с.
22. Руководство MongoDB // [Электронный ресурс] - Режим доступа: https://docs.mongodb.org/manual/ - Дата доступа 17.04.2015
23. Руководство и документация по Node.js [Электронный ресурс] - Режим доступа: https://nodejs.org/api/ - Дата доступа 20.04.2015
24. Документация по Express.js [Электронный ресурс] - Режим доступа: http://expressjs.com/4x/api.html Дата доступа 27.04.2015
ПРИЛОЖЕНИЕ А
Программный код серверной части
app = require 'app'
config = require 'config'
http = require 'http'
fs = require('fs')
server = http.createServer(app);
onListening = ()->
host = server.address().address
port = server.address().port
console.log "\n\n\nВся магия на порту -> http://#{host}:#{port}"
onError = (error)->
if error.syscall != 'listen'
throw error;
bind = if typeof port == 'string'
'Pipe ' + port
else
'Port ' + port
switch (error.code)
when 'EACCES'
console.error(bind + ' requires elevated privileges')
process.exit 1
when 'EADDRINUSE'
console.error(bind + ' is already in use')
process.exit 1
else throw error
server_port = process.env.PORT || process.env.OPENSHIFT_NODEJS_PORT || 80
server_ip_address = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1'
server.listen(server_port,server_ip_address)
server.on('error', onError);
server.on('listening', onListening);
io = require('libs/io')(server,app)
app.set('io', io);
nconf = require 'nconf'
path = require 'path'
nconf
.argv()
.env()
.file({ file: path.join __dirname,'config.json' });
module.exports = nconf
http = require('http')
class HttpError extends Error
constructor: (@status, message) ->
Error.apply this, arguments
Error.captureStackTrace this, HttpError
@message = message or http.STATUS_CODES[@status] or 'Error'
HttpError::name = 'HttpError'
exports.HttpError = HttpError
mongoose = require 'mongoose'
config = require 'config'
if config.get('DEBUG_LOCAL') == 'true'
URL = "mongodb://admin:admin@127.0.0.1:27017/itest2"
else
URL = config.get('MONGOLAB_URI') || config.get('OPENSHIFT_MONGODB_DB_URL')
mongoose.connect URL,config.get('mongoose:options')
mongoose.set('debug', true)
mongoose.connection.on 'connected', ->
console.log 'Mongoose default connection open to '
mongoose.connection.on 'error',(err)->
console.log 'Mongoose default connection error: ' + err
mongoose.connection.on 'disconnected',->
console.log('Mongoose default connection disconnected')
process.on 'SIGINT',->
mongoose.connection.close ->
console.log 'Mongoose default connection disconnected through app termination'
process.exit(0)
module.exports = mongoose;
session = require 'express-session'
RedisStore = require('connect-redis')(session)
config = require 'config'
module.exports =(app)->
if config.get('DEBUG_LOCAL') == 'true'
URL = "redis://rediscloud:mysupersecretpass@127.0.0.1:6379"
else
URL = config.get('REDISCLOUD_URL')
store = new RedisStore('url':URL)
sessionMiddleware = session
'secret': config.get "session:secret"
'key' : config.get "session:key"
'cookie': config.get "session:cookie"
'saveUninitialized': true
'resave': true
'store':store
app.use sessionMiddleware
app.set('sessionMiddleware',sessionMiddleware)
app.set('sessionStore',store)
cookie = require('express/node_modules/cookie')
User = require('models/user/index').User
HttpError = require('error').HttpError
module.exports = (server,app)->
io = require('socket.io')(server)
sessionMiddleware = app.get('sessionMiddleware')
io.use (socket, next) ->
# console.log socket
sessionMiddleware(socket.request, socket.request.res, next)
io.use (socket, next)->
# console.log socket.request.session
socket.user = null
if !socket.request.session.passport.user
return next(new HttpError(401, "Нет сессии пользователя."))
User.findById socket.request.session.passport.user, (err, user) ->
if err then return next(err)
if user
socket.sessionID = socket.request.session.id
socket.user = user
return next()
else
return next(new HttpError(403, "Anonymous session may not connect"))
# io.
require('./testHendlers')(io)
Io
Test = require('models/test').Test
debug = require('debug')('socket:test')
async = require('async')
module.exports = (io)->
io.on 'connection',(socket)->
socket.on 'submit',(data)->
subTest = socket.user.arrTest.id(data._id)
if subTest.typeTest == 'temperament'
subTest.answers.push
_id :data.quest_id
yesno:data.yesno
date :new Date()
else if subTest.typeTest == 'motivation'
subTest.answers.push
_id :data.quest_id
answer :data.answer
date :new Date()
else
return socket.emit 'TestMessages',message:'Ошибка, неизвестный тип теста'
socket.emit 'submitOk'
socket.on 'TestDone',(id)->
thisTest = null
async.waterfall [
(callback)->
if id
callback null,id
else
callback(message:'Ошибка, нет входных данных о тесте.#2')
(id,callback)->
thisTest = socket.user.arrTest.id(id)
if thisTest
thisTest.dateEnd = new Date()
callback null,thisTest
else
callback(message:'Ошибка, запрашиваемый тест не найден.')
(thisTest,callback)->
Test.findById thisTest._id,callback
(testQuestion,callback)->
if testQuestion.type == 'temperament'
countAns = {}
for answer in thisTest.answers
question = testQuestion.questions.id(answer._id)
if question
if question.yesno == answer.yesno
if question.keys of countAns
countAns[question.keys]++
else
countAns[question.keys]=1
else
console.log "AnalysisTest : answer._id:#{answer._id} not fond to result.questions"
thisTest.keysTest = countAns
callback null
else if testQuestion.type == 'motivation'
callback null
else callback message:"Это не тест другого типа"
(callback)->
thisTest.done = true
socket.user.save callback
],(err)->
if err
console.log err.stack
return socket.emit "TestMessages",message:"Ошибка сервера"
else
return socket.emit 'Done',id
socket.on 'first load',(id)->
if !id
socket.emit 'TestMessages',message:'Ошибка, нет входных данных о тесте.#1'
console.log "Ошибка, нет входных данных о тесте.#1"
console.log "user:\n"
console.log "#{socket.user}"
return console.log "args:#{arguments}"
Test.findById id,(err,test)->
if err
socket.emit 'TestMessages',message:'Ошибка сервера. Приносим свои извинения. Вкоре ошибка будет исправленна.'
return console.log(err)
if !test
socket.emit 'TestMessages',message:'Ошибка сервера. Тест ненайден.'
return console.log("Нет теста")
if !test.questions? and !Array.isArray(test.questions) and test.questions.length == 0
return socket.emit 'TestMessages',message:"Нет вопросов в тесте."
else
tmp = []
if test.type == 'temperament'
test.questions.forEach (elem)->
tmp.push
_id:elem._id
text:elem.text
else if test.type == 'motivation'
test.questions.forEach (elem)->
tmp.push
_id:elem._id
text:elem.text
answer:elem.answer
minimal:elem.minimal
else
#todo говорим что пользователь начал проходить тест но не сохраняем
loged = socket.user.arrTest.id test._id
if !loged
socket.user.arrTest.push
typeTest:test.type #говорим что пользователь начал проходить тест но не сохраняем
_id :test._id
done:false
return socket.emit 'TestQuestion', tmp
else
if loged.done==false
return socket.emit 'TestMessages',message:"Тест уже запушен"
else if loged.done == true
return socket.emit 'TestMessages',message:"Тест уже пройден."
else
return socket.emit 'TestMessages',message:"Ошибка сервера. Server error"
passport = require 'passport'
User = require('models/user/index').User
Group = require('models/group').Group
Test = require('models/test').Test
async = require('async')
module.exports = (app)->
app.use do passport.initialize
app.use do passport.session
passport.serializeUser (user, done)->
done(null, user._id)
passport.deserializeUser (id, done)->
User.findById id,(err,user)->
if err then console.error(err)
done(err, user)
app.use (req,res,next)->
async.waterfall [
(callback) ->
if req.user?
res.locals.user = req.user
callback null,req.user
else
callback "guest",
(user,callback)->
if user.isAdmin == null
if user.idGroup
Group.findById user.idGroup,callback
else callback "bad user group:#{user._id}"
else callback "this is admin"
(group, callback) ->
req.user.group = group
Test.count
year:
$in: [ 0, req.user.group.year ]
,callback
(count, callback)->
res.locals.user.testCount = req.user.testCount = count
callback(null)
], (err, result) ->
if typeof err == "string"
console.log(err)
return do next
else
return next(err)
do next
passport.use 'local-login',require('./localStrategy')
passport.use 'local-signup',require('./signupStretegy')
passport.use 'vk',require('./vkStrategy')
passport.use 'fb',require('./fbStrategy')
# passport.use 'gp',require('./GpStrategy')
passport.use 'ya',require('./YaStrategy')
HttpError = require('error').HttpError
module.exports = (req, res, next) ->
if !req.user
return next(new HttpError(401, 'Вы не авторизованы.'))
next()
module.exports = (req,res,next)->
res.redirectAjax = (url)->
if res.req.headers['x-requested-with'] == 'XMLHttpRequest'
res.json
success:true
else
res.redirect(url)
res.sendHttpError = (error)->
res.status(error.status or 500)
if res.req.headers['x-requested-with'] == 'XMLHttpRequest'
res.json
error:error
success:false
else
res.render 'error', message: error.message,error:error
next()
config = require 'config'
module.exports = (req,res,next)->
res.locals.severalRandom =
`function(min, max, num) {
var i, arr = [], res = [];
for (i = min; i <= max; i++ ) arr.push(i);
for (i = 0; i < num; i++) res.push(arr.splice(Math.floor(Math.random() * (arr.length)), 1)[0])
return res;
}`
res.locals.declOfNum =
`function(number, base, titles, separator)
{
if(!separator){
separator = " ";
}
cases = [2, 0, 1, 1, 1, 2];
return number+separator+base+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}`
res.locals.declOfNumBig =
`function(number, titles, separator)
{
if(!separator){
separator = " ";
}
cases = [2, 0, 1, 1, 1, 2];
return number+separator+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}`
res.locals.rusMount = (mount)->
rus =
0:"Янв"
1:"Фев"
2:"Мар"
3:"Апр"
4:"Май"
5:"Июн"
6:"Июл"
7:"Авг"
8:"Сен"
9:"Окт"
10:"Ноя"
11:"Дек"
return rus[mount]
res.locals.formatDate = (data)->
('0'+(data.getDate() + 1)).slice(-2)+'-'+('0'+(data.getMonth() + 1)).slice(-2)+'-'+data.getFullYear()+' '+('0'+( data.getHours() + 1)).slice(-2)+':'+('0'+( data.getMinutes() + 1)).slice(-2)
if config.get('DEBUG_LOCAL') == 'true'
res.locals.local = true
else
res.locals.local = false
do next
crypto = require 'crypto'
mongoose = require 'libs/mongoose'
Schema = mongoose.Schema;
hash = require './hash'
HttpError = require('error').HttpError
Group = require('models/group').Group
Test = require('models/test').Test
async = require('async')
ProviderSchema = new mongoose.Schema
name: String
nameId:
type: String
index: true
profile:{}
schema = new Schema
# fullAccount:
# type : Boolean
# default : false
email:
type: String
default: "" # если посетитель удалён, то у него нет email!
validate:[
{
validator: checkNonEmpty = (value)->
if not @.isAdmin
value.length > 0
else
true
msg:"E-mail пользователя не должен быть пустым."
}
{
validator: checkEmail = (value)->
if not @.isAdmin
///^[-.\w]+@([\w-]+\.)+[\w-]{2,12}$///.test(value)
else
true
msg:'Укажите, пожалуйста, корркетный email.'
}
]
index:
unique: true,
sparse: true,
errorMessage: "Такой e-mail уже используется."
# verifiedEmail:
# type: Boolean
# default: true
deleted:# private & login data is deleted
type: Boolean
default: false
isAdmin : Boolean
# lastActivity : Date
familyName : String # Фамилия
givenName : String # Имя
middleName : String # Имя
# photo : String # Фото
birthDate : Date
idGroup:
type : String
index: true
providers : [ProviderSchema]
created:
type : Date
default : Date.now
passwordHash:
type: String # user may have no password if used facebook to login/register
salt:
type: String
arrTest:[
dateStart:
type : Date
default : Date.now
dateEnd:Date
done:Boolean
keysTest:{}
typeTest:String
test:
type:String
index:
unique: true
sparse: true
# performed:Boolean #TODO востановление и продолжение
answers:[]
]
schema.virtual('username')
.get ()->
if @familyName? and @givenName?
@familyName + ' ' + @givenName
else
return null
schema.virtual('password')
.set (password)->
if password?.length < 4
this.invalidate('password', 'Пароль должен быть минимум 4 символа.')
@_plainPassword = password;
@salt = hash.createSalt()
@passwordHash = hash.createHashSlow(password,@salt)
.get ()->
@_plainPassword
schema.methods.checkPassword = (password)->
if password.length == 0 then return false
""+hash.createHashSlow(password,@salt) == @passwordHash
schema.methods.getDatePickerFormat = ->
if @birthDate
"#{@birthDate.getFullYear()}-#{('0' + (@birthDate.getMonth()+1)).slice(-2)}-#{@birthDate.getDate()}"
else
return ''
schema.methods.updateInfo = (familyName,givenName,middleName,_Group,birthDate,callback)->
User = @
errMesg = ""
if familyName?.trim()?.length == 0
errMesg += "- Укажите Фамилию.<br>"
if givenName?.trim()?.length == 0
errMesg += "- Укажите Имя.<br>"
if middleName?.trim()?.length == 0
errMesg += "- Укажите Отчество.<br>"
if birthDate?.trim()?.length != 9
dateArr = birthDate.split('-')
if dateArr.length == 3
year = +dateArr[0]
mount = +dateArr[1] - 1
day = +dateArr[2]
birthDate = new Date(year,mount,day)
else
errMesg +="- Проверьте введенную дату (Пример: 1995-09-17).<br>"
if errMesg
return callback(new HttpError(400,errMesg))
else
Group.newGroup _Group,(err,group)->
if err then return callback err
User.familyName = familyName
User.givenName = givenName
User.middleName = middleName
User.idGroup = group._id
User.birthDate = birthDate
console.log(User)
User.save callback
schema.methods.fullUserInfo = ()->
debug = @birthDate? or @idGroup? or @familyName? or @givenName? or @middleName?
return debug
exports.User = mongoose.model 'User',schema
crypto = require 'crypto'
config = require 'config'
# warning, takes time, about ~70ms for length=128, iterations=12000
exports.createHashSlow = (password, salt)->
crypto.pbkdf2Sync(password, salt, 12000, 128);
exports.createSalt = ()->
crypto.randomBytes(128).toString('base64');
mongoose = require 'libs/mongoose'
Schema = mongoose.Schema;
schema = new Schema
realYear:Number #TODO про консультир про группы
year:
type:Number
min: 1
max: 5
default:1
number :Number
faculty:String
curator:String
schema.virtual('full')
.get ()->
@faculty + '-' + @year+@number # ИСТ-12
schema.statics.newGroup= (group,callback)->
Group = this
group = group.split('-')
year=+group[1][0]
number=+group[1][1]
faculty=group[0]
tmp =new Date()
Group
.find
realYear:+tmp.getFullYear()
year:year
number:number
faculty:faculty
.exec (err,groupResult)->
if err then return callback(err)
if groupResult?.length != 0
return callback null,groupResult[0]
else
newGroup = new Group
realYear:+tmp.getFullYear()
year:year
number:number
faculty:faculty
newGroup.save callback
schema.methods.incYear = (callback)->
if @year != 5 then @year++
@save callback
exports.Group = mongoose.model 'Group',schema
mongoose = require 'libs/mongoose'
Schema = mongoose.Schema;
schema = new Schema
production:
type : Boolean
default : false
title :String
content :String
dataString:String
date:Date
created:
type : Date
default : Date.now
exports.HotInfo = mongoose.model 'HotInfo',schema
mongoose = require 'libs/mongoose'
Schema = mongoose.Schema;
schema = new Schema
production:
type : Boolean
default : false
title :String
imgTitle:String
content :String
created:
type : Date
default : Date.no
exports.News = mongoose.model 'News',schema
mongoose = require '../libs/mongoose'
Schema = mongoose.Schema;
HttpError = require('error').HttpError
questionsSchema = new Schema
text:
type : String
required: true
minimal:Number
answer:[{
val:String
}]
yesno:
type: String
enum:
values: ['yes', 'no']
message: "Неизвестное значение (yes\\no)"
keys:
type: String
enum:
values: ['Ложь','Экстраверсия','Нейротизм']
message: "Неизвестное значение ответа (Ложь\\Экстраверсия\\Нейротизм)"
schema = new Schema
dev:Boolean #TODO продукцен для теста
type:
type : String
required: true
enum:
values: ['motivation','temperament','null']
message: "Неизвестный тип теста!"
title:
type : String
required: true
year:
type : Number
min :0
max :5
questions:[questionsSchema]
# {text:'Вы гей'
# yesno:'yes'
# keys:'Ложь'}
schema.methods.addQuestionMotiv = (obgeckQuestion,callback)->
if @type == 'motivation'
if Array.isArray(obgeckQuestion)
for question in obgeckQuestion
@questions.push question
else
@questions.push obgeckQuestion
@save callback
schema.methods.addQuestionTemperam = (obgeckQuestion,callback)->
if @type == 'temperament'
if Array.isArray(obgeckQuestion)
for question in obgeckQuestion
@questions.push question
else
@questions.push obgeckQuestion
@save callback
schema.methods.editQuestionTemperam = (id,text,callback)->
schema.statics.newTest = (type,title,year,callback)->
# console.log arguments
Test = this
temperam = Test()
if title then temperam.title = title
if not isNaN(year) then temperam.year = year
temperam.type = type
temperam.save callback
exports.Test = mongoose.model 'Test',schema
bodyParser = require 'body-parser'
config = require 'config'
cookieParser = require 'cookie-parser'
express = require 'express'
favicon = require 'serve-favicon'
mongoose = require './libs/mongoose'
path = require 'path'
compress = require 'compression'
device = require 'express-device'
csurf = require 'csurf'
helmet = require 'helmet'
app = do express
HttpError = require('error').HttpError
recaptcha = require('express-recaptcha')
if config.get('RHC') == 'true'
recaptcha.init('6LecfAcTAAAAAAjbB8n9Z_B75h5Q8fbjQ0pj0LYy', '6LecfAcTAAAAAHp-P0AEYHOfQEE7FKKAWpTguUAq')
else if config.get('HEROKU') == 'true'
recaptcha.init('6LdGgAcTAAAAAPWf7_1bf0kdYuTsHfOBfN1RYRSk', '6LdGgAcTAAAAAEIMcJLrpz2flhw2FxqO-SW3cPcd')
else
recaptcha.init('6LebMgUTAAAAAMCI9cURMlkmwo2Dx9Sx2LI9P34F', '6LebMgUTAAAAAOVWadcVXAvkkfc9kMn0VXqtmSeq')
app.use(require './middleware/sendHttpError')
app.use do helmet
app.disable 'x-powered-by'
app.set 'views',path.join(__dirname, 'views')
app.set 'view engine','jade'
app.use favicon(__dirname + '/public/favicon.ico')
app.use do compress # GZIP сжатие
if config.get('DEBUG_LOCAL') == 'true'
app.use express.static(path.join(__dirname, 'public'))
else
app.use express.static(path.join(__dirname, 'public'),maxAge: 2592000000)
logger = require 'morgan'
if app.get('env') == 'development'
app.use logger 'dev'
else
app.use logger 'default'
app.use do bodyParser.json
app.use bodyParser.urlencoded(extended: true)
app.use do cookieParser
app.use do device.capture
device.enableDeviceHelpers ap
#инициализация сесии 7дн. (session + user._id))
require('./libs/session')(app)
app.use do csurf
app.use (req, res, next)->
res.locals.csrfToken = req.csrfToken()
next()
app.use(require './middleware/subFunctions')
require('./libs/passport')(app)
require('./routes')(app)
# catch 404 and forward to error handler
app.use (req, res, next)->
next(404)
# error handler
app.use (err, req, res, next) ->
if typeof err == 'number'
err = new HttpError(err)
if err instanceof HttpError
res.sendHttpError err
else
if app.get('env') == 'development' #TODO log error
res.sendHttpError err
else
console.error err
err = new HttpError(500)
res.sendHttpError err
module.exports = app
module.exports = (app)->
require('./site')(app) # Роутеры сайта
require('./api')(app) #Роутеры API
require('./admin')(app) # Роутеры Адм. панели
#TODO - Удалить или закоментировать в продакшене
app.get '/session',(req,res)->
os = require('os')
info =
gay :process.memoryUsage()
tmpdir : os.tmpdir()
endianness : os.endianness()
hostname : os.hostname()
type : os.type()
platform : os.platform()
arch : os.arch()
release : os.release()
uptime : os.uptime()
loadavg : os.loadavg()
totalmem : os.totalmem()
freemem : os.freemem()
cpus : os.cpus()
networkInterfaces : os.networkInterfaces()
EEOL : os.EOL
res.json
info : info
user : req.user
session:req.session
ПРИЛОЖЕНИЕ Б
Таблица стилей web-приложения
@media (max-width:767px)
.google-lol
margin: 6px 0
#intro
@media (min-width:768px)
height 100%
overflow hidden
#transform-head
background url(../img/bg.jpg) no-repeat top center
background-size cover
@media (min-width:768px)
height 100%
padding-top 70px
.slogan,
.scroll
text-align center
color #fff
.slogan
text-shadow -1px 1px 1px #000
font-family "Lobster","PT Sans", sans-serif
.who
font-size 3em
color gold
font-size 35px
.that
padding 0 50px
margin-top 7%
text-decoration none
font-size 2em
// Мобилки
@media (max-width:767px)
display none !important
h4
font bold 2em/1em "Open Sans Condensed"
sizeMainScrool = 60px
.scroll
text-align center
font-size (sizeMainScrool / 2)
width sizeMainScrool
height sizeMainScrool
border 2px solid
border-radius 50%
line-height sizeMainScrool
animation-delay 1s
// animation-iteration-count infinite
@media (max-width:767px)
display block
margin 10px auto
@media (min-width:768px)
&,
.slogan
position relative
.scroll
display inline-block
position absolute
bottom (sizeMainScrool / 2)
right 48%
right -webkit-calc(50% - 30px)
right -moz-calc(50% - 30px)
right calc(50% - 30px)
#text-print
.blue-block
background #99CCFF
padding 10px
ul
margin-left 10px
.leftimg
float left
margin 15px 15px 15px 0
.rightimg
float right
margin 15px 0 15px 15px
height 300px
overflow hidden
position relative
&.pre
&:after
content ''
position absolute
background-image linear-gradient(0deg, #FFF,transparent)
bottom 0
width 100%
height 100px
#hot-info
.body
list-style none
.title-hot
font-size 20px
color #555
.date-hot
background-color #AF3A3A
color white
display inline-block
padding 3px 5px
margin-right 10px
// Мобилки
@media (max-width:767px)
li
padding 3px
margin-bottom 20px
// НЕ Мобилки
@media (min-width:768px)
li
padding 10px 20px
&:hover
box-shadow 0 0 10px rgba(0,0,0,.3)
#sitenews
padding-bottom 30px
h3
font-family "Open Sans Condensed"
@media (max-width:767px)
font-size 1.3em
margin 15px 0
.list-news
list-style none
a
color #616161
font-size 15px
// Мобилки
@media (max-width:767px)
li
margin-bottom 20px
border-bottom 1px solid #D6D6D6
.date
position absolute
top 0px
left 30px
width 40px
padding 10px 0px
background none repeat scroll 0% 0% rgba(62, 62, 62, 0.7)
text-align center
z-index 1
span
display block
color #FFF
.media
position relative
h3
color #616161
font-size 16px
line-height 26px
margin-top 20px
img
transition transform .3s cubic-bezier(0.68, -0.55, 0.265, 1.55)
&:hover
transform scale(1.3) rotate(6deg)
.day
font-size 25px
font-weight bold
.month
font-size 14px
.news-img
width 100%
border-radius 3px
overflow hidden
img
width 100%
.load
margin 30px auto 0 auto
#people
.micro
text-align center
// Мобилки
@media (max-width:767px)
border-bottom 1px solid
//НЕ мобилки
@media (min-width:768px)
margin 0 auto
width 100%
overflow auto
&:hover .info-people
opacity 1
transform translate3d(0,0,0)
transition transform .3s ease-out,opacity .2s .1s
.subtitle
font-style italic
font-size .8em
.info-people
text-align left
display inline-block
li ul
padding-left 20px
@media (min-width:768px)
position relative
transform translate3d(0,-100%,0)
opacity 0
// transition transform .3s ease-out,opacity .1s .2s
.avatar-img
width 50%
margin 0 auto
height auto
border-radius 50%
overflow hidden
box-shadow 0 0 0 3px #FFF, 0 0 10px 3px rgba(0, 0, 0, 0.1)
.avatar программирование прибыль экономический
width 80%
margin 15px auto
// Мобилки
@media (max-width:767px)
.avatar-img
width 55%
margin 0 auto
#gallery
.fluid
width 100%
overflow auto
heigtPhotoBlock = 260px
.col-my-2
width 20%
display inline-block
float left
background url(../img/poptrox/loader.gif) no-repeat center center,#fff
img
min-height heigtPhotoBlock
display block
.link-zomm
img
transition transform .3s ease-in-out
&:hover img
transform scale(1.1)
display block
height heigtPhotoBlock
overflow hidden
position relative
&:after
thisSize=50px
position absolute
border-radius 50%
border 1px solid #FFF
color #FFF
left 50%
top 50%
width thisSize
height thisSize
text-align center
margin-left (- thisSize / 2)
margin-top (- thisSize / 2)
transition all 0.3s ease 0s
opacity 0
transform scale(0)
content '\e80c'
font 20px/thisSize "fontello"
&:hover:after
opacity 1
transform scale(1)
.lazy-loaded
opacity 1
#feedback
padding-bottom 20px
.list-fb
list-style none
padding 0
li
font-size 1.2em
line-height 1.5em
i
color #666 !important
margin-right 10px
.contact
margin 15px 0
font-weight bold
//НЕ мобилки
@media (min-width:768px)
.submit
width auto
#map-bargu
height 400px
box-sizing content-box
border 2px dashed
.container>h2
margin-top 15px
text-align center
font 45px/45px 'Lobster'
text-shadow 2px 2px white,3px 3px #666
&>i
font-size 23px
text-shadow none
color #CCC
display block
.ui
background url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBmaWxsPSIjQjNCM0IzIiBzdHJva2U9IiM5OTkiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgZD0iTTEwIDEyTC00LTJsMTQtMTRMMjQtMnoiLz48L3N2Zz4=") top repeat-x, #fff
padding-bottom 20px
hr
margin 20px 0
.load
colorBase = #8E44AD
user-select none
background none
outline none
border 2px solid colorBase
border-radius 100px
color colorBase
padding 5px 20px
transition background .3s,color .3s, transform .1s
cursor pointer
display inline-block
&:active
transform translate3d(0,3px,0)
&:hover
background colorBase
color white
i
padding-right 5px
&:disabled
&:hover
background inherit !important
color inherit !important
cursor not-allowed
colorBase = #73598E
border 2px solid colorBase
color colorBase
//НЕ мобилки
@media (min-width:768px)
.ui
box-shadow 0 0 10px #666
// Мобилки
@media (max-width:767px)
.hide-mobile
display none !important
.container>h2
font 30px/30px 'Lobster'
font-smoothing-on()
-webkit-font-smoothing antialiased
-moz-osx-font-smoothing grayscale
bfs = 16px
blh = bfs*1.5
gr = 3px
gc = #0080FF
heigthHeader = 75px
heigthFooter = 50px
BBBBcolor = #2BA2CE
BBBBcolor = darken(BBBBcolor,10)
*,
*:before,
*:after
box-sizing border-box
html,
body
height 100%
html
-ms-text-size-adjust 100%
-moz-text-size-adjust 100%
-webkit-text-size-adjust 100%
body
margin 0
opacity 1 !important
color #666
font bfs/blh 'PT Sans', Arial, sans-serif,sans
font-smoothing-on()
background #fff
// background: url('../img/bg/bgtr.svg') top right no-repeat,
// url('../img/bg/bgbl.svg') bottom left no-repeat,
// url('../img/bg/bgbl.svg') bottom left no-repeat,
// url('../img/bg/overlay.png'),
// linear-gradient(45deg, #b39c68, #a56365, #412e4c);
a
text-decoration none
&:hover
text-decoration underline
hr
box-sizing content-box
border none
border-top 1px solid #9C9C9C
opacity .5
ul
padding: 0
input
border 0
outline 0
.hidden
display none
.warning
background #CC2E39
padding 10px
color #FFF
transform-origin top center
transition display .3s linear
.anim-border
display none
transform scale( 1.02, 1.08 )
padding 4px
background #fff
margin-bottom 15px
colorGradient = #858585
background repeating-linear-gradient(45deg, transparent, transparent 50px, colorGradient 50px, colorGradient 87px) repeat
animation linear 5s infinite linear
.dis-hover
& *
pointer-events none !important
.justify
text-align justify
.center
text-align center
#footer,
#header
width 100%
color #fff
#header
z-index 99
fixed top left right
height 75px
padding 10px 0
transition all .3s ease-in
#footer
height heigthFooter
#wrapper
min-height 100%
margin-bottom -(heigthFooter)
&:after
content ""
display block
height heigthFooter
#nav-btn
display none
text-align center
color white
font-size 1.5em
padding 10px 0
font-weight bold
background-color #1F7493
i:before
transition transform .3s
.rotate-180:before
transform: rotate(180deg)
.nav
float right
BBBBcol = #fff
li
display inline-block
background-color: rgba(BBBBcol,.5)
transition all .3s ease
button
background none
outline none
border none
width: 100%;
a
button
text-decoration none
transition all .3s ease
font 1.4em/50px "Open Sans Condensed"
@media (max-width:1020px)
font-size 1.3em
color black
display inline-block
height 50px
padding 0 5px
border-bottom 0px solid #fff
&.active,
&:hover
border-bottom-width 4px
background rgba(BBBBcol, .3)
.test
position relative
&:hover .counter
transform rotate(360deg)
.counter
position absolute
line-height 22px
padding 0px 6px
font-weight 700
font-size .7em
background #E64C65
border-radius 100%
top -5px
right -1px
transition all .3s ease-in-out
height 22px
width 22px
color #FFF
text-align center
#header.top-nav-collapse
box-shadow 0 0 15px black
background BBBBcolor
background linear-gradient(0deg,rgba(BBBBcolor, .8),BBBBcolor 70%)
padding 0
.nav
li
background none
button
a
color white
display inline-block
height 75px
line-height 75px
&.active,
&:hover
background rgba(#000, .3)
.counter
top 5px
right 3px
#footer
background BBBBcolor
#posters-gallery
img
border 2px solid transparent
border-radius 3px
transition border-color .3s ease-in-out,transform .5s cubic-bezier(0, 1.01, .61, 1.47)
@media (max-width:767px)
border-color #EB9F14
@media (min-width:768px)
&:hover
border-color #EB9F14
transform scale(1.1)
@media (max-width:767px)
margin: 0 auto
margin-bottom 10px
.row
margin-top 15px
@media (min-width:768px)
.grayscale
transition filter .3s
-webkit-filter grayscale(100%)
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale")
filter: s('gray')
&:hover
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
-webkit-filter grayscale(0)
.form
max-width 400px
margin 20px auto
width 100%
background rgba(170, 170, 170, 0.5)
padding 15px
border-radius gr
box-shadow 0 0 10px rgba(0,0,0,.3)
.txt
margin-bottom 10px
border 2px dashed #2BA2CE
padding 10px 15px
transition .2s all linear
width 100%
&.invalid
animation input-invalid 2s infinite alternate
border-color red
.submit
font-size bfs * 1.3
color #2BA2CE
width 100%
margin-top 10px
padding 7px 20px
cursor pointer
color #ECF0F1
text-shadow 0 1px 2px rgba(0,0,0,0.2)
background #2ecc71
box-shadow 0 5px 0 #27ae60, 0 5px 10px rgba(0, 0, 0, 0.3)
border-radius 5px
&:disabled
&:hover
box-shadow 0 5px 0 #5A8366, 0 5px 10px rgba(0, 0, 0, 0.3)
&:active
top 0
cursor not-allowed
background #679475
box-shadow 0 5px 0 #5A8366, 0 5px 10px rgba(0, 0, 0, 0.3)
&:hover
box-shadow 0 5px 0 #27ae60,0 5px 10px rgba(0,0,0,0.5)
&:active
position relative
top 2px
box-shadow 0 3px 0 #27ae60,0 5px 10px rgba(0,0,0,0.5)
.auth
font 40px/50px 'Lobster'
text-align center
color white
text-shadow 0 0 3px rgba(0,0,0,.3)
display block
cursor default
user-select none
.providers
text-align center
margin-top 30px
a
display inline-block
width 55px
height 55px
font-size bfs*2
text-decoration none
margin-right 10px
text-shadow 0 0 1px black
border-radius 100%
line-height 55px
box-shadow inset 0 0 5px rgba(0,0,0,.3)
transition color .3s,box-shadow .3s
&:hover
color white
text-shadow 0 0 5px rgba(255,255,255,.5)
.icon-vk
color #45668e
&:hover
box-shadow inset 0 0 0 40px #45668e
.icon-facebook
color #3b5998
&:hover
box-shadow inset 0 0 0 40px #3b5998
.icon-yandex
color #D8232A
&:hover
box-shadow inset 0 0 0 40px #fc0
.g-recaptcha
margin-top 10px
@keyframes linear
from
background-position 0 0
to
background-position 370px 0
@keyframes input-invalid
colorRed= rgba(255, 0, 0, .3)
0%
box-shadow inset 0 0 0 colorRed
100%
box-shadow inset 0 0 10px colorRed
heigthFooter = 50px
@media (min-width:768px)
.massage
padding 20px 0
.nav
display block !important
#fix-head
height 75px
@media (max-width:767px)
#header
position static
height auto
background darken(#2BA2CE,10)
#fix-head
display none !important
width 0
height 0
.nav
float none
display none
text-align center
li
display block
a
width 100%
&.active,
&:hover
border-bottom none
border-left 4px solid #0E8487
.counter
top 25%
left calc(50% + 30px)
right 0
#nav-btn
display block
.form
box-shadow none
border-radius 0
width auto
darkk = #292929
lightt = #efefef
redd = #4183D7
greenn = #9CBFEB
#question-body
display none
.hidden-radio
opacity 0
position relative
transform translate(70px,13px)
&:invalid + .button-label
box-shadow 0px 5px 5px rgba(255, 43, 43, .5), inset 0 -3px 0 rgba(0, 0, 0, .2)
.button-label
display inline-block
padding 20px 35px
margin .5em
cursor pointer
color darkk
border-radius .25em
background lightt
box-shadow 0 3px 10px rgba(0, 0, 0, .2), inset 0 -3px 0 rgba(0, 0, 0, .2)
transition .2s
user-select none
font-size 1.5em
font-width bold
&:hover
background darken(lightt, 10%)
color darken(darkk, 10%)
box-shadow 0 3px 10px rgba(0, 0, 0, .2), inset 0 -3px 0 rgba(0, 0, 0, .3)
&:active
transform translateY(2px)
box-shadow 0 3px 10px rgba(0, 0, 0, .2), inset 0px -1px 0 rgba(0, 0, 0, .2)
.hidden-radio:checked + .button-label
background greenn
color lightt
&:hover
background darken(greenn, 5%)
color darken(lightt, 5%)
.submit.test
width auto
.text-question
padding 20px
font-size 1.3em
transition box-shadow .2s ease-in-out
box-shadow 0 0 10px rgba(0, 0, 0, .1)
&:hover
box-shadow 0 0 20px rgba(0, 0, 0, .2)
.questions-form
margin 20px
#minimal
display inline-block
padding 10px
margin-left 10px
background-color #CC6161
color white
border-radius 40px
transition opacity .3s
#values
.checkboxi
transform translateY(5px)
display inline-block
margin-right 10px
label
cursor pointer
list-style none
li
padding 5px
input[type=checkbox]
cursor pointer
height 30px
position absolute
opacity 0
width 30px
z-index 2
& + span
background #666
border-radius 50%
box-shadow 0 2px 3px 0 rgba(0,0,0,.1)
display inline-block
height 30px
// margin 4px 0 0
position relative
width 30px
transition all .2s ease
&::before
height 16px
left 13px
top 7px
-webkit-transform rotate(-45deg)
transform rotate(-45deg)
&::after
height 16px
right 13px
top 7px
-webkit-transform rotate(45deg)
transform rotate(45deg)
input[type=checkbox] + span::before, input[type=checkbox] + span::after
background #fff
content ''
display block
position absolute
width 4px
transition all .2s ease
input[type=checkbox]:checked
& + span
background #2ecc71
&::before
height 9px
left 9px
top 13px
-webkit-transform rotate(-47deg)
transform rotate(-47deg)
&::after
height 15px
right 11px
top 8px
media (max-width:767px)
.questions-form
margin 20px 0
.text-question
padding 5px
box-shadow none
.submit.test
width 100%
.title-test
font-size 25px
.button-label
padding 15px 25px
margin .3em
ПРИЛОЖЕНИЕ В
Разметка web-страниц
mixin header
header#header(class=landing ? '':'top-nav-collapse')
.container
.row
.logo.col-sm-4
a(href="/"): img.img-responsive(src="/assets/img/logotype.svg", alt="",width="260",heigth="75")
.head-menu.col-sm-8
ul.nav
li
a(href="/search")
i.icon-search
| Поиск
if user
li.test: a(href="/test")
i.icon-list-alt
| Тесты
if user.testCount
.counter=user.testCount
li: a(href="/project")
i.icon-garden
| Проекты
li: a(href="/posters")
i.icon-picture
| Постеры
if user
if user.isAdmin
li: a(href="#{_server.secretPage}")
i.icon-cogs
| Управление
else
li: a(href="/user")
i.icon-user
| Профиль
li
form(action='/logout',method="post")
input(type="hidden",name="_csrf",value="#{csrfToken}")
button(type='submit')
i.icon-logout
| Выход
else
li: a(href="/signup")
i.icon-user-add
| Регистрация
li: a(href="/login")
i.icon-login
| Вход
#nav-btn
i.icon-circle-down
| Меню
<!DOCTYPE html>
html(lang="ru")
head
block head
script.
LOCAL_BEDUG = true
function loadCss(s){var e=document.createElement("link");e.type="text/css",e.rel="stylesheet",e.href=s,document.getElementsByTagName("head")[0].appendChild(e)}
script
include ../public/assets/js/load-font.js
noscript
link(rel="stylesheet", href="/assets/css/font-face.css")
include inc/icons.jade
meta(name='yandex-verification',content='45627696ba23d0bb')
meta(name="google-site-verification",content="vjrGAMlp1BV4jmXTqO9qrLPbJs9W116IBVI72m1D7Zw")
meta(charset="utf-8")
meta(http-equiv="X-UA-Compatible",content="IE=edge")
meta(name="viewport",content="width=device-width, initial-scale=1")
body
if !landing
#wrapper
+header
#fix-head
block content
else
+header
block content
footer#footer
.container Copyright © 2015, Отдел ... | Сайт Баргу <a title="Сайт Баргу" href="http://barsu.by">barsu.by</a>
noscript
link(rel="stylesheet", href="/assets/cdn/bootstrap-min/b.css")
link(rel="stylesheet", href="/assets/css/style-styl.css")
link(rel="stylesheet", href="/assets/cdn/fontello/fontello.css")
script.
function loadAllCss(){["/assets/cdn/bootstrap-min/b.css","/assets/css/style-styl.css","/assets/cdn/fontello/fontello.css"].forEach(function(s){loadCss(s)})}window.addEventListener?window.addEventListener("DOMContentLoaded",loadAllCss,!1):window.attachEvent?window.attachEvent("onreadystatechange",loadAllCss):window.onload=loadAllCss;
//- // /Yandex.Metrika counter
script(type='text/javascript').
(function (d, w, c) {
(w[c] = w[c] || []).push(function() {
try {
w.yaCounter30734698 = new Ya.Metrika({id:30734698,
webvisor:true,
clickmap:true,
accurateTrackBounce:true});
} catch(e) { }
});
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script"),
f = function () { n.parentNode.insertBefore(s, n); };
s.type = "text/javascript";
s.async = true;
s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
if (w.opera == "[object Opera]") {
d.addEventListener("DOMContentLoaded", f, false);
} else { f(); }
})(document, window, "yandex_metrika_callbacks");
noscript
div
img(src='//mc.yandex.ru/watch/30734698', style='position:absolute; left:-9999px;', alt='')
//- // /Yandex.Metrika counter
block scriptsAndLinks
if local
script(data-main='/assets/js/require/mainG', src='/assets/cdn/require.js',async)
else
script(data-main='/assets/js/require/mainG', src='//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.17/require.min.js',async)
extends ../layout
append head
if _server
title="Восстановление пароля | " + _server.name
else
title Восстановление пароля
include cri/login
block content
if !user
.form
span.auth Восстановление пароля
if doneMsg
.anim-border(style="display:block"): .warning(style="background:#6FCC2E")!=doneMsg
else
if errMessage
.anim-border(style="display:block"): .warning!=errMessage
else
.anim-border: .warning
form#form-forgot(action="/forgot",method="post")
input(type="hidden",name="_csrf",value="#{csrfToken}")
label(for="email") Email:
input.txt#email(type="email", name="email", required, autocomplete="on",placeholder="Введите email",value="#{emailVal?emailVal:''}")
!=captcha
input.submit(type="submit",value="Восстановить пароль")
else
.massage
.container
h1 Вы уже авторизованны
extends ../layout
append head
if _server
title="Восстановление пароля | " + _server.name
else
title Восстановление пароля
include cri/login
block content
if !user
.form
span.auth Восстановление пароля
if doneMsg
.anim-border(style="display:block"): .warning(style="background:#6FCC2E")!=doneMsg
else
if errMessage
.anim-border(style="display:block"): .warning!=errMessage
form#form-forgot(action="/forgot/update",method="post")
input(type="hidden", name="passwordResetToken",value="#{passwordResetToken}")
input(type="hidden",name="_csrf",value="#{csrfToken}")
label(for="password") Новый пароль:
input.txt#password(type="password", name="password", required,placeholder="Введите пароль")
input.submit(type="submit",value="Обновить пароль")
else
.massage
.container
h1 Вы уже авторизованны
extends ../layout
append head
if hot
if _server
title=hot.title + ' | ' + _server.name
else
title=hot.title
block content
if hot
.container
br
h3=hot.dataString+' '+hot.title
hr
extends ../layout
append head
if _server
title=_server.name+' | '+_server.description
include cri/index
block content
section#intro
#transform-head
.container
.slogan
h2.who Педагоги-психологи БарГУ
h3.that Добро пожаловать на сайт педагогов-психологов Барановичского государственного университета, где вы можете получить самую актуальную информацию по психологии личности, влиянии социума и другие не менее интересные сведения.
h4 Наш сайт - это не ответ на все жизненные вопросы, это хороший способ получить необходимую информацию использовать которую придется вам самим!!!
a.scroll.mimiscroll.animated.shake(href='#sitenews')
i.icon-angle
section.ui#embodies
.container
h2 Суть психологической помощи
i.icon-circle-down
include inc/embodies.jade
if arrHotInfo && arrHotInfo.length != 0
include inc/hot.jade
if arrNews && arrNews.length != 0
section.ui#sitenews
.container
h2 Новости
i.icon-circle-down
include inc/news.jade
if is_phone == false
section#gallery.hide-mobile
.fluid
- var values = [{index:"1",comm:'Руководители и участники клуба "Молодая семья"'},{index:"2",comm:'Дебаты Студенческая - семья "за" или "против"'},{index:"3",comm:'Открытая молодежная площадка "Экзамены - установка на успех"'},{index:"4",comm:'Танцевальный тренинг - "Лидеры объединяйтесь!"'},{index:"5",comm:'Образовательный семинар - "Ты староста"'},{index:"6",comm:'Тренинг с элементами танцевальной терапии'},{index:"7",comm:'Образовательный семинар - "Кодекс старосты: 12 правил хорошего руководителя"'},{index:"8",comm:'Тренинг - "Имидж делового человека"'},{index:"9",comm:'Практикум - "Мы вместе"'},{index:"10",comm:'Тренинг групповой сплоченности'},{index:"11",comm:'Тренинг личностного роста'},{index:"12",comm:'Тренинг командообразования'}];
if severalRandom
- var keysRandPhoto = severalRandom(0,values.length-1,5)
if keysRandPhoto
each val in keysRandPhoto
.col-my-2
a.link-zomm.grayscale(href="/assets/img/gallery/#{values[val].index}.jpg")
img.lazylazy(src="/assets/img/poptrox/loader.gif",data-src="/assets/img/gallery/thumb/#{values[val].index}.jpg",title="#{values[val].comm}")
//- noscrip...
Подобные документы
Создание административной части сайта. Дизайн веб-сайта. Установка шаблона Joomla. Система администрирования. Определение прибыли и свободной отпускной цены программного средства. Обоснование экономической целесообразности проведения мероприятия.
дипломная работа [1,2 M], добавлен 02.09.2016Разработка редактора частиц "Easy Particles", позволяющего создавать несложные эффекты графики. Инсталляция программы, анализ ее надёжности. Модель и сборка приложения. Обоснование экономической целесообразности разработки программного средства.
дипломная работа [742,6 K], добавлен 09.09.2010Разработка тестирующего приложения, которое будет наглядно показывать, как должна выглядеть тестирующая программа для вычисления уровня интеллекта. Программная среда разработки, характеристика основных возможностей приложения. Стандартные диалоговые окна.
курсовая работа [716,9 K], добавлен 02.12.2013Основные этапы разработки web-сайта. Классификации современных бирж. Выбор программного средства для разработки сайта. Требования к сайту. Расчет прогнозируемой цены и прибыли на программное средство. Описание языков для разработки web–приложений.
дипломная работа [1,4 M], добавлен 02.09.2016Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.
курсовая работа [167,8 K], добавлен 18.01.2017Общая характеристика и структурная схема приложения, требования к нему и функциональные особенности, сферы практического применения. Обоснование выбора языка программирования. Описание интерфейса и инструкция пользователя. Проведение листинга программы.
дипломная работа [1,0 M], добавлен 10.07.2017Элементы объектно-ориентированного программирования. Среда Visual Studio: улучшения интегрированной среды разработки и увеличение ее производительности. Проектирование архитектуры программы и ее интерфейса. Использование двухуровневой системы приложения.
курсовая работа [516,8 K], добавлен 09.08.2015Требования к аппаратным и операционным ресурсам. Логическая и физическая организация. Состав основных классов проекта. Технико-экономическое обоснование разработки программного средства. Задержки при обработке данных. Разработка интерфейса приложения.
дипломная работа [4,4 M], добавлен 16.06.2017Проектирование структуры программы, принцип ее работы, сферы практического использования и оценка возможностей. Выбор и обоснование среды программирования. Разработка пользовательского интерфейса и модулей приложения. Проведение тестирования программы.
курсовая работа [637,7 K], добавлен 14.01.2015Технология создания многопоточных приложений в современных системах программирования с использованием языка C# в Visual Studio.NET. Разработка алгоритма и структуры программы. Описание и особенности тестирования приложения с разным количеством потоков.
курсовая работа [773,0 K], добавлен 14.03.2013Проверка и коррекция знаний учащихся в системе личностно ориентированной технологии образования с использованием тестирования. Подготовка материалов для компьютерного контроля знаний. Разработка проекта "тестирующая программа". Понятие и виды тестов.
дипломная работа [696,2 K], добавлен 16.06.2015Разработка приложения на базе скриптового языка программирования JavaScript, с использованием каскадных таблиц стилей CSS в среде программирования Bluefish Editor. Обоснование выбора инструментов. Применение клавиш управления памятью калькулятора.
курсовая работа [3,8 M], добавлен 22.06.2015Характеристика системы программирования. Главные составные части Delphi. Интерфейс программного приложения. Результаты работы программы. Руководство системного программиста и оператора. Язык программирования Delphi, среда компилятора Borland 7.0.
курсовая работа [1,6 M], добавлен 29.05.2013Разложение функции в ряд Тейлора, алгоритм работы программного интерфейса сокетов, исходный текст программ с комментариями. Возможности языка программирования Си и среда разработки приложений в ОС Linux. Виртуальная среда VMWare Player и VirtualBox.
лабораторная работа [1,8 M], добавлен 02.09.2014Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.
курсовая работа [1,6 M], добавлен 19.04.2017Обеспечение универсальности функций тестирования при разработке программы для тестирования студентов. Бесплатное программное обеспечение. Анализ выбора среды программирования. Особенности среды Delphi и СУБД MySQL. Описание алгоритма и блок-схемы.
курсовая работа [1,6 M], добавлен 01.02.2013Содержание и требования, предъявляемые к информации. Требования к аппаратным и операционным ресурсам. Проектирование справочной системы приложения. Входные и выходные данные. Описание программного средства. Проведение функционального тестирования.
курсовая работа [814,5 K], добавлен 24.01.2016Разработка приложения, которое будет выполнять функции показа точного времени и точной даты. Определение дополнительных функций разработанного приложения. Рассмотрение основных этапов создания программного продукта. Результаты тестирования приложения.
курсовая работа [2,2 M], добавлен 14.04.2019Главные составные части среды программирования. Требование к надежности, к составу и параметрам технических средств. Табличные базы данных. Выбор и обоснование выбора системы управления базами данных. Высокопроизводительный компилятор в машинный код.
курсовая работа [793,5 K], добавлен 31.01.2016Разработка программы для сбора и анализа информации об автобусах на парковке. Назначение и область применения. Алгоритм в словесной форме. Состав технических и программных средств. Разработка приложения в среде визуального программирования C++Builder 6.
курсовая работа [1,5 M], добавлен 06.09.2014