You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1075 lines
55 KiB
1075 lines
55 KiB
@@master_page.html |
|
<link href="css/page_table_list.css?v=1" rel="stylesheet" /> |
|
<link href="css/page_entity_manager.css?v=1" rel="stylesheet" /> |
|
<script src="js/ace/src-min/ace.js"></script> |
|
<script src="js/ace/src-min/ext-language_tools.js"></script> |
|
<div id="apibox" class="card mypage"> |
|
<!--正文--> |
|
<div class="card"> |
|
<div class="search-bar"> </div> |
|
<div class="card"> |
|
<form id="frmSearach" onsubmit="return false;"> |
|
<div class="row "> |
|
<div class="form-group"> |
|
<div class="col-md-1"><label class="form-control m-l-15">数据库:</label></div> |
|
<div class="col-md-11"> |
|
<div class="input-group"> |
|
<select v-model="databaseId" @change="changeDatabase()" id="selDataBaseId" class="form-control" style="width:150px;"> |
|
<option v-for="item in database" v-bind:value="item.Id"> {{item.Name}} </option> |
|
</select> |
|
<input id="txtSearch" type="text" style="width:150px;margin-left:20px; margin-right:10px" class="form-control" value="" name="keyword" placeholder="请输入名称"> |
|
<a class="btn btn-secondary m-r-5" id="btnSearch" data-toggle="tooltip" @click="onSearch()" href="#!"><i class="mdi mdi-magnify"></i> 搜索</a> |
|
<button onclick="frmSearach.reset()" type="submit" class="btn btn-close">清空</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</form> |
|
<div class="card-toolbar clearfix"> |
|
|
|
<div class="toolbar-btn-action"> |
|
<a @click="openAddDiv()" data-toggle="modal" data-target="#gridSystemModal" class="btn btn-primary m-r-10" href="#!"><i class="mdi mdi-plus"></i> 新增</a> |
|
<a class="btn btn-success m-r-10" @click="openImportEntity()" data-toggle="tooltip" data-original-title="从数据库导入实体" href="#!"><i class="mdi mdi-format-vertical-align-bottom"></i>导入</a> |
|
<a class="btn btn-warning m-r-10" @click="openCompareDatabaseStructure()" data-toggle="tooltip" data-original-title="根据实体修改表结构" href="#!"><i class="mdi mdi-redo-variant"></i>同步</a> |
|
<a class="btn btn-pink m-r-10" @click="openSqlTool()" data-toggle="tooltip" data-original-title="可以方便执行SQL,让你不需要打开数据库" href="#!"><i class="mdi mdi-database"></i>SQL</a> |
|
<a class="btn btn-danger m-r-10" @click="exportExcel()" data-toggle="tooltip" data-original-title="导出表文档" href="#!"><i class="mdi mdi-file-export"></i> 导出文档</a> |
|
<a class="btn btn-purple m-r-10" @click="openGenerateCode()" data-toggle="tooltip" data-original-title="根据实体生成文件" href="#!"><i class="mdi mdi-language-csharp"></i>实体生成器</a> |
|
<a class="btn btn-primary m-r-10" @click="openGenerateCodeByView()" data-toggle="tooltip" data-original-title="根据视图生成文件" href="#!"><i class="mdi mdi-language-csharp"></i>视图生成器</a> |
|
<a class="btn btn-cyan m-r-10" @click="openSetting()" data-toggle="tooltip" data-original-title="实体管理个性化配置" href="#!"><i class="mdi mdi-account-settings-variant"></i> 配置</a> |
|
</div> |
|
</div> |
|
<div class="card-body"> |
|
<div class="table-responsive"> |
|
<div class="master-table-container"> |
|
<table class="table table-bordered"> |
|
<thead> |
|
<tr v-if="data && data.Columns && data.Columns.length > 0"> |
|
<th class="width30"> |
|
<label class="lyear-checkbox checkbox-primary"> |
|
<input type="checkbox" @change="selectAll" id="check-all"><span></span> |
|
</label> |
|
</th> |
|
<template v-for="(column,thIndex) in data.Columns" v-if="column.PropertyName !== 'Id'"> |
|
<th> |
|
{{ column.ColumnDescription }} |
|
<span :class="sortClass"> |
|
<span v-if="thIndex == 1" class="caret-wrapper"> |
|
<i @click="sortAsc" class="sort-caret ascending mdi mdi-chevron-up"></i> |
|
<i @click="sortDesc" class="sort-caret descending mdi mdi-chevron-down"></i> |
|
</span> |
|
</span> |
|
</th> |
|
</template> |
|
<th>操作</th> |
|
</tr> |
|
</thead> |
|
<tbody v-if="data &&data.Data"> |
|
<tr v-if="data.Columns && data.Columns.length > 0" v-for="item in data.Data"> |
|
<td> |
|
<label class="lyear-checkbox checkbox-primary"> |
|
<input type="checkbox" name="ids[]" v-model="selectedItems" :alt="item.Id" :value="item.Id"><span></span> |
|
</label> |
|
</td> |
|
<template v-for="column in data.Columns" v-if="column.PropertyName !== 'Id'"> |
|
<td> |
|
{{ item[column.PropertyName] }} |
|
</td> |
|
</template> |
|
<td class="table_opt2"> |
|
<button data-toggle="modal" @click="openColumns(item)" class="btn btn-link" type="button"> |
|
<i class="mdi mdi-lead-pencil"></i> 配列 |
|
</button> |
|
<button data-toggle="modal" @click="openEditDiv(item)" data-target="#gridSystemModal" class="btn btn-link" type="button"> |
|
<i class="mdi mdi-lead-pencil"></i> 修改 |
|
</button> |
|
<button data-toggle="modal" @click="deleteAndConfirm(item)" data-target="#divDelBox" class="btn btn-link" type="button"> |
|
<i class="mdi mdi-do-not-disturb"></i> 删除 |
|
</button> |
|
</td> |
|
</tr> |
|
|
|
</tbody> |
|
</table> |
|
</div> |
|
</div> |
|
@@page_control.html |
|
</div> |
|
</div> |
|
</div> |
|
<!--插入或者新增--> |
|
<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="gridSystemModalLabel" id="gridSystemModal" style="display: none;"> |
|
<div class="modal-dialog" role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="exampleModalLabel">{{title}}</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<form id="frmEdit"> |
|
<input type="hidden" v-model="formData.Id" name="Id" /> |
|
<div class="form-group"> |
|
<label class="control-label">实体名:</label> |
|
<input type="text" placeholder="类的名字" @input="classNameInput" @change="classNameInput" v-model="formData.ClassName" name="ClassName" class="form-control"> |
|
</div> |
|
<div class="form-group"> |
|
<label for="message-text" class="control-label">表名:</label> |
|
<input type="text" placeholder="数据库中表的名称" v-model="formData.DbTableName" name="DbTableName" class="form-control"> |
|
</div> |
|
<div class="form-group"> |
|
<label for="message-text" class="control-label">数据库:</label> |
|
<select readonly v-model="formData.DataBaseId" name="DataBaseId" class="form-control"> |
|
<option v-for="item in database" v-bind:value="item.Id"> {{item.Name}} </option> |
|
</select> |
|
</div> |
|
<div class="form-group"> |
|
<label for="message-text" class="control-label">表备注:</label> |
|
<textarea placeholder="数据库中表的备注" class="form-control" v-model="formData.Description" name="Description" id="message-text"></textarea> |
|
</div> |
|
</form> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnCloseEdit" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="addOrUpdate()" class="btn btn-primary">保存</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--表结构对比--> |
|
<div id="divCompareDatabaseStructure" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnCompareDatabaseStructure" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divCompareDatabaseStructure"></button> |
|
<div class="modal-dialog " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">同步表结构</h4> |
|
</div> |
|
<div class="modal-body" v-html="columnsCompareResult"> |
|
|
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="createTables()" class="btn btn-primary">同步表结构</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--编辑列--> |
|
<div id="divEditColumns" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnEditColumns" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divEditColumns"></button> |
|
<div class="modal-dialog modal-lg width1200" role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">{{editTable}} </h4> |
|
</div> |
|
|
|
<div class="modal-body"> |
|
<div class="table-container"> |
|
<table class="table"> |
|
<thead> |
|
<tr> |
|
<th>实体属性</th> |
|
<th>列名</th> |
|
<th width="200">C#类型</th> |
|
<th>备注</th> |
|
<th width="50">可空</th> |
|
<th width="50">主键</th> |
|
<th width="50">自增</th> |
|
<th width="250"> |
|
<a class="btn btn-secondary m-r-5" @click="openCopy" href="#!"><i class="mdi mdi-content-copy"></i> 复制列</a> |
|
<a class="btn btn-secondary m-r-5" href="#!" onclick="alert('开发中')"><i class="mdi mdi-lead-pencil"></i> 配置索引</a> |
|
</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<tr v-for="(item,index) in columns" :key="index"> |
|
<td scope="row"> |
|
<input v-model="item.Id" type="hidden" /> |
|
<input v-model="item.PropertyName" class="form-control" placeholder="必填" type="text" /> |
|
</td> |
|
<td><input v-model="item.DbColumnName" class="form-control" placeholder="可空:默认取属性名" type="text" /></td> |
|
<td> |
|
<div class="row"> |
|
<div class="col-md-6"> |
|
<select v-model="item.PropertyType" class="form-control width100"> |
|
<option v-for="item in nativeTypes" :value="item.Value"> {{item.Name}} </option> |
|
</select> |
|
</div> |
|
<div class="col-md-6"> |
|
<a class="btn btn-link" @click="openEditNativeType(item)">配置<span v-if="item.DataType"> <i class="mdi mdi-lead-pencil"></i> </span></a> |
|
</div> |
|
</div> |
|
</td> |
|
<td><input v-model="item.Description" class="form-control" placeholder="" type="text" /></td> |
|
<td><input v-model="item.IsNullable" type="checkbox" class="form-control" /></td> |
|
<td><input v-model="item.IsPrimarykey" type="checkbox" class="form-control" /></td> |
|
<td><input v-model="item.IsIdentity" type="checkbox" class="form-control" /></td> |
|
<td> |
|
<span @click="pushColumns(item)" class="pointer m-r-10"><i class="mdi mdi-plus"></i>添加</span> |
|
<span @click="removeColumns(index)" class="pointer"><i class="mdi mdi-window-close"></i>删除</span> |
|
<span @click="move(index,true)" class="pointer"><i class="mdi mdi-arrow-up"></i>上移</span> |
|
<span @click="move(index,false)" class="pointer"><i class="mdi mdi-arrow-down"></i>下移</span> |
|
</td> |
|
</tr> |
|
</tbody> |
|
</table> |
|
</div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="addOrUpdateColumnInfoSubmit()" class="btn btn-primary">点击保存</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--复制列--> |
|
<div id="divCopy" class="modal fade bs-example-modal-sm inC" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnCopy" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divCopy"></button> |
|
<div class="modal-dialog modal-sm border3CCC width500" role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">复制列</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<div class="form-group"> |
|
<div class="alert alert-success">技巧: 建一个只有 创建时间、创建人 这样的表 作为模版表</div> |
|
</div> |
|
<div class="form-group"> |
|
<label for="message-text" class="control-label">表名:</label> |
|
<input v-model="tableName" @change="changeTable" class="form-control" list="browsers" name="joinTable"> |
|
<datalist id="browsers"> |
|
<option v-if="allTables&&allTables.length>0" v-for="item in allTables" :value="item.Name">{{item.Name}}</option> |
|
</datalist> |
|
<button class="btn btn-xs btn-primary removedatalist" @click="clearTable"><i class="mdi mdi-do-not-disturb"></i>删除选定项</button> |
|
</div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnCloseCopy" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="submitCopy" class="btn btn-primary">确定</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--导入实体--> |
|
<div id="divImportEntity" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnImportEntity" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divImportEntity"></button> |
|
<div class="modal-dialog modal-lg" role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">导入实体</h4> |
|
</div> |
|
<div class="modal-body"> |
|
|
|
<div class="input-group width250 m-b-10"> |
|
<input id="txtTableName" type="text" class="form-control"> |
|
<span class="input-group-btn"> |
|
<button type="button" @click="bindImportTables()" class="btn btn-default"><i class="mdi mdi-magnify"></i>搜索</button> |
|
<button type="button" onclick="txtTableName.value=''" class="btn btn-default"><i class="mdi mdi-refresh"></i>清空</button> |
|
</span> |
|
</div> |
|
|
|
<div class="table-container2"> |
|
<table class="table table-bordered"> |
|
<thead> |
|
<tr> |
|
<th class="width30"> |
|
<label class="lyear-checkbox checkbox-primary"> |
|
<input type="checkbox" @change="selectAllTables" id="check-all2"><span></span> |
|
</label> |
|
</th> |
|
<th> |
|
索引号 |
|
</th> |
|
<th> |
|
表名 |
|
</th> |
|
<th>描述</th> |
|
</tr> |
|
</thead> |
|
<tbody v-if="tables"> |
|
<tr v-for="(item,index) in tables"> |
|
<td> |
|
<input type="checkbox" name="ids[]" v-model="selectedTables" :alt="item.Name" :value="item.Name"> |
|
</td> |
|
<td>{{index+1}}</td> |
|
<td> |
|
{{ item.Name }} |
|
</td> |
|
<td> |
|
{{ item.Description }} |
|
</td> |
|
</tr> |
|
|
|
</tbody> |
|
</table> |
|
</div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnImportEntityClose" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="importEntitySubmit()" class="btn btn-primary">导入表</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--SQL工具--> |
|
<div id="divDatabaseTool" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnDatabaseTool" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divDatabaseTool"></button> |
|
<div class="modal-dialog width_r_80 " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">简化版SQL工具</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<div id="divAceEditor" style="width: 100%; height: calc(50vh - 150px) "> </div> |
|
<button @click="executeSql" class="btn btn-danger m-10 m-b-0"><i class="mdi mdi-play-circle-outline"></i>运行</button> |
|
<button @click="executeSqlRegurnExcel" class="btn btn-success m-10 m-b-0"><i class="mdi mdi-file-excel"></i>下载</button> |
|
<button @click="clearSql" class="btn btn-cyan m-10 m-b-0"><i class="mdi-restart mdi"></i>清空</button> |
|
<div id="divAceEditorResult" style="width: 100%; height: calc(50vh - 150px)"> </div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnDatabaseTooClose" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--通用配置--> |
|
<div id="divSetting" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnSetting" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divSetting"></button> |
|
<div class="modal-dialog width300 " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">个性化配置</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<div class="example-box"> |
|
<label class="lyear-checkbox"> |
|
<input type="checkbox" v-model="setting.importUnunderline" value="true"> |
|
<span class="p-l-15">导入实体去掉下划线</span> |
|
</label> |
|
</div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnSettingClose" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
<button type="button" @click="saveSetting()" class="btn btn-primary">保存</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--代码生成--> |
|
<div id="divGenerateFile" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnGenerateFile" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divGenerateFile"></button> |
|
<div class="modal-dialog width300 " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">代码生成</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<div class="example-box"> |
|
<div class=" form-group"> |
|
<label class="control-label"> |
|
模版 |
|
</label> |
|
<select v-model="currentTemplateId" @change="changeTemplate" class="form-control"> |
|
<option v-for="item in templates" :value="item.Id"> |
|
{{item.Title}} |
|
</option> |
|
</select> |
|
</div> |
|
<div class=" form-group" v-if="isView"> |
|
<label class="control-label"> |
|
视图名 <span class="red">*</span> |
|
</label> |
|
<input v-model="viewName" class="form-control" placeholder="视图名字" value="" /> |
|
</div> |
|
<div class=" form-group"> |
|
<label class="control-label"> |
|
生成地址 |
|
</label> |
|
<div><code>地址说明:修改模版可以修改这个地址</code> <a class="red" :href="tempUrl">[进入模版管理]</a></div> |
|
<div><code>符号说明:{0}是ClassName, {1}表示TableName,{project}表示项目的sln文件目录</code></div> |
|
<input class="form-control" v-model="currentTemplate.Url" /> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnGenerateFileClose" class="btn btn-default" data-dismiss="modal"><i class="mdi mdi-close"></i>关闭</button> |
|
<button type="button" @click="previewEntity()" class="btn btn-primary"> <i class="mdi mdi-eye"></i>预览实体</button> |
|
<button type="button" @click="submitGenerateFile()" class="btn btn-primary"><i class="mdi mdi-file"></i>生成文件</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--修改原生类型--> |
|
<div id="divEditNativeType" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnEditNativeType" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divEditNativeType"></button> |
|
<div class="modal-dialog border3CCC width300 " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">修改原生类型</h4> |
|
</div> |
|
<div class="modal-body"> |
|
<div class="example-box"> |
|
<div class="form-group"> |
|
<label class="control-label">类型</label> |
|
<div><code>注意:这儿有配置不支持多库,一般用于单库或者导入</code></div> |
|
<input v-model="currentColumn.DataType" class="form-control" /> |
|
</div> |
|
<div class="form-group"> |
|
<label class="control-label">长度</label> |
|
<input v-model="currentColumn.Length" class="form-control" /> |
|
</div> |
|
<div class="form-group"> |
|
<label class="control-label">精度</label> |
|
<input v-model="currentColumn.DecimalDigits" class="form-control" /> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<!--预览实体--> |
|
<div id="divPreviewEntity" class="modal fade bs-example-modal-lg" tabindex="-11" role="dialog" aria-labelledby="myLargeModalLabel" style="display: none;"> |
|
<button id="btnPreviewEntity" type="button" class="btn btn-primary hidden" data-toggle="modal" data-target="#divPreviewEntity"></button> |
|
<div class="modal-dialog width_r_80 " role="document"> |
|
<div class="modal-content"> |
|
<div class="modal-header"> |
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|
<h4 class="modal-title" id="myLargeModalLabel">预览实体</h4> |
|
</div> |
|
<div class="modal-body "> |
|
<code>双击可以全选,预览只显示一个实体</code> |
|
<pre @dblclick="selectText" id="preReviewClass" style="height:380px !important" >{{reviewClass}}</pre> |
|
</div> |
|
<div class="modal-footer"> |
|
<button type="button" id="btnClosePreviewEntity" class="btn btn-default" data-dismiss="modal">关闭</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<script> |
|
var vueObj = new Vue({ |
|
el: '#apibox', |
|
data: { |
|
databaseId: 0, |
|
data: null, |
|
error: null, |
|
addTitle: "添加实体", |
|
editTitle: "修改实体", |
|
title: "", |
|
sort: 0, |
|
sortName: null, |
|
sortClass: "", |
|
editTable: "", |
|
formData: {}, |
|
database: [], |
|
nativeTypes: [], |
|
selectedItems: [], |
|
selectedTables: [], |
|
columns: [{}], |
|
currentColumn: {}, |
|
columnsCompareResult: null, |
|
tables: [], |
|
allTables: [], |
|
tableName: null, |
|
editTableId: 0, |
|
setting: { |
|
importUnunderline: false |
|
}, |
|
templates: [], |
|
currentTemplate: {}, |
|
currentTemplateId: 0, |
|
isView: false, |
|
viewName: null, |
|
tempUrl: "/rezero/template.html", |
|
reviewClass:null |
|
}, |
|
mounted() { |
|
this.bindDatabaseSelect(); |
|
this.bindNativeTypeSelect(); |
|
this.bindTemplates(); |
|
this.bindTempUrl(); |
|
}, |
|
methods: { |
|
fetchData(append) { |
|
var url = "/PrivateReZeroRoute/100003/GetEntityInoList?random=1" + append; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
this.data = response.data; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
bindTempUrl: function () { |
|
var urlParams = new URLSearchParams(window.location.search); |
|
var model = urlParams.get('model'); |
|
var token = urlParams.get('token'); |
|
if (model) { |
|
this.tempUrl += `?model=${model}`; |
|
} |
|
if (token) { |
|
this.tempUrl += model ? `&token=${token}` : `?token=${token}`; |
|
} |
|
}, |
|
onSearch: function (page) { |
|
|
|
var urlParameters = "&" + tools.objectToQueryString({ |
|
ClassName: txtSearch.value, |
|
__pageNumber: page, |
|
__pageSize: tools.getValue("selPageSize"), |
|
DataBaseId: selDataBaseId.value, |
|
OrderByType: this.sort, |
|
OrderByName: this.sortName |
|
}); |
|
this.fetchData(urlParameters); |
|
}, |
|
deleteAndConfirm: function (item) { |
|
if (item == null) { |
|
var url = "/PrivateReZeroRoute/100003/DeleteEntityInfo?IsDeleted=true&Id=" + localStorage.delId; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
if (response.data.message) { |
|
tools.alert(response.data.message); |
|
} |
|
this.error = null; |
|
this.onSearch(); |
|
btnDelClose.click(); |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
} else { |
|
localStorage.delId = item.Id; |
|
} |
|
}, |
|
openEditDiv: function (item) { |
|
var urlById = "/PrivateReZeroRoute/100003/GetEntityInfoById?id=" + item.Id; |
|
if (item.Id) { |
|
this.title = this.editTitle; |
|
axios.get(urlById, jwHeader) |
|
.then(response => { |
|
this.formData = response.data; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
} |
|
}, |
|
openAddDiv: function (item) { |
|
this.title = this.addTitle; |
|
this.formData = { DataBaseId: this.databaseId }; |
|
}, |
|
addOrUpdate: function () { |
|
var th = this; |
|
var frmId = "frmEdit"; |
|
var json = this.formData; |
|
var url = json.Id ? |
|
"/PrivateReZeroRoute/100003/UpdateEntityInfo" : |
|
"/PrivateReZeroRoute/100003/AddEntityInfo"; |
|
this.addOrUpdateSubmit(url, json); |
|
}, |
|
addOrUpdateSubmit: function (url, json) { |
|
var th = this; |
|
axios.post(url, json, jwHeader) |
|
.then(response => { |
|
this.error = null; |
|
this.onSearch(); |
|
if (response.data == true) { |
|
frmEdit.reset(); |
|
btnCloseEdit.click(); |
|
} |
|
else { |
|
tools.highlightErrorFields(response.data) |
|
} |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
bindDatabaseSelect: function () { |
|
axios.get("/PrivateReZeroRoute/100004/GetDatabaseInfoAllList", jwHeader) |
|
.then(response => { |
|
this.database = response.data; |
|
this.databaseId = this.database[0].Id; |
|
var th = this; |
|
setTimeout(function () { |
|
th.onSearch(); |
|
}, 50); |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
bindNativeTypeSelect: function () { |
|
axios.get("/PrivateReZeroRoute/100004/GetNativeTypeList", jwHeader) |
|
.then(response => { |
|
this.nativeTypes = response.data; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
openColumns: function (item) { |
|
btnEditColumns.click(); |
|
this.editTableId = item.Id; |
|
this.editTable = item.ClassName + " - " + item.DataBaseName; |
|
var url = "/PrivateReZeroRoute/100003/GetEntityColuminsByEntityId?TableId=" + item.Id; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
this.columns = response.data; |
|
if (this.columns.length == 0) { |
|
this.columns.push({ TableId: item.Id }); |
|
} |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
openEditNativeType: function (item) { |
|
this.currentColumn = item; |
|
btnEditNativeType.click(); |
|
}, |
|
removeColumns: function (index) { |
|
this.columns.splice(index, 1); |
|
}, |
|
addOrUpdateColumnInfoSubmit: function () { |
|
var url = "/PrivateReZeroRoute/100003/SaveEntityColumnInfos" |
|
var th = this; |
|
axios.post(url, { Columns: this.columns }, jwHeader) |
|
.then(response => { |
|
this.error = null; |
|
if (response.data == true) { |
|
tools.alert("保存成功"); |
|
th.onSearch(1); |
|
} |
|
else { |
|
tools.alert(response.data); |
|
} |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
pushColumns: function (item) { |
|
this.columns.push({ TableId: item.TableId, IsNullable: true }); |
|
}, |
|
openCompareDatabaseStructure: function () { |
|
if (!this.selectedItems || this.selectedItems.length == 0) { |
|
tools.alert("请选择实体"); |
|
return; |
|
} |
|
btnCompareDatabaseStructure.click(); |
|
var url = " /PrivateReZeroRoute/100003/CompareDatabaseStructure"; |
|
axios.post(url, { ids: this.selectedItems }, jwHeader) |
|
.then(response => { |
|
this.columnsCompareResult = response.data; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
// 其他方法... |
|
previewEntity: function () { |
|
//if (!this.selectedItems || this.selectedItems.length == 0) { |
|
// tools.alert("请选择实体"); |
|
// return; |
|
//} |
|
if (this.isView && !this.viewName) |
|
{ |
|
tools.alert("请填写视图名"); |
|
return; |
|
} |
|
var tableId = this.selectedItems[0]; |
|
var url = `/PrivateReZeroRoute/100003/ViewTemplate?databaseId=${this.databaseId}&viewName=${this.isView ? this.viewName : tableId}&templateId=${this.currentTemplateId}&isView=${this.isView}`; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
btnGenerateFileClose.click(); |
|
btnPreviewEntity.click(); |
|
this.reviewClass=response.data; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
selectText(event) { |
|
// 方法1:使用现代浏览器的 Selection API |
|
const range = document.createRange(); |
|
range.selectNodeContents(event.target); |
|
const selection = window.getSelection(); |
|
selection.removeAllRanges(); |
|
selection.addRange(range); |
|
}, |
|
createTables: function () { |
|
var url = "/PrivateReZeroRoute/100003/CreateTables"; |
|
this.columnsCompareResult = "同步中...."; |
|
axios.post(url, { ids: this.selectedItems }, jwHeader) |
|
.then(response => { |
|
this.columnsCompareResult = response.data == true ? "同步成功" : response.data.message; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
openImportEntity: function () { |
|
btnImportEntity.click(); |
|
this.bindImportTables(); |
|
}, |
|
importEntitySubmit: function () { |
|
var url = " /PrivateReZeroRoute/100003/ImportEntities"; |
|
var th = this; |
|
axios.post(url, { databasdeId: this.databaseId, tableNames: this.selectedTables }, jwHeader) |
|
.then(response => { |
|
this.error = null; |
|
if (response.data == true) { |
|
btnImportEntityClose.click(); |
|
th.onSearch(1); |
|
th.selectedTables = []; |
|
document.getElementById('check-all2').checked = false; |
|
tools.alert("导入成功,删除实体可以重新导入。"); |
|
} |
|
else { |
|
tools.alert(response.data.message); |
|
} |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
changeDatabase: function () { |
|
this.onSearch(); |
|
}, |
|
bindImportTables: function () { |
|
var url = "/PrivateReZeroRoute/100004/GetImportTables?databaseId=" + this.databaseId + "&tableName=" + txtTableName.value; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
this.tables = response.data; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
bindAllTables: function () { |
|
var url = "/PrivateReZeroRoute/100004/GetAllTables?databaseId=" + this.databaseId; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
this.allTables = response.data; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
selectAll(event) { |
|
if (event.target.checked) { |
|
// 全选 |
|
this.selectedItems = this.data.Data.map(item => item.Id); |
|
} else { |
|
// 全不选 |
|
this.selectedItems = []; |
|
} |
|
}, |
|
selectAllTables(event) { |
|
if (event.target.checked) { |
|
// 全选 |
|
this.selectedTables = this.tables.map(item => item.Name); |
|
} else { |
|
// 全不选 |
|
this.selectedTables = []; |
|
} |
|
}, |
|
classNameInput: function () { |
|
this.formData.DbTableName = this.formData.ClassName; |
|
}, |
|
move: function (index, tyep) { |
|
if (tyep) { |
|
if (index == 0) { |
|
return; |
|
} |
|
var temp = this.columns[index]; |
|
this.columns.splice(index, 1); |
|
this.columns.splice(index - 1, 0, temp); |
|
} |
|
else { |
|
if (index == this.columns.length - 1) { |
|
return; |
|
} |
|
var temp = this.columns[index]; |
|
this.columns.splice(index, 1); |
|
this.columns.splice(index + 1, 0, temp); |
|
} |
|
}, |
|
sortAsc: function () { |
|
this.sort = 0; |
|
this.sortName = "ClassName"; |
|
this.sortClass = "sort-asc"; |
|
this.onSearch(1); |
|
}, |
|
sortDesc: function () { |
|
this.sort = 1; |
|
this.sortName = "ClassName"; |
|
this.sortClass = "sort-desc"; |
|
this.onSearch(1); |
|
}, |
|
openCopy: function () { |
|
this.bindAllTables(); |
|
btnCopy.click(); |
|
}, |
|
submitCopy: function () { |
|
var tableName = this.tableName; |
|
var table = this.allTables.find(table => table.Name === tableName); |
|
var tableId = table ? table.Id : null; |
|
if (tableId == null) { |
|
tools.alert("请选择表"); |
|
return; |
|
} |
|
var editId = this.editTableId; |
|
var url = "/PrivateReZeroRoute/100003/GetEntityColuminsByEntityId?TableId=" + tableId; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
response.data.forEach(item => { |
|
item.TableId = editId; |
|
item.Id = 0; |
|
this.columns.push(item); |
|
btnCloseCopy.click(); |
|
}); |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
changeTable: function () { |
|
|
|
}, |
|
clearTable: function () { |
|
this.tableName = null; |
|
}, |
|
executeSql: function () { |
|
var editor = ace.edit("divAceEditor"); |
|
var sql = editor.getValue("\r\n"); |
|
var url = "/PrivateReZeroRoute/100003/ExecuetSql"; |
|
axios.post(url, { databaseId: this.databaseId, sql: sql }, jwHeader) |
|
.then(response => { |
|
var editorResult = ace.edit("divAceEditorResult"); |
|
editorResult.setValue(JSON.stringify(response.data, null, 4)); |
|
editorResult.selection.clearSelection(); |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
executeSqlRegurnExcel: function () { |
|
var editor = ace.edit("divAceEditor"); |
|
var sql = editor.getValue("\r\n"); |
|
var th = this; |
|
axios.get("/PrivateReZeroRoute/100003/ExecuetSqlReturnExcel", { |
|
params: { |
|
databaseId: this.databaseId, sql: sql |
|
}, |
|
responseType: 'blob', |
|
headers: jwHeader.headers |
|
}) |
|
.then(function (response) { |
|
// 创建一个 Blob 对象,指向数据的 URL |
|
var url = window.URL.createObjectURL(new Blob([response.data])); |
|
var link = document.createElement('a'); |
|
link.href = url; |
|
|
|
// 设置下载文件的名称,可以根据实际情况调整 |
|
var fileName = 'sql.xlsx'; |
|
link.setAttribute('download', fileName); |
|
|
|
// 触发下载 |
|
document.body.appendChild(link); |
|
link.click(); |
|
|
|
// 清理资源 |
|
window.URL.revokeObjectURL(link.href); |
|
document.body.removeChild(link); |
|
}) |
|
.catch(function (error) { |
|
console.error("Error downloading the Excel file:", error); |
|
}); |
|
}, |
|
openSqlTool: function () { |
|
var editor = ace.edit("divAceEditor"); |
|
editor.setOption("showPrintMargin", false); |
|
editor.setTheme("ace/theme/twilight"); // 设置主题 |
|
editor.getSession().setMode("ace/mode/sql"); // 设置语言模式为SQL |
|
editor.setOption("enableBasicAutocompletion", true); |
|
editor.setOption("enableSnippets", true); |
|
editor.setOption("enableLiveAutocompletion", true) |
|
editor.setValue("\r\n"); |
|
editor.selection.clearSelection(); |
|
this.bindSqlResult(); |
|
btnDatabaseTool.click(); |
|
}, |
|
clearSql: function() { |
|
var editor = ace.edit("divAceEditor"); |
|
editor.setValue("\r\n"); |
|
editor.selection.clearSelection(); |
|
|
|
var editorResult = ace.edit("divAceEditorResult"); |
|
editorResult.setValue("\r\n"); |
|
editorResult.selection.clearSelection() |
|
}, |
|
bindSqlResult: function () |
|
{ |
|
var editor = ace.edit("divAceEditorResult"); |
|
editor.setOption("showPrintMargin", false); |
|
editor.setTheme("ace/theme/twilight"); // 设置主题 |
|
editor.getSession().setMode("ace/mode/json5"); // 设置语言模式为SQL |
|
editor.setOption("enableBasicAutocompletion", true); |
|
editor.setOption("enableSnippets", true); |
|
editor.setOption("enableLiveAutocompletion", true) |
|
editor.setValue("\r\n"); |
|
editor.selection.clearSelection(); |
|
}, |
|
openSetting: function () |
|
{ |
|
btnSetting.click(); |
|
this.getSettingItem(1, 1); |
|
|
|
}, |
|
saveSetting: function () { |
|
|
|
this.saveSettingItem(1, 1, this.setting.importUnunderline); |
|
}, |
|
exportExcel: function () { |
|
var th = this; |
|
axios.get("/PrivateReZeroRoute/100003/ExportEntities", { |
|
params: { |
|
tableIds: JSON.stringify(this.selectedItems), |
|
DataBaseId: this.databaseId |
|
}, |
|
responseType: 'blob', |
|
headers: jwHeader.headers |
|
}) |
|
.then(function (response) { |
|
// 创建一个 Blob 对象,指向数据的 URL |
|
var url = window.URL.createObjectURL(new Blob([response.data])); |
|
var link = document.createElement('a'); |
|
link.href = url; |
|
|
|
// 设置下载文件的名称,可以根据实际情况调整 |
|
var fileName = $("#selDataBaseId option:selected").text() + '.xlsx'; |
|
link.setAttribute('download', fileName); |
|
|
|
// 触发下载 |
|
document.body.appendChild(link); |
|
link.click(); |
|
|
|
// 清理资源 |
|
window.URL.revokeObjectURL(link.href); |
|
document.body.removeChild(link); |
|
}) |
|
.catch(function (error) { |
|
console.error("Error downloading the Excel file:", error); |
|
}); |
|
}, |
|
getSettingItem: function (typeId, childTypeId) |
|
{ |
|
var url = "/PrivateReZeroRoute/100003/GetSetting"; |
|
var th = this; |
|
axios.post(url, { typeId: typeId, childTypeId: childTypeId }, jwHeader) |
|
.then(response => { |
|
th.setting.importUnunderline = response.data.BoolValue; |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
saveSettingItem: function (typeId, childTypeId,value) { |
|
var url = "/PrivateReZeroRoute/100003/UpdateSetting"; |
|
axios.post(url, { typeId: typeId, childTypeId: childTypeId, value: value }, jwHeader) |
|
.then(response => { |
|
tools.alert("保存成功"); |
|
btnSettingClose.click(); |
|
this.error = null; |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
this.data = null; |
|
}); |
|
}, |
|
openGenerateCode: function () { |
|
if (!this.selectedItems || this.selectedItems.length == 0) { |
|
tools.alert("请选择实体"); |
|
return; |
|
} |
|
this.isView = false; |
|
this.viewName = null; |
|
btnGenerateFile.click(); |
|
}, |
|
openGenerateCodeByView: function () { |
|
|
|
this.isView = true; |
|
btnGenerateFile.click(); |
|
}, |
|
submitGenerateFile: function () { |
|
if (this.isView && !this.viewName) |
|
{ |
|
tools.alert("视图名不能为空"); |
|
return; |
|
} |
|
var url = "/PrivateReZeroRoute/100003/ExecTemplateByTableIds"; |
|
axios.post(url, { |
|
TableIds: JSON.stringify(this.selectedItems), |
|
DataBaseId: this.databaseId, |
|
TemplateId: this.currentTemplate.Id, |
|
Url: this.currentTemplate.Url, |
|
ViewName: this.viewName |
|
}, jwHeader) |
|
.then(response => { |
|
if (response.data && response.data.message){ |
|
tools.alert("生成出错:" + response.data.message); |
|
} else { |
|
tools.alert("已生成到目录" + response.data); |
|
} |
|
}) |
|
.catch(error => { |
|
this.error = error.message; |
|
}); |
|
}, |
|
bindTemplates: function () |
|
{ |
|
var th = this; |
|
var url = "/PrivateReZeroRoute/100003/GetTemplateListByTypeId?typeId=1"; |
|
axios.get(url, jwHeader) |
|
.then(response => { |
|
th.templates = response.data; |
|
th.currentTemplate = th.templates[0]; |
|
th.currentTemplateId = th.templates[0].Id; |
|
}) |
|
.catch(error => { |
|
th.error = error.message; |
|
}); |
|
}, |
|
changeTemplate: function (template) |
|
{ |
|
this.currentTemplate = this.templates.find(item => item.Id === this.currentTemplateId); |
|
} |
|
} |
|
}); |
|
</script> |