1.base.html
{% load staticfiles %}
{#<!DOCTYPE html>#}
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{% block title %}HFT管理系统{% endblock %}</title>
{% block head_link %}{% endblock %}
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="{% static '/bower_components/bootstrap/dist/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static '/bower_components/font-awesome/css/font-awesome.min.css' %}">
<link rel="stylesheet" href="{% static '/bower_components/Ionicons/css/ionicons.min.css' %}">
{# <link rel="stylesheet" href="{% static '/plugins/bootstrap-datatable/bootstrap-table.css' %}">#}
<link rel="stylesheet" href="{% static '/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static '/plugins/iCheck/all.css' %}">
<link rel="stylesheet" href="{% static '/plugins/bootstrapValidator/bootstrapValidator.min.css' %}">
<link rel="stylesheet" href="{% static '/plugins/bootstrap-dialog/bootstrap-dialog.min.css' %}">
<link rel="stylesheet" href="{% static '/dist/css/AdminLTE.min.css' %}">
<link rel="stylesheet" href="{% static '/plugins/timepicker/bootstrap-timepicker.css' %}">
<link rel="stylesheet" href="{% static '/dist/css/skins/skin-blue.min.css' %}">
<link rel="stylesheet" href="{% static '/public.css' %}">
<link rel="stylesheet" href="{% static '/datetimepicker/bootstrap-datetimepicker.min.css' %}">
<!-- 子模板的样式表应放在父模板的样式表之后,只有这样才可以在子模板中重定义父模板中的某些样式 -->
{% block styles %}{% endblock %}
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">
<!-- Left side column. contains the logo and sidebar -->
{# <aside class="main-sidebar">#}
{# </aside>#}
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
{% block content %}
{% endblock %}
</div>
<!-- /.content-wrapper -->
<!-- Main Footer -->
<footer class="main-footer">
<!-- To the right -->
<div class="pull-right hidden-xs">
</div>
</footer>
</div>
<!-- Jquery -->
<script src="{% static '/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static '/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<!-- DataTables -->
<script src="{% static '/bower_components/datatables.net/js/jquery.dataTables.min.js' %}"></script>
<script src="{% static '/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js' %}"></script>
<script src="{% static '/plugins/jquery-form/jquery.form.min.js' %}"></script>
<script src="{% static '/plugins/iCheck/icheck.min.js' %}"></script>
{#验证#}
<script src="{% static '/plugins/bootstrapValidator/bootstrapValidator.min.js' %}"></script>
<script src="{% static '/plugins/jquery-cookie/jquery.cookie.min.js' %}"></script>
<!-- Echart -->
<script src="{% static '/plugins/echart/echarts.min.js' %}"></script>
<script src="{% static '/plugins/bootstrap-dialog/bootstrap-dialog.min.js' %}"></script>
<!-- Theme style -->
<script src="{% static '/dist/js/adminlte.min.js' %}"></script>
<script src="{% static '/public.js' %}"></script>
<script src="{% static '/datetimepicker/bootstrap-datetimepicker.js' %}"></script>
<script src="{% static '/plugins/timepicker/bootstrap-timepicker.js' %}"></script>
<script src="{% static '/datetimepicker/jszip.min.js' %}"></script>
<script>
</script>
<!--bootstrap-->
{#<script src="https://unpkg.com/@popperjs/core@2"></script>#}
<!--bootstrap-table-->
<link href="{% static '/bootstrap_table/bootstrap-table/dist/bootstrap-table.min.css' %}" rel="stylesheet">
<script src="{% static '/bootstrap_table/bootstrap-table/dist/bootstrap-table.min.js' %}"></script>
{#<link href="https://cdn.bootcss.com/bootstrap-table/1.14.2/bootstrap-table.min.css" rel="stylesheet">#}
{#<script src="https://cdn.bootcss.com/bootstrap-table/1.14.2/bootstrap-table.min.js"></script>#}
<!--bootstrap-table-lanuage-->
<!--bootstrap-table-export-->
<script src="{% static '/bootstrap_table/bootstrap-table-export.js' %}"></script>
{#<script src="https://cdn.bootcss.com/bootstrap-table/1.14.2/extensions/export/bootstrap-table-export.min.js"></script>#}
<!--在客户端保存生成的导出文件-->
<script src="{% static '/bootstrap_table/FileSaver.min.js' %}"></script>
{#<script src="https://cdn.bootcss.com/FileSaver.js/2014-11-29/FileSaver.min.js"></script>#}
<!--以XLSX(Excel 2007+ XML格式)格式导出表(SheetJS)-->
<script src="{% static '/bootstrap_table/xlsx.core.min.js' %}"></script>
{#<script src="https://cdn.bootcss.com/xlsx/0.14.2/xlsx.core.min.js"></script>#}
<!--无论期望的格式如何,最后都包含 tableexport.jquery.plugin(不是tableexport)-->
<script src="{% static '/bootstrap_table/tableExport.js' %}"></script>
{#<script src="https://unpkg.com/tableexport.jquery.plugin/tableExport.min.js"></script>#}
<style>
.skin-blue .main-header .navbar {
background-color: #000;
}
.skin-blue .main-header .logo {
background-color: #2b2b2b;
color: #fff;
border-bottom: 0 solid transparent;
}
.content-wrapper {
{#min-height: 100%;#} background-color: rgb(0, 0, 0);
z-index: 800;
}
.skin-blue .wrapper, .skin-blue .main-sidebar, .skin-blue .left-side {
background-color: #000000;
}
.main-footer {
background: #000;
padding: 15px;
color: #f39c12;
border-top: 1px solid #000;
}
</style>
{% block scripts %}
{% endblock %}
</body>
</html>
2.paper.html
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}仿真策略{% endblock %}
{% block styles %}
<style>
th {
text-align: center;
}
td {
text-align: center;
}
label {
width: 100px;
margin-left: 5%
}
input, select {
width: 160px;
height: 24px;
background: #0F0F0F;
border: 1px solid #3C3C3C;
border-radius: 1px;
}
{#模态框下的input#}
.opts {
background-color: white;
}
form > input {
width: 160px;
height: 24px;
background: #0F0F0F;
border: 1px solid #3C3C3C;
border-radius: 1px;
}
{#input-file放在同一行#}
input[type=file] {
display: inline-block;
cursor: pointer;
border: none;
width: auto;
}
{#p > input {#}
{# width: 160px;#}
{# height: 24px;#}
{# background: #0F0F0F;#}
{# border: 1px solid #3C3C3C;#}
{# border-radius: 1px;#}
{# }#}
button {
border: none;
}
.conf {
border: 0; /*去掉未选中状态边框*/
outline: none; /*去掉选中状态边框*/
background-color: rgba(0, 0, 0, 0); /*透明背景*/
}
.bootstrap-table {
border-style: solid;
border-width: 3px;
}
.pagination-info {
display: none
}
.page-list {
display: none
}
#modal_backtest_detail .modal-body {
background-color: #282923;
padding: 0px;
}
#StgFileShow, #ConFileShow {
background-color: #282923;
color: #90918b;
border-width: 0px;
width: 448px;
height: 100%;
}
#stg_check {
padding: 10px;
}
.row {
margin-top: 10px;
}
{#tab表头的选中的样式#}
.nav-tabs-custom > .nav-tabs > li.active > a, .nav-tabs-custom > .nav-tabs > li.active:hover > a {
background-color: red;
color: white;
}
{#tab样式#}
.nav-tabs-custom > .nav-tabs > li {
border-top: transparent;
margin-bottom: -2px;
margin-right: 2px;
}
.nav-tabs > li {
float: left;
margin-bottom: -1px;
}
.nav > li > a {
position: relative;
display: block;
padding: 4px 20px;
}
{#tab头的位置及边框颜色透明#}
.nav-tabs-custom > .nav-tabs {
margin-left: 11px;
border-bottom-color: rgba(0, 0, 0, 0.2);
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
{#tab中的a标签悬浮样式#}
.nav-tabs-custom > .nav-tabs > li > a, .nav-tabs-custom > .nav-tabs > li > a:hover {
background: rgba(255, 255, 255, .15);
margin: 0;
}
.nav-tabs-custom > .nav-tabs > li > a {
color: #d2d6de;
border-radius: 0;
}
.uploadheadiv {
float: left;
margin-top: 15px;
margin-left: 10px
}
.packheadiv {
float: left;
margin-top: 15px;
margin-left: 10px
}
.simheadiv {
float: left;
margin-top: 15px;
margin-left: 10px
}
.uploadHead, .simHead, .packHead {
color: white;
margin-left: 30px;
}
.uploadheadiv, .packheadiv, .simheadiv {
margin-left: 30px;
}
.bootstrap-table .fixed-table-container .table {
width: 100%;
margin-bottom: 0 !important;
color: #939393;
}
.fixed-table-toolbar {
background-color: #141414;
}
.uploadsearch, .packsearch, .papersearch {
width: 87px;
height: 26px;
background: #3C3C3C;
border-radius: 3px;
}
.upstrategy {
width: 119px;
height: 28px;
background: inherit;
background-color: rgba(255, 204, 153, 1);
box-sizing: border-box;
border-width: 1px;
border-style: solid;
border-color: rgba(121, 121, 121, 1);
border-radius: 5px;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
color: #2B2B2B;
}
{#bootstraptable上边框#}
.table-bordered {
border: 1px solid transparent !important;
}
{#bootstraptable左侧边框#}
.table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td {
border: 1px solid rgba(255, 255, 255, .15);
}
{#无数据时鼠标悬浮的背景颜色#}
.table-hover > tbody > tr:hover {
background-color: transparent;
}
{#无数据时的奇数背景颜色#}
.table-striped > tbody > tr:nth-of-type(odd) {
background-color: transparent;
}
tr.activetable, input.activetable {
background-color: white;
width: 100px;
height: 30px;
margin-right: 6px;
margin-left: 1px
}
</style>
{% endblock %}
{% block content %}
{#上传策略模态框#}
<div class="modal fade" data-backdrop="static" id="upmodal" tabindex="-1" role="dialog"
aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" style="width: 450px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"></button>
<h4 class="modal-title">上传策略</h4>
</div>
<div class="modal-body" style="padding: 30px;height:auto">
<form>
<div style="margin-top:3%; display: block">
<label>策略名称</label>
<input class="opts" id="stgname" name="stgname" type="text"
placeholder="策略名称">
<span id="stgname_upload_spaninfo" style="color: red;font-size: 14px"></span>
</div>
<div style="margin-top:3%"><label>策略组</label>
<select class="opts" id="stggroup" name="stggroup">
<option name="isactive" value="1">
做市策略
</option>
<option name="isactive" value="2">
CTA策略
</option>
<option name="isactive" value="3">
算法策略
</option>
</select>
</div>
<div style="margin-top:3%">
<label>选择策略</label>
<input class="opts" id="file" name="file" type="file" accept=".py"
onchange="filename1()">
<span id="stgfile_upload_spaninfo" style="color: red;font-size: 14px"></span>
</div>
<div style="margin-top:3%"><label>策略参数</label>
<table style="background-color: white; margin-left: 19px;font-size: 13px">
<thead>
<tr class="activetable">
<th>
操作
</th>
<th>
参数名*
</th>
<th>
参数值*
</th>
<th>
参数描述
</th>
</tr>
</thead>
<tbody id="tb1">
<tr class="activetable">
<td>
<span style="padding:3px;cursor: pointer" class="btn-success small"
onclick="new_col('tb1')">新增行
</span>
</td>
<td>
<input class="activetable" name="stg_name" id="stg_name">
</td>
<td>
<input class="activetable" name="stg_value" id="stg_value">
</td>
<td>
<input class="activetable" name="stg_desc" id="stg_desc">
</td>
</tr>
</tbody>
</table>
<span id="paraarry_upload_spaninfo" style="color: red;font-size: 14px"></span>
</div>
<div style="margin-top:3%">
<span style="margin-left:10%;cursor:pointer;padding:5px" class="btn-primary"
onclick="reSub()">提交</span>
<span style="margin-left:60%;cursor:pointer;padding:5px" class="btn-success"
onclick="fad_upmodeal_add_change()">取消</span>
</div>
</form>
</div>
</div>
</div>
</div>
{# 上传策略提交时弹出确认按钮 #}
<div class="modal fade" id="modal_resub"></div>
{#打包失败模态框#}
<div class="modal fade" data-backdrop="static" id="modal_packageError">
</div>
{#申请实盘#}
<div class="modal fade" id="modal_askfor_live" data-backdrop="static" tabindex="-1" role="dialog"
aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" style="width: 450px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"></button>
<h4 class="modal-title">申请实盘</h4>
</div>
<div class="modal-body" style="padding: 30px;height:auto">
<form>
<div style="margin-top:3%">
<label>策略ID</label>
<input class="opts" id="stgid_askfor_live" name="stgid" type="text"
placeholder="策略ID" readonly>
</div>
<div style="margin-top:3%; display: block">
<label>策略名称</label>
<input class="opts" id="stgname_askfor_live" name="stgname" type="text"
placeholder="策略名称" readonly>
</div>
<label>策略组</label>
<input class="opts" id="stggroup_askfor_live" name="stggroup" type="text"
placeholder="策略名称" readonly>
<div style="margin-top:3%"><label>策略参数</label>
<table style="background-color: white">
<thead>
<tr class="activetable">
<th>
参数名*
</th>
<th>
参数值*
</th>
<th>
参数描述
</th>
</tr>
</thead>
<tbody id="tb2">
</tbody>
</table>
<span id="paraarry_askFor_spaninfo" style="color: red;font-size: 14px"></span>
</div>
<div style="margin-top:3%">
<span style="margin-left:10%;cursor:pointer;padding:5px" class="btn-primary"
onclick="reSubAskForLive()">提交</span>
<span style="margin-left:60%;cursor:pointer;padding:5px" class="btn-success"
onclick="fad_askfor_live()">取消</span>
</div>
</form>
</div>
</div>
</div>
</div>
{# 申请实盘提交时弹出确认按钮 #}
<div class="modal fade" id="modal_resubAskForLive"></div>
{#上传列表删除#}
<div class="modal fade" data-backdrop="static" id="modal_delete">
<div class="modal-dialog" style="width: 300px;background-color:#eee">
<div class="modal-content">
<div class="modal-body" style="padding:5px;height:80px;overflow:auto">
<div>
<p style="margin-top:10px;margin-left:5px;" id="confirm_paper">确认删除仿真策略</p>
<div>
<span id="del" sid="" onclick="fad_delete()"
style="padding:2px;cursor:pointer;float:right;margin-right:10px" class="btn-success">取消</span>
<span onclick="del_()" style="padding:2px;cursor:pointer;float:right;margin-right:10px"
class="btn-success">确定</span>
</div>
</div>
</div>
</div>
</div>
</div>
{#仿真列表删除确认#}
<div class="modal fade" data-backdrop="static" id="modal_delete_paper">
<div class="modal-dialog" style="width: 300px;background-color:#eee">
<div class="modal-content">
<div class="modal-body" style="padding:5px;height:80px;overflow:auto">
<div>
<p style="margin-top:10px;margin-left:5px;" id="confirm_delete">确认删除仿真策略</p>
<div>
<span id="del_paper" sid_paper="" onclick="fad_delete_paper()"
style="padding:2px;cursor:pointer;float:right;margin-right:10px" class="btn-success">取消</span>
<span onclick="del_paper()" style="padding:2px;cursor:pointer;float:right;margin-right:10px"
class="btn-success">确定</span>
</div>
</div>
</div>
</div>
</div>
</div>
{#打包的模态框#}
<div class="modal fade" data-backdrop="static" id="modal_pack">
<div class="modal-dialog" style="width: 300px;background-color:#eee">
<div class="modal-content">
<div class="modal-body" style="padding:5px;height:80px;overflow:auto">
<div>
<p style="margin-top:10px;margin-left:5px;">确认打包策略</p>
<div>
<span id="attr_packid" packid="" onclick="fad_pack()"
style="padding:2px;cursor:pointer;float:right;margin-right:10px" class="btn-success">取消</span>
<span onclick="stg_pack()"
style="padding:2px;cursor:pointer;float:right;margin-right:10px"
class="btn-success">确定</span>
</div>
</div>
</div>
</div>
</div>
</div>
{#面头部#}
<section class="content-header" style="background-color: #000000">
<h1 style="color: #FFFFFF; cursor: pointer">
仿真策略
</h1>
</section>
<!-- Main content -->
<section class="content" style="background-color: #000000">
<div class="row">
<div class="col-xs-12">
<div class="nav-tabs-custom" style="background-color: #000000">
<ul class="nav nav-tabs">
<li class="active"><a href="#fa-upload" onclick="tabs(0)" data-toggle="tab">上传列表</a></li>
<li><a href="#fa-pack" onclick="tabs(1)" data-toggle="tab">打包列表</a></li>
<li><a href="#fa-sim" onclick="tabs(2)" data-toggle="tab">仿真列表</a></li>
</ul>
<div class="tab-content" style="background-color: #000000">
<!--上传列表-->
<div class="tab-pane active mailbox-messages" id="fa-upload">
<div class=" mailbox-messages">
<table id="toolbar"></table>
<div class="uploadHead">
<div class="bs-bars pull-left"></div>
<div class="uploadheadiv" style="margin-left: 25px">
<button class="upstrategy" onclick="uploadmodal()">上传策略
</button>
</div>
<div class="uploadheadiv"><span>策略ID </span>
<input type="text" id="ustgid">
</div>
<div class="uploadheadiv"><span>策略名称 </span>
<input type="text" id="ustgname">
</div>
<div class="uploadheadiv"><span>策略状态 </span>
<select id="ustgstatus">
<option value=""></option>
<option value="1">待审批</option>
<option value="2">审批驳回</option>
<option value="3">审批通过</option>
</select></div>
<div class="uploadheadiv">
<button class="uploadsearch" onclick="uploadsearch()">查询
</button>
</div>
</div>
<table class="table table-bordered table-striped table-hover" id="UploadTable"
style="table-layout: fixed;word-break:break-all; word-wrap:break-all;"></table>
</div>
</div>
<!--打包列表-->
<div class="tab-pane" id="fa-pack">
<div class=" mailbox-messages">
<table id="toolbar"></table>
<div class="packHead">
<div class="bs-bars pull-left"></div>
<div class="packheadiv" style="margin-left: 13px"><span>策略名称 </span>
<input type="text" id="pstgname">
</div>
<div class="packheadiv">
<span>打包状态 </span>
<select id="ppackstatus">
<option value=""></option>
<option value="0">待打包</option>
<option value="1">打包成功</option>
<option value="2">打包失败</option>
</select></div>
<div class="packheadiv">
<button class="packsearch"
onclick="packsearch()">查询
</button>
</div>
</div>
<table class="table table-bordered table-striped table-hover" id="packTable"
style="table-layout: fixed;word-break:break-all; word-wrap:break-all;">
</table>
</div>
</div>
<!--仿真列表-->
<div class="tab-pane" id="fa-sim">
<div class=" mailbox-messages">
<table id="toolbar"></table>
<div class="simHead">
<div class="bs-bars pull-left"></div>
<div class="simheadiv" style="margin-left: 0px"><span>策略ID </span><input type="text"
id="sstgid">
</div>
<div class="simheadiv"><span>策略名称 </span><input type="text" id="sstgname">
</div>
<div class="simheadiv"><span>运行状态 </span>
<select id="sstgstatus">
<option value=""></option>
<option value="1">启动</option>
<option value="4">停止</option>
</select></div>
<div class="simheadiv">
<button class="papersearch"
onclick="papersearch()">查询
</button>
</div>
</div>
<table class="table table-bordered table-striped table-hover" id="simTable"
style="table-layout: fixed;word-break:break-all; word-wrap:break-all;">
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}
{% block scripts %}
<script type="text/javascript">
//tab标签页
function tabs(n) {
if (n == 0) {
$('#fa-upload').addClass('active');
$('#fa-pack').removeClass('active');
$('#fa-sim').removeClass('active');
} else if (n == 1) {
$('#fa-upload').removeClass('active');
$('#fa-pack').addClass('active');
$('#fa-sim').removeClass('active');
} else {
$('#fa-upload').removeClass('active');
$('#fa-pack').removeClass('active');
$('#fa-sim').addClass('active');
}
}
//上传策略取消按钮
function fad_upmodeal_add_change() {
$('#upmodal').modal('hide');
$('#stgname').val('');
$('#file').val('');
$('#stg_name').val('');
$('#stg_value').val('');
$('#stg_desc').val('');
$('#stgname_upload_spaninfo').text('');
$('#stgfile_upload_spaninfo').text('');
$('#paraarry_upload_spaninfo').text('');
$('#tb1').html('')
var tb1_html = '<tr class="activetable">\n' +
' <td>\n' +
' <span style="padding:3px;cursor: pointer" class="btn-success small"\n' +
' onclick="new_col(\'tb1\')">新增行\n' +
' </span>\n' +
' </td>\n' +
' <td>\n' +
' <input class="activetable" name="stg_name" id="stg_name">\n' +
' </td>\n' +
' <td>\n' +
' <input class="activetable" name="stg_value" id="stg_value">\n' +
' </td>\n' +
' <td>\n' +
' <input class="activetable" name="stg_desc" id="stg_desc">\n' +
' </td>\n' +
' </tr>'
$('#tb1').append(tb1_html)
}
//申请实盘取消按钮
function fad_askfor_live() {
$('#modal_askfor_live').modal('hide');
$("#tb2").html('');
}
//上传策略模态框input框的值,
function gets() {
//仿真策略参数表的条数[{key,value,desc},{}]
var pararry = []
$("#tb1").find("tr").each(function () {
var tdata = $(this).children()
var paraname = tdata.eq(1).find("input").val()
var paravalue = tdata.eq(2).find("input").val()
var paradesc = tdata.eq(3).find("input").val()
var paradic = {"paraname": paraname, "paravalue": paravalue, "paradesc": paradesc}
pararry.push(paradic)
})
data = {
'stgname': JSON.stringify([$('#stgname').val()]),
'stggroup': JSON.stringify([$('#stggroup').val()]),
{#'file': JSON.stringify([file]),#}
'pararry': JSON.stringify(pararry)
}
return data;
}
//上传列表模态框显示
function uploadmodal() {
$("#upmodal").modal("show")
}
//上传策略再次确认按钮
function reSub() {
//每次请求再次确认页面容器是空
$('#modal_resub').html('');
//上传策略点击提交,错误提示信息置空
$('#stgname_upload_spaninfo').text('');
$('#stgfile_upload_spaninfo').text('');
$('#paraarry_upload_spaninfo').text('');
//取页面输入的值
var data1 = gets()
var stgname = JSON.parse(data1["stgname"])[0];
var stggroup_value = JSON.parse(data1["stggroup"])[0];
var stggroup = $("#stggroup").find("option[value=" + stggroup_value + "]").text().replace(/\s+/g, "");
var file = $("#file").val()
var pararry = JSON.parse(data1["pararry"])
//输入框校验
if ((stgname === '') || (stgname.length > 25)) {
$('#stgname_upload_spaninfo').text('策略名不合法,请重新输入')
return;
} else if (file === '') {
$('#stgfile_upload_spaninfo').text('策略文件不可为空,请重新上传')
return;
}
for (var i in pararry) {
if ((pararry[i].paraname === '') || ((pararry[i].paraname).length > 25)) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
} else if ((pararry[i].paravalue === '') || ((pararry[i].paravalue).length > 25)) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
} else if ((pararry[i].paradesc).length > 25) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
}
}
/**else if ((pararry[0].paraname === '') || ((pararry[0].paraname).length > 25)) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
} else if ((pararry[0].paravalue === '') || ((pararry[0].paravalue).length > 25)) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
} else if ((pararry[0].paradesc).length > 25) {
$('#paraarry_upload_spaninfo').text('策略参数不合法,请重新输入')
return;
}**/
//向再次确认页面容器添加html
var paradiv = ""
for (let i = 0; i < pararry.length; i++) {
var pararow = "<tr class=\"activetable\">\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_name\" value=" + pararry[i]["paraname"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_value\" value=" + pararry[i]["paravalue"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_desc\" value=" + pararry[i]["paradesc"] + ">\n" +
" </td>\n" +
" </tr>";
paradiv = paradiv + pararow
}
var confirm_strategy = '<div class="modal-dialog" style="width: 450px;">\n' +
' <div class="modal-content">\n' +
' <div class="modal-header">\n' +
' <button type="button" class="close" data-dismiss="modal" aria-label="Close"></button>\n' +
' <h4 class="modal-title">上传策略确认</h4>\n' +
' </div>\n' +
' <div class="modal-body" style="padding: 30px;height:auto">\n' +
' <form>\n' +
' <div style="margin-top:3%; display: block">\n' +
' <label>策略名称</label>\n' +
' <input disabled class="opts conf" name="stgname" type="text"\n' +
' value="' + stgname + '" >\n' +
' <span id="stgname_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%"><label>策略组</label>\n' +
' <input disabled class="opts conf" name="stggroup" type="text"\n' +
' value="' + stggroup + '" >\n' +
' <span id="stggroup_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%"><label>选择文件</label>\n' +
' <input disabled class="opts conf" name="file"' +
' value="' + file + '">\n' +
' <span id="file_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%"><label>策略参数</label>\n' +
' <table style="background-color: white">\n' +
' <thead>\n' +
' <tr class="activetable">\n' +
' <th>\n' +
' 参数名*\n' +
' </th>\n' +
' <th>\n' +
' 参数值*\n' +
' </th>\n' +
' <th>\n' +
' 参数描述\n' +
' </th>\n' +
' </tr>\n' +
' </thead>\n' +
' <tbody>\n' + paradiv +
' </tbody>\n' +
' </table>\n' +
' <span id="paraarry_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%">\n' +
' <span style="margin-left:10%;cursor:pointer;padding:5px" class="btn-primary"\n' +
' onclick="sub(gets)">提交</span>\n' +
' <span style="margin-left:60%;cursor:pointer;padding:5px" class="btn-success"\n' +
' onclick="reSub_fad()">取消</span>\n' +
' </div>\n' +
' </form>\n' +
' </div>\n' +
' </div>\n' +
' </div>'
$("#modal_resub").append(confirm_strategy)
$('#modal_resub').modal('show')
}
//申请实盘再次确认按钮
function reSubAskForLive() {
//每次请求再次确认页面容器是空
$('#modal_resubAskForLive').html('');
//申请实盘点击提交,错误提示信息置空
$('#paraarry_askFor_spaninfo').text('');
//取页面输入的值
var data1 = gets_live()
var stgid = JSON.parse(data1["stgid_askfor_live"])[0];
var stgname = JSON.parse(data1["stgname_askfor_live"])[0];
var stggroup = JSON.parse(data1["stggroup_askfor_live"])[0];
var pararry = JSON.parse(data1["pararry_askfor_live"])
//输入框校验
for (var i in pararry) {
if ((pararry[i].paravalue === '') || ((pararry[i].paravalue).length > 25)) {
$('#paraarry_askFor_spaninfo').text('策略参数不合法,请重新输入')
return;
} else if ((pararry[i].paradesc).length > 25) {
$('#paraarry_askFor_spaninfo').text('策略参数不合法,请重新输入')
return;
}
}
//向再次确认页面容器添加html
var paradiv = ""
for (let i = 0; i < pararry.length; i++) {
var pararow = "<tr class=\"activetable\">\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_name\" value=" + pararry[i]["paraname"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_value\" value=" + pararry[i]["paravalue"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" disabled name=\"stg_desc\" value=" + pararry[i]["paradesc"] + ">\n" +
" </td>\n" +
" </tr>";
paradiv = paradiv + pararow
}
var confirm_strategy_askfor = '<div class="modal-dialog" style="width: 450px;">\n' +
' <div class="modal-content">\n' +
' <div class="modal-header">\n' +
' <button type="button" class="close" data-dismiss="modal" aria-label="Close"></button>\n' +
' <h4 class="modal-title">申请实盘确认</h4>\n' +
' </div>\n' +
' <div class="modal-body" style="padding: 30px;height:auto">\n' +
' <form>\n' +
' <div style="margin-top:3%; display: block">\n' +
' <label>策略ID</label>\n' +
' <input disabled class="opts conf" name="stgid" type="text"\n' +
' value="' + stgid + '" >\n' +
' <span id="stgname_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%; display: block">\n' +
' <label>策略名称</label>\n' +
' <input disabled class="opts conf" name="stgname" type="text"\n' +
' value="' + stgname + '" >\n' +
' <span id="stgname_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%"><label>策略组</label>\n' +
' <input disabled class="opts conf" name="stggroup" type="text"\n' +
' value="' + stggroup + '" >\n' +
' <span id="stggroup_spaninfo" style="color: red; font-size: 14px"></span>\n' +
' </div>\n' +
' <div style="margin-top:3%"><label>策略参数</label>\n' +
' <table style="background-color: white">\n' +
' <thead>\n' +
' <tr class="activetable">\n' +
' <th>\n' +
' 参数名*\n' +
' </th>\n' +
' <th>\n' +
' 参数值*\n' +
' </th>\n' +
' <th>\n' +
' 参数描述\n' +
' </th>\n' +
' </tr>\n' +
' </thead>\n' +
' <tbody>\n' + paradiv +
' </tbody>\n' +
' </table>\n' +
' </div>\n' +
' <div style="margin-top:3%">\n' +
' <span style="margin-left:10%;cursor:pointer;padding:5px" class="btn-primary"\n' +
' onclick="sub_live(gets_live)">提交</span>\n' +
' <span style="margin-left:60%;cursor:pointer;padding:5px" class="btn-success"\n' +
' onclick="reSubAskForLive_fad()">取消</span>\n' +
' </div>\n' +
' </form>\n' +
' </div>\n' +
' </div>\n' +
' </div>'
$("#modal_resubAskForLive").append(confirm_strategy_askfor)
$('#modal_resubAskForLive').modal('show')
}
//申请实盘再次确认模态框取消
function reSubAskForLive_fad() {
$('#modal_resubAskForLive').modal('hide')
$("#modal_resubAskForLive").html('');
}
//上传策略提交逻辑
function sub(func) {
//此处输入框校验可不做,之前写过,懒得删了,留着无碍
data = func();
$('#stgname_spaninfo').text('');
$('#file_spaninfo').text('');
$('#paraarry_spaninfo').text('');
data['file'] = JSON.stringify([files])
for (let key in data) {
var item = JSON.parse(data[key])[0]
if (Boolean(item) == false && key != 'id') {
var title = $("#" + key).prev().text()
$("#" + key + "_spaninfo").text(title + '不能为空')
return;
} else if (key === 'stgname') {
if (item.length > 25) {
$('#stgname_spaninfo').text('策略名称超过最大长度,请修改')
return;
}
}
}
temp_para = JSON.parse(data['pararry'])
if ((temp_para[0].paraname === '') || (temp_para[0].paravalue === '')) {
$('#paraarry_spaninfo').text('策略参数不能为空')
return;
} else if (((temp_para[0].paraname).length > 25) || ((temp_para[0].paravalue).length > 25) || ((temp_para[0].paradesc).length > 25)) {
$('#paraarry_spaninfo').text('策略参数超过最大长度,请修改')
return;
}
$.post("{% url 'trade:paper' %}", data, function (r) {
if (r === 'y') {
//新建成功则跳转,否则传错误信息
window.location.reload();
} else {
window.location.reload();
}
});
}
//上传策略再次确认模态框的取消
function reSub_fad() {
$('#modal_resub').modal('hide');
$("#modal_resub").innerHTML = "";
}
//申请实盘模态框显示
function modal_askfor_live() {
$("#modal_askfor_live").modal("show")
}
//申请实盘,get请求,携带值
function askfor_live_modify(id) {
$('#paraarry_askFor_spaninfo').text('');
$.get("{% url 'trade:paper' %}", {'askForLive_stgid': id}, function (r) {
if (r) {
var data = (r.rows)[0]
for (var key in data) {
if (data[key] instanceof Array) {
for (let i = 0; i < data[key].length; i++) {
var pararow = "<tr class=\"activetable\">\n" +
" <td>\n" +
" <input class=\"activetable\" disabled style='background-color: #eeeeee' name=\"stg_name\" value=" + data[key][i]["paraname"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" name=\"stg_value\" value=" + data[key][i]["paravalue"] + ">\n" +
" </td>\n" +
" <td>\n" +
" <input class=\"activetable\" name=\"stg_desc\" value=" + data[key][i]["paradesc"] + ">\n" +
" </td>\n" +
" </tr>";
$("#tb2").append(pararow)
}
} else {
if ($('#' + key + '_askfor_live')) {
$('#' + key + '_askfor_live').val(data[key]);
}
}
}
}
});
};
//申请实盘gets_live,获取页面输入或携带的值
function gets_live() {
//参数条数[{key,value,desc},{}]
var pararry = []
$("#tb2").find("tr").each(function () {
var tdata = $(this).children()
var paraname = tdata.eq(0).find("input").val()
var paravalue = tdata.eq(1).find("input").val()
var paradesc = tdata.eq(2).find("input").val()
var paradic = {"paraname": paraname, "paravalue": paravalue, "paradesc": paradesc}
pararry.push(paradic)
})
data = {
'stgid_askfor_live': JSON.stringify([$('#stgid_askfor_live').val()]),
'stgname_askfor_live': JSON.stringify([$('#stgname_askfor_live').val()]),
'envname_askfor_live': JSON.stringify([$('#envname_askfor_live').val()]),
'stggroup_askfor_live': JSON.stringify([$('#stggroup_askfor_live').val()]),
'pararry_askfor_live': JSON.stringify(pararry)
}
return data;
}
//申请实盘逻辑
function sub_live(func) {
var data = func();
//对提交的数据进行遍历,json解析成数组取第一个值,然后取Bool值,
// 如果是false(空),则alert,并且返回空,不继续执行下面代码
for (let key in data) {
var item = JSON.parse(data[key])[0]
if (Boolean(item) === false && key != 'id' && key != 'envname_askfor_live') {
var title = $("#" + key).prev().text()
alert(title + "不能为空!")
return
}
}
temp_para = JSON.parse(data['pararry_askfor_live'])
if (temp_para[0].paravalue === '') {
$('#paraarry_askFor_spaninfo').text('策略参数不能为空')
return;
} else if (((temp_para[0].paravalue).length > 25) || ((temp_para[0].paradesc).length > 25)) {
$('#paraarry_askFor_spaninfo').text('策略参数超过最大长度,请修改');
return;
}
$.post("{% url 'trade:paper' %}", {'data': data, 'askfor_live_sub': 1}, function (r) {
if (r == 'y') {
//新建成功则跳转,否则传错误信息
window.location.reload();
$("#fa-upload").removeClass("active")
$("#fa-sim").addClass("active")
} else {
window.location.reload();
}
});
}
//上传列表删除模态框取消
function fad_delete() {
$('#modal_delete').modal('hide');
}
//仿真列表模态框取消
function fad_delete_paper() {
$('#modal_delete_paper').modal('hide');
}
//打包模态框取消modal_pack
function fad_pack() {
$('#modal_pack').modal('hide');
}
//显示上传列表删除的模态框
function _delete(d, stgname) {
$('#modal_delete').modal('show');
$("#confirm_paper").text("确认删除" + "'" + stgname + "'" + "策略?")
$('#del').attr('sid', d);
}
//显示仿真列表删除的模态框
function _delete_paper(d, stgname) {
$('#modal_delete_paper').modal('show');
$("#confirm_delete").text("确认删除" + "'" + stgname + "'" + "策略?")
$('#del_paper').attr('sid_paper', d);
}
//上传列表删除逻辑
function del_() {
d = $('#del').attr('sid');//该值是从js动态渲染删除里面拿到的,先_delete,再del_
$.post("{% url 'trade:paper' %}", {'id': d, 'delete': 1}, function (r) {
if (r == 'y') {
window.location.reload();
} else {
$('#modal_delete').modal('hide');
}
});//post请求的回调函数,空值show"默认合约不可修改",y值则删除后跳转。
};
//仿真列表删除逻辑
function del_paper() {
d = $('#del_paper').attr('sid_paper');
$.post("{% url 'trade:paper' %}", {'id': d, 'delete_paper_list': 1}, function (r) {
if (r == 'y') {
window.location.reload();
} else {
$('#modal_delete').modal('hide');
}
});//post请求的回调函数,空值show"默认合约不可修改",y值则删除后跳转。
};
//打包失败逻辑
function stg_pack_error(d) {
$('#modal_packageError').html("")
$.post("{% url 'trade:paper' %}", {'id': d, 'stg_pack_error': 1}, function (r) {
if (r.packmsg.length == 0) {
//window.location.reload();
} else {
var packError = '<div class="modal-dialog" style="width: 450px;margin-top: 10%">\n' +
' <div class="modal-content">\n' +
' <div class="modal-header">\n' +
' <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n' +
' <h5 class="modal-title">打包失败错误信息</h5>\n' +
' </div>\n' +
' <div class="modal-body" style="padding: 30px;height:auto">\n' +
' <form>\n' +
' <div style="margin-top:3%; display: block">\n' +
' <p id="packError_spaninfo" style="color: black; font-size: 20px;text-align: center"></p>\n' +
' <span type="button" class="btn btn-primary btn-xs btn-flat btn_operation" onclick="packErroBtnSub()" style="margin-top : 33px; margin-left: 43%; padding:5px;cursor:pointer;">确认</span>' +
' </div>\n' +
'</form>' +
'</div>' +
'</div>' +
'</div>'
$('#modal_packageError').append(packError)
$('#modal_packageError').modal('show')
$('#packError_spaninfo').text(r.packmsg);
}
});
};
//打包失败确认按钮
function packErroBtnSub() {
$('#modal_packageError').modal('hide');
}
//打包模态框展示
function stg_pack_show(d) {
$('#modal_pack').modal('show');
$('#attr_packid').attr('packid', d);
}
//打包逻辑
function stg_pack() {
d = $('#attr_packid').attr('packid');
$.post("{% url 'trade:paper' %}", {'id': d, 'stg_pack': 1}, function (r) {
if (r == 'y') {
window.location.reload();
} else {
$('#modal_pack').modal('hide');
}
});
};
//上传列表的查询
function uploadsearch() {
var ustgid = $("#ustgid").val();
var ustgname = $("#ustgname").val();
var ustgstatus = $("#ustgstatus").val();
// 整理发送后台的数据
var data = {
"stgid": ustgid,
"stgname": ustgname,
"auditstatus": ustgstatus
};
var JsonData = JSON.stringify(data);
/**
$.post("{% url 'trade:paper' %}", {"data": JsonData, 'upload_search': 1}, function (r) {
$("#UploadTable").bootstrapTable("removeAll");
$("#UploadTable").bootstrapTable("append", r)
});**/
$.post("{% url 'trade:paper' %}", {"data": JsonData, 'upload_search': 1}, function (r) {
$("#UploadTable").bootstrapTable("removeAll");
$("#UploadTable").bootstrapTable("append", r)
});
}
//打包列表的查询
function packsearch() {
var pstgname = $("#pstgname").val();
var ppackstatus = $("#ppackstatus").val();
// 整理发送后台的数据
var data = {
"pstgname": pstgname,
"ppackstatus": ppackstatus
};
var JsonData = JSON.stringify(data);
$.post("{% url 'trade:paper' %}", {"data": JsonData, 'pack_search': 1}, function (r) {
$("#packTable").bootstrapTable("removeAll");
$("#packTable").bootstrapTable("append", r)
});
}
//仿真列表的查询
function papersearch() {
var sstgid = $("#sstgid").val();
var sstgname = $("#sstgname").val();
var sstgstatus = $("#sstgstatus").val();
// 整理发送后台的数据
var data = {
"sstgid": sstgid,
"sstgname": sstgname,
"sstgstatus": sstgstatus
};
var JsonData = JSON.stringify(data);
$.post("{% url 'trade:paper' %}", {"data": JsonData, 'paper_search': 1}, function (r) {
$("#simTable").bootstrapTable("removeAll");
$("#simTable").bootstrapTable("append", r)
});
}
//bstable渲染页面(固定写法)
function InitBootstrapTable(my_url, my_table_id, my_columns, my_filename, type) {
$('#' + my_table_id).bootstrapTable('destroy').bootstrapTable({
url: my_url,
method: 'get',
columns: my_columns,
toolbar: '#toolbar',
striped: true,
cache: false,
pagination: true,
width: 100,
sortable: true,
sortOrder: "asc",
queryParams: function (pageRequest) {
pageRequest['type'] = type;
return pageRequest;
},
sidePagination: "server",
pageNumber: 1,
pageSize: 20,
pageList: [10, 25, 50, 100],
minimumCountColumns: 2,
clickToSelect: true,
uniqueId: "_id",
cardView: false,
detailView: false,
buttonsAlign: "right",
})
}
// 上传列表table
my_columns = [
{
field: 'stgid',
title: '策略ID'
}, {
field: 'stgname',
title: '策略名称'
}, {
field: 'createtime',
title: '上传时间'
}, {
field: 'auditstatus',
title: '审批状态',
{#visible: false #}
}, {
field: 'uoption',
title: '操作',
formatter: function (value, row, index) {
var stgname = row.stgname
if (row.auditstatus === "审批通过") {
return ''
} else {
return "<span onclick=\"_delete('" + value + "','" + stgname + "')\" type='button' class='btn btn-danger btn-xs btn-flat btn_operation'> <i class='fa fa-pencil'></i>删除</span> ";
}
}
},
];
InitBootstrapTable("{{url}}", "UploadTable", my_columns, "uploadtable", '0');
// 打包列表table
my_columns = [
{
field: 'stgid',
title: '策略ID'
}, {
field: 'stgname',
title: '策略名称'
}, {
field: 'packstatus',
title: '打包状态',
}, {
field: 'packtime',
title: '最后打包时间'
}, {
field: 'backtype',
title: '主/备'
}, {
field: 'envname',
title: '运行环境'
}, {
field: 'poption',
title: '操作',
formatter: function (value, row, index) {
if (row.packstatus == "打包失败") {
return "<span onclick=\"stg_pack_show('" + value + "')\" type='button' class='btn btn-success btn-xs btn-flat btn_operation'> <i class='fa fa-pencil'></i>打包</span> " + " <span id='pack_error_btn_disable' onclick=\"stg_pack_error('" + value + "')\" class='btn btn-danger btn-xs btn-flat btn_operation' data-toggle='modal' data-target='#modal_model_field'> <i class='fa fa-pencil'></i>失败原因</span> ";
} else {
return ''
}
}
},
];
InitBootstrapTable("{{url}}", "packTable", my_columns, "pack", '1');
//仿真列表
my_columns = [
{
field: 'stgid',
title: '策略ID'
}, {
field: 'stgname',
title: '策略名称'
}, {
field: 'createtime',
title: '上传时间',
}, {
field: 'runstatus',
title: '运行状态'
}, {
title: '开始运行时间',
field: 'starttime'
}, {
title: '结束运行时间',
field: 'endtime'
}, {
field: 'soption',
title: '操作',
/**
formatter: function (value, row, index) {
return (value.split('/@#')[0] != '2') ? "" : "<span onclick=\"pack('" + value.split('/@#')[1] + "')\" style='padding:5px;font-size:10px' class='btn-success'>申请打包</span>";
}**/
formatter: function (value, row, index) {
var stop = '';
var stgname = row.stgname
var askfor_live = '';
if (row.runstatus == '停止') {
stop = "<span onclick=\"_delete_paper('" + value + "','" + stgname + "')\" class='btn btn-danger btn-xs btn-flat btn_operation' data-toggle='modal' data-target='#modal_model_field'> <i class='fa fa-pencil'></i>删除</span> "
}
if ((row.aud_status_live === '2') || (row.aud_status_live === '-1.1')) {
askfor_live = "<span onclick=\"askfor_live_modify('" + value + "')\" type='button' class='btn btn-primary btn-xs btn-flat btn_operation' data-toggle='modal' data-target='#modal_askfor_live'> <i class='fa fa-pencil' ></i>申请实盘</span> "
}
return askfor_live + stop
}
},
];
InitBootstrapTable("{{url}}", "simTable", my_columns, "pack", '2');
function new_col(idn) {
var h = "<tr class='activetable'>" + '<td>' +
' <span style="padding:3px; cursor: pointer" class="btn-danger small"\n' +
' onclick="$(this).parent().parent().remove()">删除行' +
' </span>' +
' </td>' +
"<td><input class='activetable' name='stg_name'></td>" +
"</td>" +
"<td><input class='activetable' name='stg_value'></td>" +
"<td><input class='activetable' name='stg_desc'></td>" +
"</tr>";
$('#' + idn).append($(h));
};
//全局变量,用于取得上传的文件
var files = ""
//只能上传py文件
function filename1() {
var filename_ = $("#file").val()
{#var file = $("#file").files[0]#}
if (filename_ && filename_.slice(-3) != ".py") {
$('#file_spaninfo').text('请上传py为后缀的文件');
$("#file").val("")
}
//文件上传
const file = document.getElementById("file").files[0];
{#console.log("file", file)#}
if (file) {
{#console.log("234")#}
var reader = new FileReader();
{#reader.readAsBinaryString(file);#} //乱码
{#reader.readAsDataURL(file); //需要base64解码,然后再解码(会有16进制的数据)#}
reader.readAsText(file, "utf-8"); //大小不一致
reader.onload = function () {
var file_ = reader.result
files = file_
{#console.log("files", file_)#}
if (file_) {
{#console.log(file_)#}
return file_
}
}
}
}
</script>
<style>
{#加载数据时的样式#}
.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {
align-items: center;
background: #141414;
display: none;
justify-content: center;
position: absolute;
bottom: 0;
width: 100%;
z-index: 1000;
}
</style>
{% endblock %}