Диплом: Автоматизация учета рабочего времени сотрудников компании "Альтерон"

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
76
12. Начало работы с Node.js [Электронный ресурс] [Офиц. сайт]. URL:
https://medium.com/devschacht/node-hero-chapter-1-239f7afeb1d1 (дата обращения:
05.11.2019).
13. Руководство по Node.js, часть 3: хостинг, REPL, работа с консолью,
модули. [Электронный ресурс] [Офиц. сайт]. URL:
https://habr.com/ru/company/ruvds/blog/423701/ (дата обращения: 14.10.2019).
14. Сравнение языков программирования и фреймворков для них.
[Электронный ресурс] [Офиц. сайт]. URL: https://habr.com/ru/post/275445/ (дата
обращения: 14.10.2019).
15. Типы систем управления базами данных и их преимущества.
[Электронный ресурс] [Офиц. сайт]. URL: http://juice-
health.ru/programming/database/460-dbms (дата обращения: 10.10.2019).
77
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ 1. ЛИСТИНГ ПРОГРАММЫ
App/module:
const express = require('express');
const mongoose = require('mongoose');
const session = require('express-session');
const flash = require('connect-flash');
const passport = require('passport');
const cron = require('node-cron');
const screen = require('./config/screen');
const app = express();
// Passport config
require('./config/passport')(passport);
// Db Config
const db = require('./config/keys').MongoURI;
// Db connect
mongoose.connect(db, { useNewUrlParser: true,
useUnifiedTopology: true })
.then(() => console.log('MongoDB Connected...'))
.catch(err => console.log(err));
// View
app.set('view engine', 'pug');
app.use(express.static(__dirname + '/public'));
//Bodyparser
app.use(express.urlencoded({ extended: false }));
78
// Express Session
app.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true,
}));
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Connect flash
app.use(flash());
// Global Vars
app.use((req, res, next) => {
res.locals.error = req.flash('error');
res.locals.success = req.flash('success');
next();
})
// Routes
app.use('/', require('./routes/index'));
const PORT = process.env.PORT || 5000;
app.listen(PORT, console.log(`Server started on port ${PORT}`));
module/index.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
79
const User = require('../models/User');
const Session = require('../models/Sessions');
const smodule = require('../config/smodule');
const screen = require('../config/screen');
const cron = require('node-cron');
var task;
router.get('/', (req, res) => {
if (!req.isAuthenticated()) {
res.render('index', { title: 'Time-tracking Alteron'});
} else {
res.redirect('/dashboard')
}
});
// Login handler
router.post('/', (req, res, next) => {
passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/',
failureFlash: true
})(req, res, next);
})
router.get('/dashboard', (req, res) => {
task = cron.schedule("* * * * *", function() {
console.log("---------------------");
console.log("Running Cron Job");
screen.screenshot();
});
if (req.isAuthenticated() && req.user.name == "Pavel Pakhtanov") {
res.redirect('/admin');
80
} else if (req.isAuthenticated() && req.session.time) {
res.render('dashboard', { user: req.user.name, time: req.session.time });
} else if (req.isAuthenticated()) {
smodule.initSession(req);
req.session.time = new Date().toString();
res.render('dashboard', { user: req.user.name, time: req.session.time });
} else {
req.flash('error', 'Чтобы получить доступ к системе, необходимо
авторизоваться');
res.redirect('/');
}
});
//Logout handler
router.get('/logout', (req, res) => {
task.stop();
const timeStart = req.session.time;
console.log(`start: ${timeStart}\nend: ${new Date()}`);
smodule.sessionClosed(req, timeStart);
req.session.destroy((err) => {
req.logout();
res.redirect('/');
})
});
router.get('/admin', (req, res) => {
User.find({}, (err, data) => {
res.render('admin', { user: req.user.name, users: data });
});
});
81
router.get('/admin/:id', (req, res) => {
Session.find({user: req.params.id}, (err, data) => {
res.render('user_info', { user: req.user.name, sessions: data });
})
})
module.exports = router;
Sessions module:
const mongoose = require('mongoose');
const SessionSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
session_id: String,
timeWork: {
type: String,
},
dateStart: {
type: Date,
required: true
},
dateEnd: {
type: Date,
},
screenshots: [
{
82
type: String
}
]
});
const Session = mongoose.model('Session', SessionSchema);
module.exports = Session;
SMODULE:
//Session Model
const Session = require('../models/Sessions');
const fs = require('fs');
var cloudinary = require('cloudinary').v2;
cloudinary.config({
cloud_name: 'dizvqjwje',
api_key: '628951932649775',
api_secret: 'lLegU4hF8DYbBJzaTDAlvgSe0gY'
});
function sessionClosed(req, timeStart) {
let urls = [];
let items = fs.readdirSync('./uploads');
items.forEach((item) => {
cloudinary.uploader.upload("./uploads/" + item, (err, data) => {
urls.push(data.url);
})
});
setTimeout(() => {
83
Session.findOneAndUpdate({session_id: req.sessionID},
{ $set: { dateEnd: new Date(),
timeWork: getTotalTime(timeStart, new Date()),
screenshots: urls } }, (err) => {
if (err) {
console.log("Session is not updated");
}
});
}, 3000);
}
function initSession(req) {
const s = new Session({
user: req.user._id,
session_id: req.sessionID,
timeWork: '0',
dateStart: new Date(),
})
s.save();
}
function getTotalTime(a, b) {
let dayStart = new Date(a);
let dayEnd = new Date(b);
let diff = Math.abs(dayEnd - dayStart);
return new Date(diff).getUTCHours() + ":" + new Date(diff).getMinutes() +
":" + new Date(diff).getSeconds();
}
84
module.exports = {
sessionClosed: sessionClosed,
initSession: initSession
};
PASSPORT.JS:
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const passport = require('passport');
//User Model
const User = require('../models/User');
module.exports = (passport) => {
passport.use(
new LocalStrategy({ usernameField: 'email' }, (email, password, done) =>
{
// Match User
User.findOne({ email: email })
.then(user => {
if (!user) {
return done(null, false, { message: 'Пользователя с такой почтой
не существует' });
}
// Match password
if (user.password != password) {
return done(null, false, { message: 'Неверный пароль' });
85
}
return done(null, user);
})
.catch(err => console.log(err));
})
);
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
}

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)