json TypeScript VSCode开发

launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "TS Dev",
      "program": "${workspaceRoot}/node_modules/ts-node-dev/bin/ts-node-dev",
      "args": [
        "--inspect",
        "--no-notify",
        "--respawn",
        "--transpileOnly",
        "-r",
        "tsconfig-paths/register",
        "./src"
      ],
      "internalConsoleOptions": "openOnSessionStart",
      "port": 9229,
      "restart": true
    },
  ]
}

json 热重装

live-server-hot-reloading.json
{
  "scripts": {
    "watch:sass": "node-sass sass/main.scss css/style.css -w",
    "devserver": "live-server",
    "start": "npm-run-all --parallel devserver watch:sass",
  }
}

json Npm脚本package.json

从高级课程CSS和CSS Udemy:https://github.com/jonasschmedtmann/advanced-css-course/blob/master/Natours/final-after-S06/package.json <br/> <br/> Npm脚本: https://deliciousbrains.com/npm-build-script/

package.json
{
  "scripts": {
    "watch:sass": "node-sass sass/main.scss css/style.css -w",
    "devserver": "live-server",
    "start": "npm-run-all --parallel devserver watch:sass",
    "compile:sass": "node-sass sass/main.scss css/style.comp.css",
    "concat:css": "concat -o css/style.concat.css css/icon-font.css css/style.comp.css",
    "prefix:css": "postcss --use autoprefixer -b 'last 10 versions' css/style.concat.css -o css/style.prefix.css",
    "compress:css": "node-sass css/style.prefix.css css/style.css --output-style compressed",
    "build:css": "npm-run-all compile:sass concat:css prefix:css compress:css"
  }
}

json 巴别装载机

babel-loader.json
{
        test: /\.m?js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              [
                '@babel/preset-env',
                {
                  corejs: 2,
                  useBuiltIns: 'usage',
                  targets: {
                    ie: 11,
                  },
                },
              ],
            ],
          },
        },
      }

json vs代码设置

vscode-settings
{
  "window.zoomLevel": 1,
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "terminal.integrated.fontSize": 15,
  "editor.minimap.enabled": false,
  "editor.multiCursorModifier": "alt",
  "editor.snippetSuggestions": "top",
  "editor.scrollBeyondLastLine": true,
  "workbench.startupEditor": "newUntitledFile",
  "workbench.activityBar.visible": false,
  "window.closeWhenEmpty": false,
  "files.insertFinalNewline": true,
  "files.hotExit": "off",
  "files.autoSave": "onFocusChange",
  "files.trimTrailingWhitespace": false,
  "editor.formatOnSave": true,
  "vetur.experimental.templateInterpolationService": false,
  "nativescript.analytics.enabled": true,
  "workbench.statusBar.visible": true,
  "workbench.sideBar.location": "left",
  "workbench.colorTheme": "SynthWave '84",
  "editor.renderControlCharacters": false,
  "todohighlight.isEnable": false,
  "todohighlight.include": [
    "**/*.js",
    "**/*.jsx",
    "**/*.ts",
    "**/*.tsx",
    "**/*.html",
    "**/*.php",
    "**/*.css",
    "**/*.scss",
    "**/*.vue"
  ],
  "todohighlight.exclude": [
    "**/node_modules/**",
    "**/bower_components/**",
    "**/dist/**",
    "**/build/**",
    "**/.vscode/**",
    "**/.github/**",
    "**/_output/**",
    "**/*.min.*",
    "**/*.map",
    "**/.next/**",
    "**/platforms/**"
  ],
  "workbench.tips.enabled": false,
  "html.format.wrapAttributes": "force-expand-multiline",
  "diffEditor.ignoreTrimWhitespace": true,
  "debug.console.fontSize": 15,
  "editor.fontSize": 17,
  "markdown.preview.fontSize": 15,
  "breadcrumbs.enabled": false,
  "editor.detectIndentation": false,
  "vetur.format.options.useTabs": true,
  "vscode_custom_css.imports": [
    "file:///Users/roberto/synthwave84.css"
  ]
}

json 文件头

文件头

fileheader.json
"psi-header.changes-tracking": {	
		"isActive": true,	
		"modAuthor": "Modified By: ",	
		"modDate": "Last Modified: ",	
		"modDateFormat": "DD MM YYYY, h:mm:ss A",	
		"autoHeader": "manualSave"	
	},	
	"psi-header.variables": [	
		["company", "Soroborno"],	
		["author", "Khan Sunny"],	
		["authoremail", "it.khansunny@gmail.com"]	
	],	
	"psi-header.lang-config": [	
		{	
			"language": "python",	
			"begin": "###",	
			"prefix": "# ",	
			"end": "###",	
			"blankLinesAfter": 0,	
			"beforeHeader": [	
				"#!/usr/bin/env python3",	
				"# -*- coding:utf-8 -*-"	
			]	
		}	
	],	
	"psi-header.templates": [	
		{	
			"language": "*",	
			"template": [	
				"File: <<filename>>",	
				"Created Date: <<filecreated('DD MM YYYY, h:mm:ss A')>>",	
				"Author: <<author>>",	
				"-----",	
				"Last Modified: ",	
				"Modified By: ",	
				"-----",	
				"",	
			]	
		},	
    ],	

json 注销安装本地节点js服务器应用程序

manager.js
require('dotenv').config()
const express = require('express')
const app = express()
const http = require('http').Server(app)
const io = require('socket.io')(http)
const socket_api = require('socket.io-client')('http://192.168.1.10:3000')
// const socket_api = require('socket.io-client')('http://nexon25.synology.me:3000')
//global constant
const port = 1234
const Printer = require('./printer')
let printer = new Printer()
//server init
http.listen(port, "0.0.0.0", function() {
  console.log('listening on :', port)
})
// printer.printTest(function(){
//   console.log('printing done');
// })
// printer.printTest()
let userData = {}

// [---------------SOCKET COMMUNICATION WITH API-----------------------------------]

// Listen to Tagging
socket_api.on(process.env.NAME, function(data) {
// socket_api.on(process.env.NAME, function(data) {
  // console.log(data);
  // Parse User Data into an Object from API into Printable & Reusable format.
  // console.log(data);
  if (data.isNexonAccount) {
    userData.isNexonAccount = true
    console.log('Nexon user data received');
    let registeredTime = new Date(data.nexonData.user.registeredAt)
    userData.registeredDate = `${registeredTime.getFullYear()}-${registeredTime.getMonth()+1}-${registeredTime.getDate()}`
    userData.favoriteGame = data.nexonData.user.favoriteGameGenre
    userData.gameData = data.nexonData.games
  }else{
    userData.isNexonAccount = false
    console.log('Non-Nexon user data received');
  }
  // console.log(data);
  let loginDateTime = new Date(data.loginDate)
  let logoutDateTime = new Date(Date.now())
  let quests = []
  let questResults = []
  let completedQuest = []
  let failedQuest = []
  for (quest of data.quests) {
    if (quest.name !== 'logout1' && quest.name !== 'logout2') {
      quests.push(quest.longName)
      questResults.push(quest.isCompleted)
      if (quest.isCompleted)
        completedQuest.push(quest.longName)
      else
        failedQuest.push(quest.longName)
    }
  }
  userData.quests = quests
  userData.questResults = questResults
  userData.username = data.username
  userData.userLang = data.language
  userData.characterId = data.quests[0].extra
  userData.today = `${logoutDateTime.getFullYear()}-${logoutDateTime.getMonth()+1}-${logoutDateTime.getDate()}`
  userData.playtime = `${loginDateTime.getHours()}:${loginDateTime.getMinutes()} - ${logoutDateTime.getHours()}:${logoutDateTime.getMinutes()}(${Math.floor(Number(Date.now() - Date.parse(data.loginDate))/60000)}m)`
  userData.questCount = completedQuest.length + failedQuest.length // no logout in quests
  userData.completedQuest = completedQuest
  userData.failedQuest = failedQuest
  // Nexon Game Coupon Data
  let couponGame = []
  let couponCode = []
  for (coupon of data.coupons){
    couponGame.push(coupon.name)
    couponCode.push(coupon.code)
  }
  userData.couponGame = couponGame
  userData.couponCode = couponCode

  // printer.printTest()
  // Send Tag signal to Unity App
  // printer.printUserData(userData, function(){
  //   console.log('priting done');
  // })
  io.emit('logout-tagging', {
    "userData": userData
  })
})

//-------------------------------------------LOCAL APP--------------------------------------------------//

io.on('connection', function(socket) {
  console.log('logout app connected');


  //---------------------------------------- FROM APP -------------------------------------------------//


  // Listen to APP to Print Receipt
  socket.on('print-receipt', function(data) {
    console.log('printing')
    // let printer = new Printer()
    // printer.unityPrintTest()
    // Print Receipt
    printer.isPrinting = true
    printer.printUserData(userData, function(){
      console.log('priting end');
      socket.emit('printing-done', {
        "print":"done"
      })
    })
    // Catch the end of printing process. => let the API knows.

  })
  socket.on('end-of-experience', function(data) {
    socket_api.emit('experience', {
      "experience": process.env.NAME,
      "data": "experience"
    })
  })

})


//------------------------------------------------------------------------------------------------------//
//----------------------------------------NODE MANAGER--------------------------------------------------//
//------------------------------------------------------------------------------------------------------//

//pre-exit scripts
let preExit = []

//catch exit
process.stdin.resume()
process.on('exit', code => {
  let i
  console.log('Process exit')
  for (i = 0; i < preExit.length; i++) {
    preExit[i](code)
  }
  process.exit(code)
})

//catch CTRL+C
process.on('SIGINT', () => {
  process.exit(0)
})

//catch uncaught exception
process.on('uncaughtException', err => {
  console.dir(err, {
    depth: null
  })
})

//catch unhandledRejection
process.on('unhandledRejection', error => {
  console.log('unhandledRejection', error.message);
});

//add pre-exit script
preExit.push(code => {
  console.log('Exit code %d, cleaning up...', code)
})
printer.js
let options = {
  encoding: "EUC-KR"
}
// const printerPort = process.env.COM
const printerPort = process.env.COM
const escpos = require('escpos')
let nexonLogo = '_data/NexonFoundation_en.png'

class Printer {
  constructor() {
    this.isPrinting = false
  }
  printUserData(userData, callback) {
    let device, printer
    let options = {
      encoding: "EUC-KR"
    }
    // console.log('on printer',userData);
    device = new escpos.Serial(printerPort)
    printer = new escpos.Printer(device, options)
    console.log('printer is working');
    escpos.Image.load(nexonLogo, (image) => {
      device.open(() => {
        printer
          .align('lt')
          .text('\n')
          .text('\n')
          .size(2, 2)
          .style('b')
          .spacing(0)
          // Exhibition Logo
          .lineSpace(24)
          .align('ct')
          .text('Game    ')
          .text('a     ')
          .text(' me    ')
          .text('/i nvi te')
          .text(' yo u_  ')
          .align('lt')
          .text('\n')
          .text('\n')
          .text('\n')
          //ExhibitionAchivement
          .size(2, 2)
          .align('lt')
          .style('b')
          .lineSpace(28)
          .lineSpace(35)
          .text('EXHIBITION ARCHIVE')
          //ExhibitionData
          .size(1, 1)
          .style('normal')
          .align('lt')
          .lineSpace(35)
          .text('ID:' + userData.username)
          .text('DATE:' + userData.today)
          .text('PLAYTIME:' + userData.playtime)
          .lineSpace(42)
          .text('QUEST:' + userData.completedQuest.length + '/' + userData.questCount)
          .lineSpace(35)
          // Quest Accomplishment
          // Completed Quest
          .size(1, 1)
          .align('lt')
          .style('b')
          .lineSpace(34)
          .style('normal')
        this.userCompletedQuestPrint(userData, printer)
        printer
          // Failed Quest
          .style('b')
          .style('normal')
        this.userFailedQuestPrint(userData, printer)
        // for Users has Nexon Game Data
        if(userData.isNexonAccount){
          printer
            .text('\n')
            // Nexon Archive
            // Nexon Data Header
            .size(2, 2)
            .align('lt')
            .lineSpace(35)
            .style('b')
            .text('NEXON ARCHIVE')
            .size(1, 1)
            .style('normal')
            .align('lt')
            .text('ID:' + userData.username)
            .text('SINCE ' + userData.registerdDate)
            .text('FAVORITE(2019): ' + userData.favoriteGame)
            .size(1, 1)
            .lineSpace(34)
          this.userGamePrint(userData, printer)
        }
        printer
          .text('')
          .text('\n')
          .align('ct')
          .size(1, 1)
          .style('b')
          .text('THANKS FOR PLAYING GAME!')
          .size(1, 1)
          .lineSpace(28)
          .text('\n')
        for(let i = 0; i < 5; i++){
          printer
            .lineSpace(28)
            .size(1,1)
            .align('ct')
            // .style('b')
            .text(userData.couponGame[i])
            .style('normal')
            .align('ct')
            .size(1,1)
            .lineSpace(50)
            .text(userData.couponCode[i])
        }
        printer
          .lineSpace(50)
          .align('ct')
          .text('\n')
          .size(1, 1)
          .raster(image)
          .text('\n')
          .cut()
          .close(() => {
            callback()
          })
      })
    })
  }
  userCompletedQuestPrint(userData, printer) {
    let calcDotsBetweenText = this.calcDotsBetweenText.bind(this)
    for (let i = 0; i < userData.completedQuest.length; i++) {
      printer
        .text('[' + userData.completedQuest[i] + ']' + calcDotsBetweenText(42, '[' + userData.completedQuest[i] + ']', 'Completed') + 'Completed')
    }
  }
  userFailedQuestPrint(userData, printer) {
    let calcDotsBetweenText = this.calcDotsBetweenText.bind(this)
    for (let i = 0; i < userData.failedQuest.length; i++) {
      printer
        .text('[' + userData.failedQuest[i] + ']' + calcDotsBetweenText(42, '[' + userData.failedQuest[i] + ']', 'Failed') + 'Failed')
    }
  }
  userGamePrint(userData, printer) {
    for (const [i, game] of userData.gameData.entries()) {
      printer
        .text('{')
        .text('  "gameName": ' + game.gameName + ',')
        .text('  "mainCharaterId": ' + game.mainCharaterId + ',')
        .text('  "mainCharacterNickname": ' + game.mainCharacterNickname + ',')
        .text('  "mainCharacterTribe": ' + game.mainCharacterTribe + ',')
        .text('  "mainCharacterClass": ' + game.mainCharacterClass + ',')
        .text('  "mainCharacterLevel": ' + game.mainCharacterLevel + ',')
        .text('  "numCharacter": ' + game.numCharacter + ',')
        .text('  "PlayTimeInMinutes": ' + game.PlayTimeInMinutes + ',')
        .text('  "mainCharacterCreatedAt": ')
        .text('  ' + game.mainCharacterCreatedAt)
      if ((i + 1) == (userData.gameData.length))
        printer
        .text('}')
      else
        printer
        .text('},')
    }
  }
  calcDotsBetweenText(rowSpacesCount, leftText, rightText) {
    let dots = ''
    let remainingSpace = rowSpacesCount - Number(leftText.length) - Number(rightText.length)
    for (var i = 0; i < remainingSpace; i++) {
      dots += '.'
    }
    return dots
  }
  endOfPrinting(){
    console.log('Printing ends')
    isPrinting = false;
  }

  printTest(callback) {
    let device, printer
    let options = {
      encoding: "EUC-KR"
    }
    device = new escpos.Serial(printerPort)
    printer = new escpos.Printer(device, options)
    console.log('printer is working');

    device.open(function() {
      printer
        .size(1, 1)
        .align('lt')
        .text('\n')
        .text('\n')
        .style('b')
        .text('printer testing')
        .text('printer testing')
        .text('printer testing')
        .text('printer testing')
        .text('printer testing')
        .text('\n')
        .text('\n')
        .text('\n')
        .cut()
        .close(() => {
          callback()
        })
    })
  }
}
module.exports = Printer
package.json
{
  "name": "nexon-expo25-logout",
  "version": "0.0.1",
  "description": "server application for logout kiosk",
  "main": "manager.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "jonghyeon",
  "license": "ISC",
  "dependencies": {
    "@babel/runtime": "^7.5.4",
    "body-parser": "^1.19.0",
    "canvas": "^2.5.0",
    "dotenv": "^8.0.0",
    "escpos": "^2.4.11",
    "express": "^4.17.1",
    "floyd-steinberg": "^1.0.6", 
    "fs": "0.0.1-security",
    "path": "^0.12.7",
    "pngjs": "^3.4.0",
    "pug": "^2.0.3",
    "serialport": "^7.1.5",
    "sharp": "^0.22.1",
    "socket.io": "^2.2.0",
    "thermalprinter": "^0.3.8"
  }
}

json 套接字网络设置功能

SocketSettings.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;

public class NetworkSetting{
    public string serverIP;
    public string serverPort;
    public NetworkSetting(string _serverIp, string _serverPort){
        serverIP = _serverIp;
        serverPort = _serverPort;
    }
}
public class SocketSettings : MonoBehaviour
{   
    public string ipAddress;
    public string port;
    public List<NetworkSetting> networkSettingList = new List<NetworkSetting>();
    private string networkSettingFile = "NetworkSetting.json";

    #region Save / Load Settings.
    public void LoadFromJson(){
        string filePath = Path.Combine(Application.streamingAssetsPath, networkSettingFile);
        string networkSettingJsonFile = File.ReadAllText(filePath);
        JsonData networkSettingJson = JsonMapper.ToObject(networkSettingJsonFile);
        // Assign them with class variables.
        ipAddress = networkSettingJson[0]["serverIP"].ToString();
        port = networkSettingJson[0]["serverPort"].ToString();
    }
    public void SaveToJson(){
        // Put them in the list, and make it Json data.
        networkSettingList.Add(new NetworkSetting(ipAddress,port));
        JsonData networkSettingJson = JsonMapper.ToJson(networkSettingList);
        networkSettingList.Clear();
        // Save Json to File
        string filePath = Path.Combine(Application.streamingAssetsPath, networkSettingFile);
        File.WriteAllText(filePath,networkSettingJson.ToString());
    }
    #endregion
}
NetworkSetting.json
[{"serverIP":"192.168.1.10","serverPort":"3000"}]

json VSCode WordPress工作区排除文件和文件夹

exclude-wordpress-settings
"files.exclude": {
    "wp-admin/": true,
    "wp-includes/": true,
    "index.php": true,
    "license.txt": true,
    "readme.html": true,
    "wp-activate.php": true,
    "wp-blog-header.php": true,
    "wp-comments-post.php": true,
    "wp-config-sample.php": true,
    "wp-cron.php": true,
    "wp-links-opml.php": true,
    "wp-load.php": true,
    "wp-login.php": true,
    "wp-mail.php": true,
    "wp-settings.php": true,
    "wp-signup.php": true,
    "wp-trackback.php": true,
    "xmlrpc.php": true,
    "*/**/cache/": true,
    "*/**/.github/": true,
    ".cache-loader/": true,
    ".travis.yml": true,
    ".vscode/": true,
    "lang": true,
    "node_modules/": true,
    "phpcs.xml": true,
    ".*-tmpchunk": true,
    "*/**/*tmpchunk": true,
    "*/**/upgrade/": true,
    "*/**/uploads/": false,
    "wp-config.php": false,
    "vendor": false,
  },
  "search.exclude": {
    "build/": true,
  },

json 立即预订Gist

立即预订Gist

book_now.json
{
  "id": 100123,
  "created_at": "2018-12-12T01:23:29.767121Z",
  "load_id": "1670213",
  "offer": "38d4ca43-0271-490b-b49e-75fdf9fcb442",
  "all_in_rate": "850.00",
  "carrier_dot": "304939",
  "carrier_mc": "47746",
  "carrier_name": "DHAB LLC",
  "carrier_phone": "(888) 888-8888",
  "carrier_email": "email@email.com",
  "other_carrier_emails": [
    "email2@email.com",
    "email3@email.com"
  ],
  "other_carrier_phone_numbers": [
    "(123) 123-1234",
    "(456) 456-4567"
  ]
}