[new] add txt json download support

This commit is contained in:
Wu Han 2021-01-08 19:18:37 +00:00
parent f223fa8c9a
commit 814fc3463e
13 changed files with 291 additions and 37 deletions

View File

@ -12,6 +12,7 @@ exports.listAllFiles = (req, res) => {
} }
exports.downloadFile = (req, res) => { exports.downloadFile = (req, res) => {
var filename = req.params.filename; var id = req.query.id;
res.download(uploadFolder + filename); var filename = req.query.filename;
} res.download(uploadFolder + '../output/' + id + '/' + filename);
}

View File

@ -1,26 +1,187 @@
module.exports = (app, router, upload) => { module.exports = (app, router, upload) => {
const fileWorker = require('../controllers/file.controller.js'); const fileWorker = require('../controllers/file.controller.js')
var path = __basedir + '/views/'; var path = __basedir + '/views/'
const tsp_list = ["ulysses16", "att48", "st70", "a280", "pcb442", "dsj1000"]
router.use((req,res,next) => { router.use((req,res,next) => {
console.log("/" + req.method); console.log("/" + req.method)
next(); next()
}); });
app.get('/', (req,res) => { app.get('/', (req,res) => {
res.sendFile(path + "index.html"); res.sendFile(path + "index.html")
}); });
app.post('/api/files/upload', upload.single("uploadfile"), fileWorker.uploadFile); app.get('/leaderboard', (req, res) => {
leaderboard = global.leaderboard
if(req.query.type === 'txt') {
res.set({"Content-Disposition":"attachment; filename=\"" + tsp_list[req.query.tsp] + ".txt\""})
result = "Not Found"
switch (parseInt(req.query.tsp)) {
case 0:
leaderboard.ulysses16.forEach(e => {
console.log('leader', e.id)
if(e.id == req.query.id) {
sentFlag = true
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
break;
case 1:
leaderboard.att48.forEach(e => {
if(e.id == req.query.id) {
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
break;
case 2:
leaderboard.st70.forEach(e => {
if(e.id == req.query.id) {
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
break;
case 3:
leaderboard.a280.forEach(e => {
if(e.id == req.query.id) {
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
break;
case 4:
leaderboard.pcb442.forEach(e => {
if(e.id == req.query.id) {
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
break;
case 5:
leaderboard.dsj1000.forEach(e => {
if(e.id == req.query.id) {
result = `${e.fitness}\n${e.solution}`
}
})
res.end(result)
default:
res.sendStatus(404);
break;
}
}
else if (req.query.type === 'json') {
res.set({"Content-Disposition":"attachment; filename=\"" + tsp_list[req.query.tsp] + ".json\""})
// res.header("Content-Type",'application/json');
data = {}
switch (parseInt(req.query.tsp)) {
case 0:
data = require('../../data/ulysses16.json')
data['edges'] = []
leaderboard.ulysses16.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
case 1:
data = require('../../data/att48.json')
data['edges'] = []
leaderboard.att48.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
case 2:
data = require('../../data/st70.json')
data['edges'] = []
leaderboard.st70.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
case 3:
data = require('../../data/a280.json')
data['edges'] = []
leaderboard.a280.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
case 4:
data = require('../../data/pcb442.json')
data['edges'] = []
leaderboard.pcb442.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
case 5:
data = require('../../data/dsj1000.json')
data['edges'] = []
leaderboard.dsj1000.forEach(e => {
if(e.id == req.query.id) {
for (let i = 0; i < e.solution.length; i++) {
data['edges'].push({
'source': e.solution[i % e.solution.length],
'target': e.solution[(i+1) % e.solution.length]
})
}
}
})
break;
default:
break;
}
res.end(JSON.stringify(data));
}
else {
res.sendStatus(404);
}
});
app.get('/api/files/getall', fileWorker.listAllFiles); app.post('/api/files/upload', upload.single("uploadfile"), fileWorker.uploadFile)
app.get('/api/files/:filename', fileWorker.downloadFile); app.get('/api/files/getall', fileWorker.listAllFiles)
app.use('/',router); app.get('/api/files/result', fileWorker.downloadFile)
app.use('/',router)
app.use('*', (req,res) => { app.use('*', (req,res) => {
res.sendFile(path + "404.html"); res.sendFile(path + "404.html")
}); })
} }

1
data/a280.json Normal file

File diff suppressed because one or more lines are too long

1
data/att48.json Normal file
View File

@ -0,0 +1 @@
{"nodes": [{"title": "0", "id": 0, "x": 6734, "y": 1453}, {"title": "1", "id": 1, "x": 2233, "y": 10}, {"title": "2", "id": 2, "x": 5530, "y": 1424}, {"title": "3", "id": 3, "x": 401, "y": 841}, {"title": "4", "id": 4, "x": 3082, "y": 1644}, {"title": "5", "id": 5, "x": 7608, "y": 4458}, {"title": "6", "id": 6, "x": 7573, "y": 3716}, {"title": "7", "id": 7, "x": 7265, "y": 1268}, {"title": "8", "id": 8, "x": 6898, "y": 1885}, {"title": "9", "id": 9, "x": 1112, "y": 2049}, {"title": "10", "id": 10, "x": 5468, "y": 2606}, {"title": "11", "id": 11, "x": 5989, "y": 2873}, {"title": "12", "id": 12, "x": 4706, "y": 2674}, {"title": "13", "id": 13, "x": 4612, "y": 2035}, {"title": "14", "id": 14, "x": 6347, "y": 2683}, {"title": "15", "id": 15, "x": 6107, "y": 669}, {"title": "16", "id": 16, "x": 7611, "y": 5184}, {"title": "17", "id": 17, "x": 7462, "y": 3590}, {"title": "18", "id": 18, "x": 7732, "y": 4723}, {"title": "19", "id": 19, "x": 5900, "y": 3561}, {"title": "20", "id": 20, "x": 4483, "y": 3369}, {"title": "21", "id": 21, "x": 6101, "y": 1110}, {"title": "22", "id": 22, "x": 5199, "y": 2182}, {"title": "23", "id": 23, "x": 1633, "y": 2809}, {"title": "24", "id": 24, "x": 4307, "y": 2322}, {"title": "25", "id": 25, "x": 675, "y": 1006}, {"title": "26", "id": 26, "x": 7555, "y": 4819}, {"title": "27", "id": 27, "x": 7541, "y": 3981}, {"title": "28", "id": 28, "x": 3177, "y": 756}, {"title": "29", "id": 29, "x": 7352, "y": 4506}, {"title": "30", "id": 30, "x": 7545, "y": 2801}, {"title": "31", "id": 31, "x": 3245, "y": 3305}, {"title": "32", "id": 32, "x": 6426, "y": 3173}, {"title": "33", "id": 33, "x": 4608, "y": 1198}, {"title": "34", "id": 34, "x": 23, "y": 2216}, {"title": "35", "id": 35, "x": 7248, "y": 3779}, {"title": "36", "id": 36, "x": 7762, "y": 4595}, {"title": "37", "id": 37, "x": 7392, "y": 2244}, {"title": "38", "id": 38, "x": 3484, "y": 2829}, {"title": "39", "id": 39, "x": 6271, "y": 2135}, {"title": "40", "id": 40, "x": 4985, "y": 140}, {"title": "41", "id": 41, "x": 1916, "y": 1569}, {"title": "42", "id": 42, "x": 7280, "y": 4899}, {"title": "43", "id": 43, "x": 7509, "y": 3239}, {"title": "44", "id": 44, "x": 10, "y": 2676}, {"title": "45", "id": 45, "x": 6807, "y": 2993}, {"title": "46", "id": 46, "x": 5185, "y": 3258}, {"title": "47", "id": 47, "x": 3023, "y": 1942}]}

1
data/dsj1000.json Normal file

File diff suppressed because one or more lines are too long

1
data/pcb442.json Normal file

File diff suppressed because one or more lines are too long

1
data/st70.json Normal file
View File

@ -0,0 +1 @@
{"nodes": [{"title": "0", "id": 0, "x": 64, "y": 96}, {"title": "1", "id": 1, "x": 80, "y": 39}, {"title": "2", "id": 2, "x": 69, "y": 23}, {"title": "3", "id": 3, "x": 72, "y": 42}, {"title": "4", "id": 4, "x": 48, "y": 67}, {"title": "5", "id": 5, "x": 58, "y": 43}, {"title": "6", "id": 6, "x": 81, "y": 34}, {"title": "7", "id": 7, "x": 79, "y": 17}, {"title": "8", "id": 8, "x": 30, "y": 23}, {"title": "9", "id": 9, "x": 42, "y": 67}, {"title": "10", "id": 10, "x": 7, "y": 76}, {"title": "11", "id": 11, "x": 29, "y": 51}, {"title": "12", "id": 12, "x": 78, "y": 92}, {"title": "13", "id": 13, "x": 64, "y": 8}, {"title": "14", "id": 14, "x": 95, "y": 57}, {"title": "15", "id": 15, "x": 57, "y": 91}, {"title": "16", "id": 16, "x": 40, "y": 35}, {"title": "17", "id": 17, "x": 68, "y": 40}, {"title": "18", "id": 18, "x": 92, "y": 34}, {"title": "19", "id": 19, "x": 62, "y": 1}, {"title": "20", "id": 20, "x": 28, "y": 43}, {"title": "21", "id": 21, "x": 76, "y": 73}, {"title": "22", "id": 22, "x": 67, "y": 88}, {"title": "23", "id": 23, "x": 93, "y": 54}, {"title": "24", "id": 24, "x": 6, "y": 8}, {"title": "25", "id": 25, "x": 87, "y": 18}, {"title": "26", "id": 26, "x": 30, "y": 9}, {"title": "27", "id": 27, "x": 77, "y": 13}, {"title": "28", "id": 28, "x": 78, "y": 94}, {"title": "29", "id": 29, "x": 55, "y": 3}, {"title": "30", "id": 30, "x": 82, "y": 88}, {"title": "31", "id": 31, "x": 73, "y": 28}, {"title": "32", "id": 32, "x": 20, "y": 55}, {"title": "33", "id": 33, "x": 27, "y": 43}, {"title": "34", "id": 34, "x": 95, "y": 86}, {"title": "35", "id": 35, "x": 67, "y": 99}, {"title": "36", "id": 36, "x": 48, "y": 83}, {"title": "37", "id": 37, "x": 75, "y": 81}, {"title": "38", "id": 38, "x": 8, "y": 19}, {"title": "39", "id": 39, "x": 20, "y": 18}, {"title": "40", "id": 40, "x": 54, "y": 38}, {"title": "41", "id": 41, "x": 63, "y": 36}, {"title": "42", "id": 42, "x": 44, "y": 33}, {"title": "43", "id": 43, "x": 52, "y": 18}, {"title": "44", "id": 44, "x": 12, "y": 13}, {"title": "45", "id": 45, "x": 25, "y": 5}, {"title": "46", "id": 46, "x": 58, "y": 85}, {"title": "47", "id": 47, "x": 5, "y": 67}, {"title": "48", "id": 48, "x": 90, "y": 9}, {"title": "49", "id": 49, "x": 41, "y": 76}, {"title": "50", "id": 50, "x": 25, "y": 76}, {"title": "51", "id": 51, "x": 37, "y": 64}, {"title": "52", "id": 52, "x": 56, "y": 63}, {"title": "53", "id": 53, "x": 10, "y": 55}, {"title": "54", "id": 54, "x": 98, "y": 7}, {"title": "55", "id": 55, "x": 16, "y": 74}, {"title": "56", "id": 56, "x": 89, "y": 60}, {"title": "57", "id": 57, "x": 48, "y": 82}, {"title": "58", "id": 58, "x": 81, "y": 76}, {"title": "59", "id": 59, "x": 29, "y": 60}, {"title": "60", "id": 60, "x": 17, "y": 22}, {"title": "61", "id": 61, "x": 5, "y": 45}, {"title": "62", "id": 62, "x": 79, "y": 70}, {"title": "63", "id": 63, "x": 9, "y": 100}, {"title": "64", "id": 64, "x": 17, "y": 82}, {"title": "65", "id": 65, "x": 74, "y": 67}, {"title": "66", "id": 66, "x": 10, "y": 68}, {"title": "67", "id": 67, "x": 48, "y": 19}, {"title": "68", "id": 68, "x": 83, "y": 86}, {"title": "69", "id": 69, "x": 84, "y": 94}]}

1
data/ulysses16.json Normal file
View File

@ -0,0 +1 @@
{"nodes": [{"title": "0", "id": 0, "x": 38, "y": 20}, {"title": "1", "id": 1, "x": 39, "y": 26}, {"title": "2", "id": 2, "x": 40, "y": 25}, {"title": "3", "id": 3, "x": 36, "y": 23}, {"title": "4", "id": 4, "x": 33, "y": 10}, {"title": "5", "id": 5, "x": 37, "y": 12}, {"title": "6", "id": 6, "x": 38, "y": 13}, {"title": "7", "id": 7, "x": 37, "y": 20}, {"title": "8", "id": 8, "x": 41, "y": 9}, {"title": "9", "id": 9, "x": 41, "y": 13}, {"title": "10", "id": 10, "x": 36, "y": -5}, {"title": "11", "id": 11, "x": 38, "y": 15}, {"title": "12", "id": 12, "x": 38, "y": 15}, {"title": "13", "id": 13, "x": 37, "y": 15}, {"title": "14", "id": 14, "x": 35, "y": 14}, {"title": "15", "id": 15, "x": 39, "y": 19}]}

View File

@ -167,6 +167,10 @@ body::after {
background-color: #f5f5f5; background-color: #f5f5f5;
} }
.link {
cursor: pointer;
}
.blink_me { .blink_me {
animation: blinker 1s linear infinite; animation: blinker 1s linear infinite;
} }

View File

@ -120,6 +120,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -127,6 +128,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -138,6 +140,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -145,6 +148,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -156,6 +160,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -163,6 +168,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -174,6 +180,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -181,6 +188,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -192,6 +200,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -199,6 +208,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -210,6 +220,7 @@
<th>Name</th> <th>Name</th>
<th>Fitness</th> <th>Fitness</th>
<th>Remark</th> <th>Remark</th>
<th>Download</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -217,6 +228,7 @@
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td> <td> - </td>
<td> - </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -249,6 +261,7 @@
<th scope="col">Problem</th> <th scope="col">Problem</th>
<th scope="col">Your Solution</th> <th scope="col">Your Solution</th>
<th scope="col">Best Solution</th> <th scope="col">Best Solution</th>
<th scope="col">Download</th>
<th scope="col"></th> <th scope="col"></th>
</tr> </tr>
</thead> </thead>
@ -257,48 +270,66 @@
<th scope="col">ulysses16</th> <th scope="col">ulysses16</th>
<td id="ulysses16_your">Inf</td> <td id="ulysses16_your">Inf</td>
<td id="ulysses16_best">Inf</td> <td id="ulysses16_best">Inf</td>
<td id="ulysses16_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="ulysses16_submit">Submit</button> <button type="submit" class="btn btn-primary" id="ulysses16_submit">Submit</button>
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="col">att48</th> <th scope="col">att48</th>
<td id="att48_your">Inf</td> <td id="att48_your">Inf</td>
<td id="att48_best">Inf</td> <td id="att48_best">Inf</td>
<td id="att48_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="att48_submit">Submit</button> <button type="submit" class="btn btn-primary" id="att48_submit">Submit</button>
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="col">st70</th> <th scope="col">st70</th>
<td id="st70_your">Inf</td> <td id="st70_your">Inf</td>
<td id="st70_best">Inf</td> <td id="st70_best">Inf</td>
<td id="st70_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="st70_submit">Submit</button> <button type="submit" class="btn btn-primary" id="st70_submit">Submit</button>
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="col">a280</th> <th scope="col">a280</th>
<td id="a280_your">Inf</td> <td id="a280_your">Inf</td>
<td id="a280_best">Inf</td> <td id="a280_best">Inf</td>
<td id="a280_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="a280_submit">Submit</button> <button type="submit" class="btn btn-primary" id="a280_submit">Submit</button>
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="col">pcb442</th> <th scope="col">pcb442</th>
<td id="pcb442_your">Inf</td> <td id="pcb442_your">Inf</td>
<td id="pcb442_best">Inf</td> <td id="pcb442_best">Inf</td>
<td id="pcb442_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="pcb442_submit">Submit</button> <button type="submit" class="btn btn-primary" id="pcb442_submit">Submit</button>
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="col">dsj1000</th> <th scope="col">dsj1000</th>
<td id="dsj1000_your">Inf</td> <td id="dsj1000_your">Inf</td>
<td id="dsj1000_best">Inf</td> <td id="dsj1000_best">Inf</td>
<td id="dsj1000_download">
<a href="" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="" target="_blank"><span class="badge badge-success link">json</span></a>
</td>
<td> <td>
<button type="submit" class="btn btn-primary" id="dsj1000_submit">Submit</button> <button type="submit" class="btn btn-primary" id="dsj1000_submit">Submit</button>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -53,6 +53,13 @@ $( document ).ready( () => {
$('#submission_info').hide(); $('#submission_info').hide();
$('#ulysses16_download').hide();
$('#att48_download').hide();
$('#st70_download').hide();
$('#a280_download').hide();
$('#pcb442_download').hide();
$('#dsj1000_download').hide();
$('#ulysses16_submit').hide(); $('#ulysses16_submit').hide();
$('#att48_submit').hide(); $('#att48_submit').hide();
$('#st70_submit').hide(); $('#st70_submit').hide();
@ -209,21 +216,27 @@ function upload_leaderboard(name) {
data = {} data = {}
if(name === 'ulysses16') { if(name === 'ulysses16') {
data.fitness = my_res.ulysses16.fitness; data.fitness = my_res.ulysses16.fitness;
data.solution = my_res.ulysses16.solution;
} }
else if (name === 'att48') { else if (name === 'att48') {
data.fitness = my_res.att48.fitness; data.fitness = my_res.att48.fitness;
data.solution = my_res.att48.solution;
} }
else if (name === 'st70') { else if (name === 'st70') {
data.fitness = my_res.st70.fitness; data.fitness = my_res.st70.fitness;
data.solution = my_res.st70.solution;
} }
else if (name === 'a280') { else if (name === 'a280') {
data.fitness = my_res.a280.fitness; data.fitness = my_res.a280.fitness;
data.solution = my_res.a280.solution;
} }
else if (name === 'pcb442') { else if (name === 'pcb442') {
data.fitness = my_res.pcb442.fitness; data.fitness = my_res.pcb442.fitness;
data.solution = my_res.pcb442.solution;
} }
else if (name === 'dsj1000') { else if (name === 'dsj1000') {
data.fitness = my_res.dsj1000.fitness; data.fitness = my_res.dsj1000.fitness;
data.solution = my_res.dsj1000.solution;
} }
data.name = $('#submit_name').val(); data.name = $('#submit_name').val();
data.desc = $('#submit_desc').val() data.desc = $('#submit_desc').val()
@ -287,4 +300,32 @@ function doAjax() {
{ {
alert('Failed to connect to server'); alert('Failed to connect to server');
} }
}
function downloadRes(id, tsp, file) {
// txt
if(file == 0) {
$.ajax({
type: "GET",
url: "/leaderboard",
data: {
"id": id,
"tsp": tsp,
"type": 'txt'
},
processData: false, //prevent jQuery from automatically transforming the data into a query string
contentType: false,
cache: false,
success: (data) => {
console.log(data)
},
error: (e) => {
// $("#listFiles").text(e.responseText);
}
});
}
// json
else {
console.log(id, 'json')
}
} }

View File

@ -52,41 +52,41 @@ socket.on('leaderboard', (obj) => {
$(".leaderboard-table").find("tr:not(:first):not(:last)").remove(); $(".leaderboard-table").find("tr:not(:first):not(:last)").remove();
if(obj.ulysses16.length != 0) { if(obj.ulysses16.length != 0) {
obj.ulysses16.forEach(element => { obj.ulysses16.forEach(element => {
$('#ulysses16-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#ulysses16-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=0&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=0&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#ulysses16_best').text(obj.ulysses16[0].fitness.toFixed(2)); $('#ulysses16_best').text(obj.ulysses16[0].fitness.toFixed(2));
} }
if(obj.att48.length != 0 ) { if(obj.att48.length != 0 ) {
obj.att48.forEach(element => { obj.att48.forEach(element => {
$('#att48-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#att48-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=1&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=1&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#att48_best').text(obj.att48[0].fitness.toFixed(2)); $('#att48_best').text(obj.att48[0].fitness.toFixed(2));
} }
if (obj.st70.length != 0) { if (obj.st70.length != 0) {
obj.st70.forEach(element => { obj.st70.forEach(element => {
$('#st70-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#st70-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=2&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=2&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#st70_best').text(obj.st70[0].fitness.toFixed(2)); $('#st70_best').text(obj.st70[0].fitness.toFixed(2));
} }
if (obj.a280.length != 0) { if (obj.a280.length != 0) {
obj.a280.forEach(element => { obj.a280.forEach(element => {
$('#a280-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#a280-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=30&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=3&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#a280_best').text(obj.a280[0].fitness.toFixed(2)); $('#a280_best').text(obj.a280[0].fitness.toFixed(2));
} }
if(obj.pcb442.length != 0) { if(obj.pcb442.length != 0) {
obj.pcb442.forEach(element => { obj.pcb442.forEach(element => {
$('#pcb442-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#pcb442-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=4&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=4&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#pcb442_best').text(obj.pcb442[0].fitness.toFixed(2)); $('#pcb442_best').text(obj.pcb442[0].fitness.toFixed(2));
} }
if(obj.dsj1000.length != 0) { if(obj.dsj1000.length != 0) {
obj.dsj1000.forEach(element => { obj.dsj1000.forEach(element => {
$('#dsj1000-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td></tr>') $('#dsj1000-last').before('<tr id=""><td>' + element.name + '</td><td>' + element.fitness.toFixed(2) + '</td><td>' + element.desc + '</td><td><a href="/leaderboard?id=' + element.id + '&tsp=5&type=txt" target="_blank"><span class="badge badge-primary link">txt</span></a> &nbsp;&nbsp; <a href="/leaderboard?id=' + element.id + '&tsp=5&type=json" target="_blank"><span class="badge badge-success link">json</span></a></td></tr>')
}); });
$('#dsj1000_best').text(obj.dsj1000[0].fitness.toFixed(2)); $('#dsj1000_best').text(obj.dsj1000[0].fitness.toFixed(2));
} }
@ -110,6 +110,9 @@ function update_your_res(tsp_file, fitness) {
if(fitness > 0) { if(fitness > 0) {
$("#" + tsp_file + "_your").text(fitness.toFixed(2)); $("#" + tsp_file + "_your").text(fitness.toFixed(2));
$("#" + tsp_file + "_download").show();
$("#" + tsp_file + "_download a:nth-child(1)").attr("href", "/api/files/result/?id="+ window.id + "&filename=" + tsp_file + ".txt");
$("#" + tsp_file + "_download a:nth-child(2)").attr("href", "/api/files/result/?id="+ window.id + "&filename=" + tsp_file + ".json");
enable_btn($("#" + tsp_file + "_submit")) enable_btn($("#" + tsp_file + "_submit"))
} }
else if (fitness == -1) else if (fitness == -1)
@ -130,7 +133,6 @@ function update_your_res(tsp_file, fitness) {
} }
} }
// Update personal result // Update personal result
socket.on('result', (res) => { socket.on('result', (res) => {
@ -141,26 +143,32 @@ socket.on('result', (res) => {
res.forEach(e => { res.forEach(e => {
if(e.name === "ulysses16.txt") { if(e.name === "ulysses16.txt") {
my_res.ulysses16.fitness = e.fitness my_res.ulysses16.fitness = e.fitness
my_res.ulysses16.solution = e.solution
update_your_res("ulysses16", e.fitness) update_your_res("ulysses16", e.fitness)
} }
if(e.name === "att48.txt") { if(e.name === "att48.txt") {
my_res.att48.fitness = e.fitness my_res.att48.fitness = e.fitness
my_res.att48.solution = e.solution
update_your_res("att48", e.fitness) update_your_res("att48", e.fitness)
} }
if(e.name === "st70.txt") { if(e.name === "st70.txt") {
my_res.st70.fitness = e.fitness my_res.st70.fitness = e.fitness
my_res.st70.solution = e.solution
update_your_res("st70", e.fitness) update_your_res("st70", e.fitness)
} }
if(e.name === "a280.txt") { if(e.name === "a280.txt") {
my_res.a280.fitness = e.fitness my_res.a280.fitness = e.fitness
my_res.a280.solution = e.solution
update_your_res("a280", e.fitness) update_your_res("a280", e.fitness)
} }
if(e.name === "pcb442.txt") { if(e.name === "pcb442.txt") {
my_res.pcb442.fitness = e.fitness my_res.pcb442.fitness = e.fitness
my_res.pcb442.solution = e.solution
update_your_res("pcb442", e.fitness) update_your_res("pcb442", e.fitness)
} }
if(e.name === "dsj1000.txt") { if(e.name === "dsj1000.txt") {
my_res.dsj1000.fitness = e.fitness my_res.dsj1000.fitness = e.fitness
my_res.dsj1000.solution = e.solution
update_your_res("dsj1000", e.fitness) update_your_res("dsj1000", e.fitness)
} }
}); });

View File

@ -1,4 +1,5 @@
const fs = require('fs') const fs = require('fs')
const MAX_LEADERBOARD = 10
// Web Server // Web Server
var express = require('express') var express = require('express')
@ -27,7 +28,7 @@ const path = require('path')
current_path = process.cwd() current_path = process.cwd()
// Initialize Leaderboard // Initialize Leaderboard
var leaderboard = {} global.leaderboard = {}
leaderboard.ulysses16 = [] leaderboard.ulysses16 = []
leaderboard.att48 = [] leaderboard.att48 = []
leaderboard.st70 = [] leaderboard.st70 = []
@ -79,24 +80,24 @@ var update_leaderboard = (obj) => {
leaderboard.dsj1000.push(obj.data) leaderboard.dsj1000.push(obj.data)
} }
// Only accept top 10 results // Only accept top MAX_LEADERBOARD results
leaderboard.ulysses16.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.ulysses16.sort(function(a, b){return a.fitness - b.fitness})
leaderboard.ulysses16 = leaderboard.ulysses16.slice(0,10) leaderboard.ulysses16 = leaderboard.ulysses16.slice(0, MAX_LEADERBOARD)
leaderboard.att48.sort(function(a, b){return a.fitness - b.fitness}).slice(0,10) leaderboard.att48.sort(function(a, b){return a.fitness - b.fitness}).slice(0, MAX_LEADERBOARD)
leaderboard.att48 = leaderboard.att48.slice(0,10) leaderboard.att48 = leaderboard.att48.slice(0, MAX_LEADERBOARD)
leaderboard.st70.sort(function(a, b){return a.fitness - b.fitness}).slice(0,10) leaderboard.st70.sort(function(a, b){return a.fitness - b.fitness}).slice(0, MAX_LEADERBOARD)
leaderboard.st70 = leaderboard.st70.slice(0,10) leaderboard.st70 = leaderboard.st70.slice(0, MAX_LEADERBOARD)
leaderboard.a280.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.a280.sort(function(a, b){return a.fitness - b.fitness})
leaderboard.a280 = leaderboard.a280.slice(0,10) leaderboard.a280 = leaderboard.a280.slice(0, MAX_LEADERBOARD)
leaderboard.pcb442.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.pcb442.sort(function(a, b){return a.fitness - b.fitness})
leaderboard.pcb442 = leaderboard.pcb442.slice(0,10) leaderboard.pcb442 = leaderboard.pcb442.slice(0, MAX_LEADERBOARD)
leaderboard.dsj1000.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.dsj1000.sort(function(a, b){return a.fitness - b.fitness})
leaderboard.dsj1000 = leaderboard.dsj1000.slice(0,10) leaderboard.dsj1000 = leaderboard.dsj1000.slice(0, MAX_LEADERBOARD)
// Write to json file // Write to json file
write_leaderboard() write_leaderboard()
@ -300,6 +301,7 @@ io.on('connection', (socket) => {
// Client submited a new result // Client submited a new result
socket.on('submit', (obj) => { socket.on('submit', (obj) => {
console.log('[client][submit]', sessionID) console.log('[client][submit]', sessionID)
obj.data.id = sessionID
update_leaderboard(obj) update_leaderboard(obj)
io.emit('leaderboard', leaderboard) io.emit('leaderboard', leaderboard)
}) })