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.
		
		
		
		
		
			
		
			
				
					
					
						
							736 lines
						
					
					
						
							19 KiB
						
					
					
				
			
		
		
	
	
							736 lines
						
					
					
						
							19 KiB
						
					
					
				| @@master_page.html | |
| <style> | |
|   .filed-container { | |
|     width: 100%; | |
|     height: 100%; | |
|     background-color: #fff; | |
|     padding: 20px; | |
|     position: relative; | |
|     display: flex; | |
|     flex-flow: column nowrap; | |
|     gap: 20px; | |
|   } | |
|  | |
|   .filed-container::before { | |
|     content: ""; | |
|     position: absolute; | |
|     top: 0; | |
|     left: 50%; | |
|     width: 2px; | |
|     height: 100%; | |
|     background-image: linear-gradient(to bottom, #e6f3ff, #fff7e6); | |
|     border-radius: 50%; | |
|   } | |
|  | |
|   .info-container { | |
|     display: flex; | |
|     align-items: center; | |
|   } | |
|  | |
|   .info-item { | |
|     flex: 1; | |
|     display: flex; | |
|     justify-content: center; | |
|     align-items: center; | |
|     flex-flow: column; | |
|     gap: 20px; | |
|   } | |
|  | |
|   .footer { | |
|     display: flex; | |
|     justify-content: space-between; | |
|   } | |
|  | |
|   .footer-item { | |
|     display: flex; | |
|     align-items: center; | |
|     gap: 10px; | |
|   } | |
|  | |
|   .info-item-title { | |
|     display: flex; | |
|     align-items: center; | |
|     font-weight: bold; | |
|     font-size: 16px; | |
|     display: flex; | |
|     gap: 10px; | |
|   } | |
|  | |
|   .info-item-upload { | |
|     display: flex; | |
|     align-items: center; | |
|     gap: 5px; | |
|     cursor: pointer; | |
|     font-weight: initial; | |
|     font-size: 14px; | |
|     color: #419ff8; | |
|     border-bottom: 1px solid #419ff8; | |
|   } | |
|  | |
|   .info-item-input-container { | |
|     display: flex; | |
|     align-items: center; | |
|     gap: 5px; | |
|   } | |
|  | |
|   .info-item-input { | |
|     width: 200px; | |
|     height: 32px; | |
|     padding: 4px 11px; | |
|     border: 1px solid #d9d9d9; | |
|     border-radius: 4px; | |
|     transition: all 0.3s; | |
|     font-size: 14px; | |
|     color: #333; | |
|     outline: none; | |
|     box-sizing: border-box; | |
|   } | |
|  | |
|   .info-form-container { | |
|     display: flex; | |
|     flex-flow: row nowrap; | |
|     align-items: center; | |
|     gap: 10px; | |
|   } | |
|  | |
|   .table { | |
|     width: 100%; | |
|     table-layout: fixed; | |
|     border-collapse: collapse; | |
|   } | |
|  | |
|   .table th, | |
|   .table td { | |
|     overflow: hidden; | |
|     text-overflow: ellipsis; | |
|     white-space: nowrap; | |
|   } | |
|  | |
|   .table th:nth-child(1), | |
|   .table td:nth-child(1) { | |
|     width: 70px; | |
|   } | |
|  | |
|   .table th:nth-child(2), | |
|   .table td:nth-child(2), | |
|   .table th:nth-child(6), | |
|   .table td:nth-child(6) { | |
|     width: 125px; | |
|   } | |
|  | |
|   .table th:nth-child(3), | |
|   .table td:nth-child(3), | |
|   .table th:nth-child(7), | |
|   .table td:nth-child(7) { | |
|     width: 120px; | |
|   } | |
|  | |
|   .table th:nth-child(4), | |
|   .table td:nth-child(4), | |
|   .table th:nth-child(8), | |
|   .table td:nth-child(8) { | |
|     width: 100px; | |
|   } | |
|  | |
|   .table th:nth-child(5), | |
|   .table td:nth-child(5), | |
|   .table th:nth-child(9), | |
|   .table td:nth-child(9) { | |
|     width: 100px; | |
|   } | |
|  | |
|   .table th:nth-child(10), | |
|   .table td:nth-child(10) { | |
|     width: 70px; | |
|     text-align: center; | |
|   } | |
|  | |
|   .footer-item-button { | |
|     display: flex; | |
|     align-items: center; | |
|     justify-content: center; | |
|     padding: 8px 16px; | |
|     border-radius: 999px; | |
|     font-size: 14px; | |
|     cursor: pointer; | |
|     transition: all 0.3s; | |
|     border: none; | |
|     color: #333; | |
|     gap: 5px; | |
|   } | |
|  | |
|   .table-row { | |
|     display: flex; | |
|     flex-flow: row nowrap; | |
|     align-items: center; | |
|     justify-content: center; | |
|   } | |
|  | |
|   .local-park, | |
|   .third-park { | |
|     width: 100%; | |
|     flex: 1; | |
|     display: flex; | |
|     flex-flow: row nowrap; | |
|     align-items: center; | |
|     justify-content: center; | |
|   } | |
|  | |
|   .local-park th, | |
|   .third-park th { | |
|     flex: 1; | |
|   } | |
|  | |
|   .table-item-input { | |
|     width: 100%; | |
|     padding: 8px 12px; | |
|     border-radius: 4px; | |
|     border: none; | |
|     font-size: 14px; | |
|     color: #606266; | |
|     background-color: #fff; | |
|     transition: border-color 0.2s ease; | |
|     outline: none; | |
|     box-sizing: border-box; | |
|  | |
|     &:disabled { | |
|       background-color: #f5f7fa; | |
|       border-color: #e4e7ed; | |
|       color: #c0c4cc; | |
|       cursor: not-allowed; | |
|     } | |
|  | |
|     &::placeholder { | |
|       color: #c0c4cc; | |
|     } | |
|   } | |
|  | |
|   .table-item-select { | |
|     width: 100%; | |
|     padding: 8px 12px; | |
|     border: 1px solid #dcdfe6; | |
|     border-radius: 4px; | |
|     font-size: 14px; | |
|     color: #606266; | |
|     outline: none; | |
|     box-sizing: border-box; | |
|     border: none; | |
|  | |
|     &:disabled { | |
|       background-color: #f5f7fa; | |
|       border-color: #e4e7ed; | |
|       color: #c0c4cc; | |
|       cursor: not-allowed; | |
|     } | |
|  | |
|     &::placeholder { | |
|       color: #c0c4cc; | |
|     } | |
|   } | |
|  | |
|   .table-item-button { | |
|     display: inline-flex; | |
|     align-items: center; | |
|     justify-content: center; | |
|     border-radius: 50%; | |
|     border: none; | |
|     padding: 8px; | |
|     background-color: transparent; | |
|     color: #606266; | |
|     cursor: pointer; | |
|     transition: all 0.2s ease; | |
|     height: 32px; | |
|     width: 32px; | |
|  | |
|     &:hover { | |
|       background-color: #f2f6fc; | |
|       color: #409eff; | |
|     } | |
|  | |
|     &:active { | |
|       background-color: #ecf5ff; | |
|     } | |
|  | |
|     .mdi { | |
|       font-size: 20px; | |
|     } | |
|  | |
|     &[title="保存"] { | |
|       color: #67c23a; | |
|  | |
|       &:hover { | |
|         background-color: #f0f9eb; | |
|       } | |
|     } | |
|  | |
|     &[title="取消"] { | |
|       color: #909399; | |
|  | |
|       &:hover { | |
|         background-color: #f4f4f5; | |
|       } | |
|     } | |
|  | |
|     &[title="删除"] { | |
|       color: #f56c6c; | |
|  | |
|       &:hover { | |
|         background-color: #fef0f0; | |
|       } | |
|     } | |
|   } | |
|  | |
|   .info-item-upload-name { | |
|     color: #01c853; | |
|   } | |
| </style> | |
| <div id="apibox" class="card"> | |
|   <section class="filed-container"> | |
|     <section class="info-container"> | |
|       <section class="info-item"> | |
|         <section class="info-item-title"> | |
|           本地表 | |
|           <section class="info-item-upload-name" v-show="localJosnName"> | |
|             {{`(${localJosnName})`}} | |
|           </section> | |
|           <section class="info-item-upload" @click="uploadLocalFile"> | |
|             <input | |
|               type="file" | |
|               style="opacity: 0; display: none" | |
|               id="localFile" | |
|               accept=".json" | |
|             /> | |
|             <i class="mdi mdi-cloud-upload"></i> | |
|             导入本地表 | |
|           </section> | |
|         </section> | |
|         <section class="info-form-container"> | |
|           <section class="info-item-input-container"> | |
|             表名<input | |
|               type="text" | |
|               class="info-item-input" | |
|               v-model="cachesData.SYSTEM_TABLE_NAME" | |
|               placeholder="请输入表名" | |
|             /> | |
|           </section> | |
|           <section class="info-item-input-container"> | |
|             表注释<input | |
|               type="text" | |
|               class="info-item-input" | |
|               v-model="cachesData.SYSTEM_TABLE_CNNAME" | |
|               placeholder="请输入表注释" | |
|             /> | |
|           </section> | |
|         </section> | |
|       </section> | |
|       <section class="info-item"> | |
|         <section class="info-item-title"> | |
|           三方表 | |
|           <section class="info-item-upload-name" v-show="thirdJsonName"> | |
|             ({{thirdJsonName}}) | |
|           </section> | |
|           <section class="info-item-upload" @click="uploadThirdFile"> | |
|             <input | |
|               type="file" | |
|               style="opacity: 0; display: none" | |
|               id="thirdFile" | |
|               accept=".json" | |
|             /> | |
|             <i class="mdi mdi-cloud-upload"></i> | |
|             导入三方表 | |
|           </section> | |
|         </section> | |
|         <section class="info-form-container"> | |
|           <section class="info-item-input-container"> | |
|             表名<input | |
|               type="text" | |
|               class="info-item-input" | |
|               v-model="cachesData.OBJECT_TABLE_NAME" | |
|               placeholder="请输入表名" | |
|             /> | |
|           </section> | |
|           <section class="info-item-input-container"> | |
|             表注释<input | |
|               type="text" | |
|               class="info-item-input" | |
|               v-model="cachesData.OBJECT_TABLE_CNNAME" | |
|               placeholder="请输入表注释" | |
|             /> | |
|           </section> | |
|         </section> | |
|       </section> | |
|     </section> | |
|     <table class="table"> | |
|       <thead> | |
|         <tr> | |
|           <th>序号</th> | |
|           <th style="background-color: #e6f3ff">字段名</th> | |
|           <th style="background-color: #e6f3ff">字段注释</th> | |
|           <th style="background-color: #e6f3ff">字段类型</th> | |
|           <th style="background-color: #e6f3ff">字典名称</th> | |
|           <th style="background-color: #fff7e6">字段名</th> | |
|           <th style="background-color: #fff7e6">字段注释</th> | |
|           <th style="background-color: #fff7e6">字段类型</th> | |
|           <th style="background-color: #fff7e6">字典名称</th> | |
|           <th>操作</th> | |
|         </tr> | |
|       </thead> | |
|       <tbody> | |
|         <tr v-for="(item, index) in data" :key="index"> | |
|           <td style="width: 150px">{{index + 1}}</td> | |
|           <td style="background-color: #f5f9ff; position: relative"> | |
|             {{item.SYSTEM_FIELD}} | |
|           </td> | |
|           <td style="background-color: #f5f9ff">{{item.SYSTEM_NAME}}</td> | |
|           <td style="background-color: #f5f9ff">{{item.SYSTEM_FIELD_TYPE}}</td> | |
|           <td style="background-color: #f5f9ff">{{item.SYSTEM_DICT_NAME}}</td> | |
|           <td style="background-color: #fffbf2">{{item.INTERFACE_FIELD}}</td> | |
|           <td style="background-color: #fffbf2">{{item.INTERFACE_NAME}}</td> | |
|           <td style="background-color: #fffbf2">{{item.OBJECT_FIELD_TYPE}}</td> | |
|           <td style="background-color: #fffbf2">{{item.OBJECT_DICT_NAME}}</td> | |
|           <td> | |
|             <button | |
|               @click="deleteField(index)" | |
|               class="table-item-button" | |
|               title="删除" | |
|             > | |
|               <i class="mdi mdi-delete"></i> | |
|             </button> | |
|           </td> | |
|         </tr> | |
|         <tr v-show="isEditing"> | |
|           <td style="width: 150px">{{data.length + 1}}</td> | |
|           <td style="background-color: #f5f9ff; position: relative"> | |
|             <input | |
|               v-model="submitData.SYSTEM_FIELD" | |
|               class="table-item-select" | |
|               placeholder="请输入字段名" | |
|               style=" | |
|                 z-index: 1; | |
|                 position: absolute; | |
|                 top: 50%; | |
|                 left: 0%; | |
|                 width: 80%; | |
|                 border: none; | |
|                 transform: translateY(-50%) translateX(10%); | |
|               " | |
|             /> | |
|             <select | |
|               id="localSelect" | |
|               class="table-item-select" | |
|               style=" | |
|                 position: absolute; | |
|                 z-index: 0; | |
|                 top: 50%; | |
|                 left: 0%; | |
|                 width: 90%; | |
|                 transform: translateY(-50%) translateX(10%); | |
|               " | |
|               title="请选择字段名称" | |
|               @change="localChange" | |
|             > | |
|               <option | |
|                 v-for="(type,index) in Object.keys(localJsonData)" | |
|                 :key="index" | |
|                 :value="type" | |
|               > | |
|                 <section>{{type}}</section> | |
|               </option> | |
|             </select> | |
|           </td> | |
|           <td style="background-color: #f5f9ff"> | |
|             <input | |
|               v-model="submitData.SYSTEM_NAME" | |
|               class="table-item-input" | |
|               placeholder="请输入字段名" | |
|             /> | |
|           </td> | |
|           <td style="background-color: #f5f9ff"> | |
|             <select | |
|               v-model="submitData.SYSTEM_FIELD_TYPE" | |
|               class="table-item-input" | |
|               placeholder="请选择字段类型" | |
|             > | |
|               <option | |
|                 v-for="type in dict.filedType" | |
|                 :key="type.VALUE" | |
|                 :value="type.VALUE" | |
|               > | |
|                 {{type.LABEL}} | |
|               </option> | |
|             </select> | |
|           </td> | |
|           <td style="background-color: #f5f9ff"> | |
|             <input | |
|               v-model="submitData.SYSTEM_DICT_NAME" | |
|               class="table-item-input" | |
|               placeholder="请输入字典名称" | |
|               :style="{display: submitData.SYSTEM_FIELD_TYPE == 'dict' ? 'block' : 'none'}" | |
|             /> | |
|           </td> | |
|           <td style="background-color: #fffbf2; position: relative"> | |
|             <input | |
|               v-model="submitData.INTERFACE_FIELD" | |
|               class="table-item-select" | |
|               placeholder="请输入字段名" | |
|               style=" | |
|                 z-index: 1; | |
|                 position: absolute; | |
|                 top: 50%; | |
|                 left: 0%; | |
|                 width: 80%; | |
|                 border: none; | |
|                 transform: translateY(-50%) translateX(10%); | |
|               " | |
|             /> | |
|             <select | |
|               id="thridSelect" | |
|               class="table-item-select" | |
|               style=" | |
|                 position: absolute; | |
|                 z-index: 0; | |
|                 top: 50%; | |
|                 left: 0%; | |
|                 width: 90%; | |
|                 transform: translateY(-50%) translateX(10%); | |
|               " | |
|               title="请选择字段名称" | |
|               @change="thridChange" | |
|             > | |
|               <option | |
|                 v-for="(type,index) in Object.keys(thirdJsonData)" | |
|                 :key="index" | |
|                 :value="type" | |
|               > | |
|                 {{type}} | |
|               </option> | |
|             </select> | |
|           </td> | |
|           <td style="background-color: #fffbf2"> | |
|             <input | |
|               v-model="submitData.INTERFACE_NAME" | |
|               class="table-item-input" | |
|               placeholder="请输入字段注释" | |
|             /> | |
|           </td> | |
|           <td style="background-color: #fffbf2"> | |
|             <select | |
|               v-model="submitData.OBJECT_FIELD_TYPE" | |
|               class="table-item-input" | |
|               placeholder="请选择字段类型" | |
|             > | |
|               <option | |
|                 v-for="type in dict.filedType" | |
|                 :key="type.VALUE" | |
|                 :value="type.VALUE" | |
|               > | |
|                 {{type.LABEL}} | |
|               </option> | |
|             </select> | |
|           </td> | |
|           <td style="background-color: #fffbf2"> | |
|             <input | |
|               v-model="submitData.OBJECT_DICT_NAME" | |
|               class="table-item-input" | |
|               placeholder="请输入字典名称" | |
|               :style="{display: submitData.OBJECT_FIELD_TYPE == 'dict' ? 'block' : 'none'}" | |
|             /> | |
|           </td> | |
|           <td> | |
|             <button | |
|               @click="saveField(index)" | |
|               class="table-item-button" | |
|               title="保存" | |
|             > | |
|               <i class="mdi mdi-content-save"></i> | |
|             </button> | |
|             <button | |
|               @click="cancelField(index)" | |
|               class="table-item-button" | |
|               title="取消" | |
|             > | |
|               <i class="mdi mdi-cancel"></i> | |
|             </button> | |
|           </td> | |
|         </tr> | |
|       </tbody> | |
|     </table> | |
|     <section class="footer"> | |
|       <section class="footer-item"> | |
|         <button | |
|           class="footer-item-button" | |
|           style="background-color: #419ff8; color: #fff" | |
|           @click="addNewField" | |
|         > | |
|           <i class="mdi mdi-plus"></i> 新增字段 | |
|         </button> | |
|       </section> | |
|       <section class="footer-item"> | |
|         <button | |
|           class="footer-item-button" | |
|           style="background-color: #ff8903; color: #fff" | |
|           @click="cancelAll" | |
|         > | |
|           <i class="mdi mdi-close"></i>取消 | |
|         </button> | |
|         <button | |
|           class="footer-item-button" | |
|           style="background-color: #01c853; color: #fff" | |
|           @click="saveAll" | |
|         > | |
|           <i class="mdi mdi-check"></i>保存 | |
|         </button> | |
|       </section> | |
|     </section> | |
|   </section> | |
| </div> | |
| <script> | |
|   var vueObj = new Vue({ | |
|     el: "#apibox", | |
|     data() { | |
|       return { | |
|         dict: { | |
|           filedType: [], | |
|         }, | |
|         isEditing: true, | |
|         data: [ | |
|            | |
|           | |
|         ], | |
|         localJsonData: {}, | |
|         localJosnName: "", | |
|         thirdJsonData: {}, | |
|         thirdJsonName: "", | |
|         submitData: { | |
|           SYSTEM_NAME: "", | |
|           SYSTEM_FIELD: "", | |
|           INTERFACE_NAME: "", | |
|           INTERFACE_FIELD: "", | |
|           SYSTEM_FIELD_TYPE: "value", | |
|           SYSTEM_DICT_NAME: "", | |
|           OBJECT_FIELD_TYPE: "value", | |
|           OBJECT_DICT_NAME: "", | |
|         }, | |
|           cachesData: { | |
|             | |
|           OBJECT_TABLE_NAME: "", | |
|           OBJECT_TABLE_CNNAME: "", | |
|           SYSTEM_TABLE_CNNAME: "", | |
|           SYSTEM_TABLE_NAME: "", | |
|         }, | |
|       }; | |
|     }, | |
|     created() { | |
|       this.getDictOption(); | |
|     }, | |
|     mounted() {}, | |
|     methods: { | |
|       getDictOption() { | |
|         axios | |
|           .get("/dict_data/simpleList?type=std_filed_type", jwHeader) | |
|           .then((res) => { | |
|             this.dict.filedType = res.data; | |
|           }); | |
|       }, | |
|       uploadLocalFile() { | |
|         document.getElementById("localFile").click(); | |
|         document.getElementById("localFile").onchange = () => { | |
|           const file = document.getElementById("localFile").files[0]; | |
|           this.localJosnName = file.name; | |
|           const reader = new FileReader(); | |
|           reader.readAsText(file); | |
|           reader.onload = () => { | |
|             this.localJsonData = JSON.parse(reader.result); | |
|           }; | |
|         }; | |
|       }, | |
|       uploadThirdFile() { | |
|         document.getElementById("thirdFile").click(); | |
|         document.getElementById("thirdFile").onchange = () => { | |
|           const file = document.getElementById("thirdFile").files[0]; | |
|           this.thirdJsonName = file.name; | |
|           const reader = new FileReader(); | |
|           reader.readAsText(file); | |
|           reader.onload = () => { | |
|             this.thirdJsonData = JSON.parse(reader.result); | |
|           }; | |
|         }; | |
|       }, | |
|       addNewField() { | |
|         this.submitData = { | |
|           SYSTEM_NAME: "", | |
|           SYSTEM_FIELD: "", | |
|           INTERFACE_NAME: "", | |
|           INTERFACE_FIELD: "", | |
|           SYSTEM_FIELD_TYPE: "value", | |
|           SYSTEM_DICT_NAME: "", | |
|           OBJECT_FIELD_TYPE: "value", | |
|           OBJECT_DICT_NAME: "", | |
|         }; | |
|         this.isEditing = true; | |
|       }, | |
|       saveField(index) { | |
|         this.data.push(this.submitData); | |
|         this.isEditing = false; | |
|       }, | |
|       cancelField(index) { | |
|         this.submitData = { | |
|           SYSTEM_NAME: "", | |
|           SYSTEM_FIELD: "", | |
|           INTERFACE_NAME: "", | |
|           INTERFACE_FIELD: "", | |
|           SYSTEM_FIELD_TYPE: "value", | |
|           SYSTEM_DICT_NAME: "", | |
|           OBJECT_FIELD_TYPE: "value", | |
|           OBJECT_DICT_NAME: "", | |
|         }; | |
|         this.isEditing = false; | |
|       }, | |
|       deleteField(index) { | |
|         this.data.splice(index, 1); | |
|       }, | |
|       thridChange(e) { | |
|         this.submitData.INTERFACE_FIELD = e.target.value; | |
|       }, | |
|       localChange(e) { | |
|         this.submitData.SYSTEM_FIELD = e.target.value; | |
|       }, | |
|       saveAll() { | |
|         if ( | |
|           this.cachesData.SYSTEM_TABLE_NAME === "" || | |
|           this.cachesData.OBJECT_TABLE_NAME === "" | |
|         ) { | |
|           tools.alert("请输入表名"); | |
|           return; | |
|         } | |
|         if (this.data.length === 0) { | |
|           tools.alert("请输入字段"); | |
|           return; | |
|         } | |
|         const data = this.data.map((i) => { | |
|           return { | |
|             ...this.cachesData, | |
|             ...i, | |
|           }; | |
|         }); | |
|         console.log(data); | |
|         axios | |
|           .post( | |
|             `/api/200100/stdobjectmappingcontroller/insertlist`, | |
|             { list: data }, | |
|             jwHeader | |
|           ) | |
|           .then((res) => { | |
|             tools.highlightErrorFields(res.data); | |
|             // window.location.href = './std_filed_map.html' | |
|           }) | |
|           .catch((error) => { | |
|             tools.alert(error.message); | |
|           }); | |
|       }, | |
|       cancelAll() { | |
|         window.location.href = "./std_filed_map.html"; | |
|       }, | |
|     }, | |
|   }); | |
| </script>
 | |
| 
 |