스크립트 기능 추가

This commit is contained in:
yunjy
2022-08-19 10:37:36 +09:00
parent f5fb0e39ee
commit 83568bd9d5
15 changed files with 790 additions and 2 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ logging:
level:
root: info
server:
port.http: 38080
port.http: 48080
port: 38443
ssl:
enabled: true
@@ -0,0 +1,9 @@
package com.eactive.httpmockserver.script.dynamic;
import com.eactive.httpmockserver.script.Script;
public class implements Script{
@Override
public String postProcess(String requestMessage, String responseMessage) throws Exception {
return responseMessage;
}
}
@@ -81,6 +81,22 @@
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-edit"></i>
<p>
부가 기능 <i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a th:href="@{/manage/findAllScriptInfos}" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>Script 관리</p>
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
@@ -153,6 +153,19 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group row">
<label class="col-sm-3 col-form-label">스크립트 명</label>
<div class="col-sm-9">
<input type="text" th:field="*{scriptName}"
class="form-control"
placeholder="수행 스크립트 명">
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group row">
@@ -0,0 +1,169 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="layout/default_layout">
<div class="content-wrapper" layout:fragment="content">
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 th:if="${scriptInfo.id == null}">스크립트 정보 등록</h1>
<h1 th:unless="${scriptInfo.id == null}">스크립트 정보 수정</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item active">스크립트 관리</li>
</ol>
</div>
</div>
</div>
<!-- /.container-fluid -->
</section>
<!-- Main content -->
<section class="content" style="padding-bottom: 1rem;">
<div class="container-fluid">
<form id="form" class="inputForm" action="#" th:action="@{/manage/saveScriptInfo}"
th:object="${scriptInfo}" method="post">
<div class="card card-default">
<div class="card-header">
<h3 class="card-title">Basic Info</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="form-group row">
<label class="col-sm-3 col-form-label">스크립트 명<small>(*)</small></label>
<div class="col-sm-9">
<input id="scriptName" type="text" th:field="*{scriptName}" class="form-control">
<span th:if="${#fields.hasErrors('scriptName')}"
th:errors="*{scriptName}" class="text-danger"></span>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group row">
<label class="col-sm-3 col-form-label">스크립트 설명<small>(*)</small></label>
<div class="col-sm-9">
<input id="scriptName" type="text" th:field="*{scriptDesc}" class="form-control">
<span th:if="${#fields.hasErrors('scriptDesc')}"
th:errors="*{scriptDesc}" class="text-danger"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card card-default">
<div class="card-header">
<h3 class="card-title">Script Code</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="form-group row">
<label class="col-sm-1 col-form-label">Script Editor</label>
<div class="col-sm-11">
<div id="scriptCode" class="shadow-sm" style="height:400px"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<input type="hidden" th:field="*{id}">
<button type="submit" class="btn btn-primary mr-2">Submit</button>
<button type="button" class="btn btn-secondary"
onclick="history.go(-1);">Cancel</button>
</form>
</div>
</section>
</div>
<th:block layout:fragment="script">
<link rel="stylesheet" data-name="vs/editor/editor.main"
th:href="@{/plugins/vs/editor/editor.main.css}">
<script>var require = { paths: { 'vs': '../../plugins/vs' } };</script>
<script th:src="@{/plugins/vs/loader.js}"></script>
<script th:src="@{/plugins/vs/editor/editor.main.nls.js}"></script>
<script th:src="@{/plugins/vs/editor/editor.main.js}"></script>
<script th:inline="javascript">
var urlForSidebar = "/manage/findAllScriptInfos";
let editor
const isNew = [[${scriptInfo.id == null}]];
function setMonaco(elementId, initValue){
var targetDivElement = document.getElementById(elementId);
editor = monaco.editor.create(targetDivElement, {
value: initValue,
language: 'java',
minimap: {
enabled: false
},
wordWrap: 'on',
wrappingStrategy: 'simple',
wordWrapBreakAfterCharacters: '',
wordWrapBreakBeforeCharacters: '',
wrappingIndent: 'none',
automaticLayout: true
});
const readonlyRange = new monaco.Range (1, 0, 7, 0)
editor.onKeyDown (e => {
const contains = editor.getSelections().findIndex (range => readonlyRange.intersectRanges (range))
let currentLineNumber = editor.getPosition().lineNumber
let lineCount = editor.getModel().getLineCount();
console.log(e.ctrlKey)
if(e.ctrlKey && e.keyCode == 33){
return
}
switch(e.keyCode){
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 63:
return
}
const matchTailPart = lineCount == currentLineNumber || lineCount - 1 == currentLineNumber;
if (contains !== -1 || matchTailPart) {
e.stopPropagation ()
e.preventDefault () // for Ctrl+C, Ctrl+V
return false;
}
});
$('#form').submit(function(eventObj) {
$('#scriptName').prop( "disabled", false );
$("<input />").attr("type", "hidden")
.attr("name", elementId)
.attr("value", editor.getValue())
.appendTo("#form");
return true;
});
}
setMonaco('scriptCode', [[${scriptInfo.scriptCode}]]);
if(isNew == false){
$('#scriptName').prop( "disabled", true );
}
$('#scriptName').on("change keyup paste", function(){
const scriptName = $('#scriptName').val();
const currentTextLength = editor.getModel().getLinesContent()[3].length + 1;
const newText = `public class ${scriptName} implements Script{`;
editor.executeEdits("my-source",
[{ range: new monaco.Range(4, 1, 4, currentTextLength), text: newText, forceMoveMarkers: true }]);
});
</script>
</th:block>
</html>
@@ -0,0 +1,155 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="layout/default_layout">
<th:block layout:fragment="css">
<link rel="stylesheet"
th:href="@{/plugins/datatables-bs4/css/dataTables.bootstrap4.min.css}">
<link rel="stylesheet"
th:href="@{/plugins/datatables-responsive/css/responsive.bootstrap4.min.css}">
<link rel="stylesheet"
th:href="@{/plugins/datatables-buttons/css/buttons.bootstrap4.min.css}">
</th:block>
<div class="content-wrapper" layout:fragment="content">
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>스크립트 관리</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item active">스크립트 관리</li>
</ol>
</div>
</div>
</div>
<!-- /.container-fluid -->
</section>
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">응답 송신 전 수행 할 스크립트, GUID 복제나 특정 예외전문등의 처리 수행 로직을 작성한다(java)</h3>
</div>
<div class="card-body">
<table id="listApiTable"
class="table table-bordered table-striped">
<thead>
<tr>
<th>스크립트 명</th>
<th>스크립트 설명</th>
<th>수정</th>
<th>삭제</th>
</tr>
</thead>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
</section>
</div>
<th:block layout:fragment="script">
<script th:src="@{/plugins/datatables/jquery.dataTables.min.js}"></script>
<script
th:src="@{/plugins/datatables-bs4/js/dataTables.bootstrap4.min.js}"></script>
<script
th:src="@{/plugins/datatables-responsive/js/dataTables.responsive.min.js}"></script>
<script
th:src="@{/plugins/datatables-responsive/js/responsive.bootstrap4.min.js}"></script>
<script
th:src="@{/plugins/datatables-buttons/js/dataTables.buttons.min.js}"></script>
<script
th:src="@{/plugins/datatables-buttons/js/buttons.bootstrap4.min.js}"></script>
<script th:src="@{/plugins/jszip/jszip.min.js}"></script>
<script th:src="@{/plugins/pdfmake/pdfmake.min.js}"></script>
<script th:src="@{/plugins/pdfmake/vfs_fonts.js}"></script>
<script th:src="@{/plugins/datatables-buttons/js/buttons.html5.min.js}"></script>
<script th:src="@{/plugins/datatables-buttons/js/buttons.print.min.js}"></script>
<script
th:src="@{/plugins/datatables-buttons/js/buttons.colVis.min.js}"></script>
<script th:inline="javascript">
$.fn.dataTable.ext.buttons.new = {
text: 'New',
action: function ( e, dt, node, config ) {
location.href = "/manage/getScriptInfoForm";
}
};
var listApiTable = $("#listApiTable").DataTable({
"responsive": true, "lengthChange": false, "autoWidth": false,
"processing": true,
"serverSide": true,
"pageLength": 50,
"searchDelay": 1200,
"ajax": {
"url": "/manage/rest/scriptInfos",
"type": "POST",
"dataType": "json",
"contentType": "application/json",
"data": function (d) {
return JSON.stringify(d);
}
},
"columns": [
{"data": "scriptName"},
{"data": "scriptDesc"},
{"data": "id", "searchable": false, "orderable": false},
{"data": "id", "searchable": false, "orderable": false}
],
"columnDefs": [
{
"render": function (data, type, row) {
return '<a href="/manage/getScriptInfoForm/' + data + '" class="btn btn-primary"><i class="fas fa-edit"></i></a>';
},
"targets": -2
},
{
"render": function (data, type, row) {
var msg = "'정말로 데이터를 삭제 하시겠습니까?'";
return '<a href="/manage/deleteScriptInfo/' + data + '" onclick="return confirm(' + msg +');" class="btn btn-primary"><i class="fas fa-trash"></i></a>';
},
"targets": -1
}
],
"buttons": ["new", "excel", "colvis"],
"initComplete": function() {
listApiTable.buttons().container().appendTo('#listApiTable_wrapper .col-md-6:eq(0)');
}
});
/*
$(".dataTables_filter input").unbind().bind("input", function(e) { // Bind our desired behavior
// If the length is 3 or more characters, or the user pressed ENTER, search
if(this.value.length >= 3 || e.keyCode == 13) {
// Call the API search function
listApiTable.search(this.value).draw();
}
// Ensure we clear the search if they backspace far enough
if(this.value == "") {
listApiTable.search("").draw();
}
return;
});
*/
</script>
</th:block>
</html>