хочу преобразовать мое веб-приложение в настольное приложение с сохранением данных

Я создал веб-приложение для расчета заработной платы и использовал для его создания mysql и node js. Проблема в том, что я не знаю, как преобразовать его в настольное веб-приложение. Я использовал для этого модуль node-mysql, поэтому мне нужно что-то изменить сейчас или просто преобразовать его с помощью node webkit?

Как это работает на самом деле?

Вот как теперь выглядит мой server.js. Итак, нужно ли мне снова вносить какие-либо изменения в код?

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');
var app = express();
var mysql = require('mysql');
//var ejsLint=require('./server.js');
//ejsLint.lint('attendance-data.ejs', '-p');
var connection = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'',
    database:'employees',
    multipleStatements:true
});

app.set('view engine','ejs');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/', function (req,res){
    res.render('index');
});
var daValue=227.30;
app.get('/da',function(req,res){
    res.render('da');
});
app.post('/da-data',function(req,res){
    daValue = Number(req.body.da);
        var data = {da :daValue};
           console.log('da is :',daValue);

    res.render('da-data.ejs',data);
});

app.get('/add-employee',function(req,res){
    res.render('add-employee');
});

app.post('/add-employee',function(req,res){
    res.status(200).send();
    console.log('employee '+req.body.name + ' added');
});

connection.connect(function(err){
    if(err){
        console.log('Error connecting to Db');
        return;
    }
    console.log('Connection established');
});

app.post('/form',function (req,res){
    //employee details from add-employee.html page
var name=req.body.name;
var designation = req.body.designation;
var pan = req.body.pan;
var aadhar = req.body.aadhar;
var bank = req.body.bank;
var basicSalary = req.body.salary;
var allowance = req.body.allowance;
var grossSalary = req.body.salarygross;
var esi = req.body.esi;
var uan = req.body.uan;


var details = {name:name,designation:designation,pan:pan,aadhar:aadhar,
    bank:bank,basic_salary:basicSalary,other_allowances:allowance,gross_salary:grossSalary,esi:esi,uan:uan};
    // for sending data as objects into database
    // use {name of database column : name of the variable where it's value is stored}
    // example {wages_rate is the name of database column : wagesRate is the variable where
        // value is stored}

var query = connection.query('INSERT INTO employee_details SET ?',details,function(err,result){
    if(err){
        console.log(err);
    }
    console.log(query.sql);
}); 

res.status(200).send('employee ' + name + 'with salary of '+salary+ ' added');

});

app.get('/show',function (req,res){
    connection.query('SELECT * FROM employee_details',function(err,rows){
  if(err) throw err;

  console.log('Data received');
  console.log(rows);
   var data ="Id "+"<strong>" +" name "+" designation "+" uan"+"</strong>";
  for(var i=0;i<rows.length;i++){
    data = data+"<br>" + (i+1)+". "+rows[i].name +" "+rows[i].designation+" "+rows[i].uan+"<br>";
  }

 res.send(data);
});
});

     var rowsLength;
     var salaryFromRow;
     var salaryArr=[];
     var allowanceFromRow;

     var allowanceArr=[];
     var designationArr=[];
app.get('/attendance',function (req,res){
    connection.query('SELECT * FROM employee_details',function(err,rows){
  if(err) {
    throw err;
   }else{
      rowsLength = rows.length;

     for(var i=0;i<rowsLength;i++){
        salaryFromRow = rows[i].salary;
        salaryArr.push(salaryFromRow);
        allowanceFromRow = rows[i].allowance;
        allowanceArr.push(allowanceFromRow);
        designationArr.push(rows[i].designation);
        console.log('designation is ',designationArr);
     }





    res.render('attendance',{rows:rows});
   }


});
});


app.post('/attendance-data',function(req,res){
    var uanFromHtml;

    var nameFromHtml;

    var  daysPresent;
    var attendance;
    var nameForm;
    var designation;
    var monthFromHTML;
    var t;
    var realBasicSalary;
    var realOtherAllowances;
    var realGrossSalary;
    var pfBasic;
    var esiGross;
    var pTax=0;
    var netAmount;
    var advance=0;
    var finalData = [];
    for(var i=1;i<=rowsLength;i++){
        var dataArr = [];
        var finalTable = [];

        attendance = "attendance"+i;
        t=i-1;
        salaryForPerson = salaryArr[i];
        allowanceForPerson = allowanceArr[i];
        console.log('req.body is ', req.body);


        daysPresent = Number(req.body[attendance]);
        nameFromHtml = req.body.name[t];
        var nameArr = req.body.name;
        uanFromHtml = req.body.uan[t];
        monthFromHTML = req.body.monthyear;

        var uanArr = req.body.uan;
        realBasicSalary = Math.ceil((req.body.basicsalary[t])*(daysPresent/30)) ;
        realOtherAllowances = Math.ceil((req.body.otherallowance[t])*(daysPresent/30));
        realGrossSalary = Math.ceil((req.body.grosssalary[t])*(daysPresent/30));
            console.log('realBasicSalary is '+realBasicSalary+' and realGrossSalary is  '+realGrossSalary+' and realOtherAllowances is '+ realOtherAllowances);
        pfBasic = Math.ceil((12/100)*realBasicSalary);
        esiGross = Math.ceil((1.75/100)*realGrossSalary);

        if(realBasicSalary>10000 && realBasicSalary<=15000){
            pTax = 110;
        }else if(realBasicSalary>=15001 && realBasicSalary<=25000){
            pTax = 130;
        }else if(realBasicSalary>=25001 && realBasicSalary<=40000){
            pTax = 150;
        }else if(realBasicSalary>=40001){
            pTax = 200;
        }
            netAmount = realGrossSalary - (pTax + pfBasic + esiGross + advance);

        console.log('realGrossSalary is '+realGrossSalary + ' and realBasicSalary is '+realBasicSalary+
            'pTax is '+ pTax+ 'pfBasic is '+pfBasic +'esiGross is '+esiGross);

        console.log('namefromhtml is : ', nameFromHtml);
        console.log('attendance is :',attendance);
        console.log('days present is :',daysPresent);
        console.log('monthyear is : ',monthFromHTML);
        dataArr.push(monthFromHTML,uanFromHtml,nameFromHtml,daysPresent,realBasicSalary,realOtherAllowances,realGrossSalary,pTax);

        finalData.push(dataArr);
    /*  uanArr.push(uanFromHtml);
        nameArr.push(nameFromHtml);
        daysArray.push(daysPresent);
        */

        console.log('dataArr is : ',dataArr);
        console.log('finalData is  : ',finalData);

    }
        var attendanceData = {monthyear :monthFromHTML,rows:rowsLength,uanarr:uanArr,designationarr:designationArr,
        namearr:nameArr,finaldata:finalData,realbasicsalary:realBasicSalary,realgrosssalary:realGrossSalary,ptax:pTax,advance:advance};

    connection.query("INSERT INTO attendance_details(month_year,uan,name,days_present,real_basic_salary,other_allowances,gross_salary,ptax) VALUES ?", 
        [finalData], function(err) {
    if (err){
     var errors = err;
     console.log(errors);
     res.send(errors);
 }else{


    //put database query for inserting values here
    res.render('attendance-data.ejs', attendanceData);
 }

});

});

/*
app.get('/final',function(req,res){
    connection.query('SELECT name,designation,salary,wages_rate FROM employee_details;SELECT uan,da,days_present,total_wages FROM attendance_details;',function(err,rows){
    if(err){
        console.error('MySQL — Error connecting: ' + err.stack);
    }else{
        var rowsNumber = rows.length;
      console.log('rows is :',rows);
    var nameFinal;
    var designationFinal;
    var salaryFinal;
    var wagesrateFinal;
    var uanFinal;
    var daFinal;
    var daysFinal;
    var totalwagesFinal;
    var nameFinalarr = [];
    var designationFinalarr =[];
    var salaryFinalarr = [];
    var wagesrateFinalarr =[];
    var uanFinalarr =[];
    var daFinalarr =[];
    var daysFinalarr = [];
    var totalwagesFinalarr =[];



    for(var i=0;i<rowsNumber;i++){
        nameFinalarr.push(rows[i].name);
        designationFinalarr.push(rows[i].designation);
        salaryFinalarr.push(rows[i].salary);
        wagesrateFinalarr.push(rows[i].wages_rate);
        uanFinalarr.push(rows[i].uan);
        daysFinalarr.push(rows[i].da);
        daysFinalarr.push(rows[i].days_present);
        totalwagesFinalarr.push(rows[i].total_wages);

    }
        console.log('nameFinalarr is :', nameFinalarr);
        console.log('daysFinalarr is :', daysFinalarr);
    }

    res.render('final',{rows:rowsNumber,name:nameFinal,designation:designationFinal,salary:salaryFinal,wagesrate:wagesrateFinal,uan:uanFinal,da:daFinal,
        days:daysFinal,
        totalwages:totalwagesFinal});
  });

});
*/

app.get('/select-month',function(req,res){
    connection.query('SELECT month_year,name FROM attendance_details',function(err,rows){
        if(err){
            throw err;
        }else{

            var rowsLength = rows.length;
            console.log('rows is ',rows);

            res.render('select-month.ejs',{rows:rows});
        }
    });


});

app.get('/salary-sheet',function(req,res){
    var month = req.query.selectpicker;
    var employeeName = req.query.selectpicker2;
    console.log('employeeName is ',employeeName);
    connection.query('SELECT * FROM attendance_details WHERE month_year='+"'"+month+"' AND name='"+employeeName+"'",function(err,rows){
        if(err){
            throw err;
        }else{
            var rowsLength = rows.length;
            console.log('rows is ',rows);
            var uanarr=[];
            var namearr=[];
            var daysarr=[];
            var realBasicSalaryarr=[];
            var realOtherAllowancesarr=[];
            var grossSalaryarr=[];
            var ptaxarr=[];
            var advance=0;
            for(var i=0;i<rowsLength;i++){
                uanarr.push(rows[i].uan);
                namearr.push(rows[i].name);
                daysarr.push(rows[i].days_present);
                realBasicSalaryarr.push(rows[i].real_basic_salary);
                realOtherAllowancesarr.push(rows[i].other_allowances);
                grossSalaryarr.push(rows[i].gross_salary);
                ptaxarr.push(rows[i].ptax);

            }
            console.log('realBasicSalaryarr is ',realBasicSalaryarr);
            console.log('namearr is ',namearr);
            res.render('salary-sheet.ejs',{advance:advance,rows:rows,monthyear:month,uanarr:uanarr,namearr:namearr,daysarr:daysarr,basicsalaryarr:realBasicSalaryarr,
                realotherallowancesarr:realOtherAllowancesarr,realgrosssalaryarr:grossSalaryarr,ptaxarr:ptaxarr});
        }
    });


});



app.get('/add-company',function(req,res){
     res.render('add-company.ejs');
});

app.get('/style.css',function(req,res){
    res.sendFile(path.join(__dirname,'/style.css'));
});

app.get('/main.js',function(req,res){
    res.sendFile(path.join(__dirname,'/main.js'));
});

app.get('/cmain.js',function(req,res){
    res.sendFile(path.join(__dirname,'/cmain.js'));
});

var port=8080;
app.listen(8080,function(req,res){
   console.log(`Payroll app listening on port ${port}!` );
});

Не могли бы вы рассказать мне, как преобразовать это в настольное приложение?


person faraz    schedule 07.03.2017    source источник
comment
Проблема с MySQL заключается в том, что она должна работать на целевой машине или в сети, если вы хотите, чтобы она работала как настольное приложение. Вам нужно, чтобы это настольное приложение работало независимо от вашего сервера, или вам просто нужно обернуть свое веб-приложение, чтобы оно выглядело как настольное приложение? Другими словами, вы хотите создать более традиционное автономное веб-приложение?   -  person Ewald    schedule 07.03.2017
comment
ну, я думаю, они делали ремонтные работы, когда я попытался опубликовать ответ здесь. надеюсь на этот раз пройдет. В любом случае, я хочу подарить это кому-нибудь. и я хочу дать ему файл или исполняемый файл, который он может установить на свою машину. ему не нужно запускать сервер или вообще что-либо делать с mysql. просто хочу сообщить вам, что я использую здесь node-mysql. Я согласен с использованием электронного или узла webkit или чего-либо еще, что может помочь мне преобразовать это в настольное приложение. будут рады вашим предложениям по этому поводу. Благодарность   -  person faraz    schedule 07.03.2017
comment
Ах, в таком случае у вас не возникнет особых трудностей с использованием NWJS для этой задачи. Он объединяет браузер и среду Node в одно целое. Таким образом, приложение будет своим собственным сервером и клиентом.   -  person Ewald    schedule 07.03.2017
comment
так что @Ewald, не могли бы вы сказать, как это сделать? Я не уверен, как сделать даже первый шаг. Я прочитал много статей, но это сбивает с толку   -  person faraz    schedule 08.03.2017


Ответы (2)


Чтобы это работало в автономном режиме, другими словами, автономно, вам нужно пересмотреть свой подход к сохранению. MySQL - это не то, что я бы попытался связать с приложением. В идеале вы бы использовали что-то из ссылки, предложенной Yonghoon Lee, так как вам нужно, чтобы приложение имело встроенную базу данных, а не внешнюю.

Мне удалось сделать что-то подобное, хотя переход на IndexDB означал, что мне пришлось переписать все мои запросы, поскольку это база данных NoSQL. Пожалуйста, воздержитесь от использования базы данных Web SQL, она не является стандартной и может исчезнуть в любой момент.

Кроме этого, я не вижу ничего, что было бы очевидной проблемой для преобразования в приложение NWJS. Вы можете обратиться к официальной документации, где приведены некоторые примеры того, как начать работу.

person Ewald    schedule 07.03.2017
comment
не могли бы вы дать мне пошаговую разбивку, как это сделать? Я прочитал много статей, и это становится все более и более запутанным. я не знаю, что делать. - person faraz; 08.03.2017
comment
Могу ли я смиренно предложить вам проработать три примера на странице docs.nwjs.io/en/latest/For%20Users/Getting%20Started/, поскольку он покажет вам, как работает экосистема NW.js. Они начинаются с простого добавления, затем добавляют некоторые функции NW.js и, наконец, показывают, как использовать Node.js для создания собственного встроенного сервера. Это реальные шаги, которые вам нужно предпринять, и это даст вам хорошую основу для начала работы. Пока вы этого не сделаете, продолжать бессмысленно, потому что ничего не будет иметь смысла. - person Ewald; 08.03.2017

Это не может быть легко портировано. Вы не должны ожидать, что люди из stackoverflow сделают всю работу за вас. Это не простая задача, но я постараюсь провести вас через нее.

1.) понять, что такое NWJS. NWJS — это не только сервер node.js, но и клиент. Это означает, что вы можете использовать как код node.js, так и код javascript, предназначенный для запуска на клиенте.

2.) Вам сервер js не нужен. Точка входа вашего приложения — это не файл сервера js, а файл index.html.

3.) Ваш код js должен быть добавлен в тег индекса html. Здесь вы можете создать файл main.js с кодом, который хотите запустить, и добавить его в качестве тега скрипта.

4.) Установите mysql в свой пакет nwjs с помощью npm install mysql --save. Вы должны запустить эту команду в папке, в которой у вас есть package.json

5.) Если вы хотите использовать маршруты, вам необходимо установить express.js. Маршруты будут локальными маршрутами на вашем компьютере.

Теперь вы должны рассмотреть, что вы действительно хотите сделать? Откуда должны быть доступны маршруты? Хотели бы вы приложение, в котором у вас есть кнопки, которые вы можете нажимать, а затем передавать данные в базу данных mysql?

Если вы действительно заинтересованы в переносе его на nwjs, вы должны понимать, как работает nwjs. Я дал вам первые шаги, но без дополнительной информации я не могу дать вам больше советов.

Желаю вам удачи. Если вы понимаете структуру nwjs, его будет легко портировать ;)

person Silve2611    schedule 16.03.2017