feat: Log Manage页面编写,按设计自定义带连接线的树组件
This commit is contained in:
		
							parent
							
								
									efe44ac59f
								
							
						
					
					
						commit
						407fd4e09c
					
				|  | @ -1,5 +1,5 @@ | |||
| NODE_ENV=development | ||||
| VUE_APP_API_BASE_URL=http://182.92.183.230:8080/jeecg-boot | ||||
| VUE_APP_API_BASE_URL=http://182.92.183.230:9999 | ||||
| VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas | ||||
| VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/global/switcher-open.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/global/switcher-open.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 970 B | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/global/switcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/global/switcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 984 B | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/log/download-active.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/log/download-active.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/log/download.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/log/download.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/log/operate-active.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/log/operate-active.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/log/operate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/log/operate.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.3 KiB | 
|  | @ -1,12 +1,10 @@ | |||
| <template> | ||||
|   <a-modal v-bind="$attrs" v-model="visible" :title="title"> | ||||
|   <a-modal v-bind="$attrs" v-model="visible" :title="title" :footer="null"> | ||||
|     <slot></slot> | ||||
|     <template slot="footer"> | ||||
|       <a-space class="operators" :size="20"> | ||||
|         <a-button type="success" @click="onSave" :loading="confirmLoading">Save</a-button> | ||||
|         <a-button type="warn" @click="onCancel">Cancel</a-button> | ||||
|       </a-space> | ||||
|     </template> | ||||
|     <a-space v-if="showFooter" class="operators" :size="20"> | ||||
|       <a-button type="success" @click="onSave" :loading="confirmLoading">Save</a-button> | ||||
|       <a-button type="warn" @click="onCancel">Cancel</a-button> | ||||
|     </a-space> | ||||
|   </a-modal> | ||||
| </template> | ||||
| <script> | ||||
|  | @ -20,6 +18,10 @@ export default { | |||
|     }, | ||||
|     title: { | ||||
|       type: String | ||||
|     }, | ||||
|     showFooter: { | ||||
|       type: Boolean, | ||||
|       default: true | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|  | @ -60,6 +62,8 @@ export default { | |||
| </script> | ||||
| <style lang="less" scoped> | ||||
| .operators { | ||||
|   width: 100%; | ||||
|   justify-content: center; | ||||
|   .ant-btn { | ||||
|     width: 92px; | ||||
|   } | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ | |||
|     :loading="loading" | ||||
|     :pagination="pagination" | ||||
|     :customRow="customRow" | ||||
|     :rowClassName="() => canSelect? 'custom-table-row': ''" | ||||
|     @change="handleTableChange" | ||||
|   > | ||||
|     <!-- 处理 scopedSlots --> | ||||
|  | @ -41,15 +42,19 @@ export default { | |||
|       type: Boolean | ||||
|     }, | ||||
|     pagination: { | ||||
|       type: Object | ||||
|       type: [Object, Boolean] | ||||
|     }, | ||||
|     selectedRowKeys: { | ||||
|       type: Array | ||||
|     }, | ||||
|     canSelect: { | ||||
|       type: Boolean, | ||||
|       default: true | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|         innerSelectedRowKeys: cloneDeep(this.selectedRowKeys) | ||||
|         innerSelectedRowKeys: cloneDeep(this.selectedRowKeys) || [] | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|  | @ -59,6 +64,9 @@ export default { | |||
|         class: this.innerSelectedRowKeys.includes(record[this.rowKey]) ? 'ant-table-row-selected' : '', | ||||
|         on: { | ||||
|           click: () => { | ||||
|             if(!this.canSelect) { | ||||
|               return | ||||
|             } | ||||
|             if (this.innerSelectedRowKeys.includes(record[this.rowKey])) { | ||||
|               this.innerSelectedRowKeys = [] | ||||
|             } else { | ||||
|  | @ -85,12 +93,8 @@ export default { | |||
|   } | ||||
| } | ||||
| </script> | ||||
| <style lang="less" scoped> | ||||
| .custom-table { | ||||
|   ::v-deep { | ||||
|     .ant-table-row { | ||||
|       cursor: pointer; | ||||
|     } | ||||
|   } | ||||
| <style lang="less"> | ||||
| .custom-table-row { | ||||
|   cursor: pointer; | ||||
| } | ||||
| </style> | ||||
|  |  | |||
							
								
								
									
										102
									
								
								src/components/TreeWithLine/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								src/components/TreeWithLine/index.vue
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,102 @@ | |||
| <template> | ||||
|   <div class="tree-with-line"> | ||||
|     <a-tree v-bind="$attrs" :defaultExpandAll="true"> | ||||
|       <template slot="switcherIcon"> | ||||
|         <div></div> | ||||
|       </template> | ||||
|     </a-tree> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| export default {} | ||||
| </script> | ||||
| <style lang="less" scoped> | ||||
| .tree-with-line { | ||||
|   @borderColor: #0a544e; | ||||
|   @bgColor: #022024; | ||||
|   ::v-deep .ant-tree { | ||||
|     border-left: 1px dotted @borderColor; | ||||
|     &-switcher { | ||||
|       background: transparent !important; | ||||
|       width: 17px; | ||||
|       height: 17px; | ||||
|       &-noop { | ||||
|         display: none; | ||||
|       } | ||||
|       &-icon { | ||||
|         margin-top: 3px; | ||||
|         background: url(~@/assets/images/global/switcher.png) center center no-repeat; | ||||
|         position: relative; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         transform: none; | ||||
|       } | ||||
|       &_open { | ||||
|         .ant-tree-switcher-icon { | ||||
|           background-image: url(~@/assets/images/global/switcher-open.png); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     &-treenode-switcher { | ||||
|       &-open, | ||||
|       &-close { | ||||
|         &::before { | ||||
|           content: ''; | ||||
|           border-top: 1px dotted @borderColor; | ||||
|           width: 19px; | ||||
|           display: inline-block; | ||||
|           vertical-align: middle; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     li ul { | ||||
|       padding-left: 28px; | ||||
|     } | ||||
| 
 | ||||
|     &-child-tree { | ||||
|       position: relative; | ||||
|       &::after { | ||||
|         content: ''; | ||||
|         position: absolute; | ||||
|         border-left: 1px dotted @borderColor; | ||||
|         top: -14px; | ||||
|         height: 100%; | ||||
|         z-index: 0; | ||||
|       } | ||||
|       li { | ||||
|         &:last-child { | ||||
|           position: relative; | ||||
|           padding-top: 4px; | ||||
|           &::after { | ||||
|             content: ''; | ||||
|             background-color: @bgColor; | ||||
|             position: absolute; | ||||
|             top: 16px; | ||||
|             left: -1; | ||||
|             height: calc(100% - 14px); | ||||
|             width: 3px; | ||||
|             z-index: 1; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     > li:last-child { | ||||
|       position: relative; | ||||
|       &::after { | ||||
|         content: ''; | ||||
|         background-color: @bgColor; | ||||
|         width: 3px; | ||||
|         height: 100%; | ||||
|         position: absolute; | ||||
|         top: 16px; | ||||
|         left: -1px; | ||||
|         z-index: 1; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|  | @ -490,6 +490,10 @@ body { | |||
|       color: #0cebc9; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   &-title { | ||||
|     user-select: none; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // 按钮 | ||||
|  | @ -636,11 +640,6 @@ body { | |||
|     } | ||||
|   } | ||||
|   &-body { | ||||
|     padding-bottom: 0; | ||||
|   } | ||||
|   &-footer { | ||||
|     border-top: none; | ||||
|     text-align: center; | ||||
|     padding-bottom: 22px; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,3 +1,249 @@ | |||
| <template> | ||||
|     <div>日志管理警页面</div> | ||||
| </template> | ||||
|   <div class="log"> | ||||
|     <a-card class="log-tree" :bordered="false"> | ||||
|       <!-- 标题 --> | ||||
|       <template slot="title"> | ||||
|         <div class="title"> | ||||
|           <div class="title-text">LOG</div> | ||||
|           <div class="title-rect"> | ||||
|             <span></span> | ||||
|             <span></span> | ||||
|             <span></span> | ||||
|             <span></span> | ||||
|             <span></span> | ||||
|             <span></span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </template> | ||||
|       <!-- 标题结束 --> | ||||
|       <!-- 内容 --> | ||||
|       <tree-with-line :treeData="treeData"> </tree-with-line> | ||||
|       <!-- 内容结束 --> | ||||
|     </a-card> | ||||
|     <div class="log-list"> | ||||
|       <custom-table | ||||
|         size="middle" | ||||
|         rowKey="id" | ||||
|         :columns="columns" | ||||
|         :list="dataSource" | ||||
|         :pagination="false" | ||||
|         :loading="loading" | ||||
|         :can-select="false" | ||||
|         @change="handleTableChange" | ||||
|         :scroll="{ y: 'calc(100vh - 365px)' }" | ||||
|       > | ||||
|         <template slot="operate" slot-scope="{ record }"> | ||||
|           <a-space :size="20"> | ||||
|             <img src="@/assets/images/log/operate.png" alt="" style="cursor: pointer" @click.stop="onOperate(record)" /> | ||||
|             <img | ||||
|               src="@/assets/images/log/download.png" | ||||
|               alt="" | ||||
|               style="cursor: pointer" | ||||
|               @click.stop="onDownload(record)" | ||||
|             /> | ||||
|           </a-space> | ||||
|         </template> | ||||
|       </custom-table> | ||||
|     </div> | ||||
| 
 | ||||
|     <custom-modal title="Log" v-model="visible" :show-footer="false"> | ||||
|         这里是Log内容 | ||||
|     </custom-modal> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| import { JeecgListMixin } from '@/mixins/JeecgListMixin' | ||||
| import TreeWithLine from '@/components/TreeWithLine/index.vue' | ||||
| 
 | ||||
| const columns = [ | ||||
|   { | ||||
|     title: 'Name', | ||||
|     align: 'center', | ||||
|     dataIndex: 'name' | ||||
|   }, | ||||
|   { | ||||
|     title: 'date', | ||||
|     align: 'center', | ||||
|     dataIndex: 'date' | ||||
|   }, | ||||
|   { | ||||
|     title: 'size', | ||||
|     align: 'center', | ||||
|     dataIndex: 'size' | ||||
|   }, | ||||
|   { | ||||
|     title: 'Operate', | ||||
|     align: 'center', | ||||
|     scopedSlots: { | ||||
|       customRender: 'operate' | ||||
|     } | ||||
|   } | ||||
| ] | ||||
| 
 | ||||
| export default { | ||||
|   mixins: [JeecgListMixin], | ||||
|   components: { | ||||
|     TreeWithLine | ||||
|   }, | ||||
|   data() { | ||||
|     this.columns = columns | ||||
|     return { | ||||
|       url: { | ||||
|         list: '' | ||||
|       }, | ||||
|       treeData: [ | ||||
|         { | ||||
|           title: 'Db', | ||||
|           key: '1', | ||||
|           children: [ | ||||
|             { | ||||
|               title: '2022', | ||||
|               key: '1-1', | ||||
|               children: [ | ||||
|                 { | ||||
|                   title: '04', | ||||
|                   key: '1-1-1' | ||||
|                 }, | ||||
|                 { | ||||
|                   title: '05', | ||||
|                   key: '1-1-2' | ||||
|                 } | ||||
|               ] | ||||
|             }, | ||||
|             { | ||||
|               title: '2023', | ||||
|               key: '1-2', | ||||
|               children: [ | ||||
|                 { | ||||
|                   title: '04', | ||||
|                   key: '1-2-1' | ||||
|                 }, | ||||
|                 { | ||||
|                   title: '05', | ||||
|                   key: '1-2-2' | ||||
|                 } | ||||
|               ] | ||||
|             } | ||||
|           ] | ||||
|         }, | ||||
|         { | ||||
|           title: 'Error', | ||||
|           key: '2', | ||||
|           children: [ | ||||
|             { | ||||
|               title: '2022', | ||||
|               key: '2-1', | ||||
|               children: [ | ||||
|                 { | ||||
|                   title: '04', | ||||
|                   key: '2-1-1' | ||||
|                 }, | ||||
|                 { | ||||
|                   title: '05', | ||||
|                   key: '2-1-2' | ||||
|                 } | ||||
|               ] | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       ], | ||||
|       dataSource: [{ id: 1, name: 'DEX33_002-20220512_0723_S_FULL_9011.9.log', date: '2022-05-13', size: '105KB' }], | ||||
|       visible: false | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     onOperate(record) { | ||||
|       console.log('%c [  ]-147', 'font-size:13px; background:pink; color:#bf2c9f;', record) | ||||
|       this.visible = true | ||||
|     }, | ||||
|     onDownload(record) { | ||||
|       console.log('%c [  ]-151', 'font-size:13px; background:pink; color:#bf2c9f;', record) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| <style lang="less" scoped> | ||||
| .log { | ||||
|   height: 100%; | ||||
|   display: flex; | ||||
|   &-tree { | ||||
|     width: 290px; | ||||
|     height: 100%; | ||||
|     flex-shrink: 0; | ||||
|     margin-right: 20px; | ||||
|     background-color: #022024; | ||||
|     border: 1px solid #0c6a66; | ||||
|     ::v-deep { | ||||
|       .ant-card { | ||||
|         &-head { | ||||
|           border-bottom: 4px solid rgba(12, 235, 201, 0.2); | ||||
|           height: auto; | ||||
|           &-title { | ||||
|             height: 45px; | ||||
|             line-height: 45px; | ||||
|             padding: 0; | ||||
|             padding-right: 20px; | ||||
|             font-family: MicrogrammaD-MediExte; | ||||
|             font-size: 18px; | ||||
|             font-weight: bold; | ||||
|             color: #0cebc9; | ||||
|           } | ||||
|         } | ||||
|         &-body { | ||||
|           padding: 0 20px; | ||||
|           height: calc(100% - 50px); | ||||
|           overflow: auto; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     .title { | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|       &-text { | ||||
|         padding-left: 20px; | ||||
|         width: 100px; | ||||
|         background-color: rgba(12, 235, 201, 0.05); | ||||
|       } | ||||
| 
 | ||||
|       &-rect { | ||||
|         span { | ||||
|           display: inline-block; | ||||
|           background-color: rgba(12, 235, 201, 0.2); | ||||
|           vertical-align: middle; | ||||
|           &:first-child { | ||||
|             width: 4px; | ||||
|             height: 4px; | ||||
|           } | ||||
|           &:nth-child(2) { | ||||
|             width: 6px; | ||||
|             height: 6px; | ||||
|             margin-right: 6px; | ||||
|           } | ||||
|           &:nth-child(3) { | ||||
|             width: 4px; | ||||
|             height: 4px; | ||||
|             margin-right: 9px; | ||||
|           } | ||||
|           &:nth-child(4) { | ||||
|             width: 1px; | ||||
|             height: 16px; | ||||
|             margin-right: 23px; | ||||
|           } | ||||
|           &:nth-child(5) { | ||||
|             width: 2px; | ||||
|             height: 2px; | ||||
|             margin-right: 24px; | ||||
|           } | ||||
|           &:nth-child(6) { | ||||
|             width: 4px; | ||||
|             height: 4px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   &-list { | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|  |  | |||
|  | @ -550,6 +550,13 @@ export default { | |||
|         } | ||||
|       } else { | ||||
|         this.checkedAccount = selected ? '' : eventKey | ||||
|         // 将所有右侧的穿梭状态重置 | ||||
|         this.accountTreeData.forEach(account => { | ||||
|           // 将所有右侧的穿梭状态重置 | ||||
|           account.children.forEach(child => { | ||||
|             itemSelect(child.key, false) | ||||
|           }) | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|  | @ -574,6 +581,7 @@ export default { | |||
|         } | ||||
|       } else { | ||||
|         const moveKey = moveKeys[0] | ||||
|         console.log('%c [ moveKey ]-577', 'font-size:13px; background:pink; color:#bf2c9f;', moveKey) | ||||
|         let parentIndex = -1, | ||||
|           childIndex = -1 | ||||
|         for (const pIndex in this.accountTreeData) { | ||||
|  | @ -587,6 +595,7 @@ export default { | |||
|           } | ||||
|         } | ||||
|         this.accountTreeData[parentIndex].children.splice(childIndex, 1) | ||||
|         console.log('%c [ childIndex ]-591', 'font-size:13px; background:pink; color:#bf2c9f;', childIndex) | ||||
|       } | ||||
|       this.targetKeys = targetKeys | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user