Commit c37532c2 by 김현기

mac test ok

parent 4c1c4420
{
"editor.fontSize": 14,
"editor.accessibilityPageSize": 14
}
\ No newline at end of file
TEACHING_RESOLUTION=(3840x2160)
TEACHING_IMAGE_PATH=/home/falinux/sds/backend/public/image/capture.jpg
WPO=1003_AOI01
PORT=3000
\ No newline at end of file
TEACHING_RESOLUTION=(3840x2160)
TEACHING_IMAGE_PATH=/home/falinux/sds/backend/public/image/capture.jpg
WPO=1003_AOI01
PORT=3000
\ No newline at end of file
const express = require('express')
const http = require('http')
const path = require('path')
const fs = require('fs');
const dgram = require('dgram');
const express = require("express")
const history = require("connect-history-api-fallback")
const path = require("path")
const apiRouter = require("./routes/index")
const bodyParser = require('body-parser');
const app = express();
const dotenv = require('dotenv');
const app = express()
const bodyParser = require('body-parser'); //
app.use(express.json({ limit : "50mb" }));
app.use(express.urlencoded({ limit:"50mb", extended: false }));
dotenv.config();
dotenv.config({
path: path.resolve(
process.cwd(),
process.env.NODE_ENV == "production" ? ".env" : ".env.dev"
)
});
const publicPath = path.resolve(__dirname, "public")
const server = dgram.createSocket('udp4');
// socket 실행
server.bind(9400);
app.use(express.json({ limit : "50mb" }))
app.use(express.urlencoded({ limit:"50mb", extended: false }))
server.on('listening', function() {
console.log('Socket Port : 9400');
});
server.on('message', function(msg ) {
udpResultMsg = msg.toString();
console.log("케켘", udpResultMsg)
});
server.on('close', function() {
console.log('Server UDP Socket close');
});
const client = dgram.createSocket('udp4');
const clientPort= 9300;
// const clientPort= 4403;
// const clientHost = '192.168.52.122'; //inet
const clientHost ='192.168.52.38';
// Error [ERR_SOCKET_DGRAM_NOT_RUNNING]: Not running
client.on('close', function() {
console.log('Client UDP socket close')
});
// const jsonFile = fs.readFileSync('./json/projects.json', 'utf8');
// console.log(jsonFile);
// const jsonData = JSON.parse(jsonFile);
// console.table(jsonData);
//Post 방식은 Get 과 다르기 때문에 body-parser 를 설치해서 사용해야한다.
//post body 값을 가져오기 위함
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}))
//vue router 연동하기 위한 설정
app.use(require('connect-history-api-fallback')());
app.use(express.static(path.join(__dirname, 'public')));
app.set('port',process.env.PORT || 3001);
app.use(express.static(publicPath))
/* udp 통신으로 매니저에게 받는 결과값*/
let udpResultMsg = ''
/* udp 통신 기다리는 시간*/
let udpAwaitTime = 0
app.use("/api", apiRouter); // '/api' 로 시작하는 URL은 라우터로 전송
let newProjectNum = 0
app.use(history) //REST API 서버로서 사용한다면 라우터 뒤에 실행하게 한다. 그렇치 않으면 요청이 들어오지 않는다.
app.get('/api/getWpoId',(req,res) => {
let id = process.env.WPO
res.send(id)
app.listen(process.env.PORT, () => {
console.log(`Neuromorphic web server start ${process.env.PORT}`)
})
app.post('/api/projectInfo',async (req,res) => {
const dataBuffer = fs.readFileSync('./json/project.json')
const project = JSON.parse(dataBuffer.toString())
console.log('로컬 프로젝트 :' , project)
// 받아온 값이 있을경우
if(Object.keys(req.body).length !== 0 ){
project.admin = req.body.admin
project.aoiUid = req.body.aoiUid
project.counter = req.body.counter
project.createDate = req.body.createDate
project.name = req.body.name
project.state = req.body.state
project.successDate = req.body.successDate
project.uid = req.body.uid
project.user = req.body.user
project.infos = req.body.infos
project.updateDate = new Date()
fs.writeFileSync('./json/project.json',JSON.stringify(project) , (err) =>{
if ( err ) return err;
})
}
res.status(200).json(project)
})
const wrapper = asyncFn => { return (async (req, res, next) => { try { return await asyncFn(req, res, next); } catch (error) { return next(error); } }); };
//https://kjwsx23.tistory.com/199 express 와 async ,await 이슈
//express async await wrapper 함수를 써서 감싸거나 라이브러리를 써야 한다.
app.get('/api/requestManager',wrapper(async (req,res)=>{
req.query.image_path = process.env.TEACHING_IMAGE_PATH
if(req.query.cmd === "neuro_check"){
req.query.teaching = `${process.env.TEACHING_IMAGE_PATH}-${req.query.project_num}-2-${process.env.TEACHING_RESOLUTION}${req.query.teaching_info}`
}
console.log("param :",JSON.stringify(req.query) )
sendToManager (JSON.stringify(req.query))
let requestMsg = ''
switch(req.query.cmd){
case "neuro_start":
requestMsg = 'neuro_start_done'
break
case "neuro_ready":
requestMsg = 'neuro_ready_done'
break
case "neuro_capture":
requestMsg = 'capture_done'
break
case "neuro_check" :
requestMsg = 'neuro_result'
break
// case "neuro_replay" :
// requestMsg = 'neuro_result'
// break
default:
res.status(404)
}
await responseManager(requestMsg)
.then(data => {
res.status(200).json(data)
})
.catch(error =>{
res.status(404).send(error);
})
}))
//UDP 메세지 보냄 통신
function sendToManager(msg){
client.send(msg, 0, msg.length, clientPort, clientHost, function(err) {
if ( err ) return ;
console.log("UDP send Msg ")
});
}
// await Promise 응답해야됨
function responseManager (requestMsg) {
return new Promise((resolve, reject) => {
let delay = 100; //ms 단위로 체크
let waitingTime = 0 //대기 시간
let timer = setInterval(() => {
if(requestMsg === JSON.parse(udpResultMsg).cmd ){
if(requestMsg === 'capture_done'){
let base64 = fs.readFileSync('./public/image/capture.jpg' , 'base64')
let msg = JSON.parse(udpResultMsg)
msg.imageBase64 = base64
udpResultMsg = JSON.stringify(msg)
// console.log("야이 씨벌 :", JSON.parse(udpResultMsg))
// console.log("base64 :",base64)
}
resolve(udpResultMsg)
clearInterval(timer)
}else if(waitingTime === 500000){
reject('No response from Manager')
clearInterval(timer)
}else{
waitingTime = waitingTime + delay
}
},delay)
});
}
http.createServer(app).listen(app.get('port'),function(){
console.log('WebServer Port: ' +app.get('port'))
})
{"learning":[{"projectUid":191,"order":1,"type":null,"startX":935,"startY":243,"lastX":1006,"lastY":360,"width":71,"height":117,"goodImage":"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","missingImage":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCACvAGoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDif+EI+E8emr9n+J1ol2qgPIdOnYH2ACjFUz4F8HJcOB8TbAKFBjlbTZ2yfdQAa5abTL+3tY7y5hfa/wB1lTJ/Idaz9S8TaZpVxDHqt3FE07eXawhsy3B7+WBy/QnHGMH0rjuo7RufjTqQkklD8ztj4O8BRO0cvxqh3kZHl+G7ravvknmqknwh0fxhpl/oXhj4mQXs80DRxhdEngVmYYHLseckVR13wx4g8PaJDqOuaPfR20pMaXa27vEsnJwzY2q2FPy5zwfeus+Cmvw3WqNo2mwAzvakCXaABkctgen861TTWsTqp0FGtGNWHK2fnl+1K8h1HR4ZJXJeF2iYjgxsE5/8drzfToDK0lgjf6SnMDEZ3ex/z2r0P9piLda+G51kYsmmFcc8428153ZRhFTUVlxJkEEggg//AKs1a5bbH6NlceXDpLY2bZZtT06A7i01rkNuXDEd84684xVn4iRuvwyvXhtdxKIHwM4y6jJz9aitpYzNHrVupWCXhyD1Per3jXz4vhjqeyX5po0MYPT/AFicVMNGeq72PFrWVonjds5y4YgDJ6jFfTX7JHxw+EngCK++Bvxx8HQ6n4T8a2aW+v21yxUFONjxygFoJYz86OCAGUZ4Jr5o04pPfQxYOGbO09cknNXfGF35uuSRqrDylRdrNjGB1+vf2OD2q5RW5CdlqeyftgfsS+Nf2YxbfEPw/qjeK/hjrs+PDXjaFUKgEBhaXYUlYLhUI67Ul2syYya8NNsYyU24GThkHGOMc9c+q9vU19f/APBPb/goBD8N1m+An7QNhb+JfAfiQC1v7LXI1uILhScYl3g/MByGOD8g53YNav7an/BKq78E6ZcfHv8AY0ku/FXgi5je8vPDcIMt/o8X3i1uBzdwDoQAJIsrkOMsFCSe4JRex8UGWUE8nkg8e1OaeZ2LmLqc9aRNsuHQnBGTx0Ppnp6+/HSnZk9auyJWp+rNz4g1HVLUWDR4jBwGGRt4IB6+9dH4bGoaB+z78XvF/grw9aSeL28GXMei6jNE000Y+zSFIoIhkfOyZbI6qpyMYPMxTJs8tO44Gep/x9PfFS6HqXiWLxdp2k+C9IvdV1u8mP2LTNOsWuJpcDBxGARsjBJd2KqoJ55rClHlqpvY/KcqxUaeLjKS5jzH/gnH4p+O/wAc/g78ZPE3xC8TXF74K+GWjtqWraz4g1ERW1g7JKY7CDgB7qWUJGsaqctIOmOfbf2dooIfFUaozoBBsLEfN/BlT6EZGR7itb9q27+Muo2Hhjw98eNRmi0a1A1DQ/COnXax6bZzoQFuJrOFEjeYEkpJKrnDuUYjJqX4B2vh+LWd0F9G9zJEFRVYkouQcYI+nJyTxzW1V8ktj383xEMTXhCMeX1Pzu/aWup1j8MySRZiNkThR0O1Dj6cn9K4G1mTUbyOyMbeS4+cr/D7j/PevQP2g8T2eggyRs32IJsAOQSBz9PlH51wthbXlpCYggaZRuUIOXH90e/Q/hST6n1WVP8A2ZIuaXFHBO/h67l+RmypXoPTFWPiArf8Kz1OMOxZI12EdRh1qOxSO70tNQYL58BIcDqf/wBVX/GskB+Gt28ZKsYPmx9Qam7cj02lLU8g8O2on1yKQIfkdTyew5P86o69eyXeu3V2PlLTnaSP4RwK1/CUeLi6vxyYoGYH3IA/rWA5ZyDKCWzgk1p0MUtCWNmbIDDLEZA6evTvg4P1ANfZX/BOn/govrXwf121+FXxW1y4l0C5mAs9TEhV7RuP3m7Od/bPU5x3r4xKooD9MNwR2p/nOz+agBXHOTjHv/X6gVE6alHsO3Krn6b/ALZn7A/wf/aVvz40+E19pfhTxxqi/a7LU9wh0XxTuGSJlUYtLv7oZ1GCcmRWzvT4e1T9ir9sbSdTudKuv2YfHZltp3ikNr4UluIiysQdkqNtkXI4deGHI4NeqfsYft1W3hawj+BP7QW7VvCWoSqlndzSlZbSUcJJHIATHKCeHxj+9kV9q2R+OhsoT4c/4KGeE49P8pfsEepaNdm5WHHyCUxkoZAuN20lc5wSKUaqWlgjOD6nL3FnfW9t9qltnRCNoYjggjBB/DNezfscePdN8KXmv2On3Fra6rrFmIp9SmX9+1tGvEEbE7UQ4BbI5xkklRXls+u3usaUto1vtjAwffiqfgvwz4+8ZfETTfDPwe8LXmteJLeSO9tYbR0iFlHG7MbmeV/lgiUISSck7WXBD8ZwUua5+S5XVWHxsXGLmfaXxP8A2bvgX4n+BN/4o+JXirRvDet2m2YRXUhk1C9tlEbXF5M6yEwQBWZUJ3B5I1UDJFfJXwSuIJPHcyaFbTxI9oz20cz8ooMZAYnq2G5xjBHvVn4reO/i34+sdWTxR4vXxTZeHYxc+IP+EbujcWFhFF8sUs5UKrj5G2by+NvIOSal+A8/h9tVZFWN7uSJh50bEnhvmYc4wflzx1xXRXrXjax9FnFZYivTjyuPqfn5+0Vb7oPDlxGxjf8AsshsnJONv+NcVoUdzJcwakl7wp/dNno3ofwzXof7Sa2drY+G4hEE8+F40m77QqHH1J/lXn1kml3F3HpqXH2eW7GwkD5EYdG9uhH41mtEfVZWv3C1L8SGHWUubZP9GmY7geme4H1qf4iHyfhxf3TJhWKKqL1wXA4/OktYpkQ6DcR7Jo5MqCc9jz9Dml+I9vcf8KtvY55QrIYhG3qfNX+maqnZyPSTZ5fpZa18L39ymQzDy0J/3uh9+KwC53kEk/N39q6PVHWDwVbRLkfaLlnz6hSw/mRXNnbIgYdmP61SuZzXYkI3oVH1qLoMI3I5HtUqRMVJB7U3YwUnipe4m9LEgld0LM2RjDRjow9CO474PBxyDW/beP8A4h2lvHaWfjzVY4YkCRRjUnwqgYA69hXNRzmM+9P3RnkqMn61DTbFGKsfrFvUQPGrMUbhkH8/w6nHYGpNP8V/ELVP2fPiV8A/htbW9lfeKrbz77U7a6dL3UVSPbBYZUZSEyRuW+9nzcY5BWmi3dvbGeW1OyT/AFZP06fiMj8al8O+APFvjDVJ28MyW1jbaaqXGt6/q2ova2WjwMRGZpZVDOcndsSNS7HgdSwVKXLUPyXKK1WljYyUb+R49+yx+xN+0h+zj4P8W+Lf2k7HxP8AC/wxqmhRvoPhfW4pov8AhKroLMVeO1WRFeFF+XzGXnzTgfNx73+zkqL43kZrdhcSaa+SU2lVLpyR0H3R09TWb4x8NaRqdqPHej+IF8Y3NrZBbrV9QtJEujChBRY0ui80MZHIjJ6KCwzgjqfgRqGialqxt7e2IuGiUyyAFW5Iz+WQPxrTERkmkla59NnGIq16kFVhyLuz4I/aYghvLHRG2uyQRybXQbcNwO+fSvO7FI0tjNdDE8WPMRuN6e344rvf2jzdxweH5pnLgWshlhQ9T8h/mT+VcRpl/dNPBeT24eGDG/8Ad7hMndfwHP1FTHsz6fK1/sydy2hknK60WkE4YAoehGDg5/z1q58Td1x8KXHynMkQc55UmReaqTy2NtrAsbWRjbSMXjVwcop6A9s/hWl4704D4fyosalLm4hwDntIp/kKULqR6Z5P48c2ttpuk+UFEVrvYjplsE/hXNKFyAp6t0rd+Ij+Z4nuIg42whIkVewVB/XNYceEYH3rYzbuyXzjtMRIBB6imEDH3z+dNyCSc5OaME9KVkJgqddo/Ok247mpAwAAA9qeEyM5pO/YLs/V678TvqGnJpjWgQJ98qO46Y/nWt4R8Uy3uiP8E7OxniGvaxbXDeQsrm+nj+S3tmCH5l3uSFIxuY9TtxzURh3kxEFjzs3DLH04zj6nitnwX8KvEnxStdW1Ww1nR9B8P+HLWO78TeMfExkFjpoaUpbxRxx5kvLmWQAJAgBG0sThayg7Sufk+VYivDGQ5Y3fY9p/a9+Fvwz/AGWvDtjP8VPi7omt/EPWNKig0z4a+HNKuBfW00u6IT3hL+XAiqC53BWIHCnO5fJf2dbee/8AiLHI1uA1xbyp95soD5ZXGBgglR34555rmrX4L+GPDnhvU/Evw98Z6Rqf9nhm1O1i8Jf2bLbwlNzEk3E5UBQX2swZ8H5RjA7v9n3xJaSa9FBa6Qs5a3ZgkxwrMQDkDoc8MewxjFdFatOcVdH0Gb1auIxEI1Y8q+8+F/i34WvPFTaOtrc21mZo/KMt5MFW3Z8E72yQDgHiuYvPh1c+FraXQLPxJpmpbmY2txZairqjLyRkD68V6d/wUeh8N6lonwy+IOgeGdI0N9f07UJNQtNHskgjLj7I43KPvbd5XJPrXy/Bd3un5FhcoFViyqgCgE9axUdLpn1uX2pYdRR3VhYT/YjaXVurXBl3JKr5yT1B9h2rqNesJZfCotr2NBFagOxDc4AP9cV5lpHxW8S6E5lRoSqqMrtBxjp1962/FPxV1nxV4CvdQ1KOOOGFUjLRjBaRuMUK/Mehzpo8p1y6F/q9zeMwzPcO+AOmSf8AGqZUevQ1I6usvlyNkq5U/Udf50zBZiB61qZO9xEQbj70oyGwPWlTAOO9Jkq+R2NAK4sRAfLjjOKsFbQnO9v0qur4zkD1o3y/3B+RoE73P07k8I2kjus1zJlRgx4TawPUH5c16R8HfHnhnwh8PvEnw28Q6wdOGqt5mnaiIIUW3uzGsazSHaBtAHUggFieM5Hn0Ov6M10Zf7Q3KTzhGOeOMEDrnHFd58HP2cPGv7QnhHxt8SrfXdL8OfD/AOG+mfaPG3jbW4nkSGZlzHZWtvH+8nuG+U5GFTzY1OS3OVOUr6n5RldbGwxkHCNzxn9nL9lbQP2TPAvjbxP4z/ad8LeNtc1fSIbHwl4K+HutPqcEl1M5V77ULgx+SrQLmQwxO+cnLjAU+u/s5mWy8ZxJNCWKW8rMpBIyV3YHoCWzjsDjtXFeE9X/AGZPHEmraH+z/wDGbxjq/iLQXkuNT0XxB4ds7SKW1C8lPJto5Q+7ABcsM9c9D3X7POoT3PjyAwPkPA5L5GGbODjI5BJJzWlSTbR7uc18W69NVafKrnyJ/wAFGrk2Pwj+CLlgTDo2pRbQuGYFNPIJ9emfqxr5On8RzgMI0CjPpX1d/wAFLYh/wpj4Ime6Vn/szUcZ+8QINN5OK+QuASPL69zVOyPrsF/ARZi1C4u3CySgDcCeOoyM11fjbfongDRvD+8F7x3u7hG69AADjtlj+QrlvD2mS6tqkOnRAbpn2j8a6D4s6ol/4zuLeOELHaRRwwj0AXJ/HJIP+7U2W532sjlt+0l5ectnI9aYc78r3PNS84yyDH0psYLSnA4xTFdCMQpwo/Omnk5pQFYlQeQaCjYzxxQCdwZRgHJpfNP90flQgaVeOgpNh9RSdyJJN7n6iWelaEVew03Q7aPI/wBXDCuCfQ+xGeuR+OCN/wAL+NbfRvAGrfCLUtWm07QdV1KHUVtYo99nFfReUkc7wqdrMFjReFLHaB6msxfDHhy3hmuzeSDGPI8vWbkyemXwwAPtjvWv8Kfg34U8Y2Os/EzxQNVu9J0CVIBo2naxdpcandMUIhDqspjXa6MzrGWG4YK9RjTlzStc/MMAsTRx0FSkpSZ5z4L+F/w/+DHiHxx8UNQ+JEvxK+IHiDQP7G8IzaTp76Npug+e6PcXl40jLLPIiqu1AAvmOAc5XHrH7NMENl40tjLOMR2z5Y5BAxnGSpxg56kDt1HNDw/4X+FXxd8Qan4X8HfAHxd8LJra0kl0+PWPife6hFdxoSGIWWYKGbcR/EXRSw8sqKh+Cetz+APitau9vfX8l1LLFBNHc/vEcxsFYksd2Bk9cZAOK2lzJW6HuZ39clWpqskvQ+Yv+CntncwfA/4FpqEAS5FhqiFWQhiFSwVieBjlRgc96+N385QAcEV9Mf8ABRX4geN/iG/hfxF468U6jql15tyVbULx5hFvCZSPezbFAQfKuB+lfNMe5pASeAemOoquZcuh9Jl9/q6Ow+EdhF/akviK4RGh06FpW3dMjAH6nH41zF/K19eS38sjM0rFmYnknJJ/U/rXbWtvF4Y+Ck95LE0dzq935USjrsGWz9MqPzrg5JXZmIA68gDjJFSndHpO9hxctAUIHHOajWPEY2tjnJzTlLbdpHB4NDAABewpkLR6jVVI2IUgk+tOJyMYFDLwGVRmm7wpw/6UFSV5CbuSMhRSc+/50pjRzljxmn7FH8ZpO4/RH6jppN/bwC5ueEGdyrODj3baeOcfe5rp/hf8adK+Ffh7XfBnibwyl9pWu3dvM2qLd7LjTJAEUzRoxG5sxxEkEcRjtkHCutV1qTTfsk+lw2kO8OwhttrTt/fY4+fvya6/4E/BTRvi+2pajrgjv7i0McejaDJrf2KK8uciR5riSBvP8pF2jahTO4gnkY5YRtK63PyXKlOOZw+r/iclqfjz4XfB+TxJ4m8C/EFPF+oeJLSSx0q81mKIwaPbyw4doollcS3Chtiz8BAhXYd5zS+G9zbXfjbw5eW08YT7aXjIQD5WRs49O9el+Lv2dJvEnw1U6x+xtBob6jqFxbaH4l0q0s7KS+uIA+8/ZVJuHA2t+8kDF85zkivGPgxONP8AH2k6Fq8ckJt9WnhcTxMjYCyqeGAIIIGOMda7aikkk1oz7DNqWIc06jR8kftuNGE8LwxqBH5cp2qoADcZx+leG6bD9quo4VXJlcKFJ6knAH5kV7v+2lsOn+GHKAkmZkA9MKP5CvNvgpoEOpeNrW5vxi3sT9quCpHCIQ3OQfSso8qVkezl1vqyLHxult9JvNI8E6fIFXSNOAuURyczPgtn6f1rhnypBToRk/WtPxVrcvibxLqGuTsSby7knU46KzHA+gAGPrWa2V+RefrV2seixwYFAT69qVVEpIBxgVHhsYz+VCB88MR60C0bHiQx5DgY6cVG5DHK0+Rdp2g5HvSM4AGQOvUUBz6aDAFGGyfpTt6e9BEfmhUyQfWnmGYHGF/Wgi7bP1R1DxLa3WnPHZWbRtO265klnLlTgj5c8L16Cn+FvigPh1Muq3OlXFw6z7re8trx1e13AqzRqDjJUlTkjjuO83iCa/j0iN7yylRd25Q9uB5SYPy8Afrk1xfiXx9pvhbRzq3/AAjml6lcyTCG1fV3zbQMwOHeMI2/ptw2F+bJPGDy0bN2ufl2DeKqZlBU5py7nuXxT/b38L6h8NtJ8C/DL4f6Jb6nY6bJa3Gr2VhFDNh9vmTzMq75J3IBZ2kYZJwBmvDfheLW+8c6Rf22lReZPqEzqkaAbWEcjMSBgkk5OaxtV+LuoXcDWvjy1s5YptI8zTodA0l4o5LlFY+RtEvlp0x5uwfTBNdN8OvKHxO8Jtptt5jPqciuyHapU2043HpkEcgdsck1vWnUuru6R9Lmk8bSrKNSSdz5O/bTt400PwrJJEQ/2iaNcjgIYx1/E15roMY8I/CO+18kpca5KLK1IGG2qrbiPbivTf2trN9W0rwfp1nE091dXkiwwo24k+SBj8yPyrzr4+vHomtWfw2sr1ZYtCs4o5XjOB57KC+B9f0IpQSsfQZav9nR5/K6rKSmdhHyg9uACP0/WkV1Y7iOadtHPGc+tRtx8uMc9q0O1c3UeWGOBTfvDbnHPalMRCBlf67qUbR94HPr2oKjdPUQRgNjcTx3o6E8U4c/Ng00gljigWnUTIA6dOn1pu24PO8085TBK96kDZGdo/KgPQ/Uq51iS4sRF/ZMcJnO+SQKAWPrweR78Cuc1XTdFZDFr9it1bsRlBIYyeegKkHkZBweQTXS3mtQ3Vm0Srcu8jkyCW4Lhev3AfuivNPiZ4vv/DkMEVhdyQzSTjcIyQwRQWOD0/h74Fc1HSWh+TYOOJq5lT9hNNvqzorC60a00q48LeEfC2j2MFxCbS5vU0xGlW13qzW8HASFHxtcqu9gT8+ea2/h20Nl8Q/DMk0cuBqDCJgm7YpikB+grnPgn8Yf2gPif4jx8R/hz4r1fwDNazppHir/AIRS6gsre5iUZg+1iAwvkEtu5+4Rnmt7wfYMvxD0DR73fDGdTZZ3gkwRiKRmA+8BwrYz144rok1JH1Ga4fGUsTCVWSkvQ8B8d6Zpx1LRPGur28S2vhu1uLnlSCJvJCqR+NfKniLVr7xHrd1repMPNu7hpmAHrjv6YwPwFfTP7U3iKbS/hFZ6cCgm1K++zXG0fwqkhcD8dnrXzE8Yjby1QqoJIH5D+lKHwn0eAlFYdIrmEr93071ER823bk1ZOXHHBHekaFWTcCMg1R6F7orFPm+fOKeWQDYwOO1TPbNCqyvgg8YppVHAO3vQJXGkhoQoXBzTDGqjcCck1YEQcZUc0jW+z5if1oFIr4BByKMH1qQKWYq3TFO+zj3pXSJi5bH6Waf4p8PoAbnX7G2lAJeG7u442UfRiKwvFWk+CvF1zGs3iTTTLvzExvIzu+nOD9K7h/Bfwzur8Le/F74bSzKm+SSTT9ZcsMju2kZ7jvVmfwt8PoUeG5+M/gIW5gZiY7HWGEYA4IU6UvfA4Oeaypw1PyCjGdCpGcLprbY5TTviD4iSG3stZ+PE13pukQeRb6RLroktLY9NwhkdokbGQSqjg9R36H4Rac/jr4v+H7fQ7qK7isbuS6ub4P5kbDyWG3eMqSSRxuzgtgel1vCHw60q3jv3+N/gOFSg8pzYaym9cAnmPSyTzj72D71q/Djxj8JvA/imHxXqHx68OXYs45C9tp2n6u0kw2E7QZbCNR07kVo0z06+OxeJqRdZs+JP2u/tV34L8OK0+FXWZmRcjLZjfnp/sj8zXz8Y5FRUc54yD7mvoX9rNP8AiivDHn/KDqbGI5+Yr5DHOACMcr3z149PB5kiQBEDHaowSfrTSsj7rK3zYdSKxRIotskY3fSmtApAIiwG61YKxtiSYng9qlupEmQCNAMD07Uz0ldKxQuo41VVXJ7c1BIoXCEc56ip7gNnbx161C2CQDnIPNAJyQ1htQ7eo6UOAFU5JyOaeUUtt7CgA5IAH40DSbd2REqW2jORzS7z6Ch0Ik3HHJxxSHg4pWQJSR//2Q==","goodPath":"/ini_neuro/inspection_dist_image_x64/191/0_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/191/0_part_1.jpg","__typename":"Learning"}]}
\ No newline at end of file
{"admin":"한태현","aoiUid":1,"counter":5,"createDate":"2021-09-07","name":"1차 테스트","state":true,"successDate":"2021-10-07","uid":3,"updateDate":"2021-09-10T03:21:12.353Z","user":"신대섭","infos":[{"projectUid":3,"order":1,"type":null,"startX":978,"startY":74,"lastX":1029,"lastY":153,"width":51,"height":79,"goodImage":"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","missingImage":"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","goodPath":"/ini_neuro/inspection_dist_image_x64/3/0_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/3/0_part_1.jpg","__typename":"NeuroInfo"},{"projectUid":3,"order":2,"type":null,"startX":1084,"startY":93,"lastX":1170,"lastY":144,"width":86,"height":51,"goodImage":"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","missingImage":"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","goodPath":"/ini_neuro/inspection_dist_image_x64/3/1_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/3/1_part_1.jpg","__typename":"NeuroInfo"},{"projectUid":3,"order":3,"type":null,"startX":1067,"startY":334,"lastX":1193,"lastY":412,"width":126,"height":78,"goodImage":"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","missingImage":"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","goodPath":"/ini_neuro/inspection_dist_image_x64/3/2_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/3/2_part_1.jpg","__typename":"NeuroInfo"},{"projectUid":3,"order":4,"type":null,"startX":1068,"startY":473,"lastX":1195,"lastY":547,"width":127,"height":74,"goodImage":"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","missingImage":"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","goodPath":"/ini_neuro/inspection_dist_image_x64/3/3_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/3/3_part_1.jpg","__typename":"NeuroInfo"},{"projectUid":3,"order":5,"type":null,"startX":905,"startY":630,"lastX":958,"lastY":682,"width":53,"height":52,"goodImage":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCABOAE8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzP/glN/wT6g8ZXMPx/wDi7pUdxp4mE+h6fNH94p0lYN1G7dgdxX3X8a/2S9B12wPiTw1ocMLniSOGBVUjGMhQOOldv8FPCOk6F4XsvD2jRrHa20SRwRpFtARRgdOgxXtHhvSYb+28m5tlZQNpj9a/E8xzGvjcU6sn6eh14HBQw1BQij4Dg+AkWnz7LjT0yowVjXHeuG/aO0nV/wBjzWtG/bI0rwex0qK3Gh+Ir5FZTZRSTRtbXYkXlHS4CoD2E3UHBX9H/GfwD0fTLn/hILzTfLDjMcPl4zx6V8d/8FH9L8Y+N/2e/FPw+sZzbWN5YeVLbQxAiQZJwc9CAocHsQK0yyNbEYhW0R7GDqzw2KjUT+R8yeIbj4ff8FVf2t1/4Taw8TWviS+8HST6Vrfg5LYTJrGmRmWK4uopDmeBoo0jeOMbsKWIGa+mtc1nQv2qP2Cryy13wnBY61/YjWesW/kLG9nfw7Qz46oCYmIB5AbB6V+fv7Fnx28c/sU/Fuz+K3gi2t7y709Z4Y0u4/MieCaMxSBu5JU9q+uP2K/ibe+IUn0PXLeNB4ltJbiZUPyC4YszjHblmGPav1LCZTD+z1W5vfTv8h51jalbHKySVvkfnX8QvD326ESOh37N+McgEAj/AAr1zw18IoPiT8Cbq6stQWO5ttKZ7eZznaVABBHtj8KZ8afh5aaT4r13SLqU5sdTniJ6KqGRigx2+UrW18D5Y9B8J3dnYzqYZUaGUclSr5z9OlfR0ITs68VdW6Hl5rVpYrARpT37nhtl+z/rlwHeL4jeBDtG9o5/GMEchOcEbOcHOeK6O0/ZS8cXSpJY/Eb4aEum54n8fRgx+xAjIB/GvYvi7+wPb+PPg3ZfG/4HaPC+pQnbrehOqst6hJG9CxwkgI4J44rw23/ZM+PNzlm+C10VRMtcPf2CoADtwXM4BOeD71rl+Y4TMaTdNO8XZn5bmeW1sDVu43iz94/hxFCscYtiAoGPlXjrXu3wo0GHVdVSVz+6iXc/y9cV4D8PbxQ4SJiNp53Hrz1/Hr+NfSPwpdrLwXeayUw7DZG2OMd8V/NFeyaV92fr8Obk0Ra+IuoW/iKdbMKvkW6lVAXrxXyV+1P4GtpNA1G2urdESezlVmYcbSrc/Wvpe9ujJuLMQxJyPWvmb9vTxw/h7wqlnZbTNcfJgnnGDmvucipRjyw6s5ZSlTlzM/Kj4o/D3UvAVhY3EMaNDcxt5cgA+YKQOnqMrn6j1rtPgF8QL/QvDdv4xtHZJdPvQzsF4MfT8sEn8DXpf7QPgjTNX/Zi0/xLHGv22xvAtwR1VX3Agf8AfKE15J8HdG1C8+H/AIk0+xtm8ryCclD2RsBfU4xX6xlyjGk6Utjlxtf2seZbmN8Xdbt/G/iHXPFUVsCuoSiSVdvIOxR0/CrX7M3he51HRL9FEZg845jnjOQMVB4T8Lahr+nXjrEzLH8mQpOWxnH1r2L4M/DS+8NeA7i8ulKPcOSCvHHQV6CrUsPemuz/ABPPcnWppyPof9lLw9oz+GX8KKsLwiMSJDIMjnO4AdSMkmvze/4KVfs2wfs7ftGXWraDlbHxY7XlnJ8wEEqriWBjg7wcLIuemGA+7X6P/A+1utBsbXV9PLFoyu/PdehH515Z/wAFkvgXL8VPgpo3jvQtNia+0zUkbeX2kK+UwP8AvuvyzCxxOVZ21Sk7SbNMxw9LGYJp6NH134Ov0s2VcnzNgEfo/r9a+mvh5rbWXwmZHnBDO5VGHIyB/XNfEHgfx9HeWEUsFwVUx+ZbyN2Y8Ln0Hb6givs74ZXMfir4H2txAS8mzEvy4y4Yqw/OvzPEwlSqx5l1PoKc1UjcazSzhpiedxIFfB3/AAUc8VXY8dafo32lRG8LMQexFfdNrM/2MsIyCpIx+lfCf/BSvw/qNpq9r4g+ynyi+3eSARwK+64erR+uxb2Zx4pONNs8X8Aald+NfAuseCpXDLndHG65VuOetV/h58O7vwVoGrNJYqkTROwTOQ3y9K4v4TeO38G+NzPqw2QTfIxZ/lx79q9W+JvxX8O/8I08Ok30EksqYxbyK354Nfo8pVKVT3djzYPmhqcT+znfeGNPbXFvIBbQXWMwTsMROBywz2P/ANauyn+Iuia3nw1YkpExBgdBxx2JFeDDT/FGva+rQQR+S332t8g/iRwa9u+Cnwm1G91OCS7iMhwPvfWuTGYlUP3jeo4xu7JH0d8LPDrL4SjcjLGIHIFQ/tH6Hoviv9nG403xJMqxxanEHdmAKfOpXr24r0bwj4Ti8PeESpAysHC9xXgX7ZXjNPD/AOz/AKnLNdokb6nbg75Ao5kXByf91vzr5ijOWLxkKi6O5vUtRg+un5nxb+w3+3jfzaNaeB/Hd5i9tIxG8w58xegmAP3lK4VkHIILd6/XT/gnT8b9N8Z+AtU8F/bd09k/2iKMuGUW8hIwp77WTPtuGa/ml0rUL2wuor/TdQmtbuEh7eaJsMhHcHp/wE9a+z/2Cf8AgqB4q+Cfxa0bU/F+qGPy5RBcysMQ3cLbVYMOgbHQdznFcHEXDkpJ16C8zysnzeKl7Kq9T94NbuBoWpvHIAI5HJUHsD0H1xXkv7Tvwssfiv4OudLjQpcNHmG42BvLOOw/rXpWh+IfDvxd8GWnjbwZqcF1Y38XnWkkbgrg87c/3h0I7Gub8QweLdDZvt3hya4jyQGto2cj6gDivk8FjHhaiU9HE+pnT54+p+ed58Gbrw9qU+ia94cXzIiRvZeW/wBofXr+NZLfBq3ub8IIiFByqetfbPirRvh341me01ZI1usFVIwrp9R1rndO+AHhZrktF4o/d7cFXQZHsPWvu6HEUatPV6nnSwklKyR8/wDg/wCEiRhYIrBcZ+6Isn86+iPgr8IIdKC6reW22ONchDHya6XQPB3ww8GqJtUvYZXRcqZZVXHvyeao+MPjjpVvCdN8MzCVnG1GiTj07V5GPzWdf3dkbww3JuSfE3xpY6LanS7Jxul+X5T0GK/N3/gr3+0fYeH/AAtpHwt0S8U31/P511FnOxUIZS2OnTjP94V9VfGL4gr4D0ubxd4vvxvJIt7duu7GOlfDHxTubX4reKZvEvibSLS8leQhDNbqSiYwAM+wFfV8I4eeLvyx26s8rM5KFNpM+WvDXw/064RZPPkDAc8/yrR1j4OwQCLXdL1GUFJV8wMvUZ6+2K0PC4GweXwAOc967fSoIbgpbSrlJUIdTXvckbWZ+aVMbVoVbnp37B3/AAU7+Kn7F2rXXgTxD45bxH4DkdpJNPvrhjdaY7kl2hP8UZHzbOpLHFfsH+zP+3Z8HP2ifBNj4q8B+OLC/tbiKMiW2nyYyV/1cg52OOhVsEEHIr+eT4u/DqDTbmS+sbraMYdf7wNc78FfGnjXwB8Q9P1LwD4pvtIuVuFMx0+7eBZkJ2lX2n5+nUjjpXy+c8LYXMnzUkoyPt8m4mbiozVz+pmfQvhh4zgB17TbS7Dgld6K3Xup4x9RXLeJ/wBmn4OXdvIdOe/si5ypTV5GH4KxIH4Bf61+UPgH9sX9oD4cW0TaV43eYqny/bIzLjJz1DKT+dUfi7/wVq/aw+HujQ6xP4gspo7+6FsgtrWRGGe5zKf518lPgTPqU/ckrd+Y+rp5pha+x+n93+y38L7WNp77W74R4y3n38gOAOTjzSMfj37dK+d/2r/2u/2ZP2VNGli0vUrF71dsRkdhJ5bbsDc5JxyR1PfFfmZ+0P8A8FPP2qJNB0O6k8dyr/a2sG1uIY1IUISF4yxPQfnXmf7R2t6nd+DvF11qd9LK8l3ZFZNxJyzQE5yfUnpXuZTwNiqldPFzvFa2uc2IzSnBOMFqfQnxK/axtfjh4xv7nVfF0Us1iN/2GOQEW8TDIO0HknrWFZ+KvD15YR6nb6xbm3mGUnEi7Wxx1zjtXy38LCZfi340jVQP+JMADk/dECN+e4fkTXS+GJL2H9mjw29vckS+VGrOWPzcE5+tfruVUsNhcP7GhBRSPnsROpVd5n//2Q==","missingImage":"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","goodPath":"/ini_neuro/inspection_dist_image_x64/3/4_part_0.jpg","missingPath":"/ini_neuro/inspection_dist_image_x64/3/4_part_1.jpg","__typename":"NeuroInfo"}]}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -12,9 +12,15 @@
"body-parser": "^1.19.0",
"connect-history-api-fallback": "^1.6.0",
"dotenv": "^10.0.0",
"express": "^4.17.1"
"express": "^4.17.1",
"nodemon": "^2.0.12"
}
},
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"node_modules/accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
......@@ -27,11 +33,36 @@
"node": ">= 0.6"
}
},
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"engines": {
"node": ">=8"
}
},
"node_modules/body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
......@@ -52,6 +83,26 @@
"node": ">= 0.8"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
......@@ -60,6 +111,37 @@
"node": ">= 0.8"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
......@@ -195,6 +277,17 @@
"node": ">= 0.10.0"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
......@@ -228,6 +321,38 @@
"node": ">= 0.6"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
......@@ -254,6 +379,11 @@
"node": ">=0.10.0"
}
},
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
},
"node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
......@@ -267,6 +397,44 @@
"node": ">= 0.10"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
......@@ -318,6 +486,17 @@
"node": ">= 0.6"
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
......@@ -331,6 +510,69 @@
"node": ">= 0.6"
}
},
"node_modules/nodemon": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz",
"integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==",
"hasInstallScript": true,
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.0.4",
"pstree.remy": "^1.1.8",
"semver": "^5.7.1",
"simple-update-notifier": "^1.0.7",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"bin": {
"nodemon": "bin/nodemon.js"
},
"engines": {
"node": ">=8.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/nodemon/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/nodemon/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": "*"
}
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
......@@ -355,6 +597,17 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
......@@ -367,6 +620,11 @@
"node": ">= 0.10"
}
},
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
},
"node_modules/qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
......@@ -397,6 +655,17 @@
"node": ">= 0.8"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
......@@ -407,6 +676,14 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
......@@ -454,6 +731,25 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"node_modules/simple-update-notifier": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz",
"integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==",
"dependencies": {
"semver": "~7.0.0"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
......@@ -462,6 +758,28 @@
"node": ">= 0.6"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
......@@ -470,6 +788,17 @@
"node": ">=0.6"
}
},
"node_modules/touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dependencies": {
"nopt": "~1.0.10"
},
"bin": {
"nodetouch": "bin/nodetouch.js"
}
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
......@@ -482,6 +811,11 @@
"node": ">= 0.6"
}
},
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
......@@ -508,6 +842,11 @@
}
},
"dependencies": {
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
......@@ -517,11 +856,30 @@
"negotiator": "0.6.2"
}
},
"anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
......@@ -539,11 +897,48 @@
"type-is": "~1.6.17"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
......@@ -652,6 +1047,14 @@
"vary": "~1.1.2"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
......@@ -676,6 +1079,25 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"optional": true
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
......@@ -696,6 +1118,11 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
"ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
......@@ -706,6 +1133,32 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
......@@ -739,6 +1192,14 @@
"mime-db": "1.44.0"
}
},
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
......@@ -749,6 +1210,51 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"nodemon": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz",
"integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==",
"requires": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.0.4",
"pstree.remy": "^1.1.8",
"semver": "^5.7.1",
"simple-update-notifier": "^1.0.7",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"requires": {
"abbrev": "1"
}
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
......@@ -767,6 +1273,11 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
......@@ -776,6 +1287,11 @@
"ipaddr.js": "1.9.1"
}
},
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
......@@ -797,6 +1313,14 @@
"unpipe": "1.0.0"
}
},
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"requires": {
"picomatch": "^2.2.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
......@@ -807,6 +1331,11 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
......@@ -850,16 +1379,55 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"simple-update-notifier": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz",
"integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==",
"requires": {
"semver": "~7.0.0"
},
"dependencies": {
"semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
}
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"requires": {
"nopt": "~1.0.10"
}
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
......@@ -869,6 +1437,11 @@
"mime-types": "~2.1.24"
}
},
"undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
......
......@@ -5,7 +5,7 @@
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app.js"
"start": "nodemon app.js"
},
"author": "",
"license": "ISC",
......@@ -13,6 +13,7 @@
"body-parser": "^1.19.0",
"connect-history-api-fallback": "^1.6.0",
"dotenv": "^10.0.0",
"express": "^4.17.1"
"express": "^4.17.1",
"nodemon": "^2.0.12"
}
}
const express = require("express")
const mangerRoutes = require('./manager')
const projectRoutes = require('./project')
const wpoRoutes = require('./wpo')
const router = express.Router()
router.use('/manager', mangerRoutes)
router.use('/project', projectRoutes)
router.use('/wpo', wpoRoutes)
module.exports = router;
\ No newline at end of file
const express = require('express')
const fs = require('fs');
const router = express.Router()
const dgram = require('dgram');
let udpResultMsg = ''
// socket 실행
const server = dgram.createSocket('udp4');
server.bind(9400);
server.on('listening',() => {
console.log('Socket Port : 9400');
});
server.on('message', (msg) => {
udpResultMsg = msg.toString();
console.log('받은 메시지 :',udpResultMsg)
});
server.on('close',() => {
console.log('Server UDP Socket close');
});
const manager = dgram.createSocket('udp4');
const managerPort= 9300;
const managerHost ='127.0.0.1';
const requestToManager = ((msg) => {
manager.send(msg, 0, msg.length, managerPort, managerHost, (err) => {
if ( err ) return ;
console.log("UDP send Msg : ",msg)
});
})
router.get('/', async (req,res)=>{
req.query.image_path = process.env.TEACHING_IMAGE_PATH
if(req.query.cmd === "neuro_check"){
req.query.teaching = `${process.env.TEACHING_IMAGE_PATH}-${req.query.project_num}-2-${process.env.TEACHING_RESOLUTION}${req.query.teaching_info}`
}
requestToManager(JSON.stringify(req.query))
let requestMsg = ''
switch(req.query.cmd){
case "neuro_start":
requestMsg = 'neuro_start_done'
break
case "neuro_ready":
requestMsg = 'neuro_ready_done'
break
case "neuro_capture":
requestMsg = 'capture_done'
break
case "neuro_check" :
requestMsg = 'neuro_result'
break
case "neuro_replay" :
requestMsg = 'btnpush'
break
case "network_check":
requestMsg = 'network_status'
break
case "neuro_complete":
requestMsg = 'complete_done'
break
default:
res.status(404)
}
await managerResponse(requestMsg)
.then(data => {
res.status(200).json(data)
})
.catch(error =>{
res.status(404).send(error);
})
})
const managerResponse = ((requestMsg) => {
return new Promise((resolve, reject) => {
let delay = 100; //ms 단위로 체크
let waitingTime = 0 //대기 시간
let timer = setInterval(() => {
if(udpResultMsg.length > 0 && requestMsg === JSON.parse(udpResultMsg).cmd){
if(requestMsg === 'capture_done'){
let base64 = fs.readFileSync('./public/image/capture.jpg' , 'base64')
let msg = JSON.parse(udpResultMsg)
msg.imageBase64 = base64
udpResultMsg = JSON.stringify(msg)
}
resolve(udpResultMsg)
clearInterval(timer)
}else if(waitingTime === 3_000_000){
reject('No response from Manager')
clearInterval(timer)
}else{
waitingTime = waitingTime + delay
}
},delay)
});
})
manager.on('close',() => {
console.log('Client UDP socket close')
});
module.exports = router
\ No newline at end of file
const express = require('express')
const fs = require('fs');
const router = express.Router()
router.get('/',async (req,res) => {
const project = JSON.parse( fs.readFileSync('./json/project.json').toString() )
const learning = JSON.parse( fs.readFileSync('./json/learning.json').toString() )
let result = {
'project':project,
'learning':learning
}
res.send(result)
})
router.post('/',async (req,res) => {
const project = JSON.parse( fs.readFileSync('./json/project.json').toString() )
const learning = JSON.parse( fs.readFileSync('./json/learning.json').toString() )
// 받아온 값이 있을경우
if(Object.keys(req.body).length !== 0 ){
project.admin = req.body.project.admin
project.aoiUid = req.body.project.aoiUid
project.counter = req.body.project.counter
project.createDate = req.body.project.createDate
project.name = req.body.project.name
project.state = req.body.project.state
project.successDate = req.body.project.successDate
project.uid = req.body.project.uid
project.user = req.body.project.user
project.updateDate = new Date()
project.total = req.body.project.total
project.success = req.body.project.success
project.fail = req.body.project.fail
project.result = req.body.project.result
learning.learning = req.body.learning
fs.writeFileSync('./json/project.json',JSON.stringify(project) , (err) =>{
if ( err ) return err;
})
fs.writeFileSync('./json/learning.json',JSON.stringify(learning) , (err) =>{
if ( err ) return err;
})
}else{
fs.writeFileSync('./json/project.json',JSON.stringify({}) , (err) =>{
if ( err ) return err;
})
fs.writeFileSync('./json/learning.json',JSON.stringify({}) , (err) =>{
if ( err ) return err;
})
}
let result = {
'project':project,
'learning':learning.learning
}
res.status(200).send(result)
})
module.exports = router
\ No newline at end of file
const express = require('express')
const router = express.Router()
router.get('/',async ( req , res) => {
let id = await process.env.WPO
res.send(id)
})
module.exports = router
\ No newline at end of file
.DS_Store
node_modules
/dist
/tests/e2e/reports/
selenium-debug.log
chromedriver.log
geckodriver.log
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# front-end
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Run your unit tests
```
npm run test:unit
```
### Run your end-to-end tests
```
npm run test:e2e
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint",
"start": "npm run serve",
"build2": "npm run build",
"crossbuild": "cross-env vue-cli-service build",
"crossbuild2": "cross-env npm run build"
},
"dependencies": {
"apollo-boost": "^0.4.9",
"chart.js": "^2.9.4",
"core-js": "^3.6.5",
"graphql": "^15.5.1",
"konva": "^7.1.3",
"register-service-worker": "^1.7.1",
"vue": "^2.6.11",
"vue-apollo": "^3.0.7",
"vue-chartjs": "^3.5.1",
"vue-konva": "^2.1.6",
"vue-router": "^3.2.0",
"vuetify": "^2.2.11",
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.1.0"
},
"devDependencies": {
"@mdi/js": "^5.5.55",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-e2e-nightwatch": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-pwa": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-unit-jest": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/test-utils": "^1.0.3",
"graphql-tag": "^2.9.0",
"babel-eslint": "^10.1.0",
"chromedriver": "85",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"vue-cli-plugin-apollo": "^0.20.0",
"vue-cli-plugin-vuetify": "~2.0.7",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {},
"overrides": [
{
"files": [
"**/__tests__/*.{j,t}s?(x)",
"**/tests/unit/**/*.spec.{j,t}s?(x)"
],
"env": {
"jest": true
}
}
]
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
],
"jest": {
"preset": "@vue/cli-plugin-unit-jest"
}
}
<template>
<v-app>
<v-main>
<Alert
:open="alertOpen"
:message="message"
:type="type"
/>
<Loading
:open="loadingModal"
:message="message"
/>
<Bluetooth
:open="bluetoothModal"
/>
<router-view/>
</v-main>
</v-app>
</template>
<script>
import { EventBus } from '@/event-bus'
import Alert from './components/Alert.vue'
import Loading from './components/Loading.vue'
import Bluetooth from './components/Bluetooth.vue'
export default {
name: 'App',
components: {
Alert,
Loading,
Bluetooth,
},
created() {
this.$store.dispatch('getSerial')
EventBus.$on('openAlert',( massage , type) => {
this.alertOpen = true,
this.message = massage,
this.type = type
}),
EventBus.$on('closeAlert',() => { this.alertOpen = false })
EventBus.$on('openLoading',( massage ) => {
this.loadingModal = true
this.message = massage
}),
EventBus.$on('closeLoading',() => { this.loadingModal = false })
EventBus.$on('openBluetooth',() => { this.bluetoothModal = true }),
EventBus.$on('closeBluetooth',() => { this.bluetoothModal = false })
},
data: () => ({
bluetoothModal:false,
loadingModal:false,
alertOpen: false ,
message:'',
type:'',
}),
beforeDestroy(){
EventBus.$off('openAlert');
EventBus.$off('closeAlert');
EventBus.$off('openLoading');
EventBus.$off('closeLoading');
}
};
</script>
<style lang="scss">
html,body{
padding: 0;
margin: 0;
height: 100%;
width: 100%
}
#app {
background-color:#CFD8DC;
height: 100%;
width: 100%;
}
html {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
html::-webkit-scrollbar {
display: none; /* Chrome, Safari, Opera*/
}
</style>
<template>
<v-overlay
:value="openAlert"
:z-index="20"
>
<v-alert
:type="type"
dismissible
@click="closeAlert()"
>
{{ message }}
</v-alert>
</v-overlay>
</template>
<script>
import { EventBus } from '../event-bus'
export default {
props: {
open:Boolean,
message:String,
type:String,
},
watch: {
open(newVal) {
if (newVal) {
setTimeout(() => {
this.closeAlert()
}, 2000);
}
},
},
computed: {
openAlert: {
get() {
return this.open;
},
set() {
this.closeAlert()
},
},
},
methods:{
closeAlert(){
EventBus.$emit("closeAlert");
}
}
};
</script>
\ No newline at end of file
<template>
<v-overlay v-if="open" :z-index="10">
<v-card max-width="1500" min-width="1500" color="blue-grey lighten-5" light >
<v-toolbar
color="indigo "
class="elevation-0"
>
<v-toolbar-title class="white--text">블루투스 연결 (네트워크 연결)</v-toolbar-title>
</v-toolbar>
<v-row class='px-4'>
<v-col cols="6">
<v-subheader>안드로이드</v-subheader>
<v-card>
<v-row no-gutters>
<v-col cols="6">
<v-img
src="@/../public/image/android.jpg"
height="525"
contain
></v-img>
</v-col>
<v-col cols="6" class="d-flex justify-center align-center flex-column ">
<p class="text-h5">안드로이드 연결</p>
<p>1. 블루투스를 컨다</p>
<p>2. 블루투스 목록중 <strong>'falinux'</strong> 찾는다</p>
<p>3. <strong>'falinux'</strong> 선택</p>
<p>4. 모바일에서 핫스팟을 컨다</p>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col cols="6">
<v-subheader>아이폰</v-subheader>
<v-card color="">
<v-row no-gutters>
<v-col cols="6">
<v-img
src="@/../public/image/ipone.jpg"
height="525"
contain
></v-img>
</v-col>
<v-col cols="6" class="d-flex justify-center align-center flex-column ">
<p class="text-h5">아이폰 연결</p>
<p>1. 블루투스를 컨다</p>
<p>2. 블루투스 목록중 <strong>'falinux'</strong> 찾는다</p>
<p>3. <strong>'falinux'</strong> 선택</p>
<p>4. 모바일에서 핫스팟을 컨다</p>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
</v-card>
</v-overlay>
</template>
<script>
export default {
props:{
open:Boolean,
},
}
</script>
<style lang="scss">
</style>
<script>
// import VueCharts from 'vue-chartjs'
import { Doughnut,mixins } from 'vue-chartjs'
const { reactiveProp } = mixins
//https://www.chartjs.org/docs/latest/charts/line.html 옵션
//https://www.chartjs.org/samples/latest/
export default {
extends: Doughnut, //차트 종류 ex)bar
mixins: [ reactiveProp] ,
props:{
chartdata:Object,
percent: Number,
},
data () {
return {
options: {
title: {
display: false,
// text: 'title'
},
legend: {
position: 'bottom',
display: true,
},
responsive: true,
maintainAspectRatio: false
},
}
},
mounted () {
this.addPlugin({
id: 'my-plugin',
beforeDraw: this.centerText
})
this.renderChart(this.chartData, this.options )
},
methods: {
//가운데 퍼센트 표시하기 위함
centerText(chart){
let width = chart.chart.width;
let height = chart.chart.height;
let ctx = chart.chart.ctx;
ctx.restore();
let fontSize = (height / 150).toFixed(2);
ctx.font = fontSize + "em sans-serif" ;
ctx.textBaseline = "middle";
let text = this.percent+'%';
let textX = Math.round((width - ctx.measureText(text).width) / 2);
let textY = height / 2.2;
ctx.fillText(text, textX, textY);
ctx.save();
}
}
}
</script>
\ No newline at end of file
<template>
<v-overlay
class="loading-overlay"
:z-index="20"
:value="open">
<v-progress-circular
indeterminate
:size="150"
:width="7"
class="title"
>{{message}}...</v-progress-circular>
</v-overlay>
</template>
<script>
export default {
props: {
open:Boolean,
message:String,
},
}
</script>
import Vue from 'vue'
export const EventBus = new Vue()
import gql from 'graphql-tag' // eslint-disable-line no-unused-vars
import apolloProvider from '../plugins/apollo'
// import store from '@/store'
export default {
async get(serial){
try{
const response = await apolloProvider.defaultClient.query({
query: gql`
query aoiSerial($serial:String!){
aoiSerial(serial:$serial){
uid
name
state
serial
projectUid
}
}
`,
fetchPolicy: 'no-cache',
variables: { serial: serial }
})
let aoi = response.data.aoiSerial
if (!aoi) return ''
if (aoi.errors) throw new Error(aoi.errors[0])
return aoi
}catch (e) {
console.log(e)
throw e
}
},
async update(input){
try{
const response = await apolloProvider.defaultClient.mutate({
mutation: gql`
mutation updateAoi( $name: String! ,$state: Boolean! , $serial:String! ,$updateDate:String! ,$uid:Int! , $projectUid:Int ){
updateAoi(input:{
name:$name
state:$state
serial:$serial
updateDate:$updateDate
projectUid:$projectUid
uid:$uid
})
{
aoi{
uid
name
state
serial
updateDate
projectUid
}
}
}
`,
variables: {
uid:input.uid,
name:input.name,
state:input.state,
serial:input.serial,
updateDate:new Date(),
projectUid:0
}
})
let aoi = response.data.updateAoi.aoi
if (!aoi) return ''
if (aoi.errors){
throw new Error(aoi.errors[0])
}
return aoi
}catch (e) {
console.log(e)
throw e
}
},
}
\ No newline at end of file
import gql from 'graphql-tag' // eslint-disable-line no-unused-vars
import apolloProvider from '../plugins/apollo'
export default {
async get(projectUid){
try{
const response = await apolloProvider.defaultClient.query({
query: gql`
query learning($projectUid: Int!) {
learning(projectUid: $projectUid) {
projectUid
order
type
startX
startY
lastX
lastY
width
height
goodImage
missingImage
goodPath
missingPath
}
}`,
fetchPolicy: 'no-cache',
variables: { projectUid: projectUid }
})
let learning = response.data.learning
if (!learning) return ''
if (learning.errors) throw new Error(learning.errors[0])
return learning
}catch (e) {
console.log(e)
throw e
}
},
}
\ No newline at end of file
import gql from 'graphql-tag' // eslint-disable-line no-unused-vars
import apolloProvider from '../plugins/apollo'
// import store from '@/store'
export default {
async get(uid){
try{
const response = await apolloProvider.defaultClient.query({
query: gql`
query nProject($aoiUid:Int!) {
nProject(aoiUid:$aoiUid) {
name
admin
user
createDate
successDate
counter
aoiUid
uid
state
updateDate
}
}`,
fetchPolicy: 'no-cache',
variables: { aoiUid: uid }
})
let project = response.data.nProject
if (!project) return ''
if (project.errors) throw new Error(project.errors[0])
return project
}catch (e) {
return false
}
},
async update(input){
try{
const response = await apolloProvider.defaultClient.mutate({
mutation: gql`
mutation updateNproject(
$name: String! ,
$admin: String! ,
$user: String! ,
$createDate: String! ,
$successDate: String! ,
$counter:Int ,
$aoiUid:Int! ,
$uid:Int!,
$state:Boolean!,
$updateDate:String,
$success:Int,
$fail:Int,
$total:Int,
$result:Boolean
){
updateNproject(input:{
name:$name
admin:$admin
user:$user
createDate:$createDate
successDate:$successDate
counter:$counter
aoiUid:$aoiUid
uid:$uid
state:$state
updateDate:$updateDate,
success:$success,
fail:$fail,
total:$total,
result:$result
})
{
nProject{
name
admin
user
createDate
successDate
counter
aoiUid
uid
state
updateDate
success
fail
total
result
}
}
}
`,
variables: {
name: input.name,
admin: input.admin,
user: input.user,
createDate: input.createDate,
successDate: input.successDate,
counter: input.counter,
aoiUid: 0,
uid: input.uid,
state: input.state,
updateDate: new Date(),
success:input.success,
fail:input.fail,
total:input.total,
result:input.result,
}
})
let project = response.data.updateNproject.nProject
if (!project) return ''
if (project.errors){
throw new Error(project.errors[0])
}
return true
}catch (e) {
console.log(e)
throw e
}
},
}
\ No newline at end of file
import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
import vuetify from './plugins/vuetify';
import axios from 'axios'
import VueKonva from 'vue-konva'
import apolloProvider from './plugins/apollo'
Vue.use(VueKonva)
axios.defaults.baseURL = '/api' //모든 요청에 '/api' 붙도록 기본 설정
axios.defaults.headers.common.Accept = 'application/json'//JSON 형식으로만 받는다
axios.interceptors.response.use( //Error 전파하기 위해 인터셉터 응답을 추가한다.
response => response,
(error) => {
return Promise.reject(error)
}
)
//Vue.prototype.$http = axios //vue 컴포넌트에서 this.$http 요청할 수 있게 된다.
Vue.config.productionTip = false
new Vue({
router,
store,
vuetify,
apolloProvider,
render: h => h(App)
}).$mount('#app')
import Vue from 'vue'
import { ApolloClient } from 'apollo-client'
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import VueApollo from 'vue-apollo'
//멑티 클라이언트 구성
//https://apollo.vuejs.org/guide/multiple-clients.html
Vue.use(VueApollo)
const httpLink = createHttpLink({
uri: 'https://www.nemopai.com/graphql',
})
const link = httpLink
const apolloClient = new ApolloClient({
// Tells Apollo to use the link chain with the http link we set up.
link,
// Handles caching of results and mutations.
cache: new InMemoryCache({ freezeResults: false }),
// Useful if you have the Apollo DevTools installed in your browser.
connectToDevTools: true
});
const apolloProvider = new VueApollo({
defaultClient: apolloClient
});
export default apolloProvider;
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
Vue.use(Vuetify);
export default new Vuetify({
icons: {
iconfont: 'mdiSvg',
},
});
/* eslint-disable no-console */
import { register } from 'register-service-worker'
if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, {
ready () {
console.log(
'App is being served from cache by a service worker.\n' +
'For more details, visit https://goo.gl/AFskqB'
)
},
registered () {
console.log('Service worker has been registered.')
},
cached () {
console.log('Content has been cached for offline use.')
},
updatefound () {
console.log('New content is downloading.')
},
updated () {
console.log('New content is available; please refresh.')
},
offline () {
console.log('No internet connection found. App is running in offline mode.')
},
error (error) {
console.error('Error during service worker registration:', error)
}
})
}
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'home',
component: Home
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
import axios from 'axios'
export default {
async projectCreateNum() {
try{
const result = await axios.get('/projectCreateNum')
return result.data
} catch (error) {
return error.message
}
},
async projectCreate(data) {
try{
const result = await axios.post('/projectCreate',data)
return result
} catch (error) {
return error.message
}
},
async projectCapture (data) {
try{
const result = await axios.get('/requestManager',{ params: data })
return result
} catch (error) {
return error.message
}
},
// axios.get('/neuroCapture',{ params: param })
projectUpdate (data) {
return new Promise((resolve,reject) =>{
// axios.post('/projectModify',{ params: data })
axios.post('/projectUpdate',data)
.then(({data}) => {
resolve(data)})
.catch((error) => {
reject(new Error(`${error} 요청 실패입니다.`));
})
})
},
projectRemove (data) {
return new Promise((resolve,reject) =>{
// axios.post('/projectModify',{ params: data })
axios.post('/projectUpdate',data)
.then(({data}) => {
resolve(data)})
.catch((error) => {
reject(new Error(`${error} 요청 실패입니다.`));
})
})
}
}
\ No newline at end of file
import axios from 'axios'
/* {data} 받으면 data.data. => data. 접근 가능 */
export default{
async request(param) {
try{
let response = await axios.get('/manager',{ params: param })
return response
}catch(e){
console.error(e.message)
}
},
}
\ No newline at end of file
export default{
neuroStart (param){
return new Promise((resolve,reject) => {
JSON.parse(param).cmd === "neuro_start" ? resolve(param) : reject(new Error("요청 값이 틀립니다."))
})
},
neuroCapture (param){
return new Promise((resolve,reject) => {
JSON.parse(testJson).cmd === "capture_done" ? resolve(testJson) : reject(new Error("요청 값이 틀립니다."))
})
},
neuroCheck (param){
return new Promise((resolve,reject) => {
JSON.parse(param).cmd === "neuro_check" ? resolve("검수 성공 ") : reject(new Error("요청 값이 틀립니다."))
})
},
neuroSave (param){
return new Promise((resolve,reject) => {
JSON.parse(testJson).cmd === "capture_done" ? resolve(testJson) : reject(new Error("요청 값이 틀립니다."))
})
},
}
\ No newline at end of file
import axios from 'axios'
export default {
async get() {
try{
const response = await axios.get('/project')
return response.data
}catch (e) {
console.log(e)
throw e
}
},
async save(data) {
try{
let response = await axios.post('/project', data )
return response.data
}catch(e){
console.error(e.message)
}
}
}
\ No newline at end of file
import axios from 'axios'
export default {
async getWpoId () {
try{
let response = await axios.get('/wpo')
return response.data
}catch(e){
console.error(e.message)
}
},
}
\ No newline at end of file
import Vue from 'vue'
import Vuex from 'vuex'
// import projectStore from './modules/projectStore.js'
import aoiStore from './modules/aoiStore'
import projectStore from './modules/projectStore'
import createPersistedState from 'vuex-persistedstate';
Vue.use(Vuex)
export default new Vuex.Store({
modules:{
project:projectStore,
aoi:aoiStore
},
plugins:[
createPersistedState({
paths:['aoi' , 'project']
}),
]
})
import aoiGql from '@/gql/aoi'
import wpoService from '@/service/wpo'
const state = {
aoi: {},
serial: '',
}
const getters = {
}
const actions = {
async getSerial({commit}){
let serial = await wpoService.getWpoId() //웹서버에 지정한 WPO ID 가져오기
commit('GETSERIAL' , serial)
},
async getAoi({commit}, serial){
let aoi = await aoiGql.get(serial)
commit('GETAOI' , aoi)
},
async updateAoi({commit} , input){
let result = await aoiGql.update(input)
commit('UPDATEAOI' , result)
},
}
const mutations = {
GETSERIAL(state,payload ){
state.serial = payload
},
GETAOI(state,payload ){
state.aoi = payload
},
UPDATEAOI(state,payload){
state.aoi = { ...payload};
},
}
export default {
state: {
...state
},
getters,
mutations,
actions
}
\ No newline at end of file
import projectGql from '@/gql/project'
const state = {
project: [],
}
const getters = {
}
const actions = {
async setProject({commit}, project){
commit('SETPROJECT' , project)
},
async updateAoi({commit} , input){
let result = await projectGql.update(input)
commit('UPDATEAOI' , result)
},
}
const mutations = {
SETPROJECT(state,payload ){
state.project = payload
},
UPDATEAOI(state,payload){
state.aoi = { ...payload};
},
}
export default {
state: {
...state
},
getters,
mutations,
actions
}
\ No newline at end of file
<template>
<v-container class="home d-flex align-center justify-center" >
<v-row>
<Setting
v-if="stepper === 0"
:message="message"
/>
<Aoi
v-else-if="stepper === 1"
/>
<Teaching
v-else-if="stepper === 2"
:project="project"
:learnings="learnings"
/>
<Project
v-else-if="stepper === 3"
:project="project"
:learnings="learnings"
/>
</v-row>
</v-container>
</template>
<script>
// import wpoService from '../service/wpo'
import projectService from '../service/project'
// import learningService from '../service/learning'
// import teachingService from '@/service/teaching'
import projectGql from '@/gql/project'
import learningGql from '@/gql/learning'
import { EventBus } from '@/event-bus'
import Setting from './step/Setting.vue'
import Aoi from './step/Aoi.vue'
import Teaching from './step/Teaching.vue'
import Project from './step/Project.vue'
export default {
data () {
return {
stepper: 0,
message:'Setting ...',
projectUid: 0 ,
project:{},
learnings:[],
}
},
components:{
Setting,
Aoi,
Teaching,
Project
},
created(){
this.getProject()
EventBus.$on('setTeaching',( number , aoiUid ) => { this.setTeaching(number , aoiUid) })
EventBus.$on('setProject', ( number , project ) => { this.setProject(number , project) })
EventBus.$on('setInit', () => { this.getProject() ,this.stepper === 1 })
},
mounted(){
//
},
methods: {
async getProject(){
let local = await projectService.get()
console.log('local :',local)
if(Object.keys(local.learning).length === 0 || Object.keys(local.project).length === 0){
this.stepper = 1
}else if(local.project.result){
this.stepper = 3
this.project = local.project
this.learnings = local.learning.learning
this.$store.dispatch('setProject' ,this.project )
}else if(!local.project.result){
this.project = local.project
this.learnings = local.learning.learning
this.stepper = 2
this.$store.dispatch('setProject' ,this.project )
}
},
async setTeaching(aoiUid){
this.stepper = 0
this.message ="프로젝트 세팅..."
let gqlProject = await projectGql.get(aoiUid)
this.$store.dispatch('setProject',gqlProject)
this.message ="학습 세팅..."
let gqlLearning = await learningGql.get(gqlProject.uid)
this.message ="프로젝트 저장..."
let saveData = {
'project':gqlProject,
'learning': gqlLearning
}
if(Object.keys(gqlProject).length !== 0 && gqlLearning.length !== 0){
let response = await projectService.save(saveData)
this.project = response.project
this.learnings = response.learning
if(Object.keys(this.project).length !== 0 && this.learnings.length !== 0) this.stepper = 2
}
},
async setProject( project){
this.stepper = 3
this.project = project
}
},
beforeDestroy(){
EventBus.$off('setTeaching');
EventBus.$off('setProject');
EventBus.$off('setInit');
},
}
</script>
<style lang="scss">
.home{
height: 100vh;
}
</style>
\ No newline at end of file
<template>
<v-card
width="1280"
max-width="1280"
height="846"
max-height="846"
dark
class="elevation-0 mx-auto"
>
<v-card
v-if="captureImage === null"
height="720"
max-height="720"
width="100%"
max-width="100%"
class="elevation-0 d-flex justify-center align-center flex-column"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-h3 text-center"
cols="12"
>
<span><strong class="white--text success">보드</strong>를 삽입해주세요</span>
</v-col>
<v-col cols="12">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="6"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
<v-stage
v-else
class="ma-0 pa-0 "
ref="stage"
:config="stageSize"
>
<v-layer ref="layer"
:config="stageSize"
>
<v-image
:config="{
image: image,
width: 1280,
height: 720,
}"/>
<v-rect
v-for="(rec, index) in rect"
:key="index"
:config="{
x: Math.min(rec.startX , rec.lastX ),
y: Math.min(rec.startY , rec.lastY),
width: Math.abs(rec.width ),
height: Math.abs(rec.height ),
fill: rec.stroke+'4D',
stroke: rec.stroke,
dash:[8,8],
strokeWidth: 3,
}"
>
</v-rect>
</v-layer>
</v-stage>
<v-card-text>
<v-progress-linear
class="mt-10"
v-if="captureImage !== null"
color="green darken-2"
v-model="progressbar"
height="40"
dark
reactive
@click.prevent.self
>
<strong>{{ progressbar }} %</strong>
</v-progress-linear>
</v-card-text>
</v-card>
</template>
<script>
export default {
data () {
return {
loading: true,
progressbar: 0,
image: null,
rect:[],
check:[],
stageSize: {
width: 1280,
height: 720,
},
drwingColor: '#2196F3', // 선 색
thickness: 3, //선 굵기
}
},
props: {
step:Number,
learnings:Array,
project:Object,
counter:Number,
result:Array,
captureImage:String
},
watch: {
counter(current){
this.progressbar = Math.round((100 * current) / this.project.counter);
},
result(current){
if(current.length !== 0){
this.rect =[]
this.rect = [...this.learnings]
for(let i = 0; i < current.length; i++ ){
Number(current[i]) === 0 ? (this.rect[i].fill = '#0D47A1' , this.rect[i].stroke = '#0D47A1' ) : (this.rect[i].fill = '#B71C1C' , this.rect[i].stroke = '#B71C1C' )
}
}
},
step(current){
if(current === 6){
this.rect =[]
}
},
captureImage(current){
let image = new Image();
image.src = 'data:image/jpeg;base64,'+current
image.onload = () => { this.image = image};
}
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-card
dense
height="400"
class="elevation-0"
>
<v-toolbar
class="elevation-0 "
dense
>
<v-toolbar-title>통계</v-toolbar-title>
<v-spacer></v-spacer>
</v-toolbar>
<div v-if="result.length !== 0" class=" pa-0 ma-0">
<DoughnutChart
class="mt-3 pa-0 ma-0"
:chart-data="totalColl"
:height="220"
:percent="percent"
/>
</div>
</v-card>
</template>
<script>
import DoughnutChart from '../../components/DoughnutChart.vue'
export default {
data () {
return {
total:0,
totalColl:{},
success:0,
fail:0,
percent:0
}
},
props: {
step:Number,
wpo:String,
infos:Array,
project:Object,
result:Array,
counter:Number
},
mounted(){
this.totalColl = {
labels: ['성공','실패'],
datasets: [
{
backgroundColor: ['#4CAF50' ,'#F44336'],
data: [ this.success ,this.fail],
}
],
}
},
components: {
DoughnutChart,
},
watch:{
result(current){
if(current.length !== 0){
this.total = this.total + current[current.length-1]['time']
current[current.length-1]['result'] === 0 ? ++ this.fail : ++this.success
this.percent = Math.round((100 * this.success ) / this.counter)
this.totalColl = {
labels: ['성공','실패'],
datasets: [
{
backgroundColor: ['#4CAF50' ,'#F44336'],
data: [ this.success ,this.fail],
}
],
}
}
},
step(current){
if(current === 1){
this.total = 0,
this.totalColl ={},
this.success = 0,
this.fail = 0,
this.percent = 0
}
}
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-data-table
:disabled="loading"
height="300px"
min-height="300px"
max-height="300px"
width="100%"
max-width="100%"
dense
:headers="headers"
:items="result"
:items-per-page="100"
no-data-text="검수 이력이 없습니다."
:sort-by="['counter']"
:sort-desc="[true]"
class="elevation-0 mt-6 overflow-x-hidden overflow-y-auto"
hide-default-footer
>
<template v-slot:[`item.total`]="{ item }">
{{item.total}}
</template>
<template v-slot:[`item.state`]="{ item }">
<v-chip
:color="item.result === 0 ? 'error' : 'success'"
small
dark
>
{{ item.result === 0 ? '실패' :'성공' }}
</v-chip>
</template>
<template v-slot:[`item.time`]="{ item }">
{{item.time.toFixed(2)}}
</template>
</v-data-table>
</template>
<script>
export default {
data () {
return {
loading: true,
headers: [
{ text: '횟수', align: 'start', sortable: false, value: 'total',},
{ text: '검수 결과', align: 'center', value: 'state' },
],
}
},
props: {
step:Number,
project:Object,
result:Array
},
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-stepper
v-model="step"
vertical
style="height:100%"
class="font-weight-black elevation-0 "
width="100%"
max-width="100%"
>
<v-toolbar
color="blue darken-1"
dark
class="elevation-0 "
>
<v-toolbar-title>{{wpo}}</v-toolbar-title>
<v-spacer></v-spacer>
<v-chip v-if="local" light color="yellow">LOCAL</v-chip>
</v-toolbar>
<v-stepper-step
:color="step > 1 ? 'primary' : 'blue lighten-3'"
:complete="step > 1"
step="1"
class="font-weight-black"
>
<small class="font-weight-bold">Step 1</small>
세팅
</v-stepper-step>
<v-stepper-content step="1" >
<div class="text-center">
<v-progress-circular
:size="100"
color="blue lighten-3"
indeterminate
></v-progress-circular>
</div>
</v-stepper-content>
<v-stepper-step
:color="step > 2 ? 'primary' : 'blue lighten-3'"
:complete="step > 2"
step="2"
class="font-weight-black"
>
<small class="font-weight-bold">Step 2 </small>
<span> 데이터 불러오기 </span>
</v-stepper-step>
<v-stepper-content step="2" >
<v-list>
<v-list-item-group
multiple
>
<v-list-item>
<v-list-item-action>
<v-checkbox
:input-value="Object.keys(project).length !== 0 ? true : false"
color="blue lighten-3"
></v-checkbox>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>프로젝트</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-checkbox
:input-value="infos.length !== 0 ? true : false"
color="blue lighten-3"
></v-checkbox>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>검수 정보</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-checkbox
:input-value="step === 2 ? true : false"
color="blue lighten-3"
></v-checkbox>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>데이터 저장</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list-item-group>
</v-list>
</v-stepper-content>
<v-stepper-step
:color="step > 3 ? 'primary' : 'blue lighten-3'"
:complete="step > 3"
step="3"
>
<small class="font-weight-bold">Step 3</small>
매니저 티칭 정보 확인
</v-stepper-step>
<v-stepper-content step="3">
<div class="text-center">
<v-progress-circular
:size="100"
color="blue lighten-3"
indeterminate
></v-progress-circular>
</div>
</v-stepper-content>
<v-stepper-step
:color="step > 4 ? 'primary' : 'blue lighten-3'"
:complete="step > 4"
step="4"
>
<small class="font-weight-bold">Step 4</small>
보드 사진 촬영
</v-stepper-step>
<v-stepper-content step="4">
<div class="text-center">
<v-progress-circular
:size="100"
color="blue lighten-3"
indeterminate
></v-progress-circular>
</div>
</v-stepper-content>
<v-stepper-step
:color="step > 5 ? 'primary' : 'blue lighten-3'"
:complete="step > 5"
step="5"
>
<small class="font-weight-bold">Step 5</small>
검수
</v-stepper-step>
<v-stepper-content step="5">
<div class="text-center">
<v-progress-circular
:size="100"
color="blue lighten-3"
indeterminate
></v-progress-circular>
</div>
</v-stepper-content>
<v-stepper-step
:color="step === 6 ? 'primary' : 'blue lighten-3'"
:complete="step === 6"
step="6"
>
<small class="font-weight-bold">Step 6</small>
결과
</v-stepper-step>
<v-stepper-content step="6">
<div class="text-center">
<v-btn
class="elevation-3 mt-5 "
x-large
fab
color="yellow"
>
<v-icon>mdi-replay</v-icon>
</v-btn>
<div class="mt-3">상단 버튼을 누르면 재검수</div>
</div>
</v-stepper-content>
</v-stepper>
</template>
<script>
export default {
props: {
step:Number,
wpo:String,
infos:Array,
project:Object,
local:Boolean
},
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-card
width="100%"
height="850px"
class="elevation-0 "
>
<v-card-title class="blue-grey white--text ">AOI</v-card-title>
<v-container>
<v-row>
<v-col cols="4">
<v-card
:class="step === 0 ?'elevation-12':'elevation-0'"
:color="step === 0 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center"
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 0" class="text-h4">블루투스 연결 <v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<span v-else class="text-h4 "><strong>블루투스</strong>를 연결해주세요</span>
</v-col>
<v-col v-if="step === 0" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col cols="4">
<v-card
:class="step === 1 ?'elevation-12':'elevation-0'"
:color="step === 1 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center "
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 1" class="text-h4">AOI 연결 <v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<div v-else class="text-h4 "><strong>AOI 장비</strong>와 연결해주세요
<p class="text-h4 "><strong>S/N : {{serial}}</strong></p></div>
</v-col>
<v-col v-if="step === 1" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col cols="4">
<v-card
:class="step === 2 ?'elevation-12':'elevation-0'"
:color="step === 2 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center"
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 2" class="text-h4">프로젝트 연동 완료 <v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<span v-else class="text-h4 "><strong>프로젝트</strong>를 생성해주세요</span>
</v-col>
<v-col v-if="step === 2" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
</v-container>
</v-card>
</template>
<script>
import managerService from '@/service/manager'
import { EventBus } from '@/event-bus'
export default {
data () {
return {
message: '준비중...',
step:1, //테스트로 실행
// step:0,
id:'',
}
},
computed: {
serial() {
return this.$store.state.aoi.serial
},
aoi(){
return this.$store.state.aoi.aoi
}
},
created(){
// this.network()
this.getAoi() // 테스트로 실행
},
methods: {
async network(){
EventBus.$emit('openBluetooth')
try{
const msg = new Object()
msg.cmd = "network_check"
let response = await managerService.request(msg)
if(JSON.parse(response.data).status){
EventBus.$emit('closeBluetooth')
setTimeout(() => {
this.step = 1
}, 1000);
}else{
this.network()
}
}catch(e){
// EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
getAoi(){
this.$store.dispatch('getAoi',this.serial)
let delay = 1000;
let timer = setInterval(()=> {
if(this.aoi.serial === this.serial){
clearInterval(timer)
setTimeout(() => {
this.step = 2
}, 2000);
}else{
this.$store.dispatch('getAoi',this.serial)
}
},delay)
},
getAoiProject(){
let delay = 1000;
let timer = setInterval(()=> {
if(this.aoi.projectUid !== 0){
clearInterval(timer)
this.step = 3
setTimeout(() => {
setTimeout(EventBus.$emit('setTeaching' , this.aoi.uid ), 3000);
}, 2000);
}else{
this.$store.dispatch('getAoi',this.serial)
}
},delay)
}
},
watch:{
async step(current) {
switch(current) {
case 1:
this.getAoi()
break;
case 2:
this.getAoiProject()
break;
}
}
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-card
width="100%"
height="850px"
class="elevation-0 "
>
<v-card-title class="blue-grey white--text ">PROJECT</v-card-title>
<v-container>
<v-row>
<v-col cols="4">
<v-card
:class="step === 0 ?'elevation-12':'elevation-0'"
:color="step === 0 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center"
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 0" class="text-h4">블루투스 연결 <v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<span v-else class="text-h4 "><strong>블루투스</strong>를 연결해주세요</span>
</v-col>
<v-col v-if="step === 0" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col cols="4">
<v-card
:class="step === 1 ?'elevation-12':'elevation-0'"
:color="step === 1 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center "
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 1" class="text-h4">데이터 연동<v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<div v-else class="text-h4 "><strong>서버</strong>와 DB 연동</div>
<!-- <p class="text-h4 "><strong>S/N : {{id}}</strong></p></div> -->
</v-col>
<v-col v-if="step === 1" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col cols="4">
<v-card
:class="step === 2 ?'elevation-12':'elevation-0'"
:color="step === 2 ? '' : 'grey lighten-2'"
class="d-flex justify-center align-center"
height="740"
>
<v-row
class="fill-height"
align-content="center"
justify="center"
>
<v-col
class="text-center"
cols="12"
>
<span v-if="step > 2" class="text-h4">세팅 초기화<v-icon color="success" class="pb-4" x-large>mdi-check-bold</v-icon> </span>
<span v-else class="text-h4 "><strong>세팅</strong> 초기화</span>
</v-col>
<v-col v-if="step === 2" cols="8">
<v-progress-linear
color="blue-grey"
indeterminate
rounded
height="8"
></v-progress-linear>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
</v-container>
</v-card>
</template>
<script>
import managerService from '@/service/manager'
import projectService from '@/service/project'
import projectGQL from '@/gql/project'
import aoiGQL from '@/gql/aoi'
import { EventBus } from '@/event-bus'
export default {
data () {
return {
message: '준비중...',
step:0,
id:'',
}
},
props: {
project: Object,
},
computed: {
aoi(){
return this.$store.state.aoi.aoi
}
},
created(){
this.network()
},
methods: {
async network(){
EventBus.$emit('openBluetooth')
try{
const msg = new Object()
msg.cmd = "network_check"
let response = await managerService.request(msg)
if(JSON.parse(response.data).status){
EventBus.$emit('closeBluetooth')
setTimeout(() => {
this.step = 1
}, 1000);
}else{
this.network()
}
}catch(e){
// EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
async projectUpdate(){
let result = await projectGQL.update(this.project)
if(result){
projectService.save({})
setTimeout(() => {
this.step = 2
}, 3000);
}
},
async aoiInit(){
let result = await aoiGQL.update(this.aoi)
if(Object.keys(result).length !== 0){
setTimeout(() => {
this.step = 2
EventBus.$emit('setInit')
}, 3000);
}
},
},
watch:{
async step(current) {
switch(current) {
case 1:
this.projectUpdate()
break;
case 2:
this.aoiInit()
break;
}
}
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-card
width="100%"
height="850px"
class="elevation-0 d-flex justify-center align-center flex-column"
>
<v-progress-circular
color="blue-grey"
indeterminate
rounded
:size="500"
:width="30"
>
<span class="text-h3 font-weight-bold"> {{message}}</span>
</v-progress-circular>
</v-card>
</template>
<script>
export default {
data () {
return {
}
},
props: {
message: String,
},
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<v-container class="home d-flex align-center justify-center" >
<v-row >
<v-col col="3">
<v-card
min-height="846"
>
<v-card-title class="green darken-1 white--text font-weight-bold" >{{project.name}}</v-card-title>
<v-card-text class="mt-3">
<v-text-field
label="관리자"
v-model="project.admin"
readonly
outlined
></v-text-field>
<v-text-field
label="작업자"
v-model="project.user"
readonly
outlined
></v-text-field>
<v-row>
<v-col cols="6">
<v-text-field
label="작업자"
v-model="project.createDate"
readonly
outlined
></v-text-field>
</v-col>
<v-col cols="6">
<v-text-field
label="작업자"
v-model="project.successDate"
readonly
outlined
></v-text-field>
</v-col>
</v-row>
<p>진행 사항</p>
<v-row >
<v-col cols="3">
<v-text-field
label="진행 횟수"
v-model="total"
readonly
filled
></v-text-field>
</v-col>
<v-col cols="3">
<v-text-field
label="성공 횟수"
v-model="success"
readonly
filled
></v-text-field>
</v-col>
<v-col cols="3">
<v-text-field
label="실패 횟수"
v-model="fail"
readonly
filled
></v-text-field>
</v-col>
<v-col cols="3">
<v-text-field
label="검수 횟수"
v-model="project.counter"
readonly
filled
></v-text-field>
</v-col>
</v-row>
<Result
:step="step"
:project="project"
:result="result"
/>
</v-card-text>
</v-card>
</v-col>
<v-col cols="9" >
<Board
:step="step"
:learnings="learnings"
:project="project"
:counter="success"
:result="resultRect"
:captureImage="captureImage"
/>
</v-col>
</v-row>
</v-container>
</template>
<script>
import managerService from '@/service/manager'
import projectService from '@/service/project'
import { EventBus } from '@/event-bus'
import Board from '@/views/main/Board.vue'
import Result from '@/views/main/Result.vue'
export default {
data () {
return {
step:0,
aoi:{},
total:0, //진행 횟수
success:0, //성공 횟수
fail:0, //실패 횟수
result:[],
resultRect:[],
captureImage:null ,
}
},
props: {
project: Object,
learnings: Array,
},
components:{
Board,
Result,
// Chart
},
created(){
this.step = 1
},
methods: {
async teachingCheck(){
try{
const msg = new Object()
msg.cmd = "neuro_start"
msg.project_num = this.project.uid
let response = await managerService.request(msg)
console.log('neuro_start :',JSON.parse(response.data).state)
JSON.parse(response.data).state ? this.step = 2 : EventBus.$emit('openAlert',`AOI 전원을 재부팅 해주세요`, 'error')
}catch(e){
EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
async captureReady(){
try{
const msg = new Object()
msg.cmd = "neuro_ready"
let response = await managerService.request(msg)
JSON.parse(response.data).cmd === 'neuro_ready_done' ? this.step = 3 : EventBus.$emit('openAlert',`AOI 전원을 재부팅 해주세요`, 'error')
}catch(e){
EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
async imageCapture(){
try{
const msg = new Object()
msg.cmd = "neuro_capture"
let response = await managerService.request(msg)
let data = JSON.parse(response.data)
this.captureImage = data.imageBase64
this.step = 4
}catch(e){
EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
async inspection(){
try{
let teachingInfo = ''
this.learnings.forEach((rect) => {
let str = `(${Math.ceil(rect.startX * 1.5)},${Math.ceil(rect.startY * 1.5)},${Math.ceil(rect.lastX * 1.5)},${Math.ceil( rect.lastY * 1.5) })`
teachingInfo= teachingInfo + "-" + str
})
let msg = new Object()
msg.cmd = "neuro_check"
msg.project_num = this.project.uid
msg.teaching_info = teachingInfo
let response = await managerService.request(msg)
let data = JSON.parse(response.data)
this.resultRect = []
let order = new Object()
order.total = this.total
order.result = data['result']
data['result'] === 0 ? ++ this.fail : ++ this.success
this.resultRect = data['check_box']
this.result.push(order)
console.log(this.result)
if(typeof response === 'undefined') throw new Error('서버와 연결 되지 않았습니다.')
if(response.status !== 200) throw new Error('옳지 않은 응답입니다.')
this.success === this.project.counter ? this.step = 5 : this.step = 2
}catch(e){
EventBus.$emit('openAlert',`${e.message}`, 'error')
}
},
async teachingResult(){
EventBus.$emit('openLoading','Finish...')
try{
const msg = new Object()
msg.cmd = "neuro_complete"
let response = await managerService.request(msg)
if(JSON.parse(response.data).cmd === "complete_done"){
this.project.total = this.total
this.project.success = this.success
this.project.fail = this.fail
this.project.result = true
let saveData = {
'project':this.project,
'learning': this.learnings
}
let response = await projectService.save(saveData)
if(Object.keys(response.project).length !== 0 ){
EventBus.$emit('closeLoading')
EventBus.$emit('setProject' , response.project )
}
}
}catch(e){
EventBus.$emit('openAlert',`${e.message}`, 'error')
}
}
// async replay(){
// try{
// let msg = new Object()
// msg.cmd = "neuro_replay"
// let response = await managerService.requestManager(msg)
// let data = JSON.parse(response.data)
// if(data['btn_num'] === 1){
// this.dataInit()
// this.step = 2
// }else{
// this.replay()
// }
// }catch(e){
// EventBus.$emit('openAlert',`${e.message}`, 'error')
// }
// }
},
watch:{
async step(current) {
if(current === 1){
await this.teachingCheck()
}else if(current === 2){
await this.captureReady()
}else if(current === 3){
await this.imageCapture()
}else if(current === 4){
++this.total
await this.inspection()
}else if(current === 5){
await this.teachingResult()
}
}
},
}
</script>
<style lang="scss">
.home{
height: 100vh;
}
</style>
\ No newline at end of file
module.exports = {
rules: {
'no-unused-expressions': 'off'
}
}
/**
* A custom Nightwatch assertion. The assertion name is the filename.
*
* Example usage:
* browser.assert.elementCount(selector, count)
*
* For more information on custom assertions see:
* https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions
*
*
* @param {string|object} selectorOrObject
* @param {number} count
*/
exports.assertion = function elementCount (selectorOrObject, count) {
let selector
// when called from a page object element or section
if (typeof selectorOrObject === 'object' && selectorOrObject.selector) {
// eslint-disable-next-line prefer-destructuring
selector = selectorOrObject.selector
} else {
selector = selectorOrObject
}
this.message = `Testing if element <${selector}> has count: ${count}`
this.expected = count
this.pass = val => val === count
this.value = res => res.value
function evaluator (_selector) {
return document.querySelectorAll(_selector).length
}
this.command = cb => this.api.execute(evaluator, [selector], cb)
}
/**
* A very basic Nightwatch custom command. The command name is the filename and the
* exported "command" function is the command.
*
* Example usage:
* browser.customExecute(function() {
* console.log('Hello from the browser window')
* });
*
* For more information on writing custom commands see:
* https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
*
* @param {*} data
*/
exports.command = function command (data) {
// Other Nightwatch commands are available via "this"
// .execute() inject a snippet of JavaScript into the page for execution.
// the executed script is assumed to be synchronous.
//
// See https://nightwatchjs.org/api/execute.html for more info.
//
this.execute(
// The function argument is converted to a string and sent to the browser
function (argData) { return argData },
// The arguments for the function to be sent to the browser are specified in this array
[data],
function (result) {
// The "result" object contains the result of what we have sent back from the browser window
console.log('custom execute result:', result.value)
}
)
return this
}
/**
* A basic Nightwatch custom command
* which demonstrates usage of ES6 async/await instead of using callbacks.
* The command name is the filename and the exported "command" function is the command.
*
* Example usage:
* browser.openHomepage();
*
* For more information on writing custom commands see:
* https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
*
*/
module.exports = {
command: async function () {
// Other Nightwatch commands are available via "this"
// .init() simply calls .url() command with the value of the "launch_url" setting
this.init()
this.waitForElementVisible('#app')
const result = await this.elements('css selector', '#app ul')
this.assert.strictEqual(result.value.length, 3)
}
}
/**
* A class-based Nightwatch custom command which is a variation of the openHomepage.js command.
* The command name is the filename and class needs to contain a "command" method.
*
* Example usage:
* browser.openHomepageClass();
*
* For more information on writing custom commands see:
* https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
*
*/
const assert = require('assert')
module.exports = class {
async command () {
// Other Nightwatch commands are available via "this.api"
this.api.init()
this.api.waitForElementVisible('#app')
const result = await this.api.elements('css selector', '#app ul')
assert.strictEqual(result.value.length, 3)
}
}
///////////////////////////////////////////////////////////////////////////////////
// Refer to the entire list of global config settings here:
// https://github.com/nightwatchjs/nightwatch/blob/master/lib/settings/defaults.js#L16
//
// More info on test globals:
// https://nightwatchjs.org/gettingstarted/configuration/#test-globals
//
///////////////////////////////////////////////////////////////////////////////////
module.exports = {
// this controls whether to abort the test execution when an assertion failed and skip the rest
// it's being used in waitFor commands and expect assertions
abortOnAssertionFailure: true,
// this will overwrite the default polling interval (currently 500ms) for waitFor commands
// and expect assertions that use retry
waitForConditionPollInterval: 500,
// default timeout value in milliseconds for waitFor commands and implicit waitFor value for
// expect assertions
waitForConditionTimeout: 5000,
'default': {
/*
The globals defined here are available everywhere in any test env
*/
/*
myGlobal: function() {
return 'I\'m a method';
}
*/
},
'firefox': {
/*
The globals defined here are available only when the chrome testing env is being used
i.e. when running with --env firefox
*/
/*
* myGlobal: function() {
* return 'Firefox specific global';
* }
*/
},
/////////////////////////////////////////////////////////////////
// Global hooks
// - simple functions which are executed as part of the test run
// - take a callback argument which can be called when an async
// async operation is finished
/////////////////////////////////////////////////////////////////
/**
* executed before the test run has started, so before a session is created
*/
/*
before(cb) {
//console.log('global before')
cb();
},
*/
/**
* executed before every test suite has started
*/
/*
beforeEach(browser, cb) {
//console.log('global beforeEach')
cb();
},
*/
/**
* executed after every test suite has ended
*/
/*
afterEach(browser, cb) {
browser.perform(function() {
//console.log('global afterEach')
cb();
});
},
*/
/**
* executed after the test run has finished
*/
/*
after(cb) {
//console.log('global after')
cb();
},
*/
/////////////////////////////////////////////////////////////////
// Global reporter
// - define your own custom reporter
/////////////////////////////////////////////////////////////////
/*
reporter(results, cb) {
cb();
}
*/
}
/**
* A Nightwatch page object. The page object name is the filename.
*
* Example usage:
* browser.page.homepage.navigate()
*
* For more information on working with page objects see:
* https://nightwatchjs.org/guide/working-with-page-objects/
*
*/
module.exports = {
url: '/',
commands: [],
// A page object can have elements
elements: {
appContainer: '#app'
},
// Or a page objects can also have sections
sections: {
app: {
selector: '#app',
elements: {
logo: 'img'
},
// - a page object section can also have sub-sections
// - elements or sub-sections located here are retrieved using the "app" section as the base
sections: {
headline: {
selector: 'h1'
},
welcome: {
// the equivalent css selector for the "welcome" sub-section would be:
// '#app div.hello'
selector: 'div.hello',
elements: {
cliPluginLinks: {
selector: 'ul',
index: 0
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////
// For authoring Nightwatch tests, see
// https://nightwatchjs.org/guide
//
// For more information on working with page objects see:
// https://nightwatchjs.org/guide/working-with-page-objects/
////////////////////////////////////////////////////////////////
module.exports = {
beforeEach: (browser) => browser.init(),
'e2e tests using page objects': (browser) => {
const homepage = browser.page.homepage()
homepage.waitForElementVisible('@appContainer')
const app = homepage.section.app
app.assert.elementCount('@logo', 1)
app.expect.section('@welcome').to.be.visible
app.expect.section('@headline').text.to.match(/^Welcome to Your Vue\.js (.*)App$/)
browser.end()
},
'verify if string "e2e-nightwatch" is within the cli plugin links': (browser) => {
const homepage = browser.page.homepage()
const welcomeSection = homepage.section.app.section.welcome
welcomeSection.expect.element('@cliPluginLinks').text.to.contain('e2e-nightwatch')
}
}
// For authoring Nightwatch tests, see
// https://nightwatchjs.org/guide
module.exports = {
'default e2e tests': browser => {
browser
.init()
.waitForElementVisible('#app')
.assert.elementPresent('.hello')
.assert.containsText('h1', 'Welcome to Your Vue.js App')
.assert.elementCount('img', 1)
.end()
},
'example e2e test using a custom command': browser => {
browser
.openHomepage()
.assert.elementPresent('.hello')
.end()
}
}
import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'
describe('HelloWorld.vue', () => {
it('renders props.msg when passed', () => {
const msg = 'new message'
const wrapper = shallowMount(HelloWorld, {
propsData: { msg }
})
expect(wrapper.text()).toMatch(msg)
})
})
module.exports = {
"transpileDependencies": [
"vuetify"
],
devServer: {
proxy: {
'/api/*': {
// target: 'http://192.168.53.34:3000' // 개발/서버
target: 'http://localhost:3000' // 개발서버
}
}
},
//npm run build 하면 지정된 경로로 생성한다.
outputDir: '../backend/public' ,
}
\ No newline at end of file
#!/bin/bash
docker rmi base/home-main-ds:0.3
#docker rmi base/home-main-ds:0.3
docker-compose build --no-cache base-vue-cli-3-ds
FROM node:14.18.1
MAINTAINER David You <frog@falinux.com>
LABEL org.opencontainers.image.authors="khkraining@falinux.com"
ENV DEBIAN_FRONTEND noninteractive
......
......@@ -8,7 +8,7 @@ services:
container_name : base-home-main-ds
volumes:
- ../apps/:/apps
network_mode: "host"
# network_mode: "host"
privileged: true
environment:
CYPRESS_CACHE_FOLDER: /apps/.cypress-cache
......
......@@ -12,10 +12,13 @@
#echo -e "kcert2-home-$target dev sever"
touch ../apps/frontend/src/vue-apollo.js
docker-compose run --name neuro-home-dev-backend \
docker-compose run \
--publish 3000:3000 \
--publish 9400:9400 \
--name neuro-home-dev-backend \
--rm \
-u $(id -u ${USER}):$(id -g ${USER}) \
--workdir /apps/backend/ \
-e AS_SERVICE=yes \
base-home-main-ds \
npm start
# -u $(id -u ${USER}):$(id -g ${USER}) \
......@@ -12,10 +12,12 @@
#echo -e "kcert2-home-$target dev sever"
#
touch ../apps/frontend/src/vue-apollo.js
docker-compose run --name neuro-home-dev-frontend \
docker-compose run \
--publish 8080:8080 \
--name neuro-home-dev-frontend \
--rm \
-u $(id -u ${USER}):$(id -g ${USER}) \
--workdir /apps/frontend/ \
-e AS_SERVICE=yes \
base-home-main-ds \
npm run serve
# -u $(id -u ${USER}):$(id -g ${USER}) \
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment