fix: 调整视图列表
This commit is contained in:
		
							parent
							
								
									8f9cef2a90
								
							
						
					
					
						commit
						32ac8041ee
					
				
							
								
								
									
										1
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -33,6 +33,7 @@ declare module 'vue' { | |||||||
|     RouterLink: typeof import('vue-router')['RouterLink'] |     RouterLink: typeof import('vue-router')['RouterLink'] | ||||||
|     RouterView: typeof import('vue-router')['RouterView'] |     RouterView: typeof import('vue-router')['RouterView'] | ||||||
|     Table: typeof import('./src/components/common/table.vue')['default'] |     Table: typeof import('./src/components/common/table.vue')['default'] | ||||||
|  |     YChart: typeof import('./src/components/common/y-chart.vue')['default'] | ||||||
|     YTable: typeof import('./src/components/common/y-table.vue')['default'] |     YTable: typeof import('./src/components/common/y-table.vue')['default'] | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										3212
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3212
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -6,14 +6,16 @@ | |||||||
|   "scripts": { |   "scripts": { | ||||||
|     "dev": "vite --mode staging", |     "dev": "vite --mode staging", | ||||||
|     "build:pre": "vite build --mode staging", |     "build:pre": "vite build --mode staging", | ||||||
|     "build": "vite build --mode production", |     "build:pro": "vite build --mode production", | ||||||
|     "type-check": "vue-tsc --build --force", |     "type-check": "vue-tsc --build --force", | ||||||
|     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" |     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "@antv/g2plot": "^2.4.31", | ||||||
|     "@vueuse/core": "^10.11.0", |     "@vueuse/core": "^10.11.0", | ||||||
|     "ant-design-vue": "^4.1.2", |     "ant-design-vue": "^4.1.2", | ||||||
|     "axios": "^1.6.7", |     "axios": "^1.6.7", | ||||||
|  |     "lodash": "^4.17.21", | ||||||
|     "pinia": "^2.1.7", |     "pinia": "^2.1.7", | ||||||
|     "vue": "^3.4.15", |     "vue": "^3.4.15", | ||||||
|     "vue-router": "^4.2.5" |     "vue-router": "^4.2.5" | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								src/components/common/y-chart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/components/common/y-chart.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="chart-show-box"> | ||||||
|  |     <div class="switch-type"> | ||||||
|  |       <a-radio-group v-model:value="chartType"> | ||||||
|  |         <a-radio-button value="line">折线图</a-radio-button> | ||||||
|  |         <a-radio-button value="bar">柱状图</a-radio-button> | ||||||
|  |       </a-radio-group> | ||||||
|  |     </div> | ||||||
|  |     <div class="chart-wrap"> | ||||||
|  |       <Column v-if="chartType === 'bar'" /> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { ref } from "vue"; | ||||||
|  | import Line from "@/plugins/antv-g2plot/line.vue"; | ||||||
|  | import Column from "@/plugins/antv-g2plot/column.vue"; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  |   chartCfg: { | ||||||
|  |     type: Array, | ||||||
|  |     default: () => [], | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const chartType = ref("line"); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="less" scoped> | ||||||
|  | .chart-wrap { | ||||||
|  |   padding: 20px; | ||||||
|  | } | ||||||
|  | </style> | ||||||
| @ -11,6 +11,7 @@ | |||||||
|           v-if="item.type === 'select'" |           v-if="item.type === 'select'" | ||||||
|           class="input-item" |           class="input-item" | ||||||
|           :options="item.options" |           :options="item.options" | ||||||
|  |           allow-clear | ||||||
|           v-model:value="filterData[item.name]" |           v-model:value="filterData[item.name]" | ||||||
|           @change="toFilt" |           @change="toFilt" | ||||||
|         ></a-select> |         ></a-select> | ||||||
| @ -18,6 +19,7 @@ | |||||||
|           v-if="item.type === 'text'" |           v-if="item.type === 'text'" | ||||||
|           class="input-item" |           class="input-item" | ||||||
|           placeholder="请输入" |           placeholder="请输入" | ||||||
|  |           allow-clear | ||||||
|           v-model:value="filterData[item.name]" |           v-model:value="filterData[item.name]" | ||||||
|           @change="toFilt" |           @change="toFilt" | ||||||
|         /> |         /> | ||||||
| @ -47,6 +49,7 @@ | |||||||
| <script setup> | <script setup> | ||||||
| import { reactive, ref, watch } from "vue"; | import { reactive, ref, watch } from "vue"; | ||||||
| import { useDebounceFn } from "@vueuse/core"; | import { useDebounceFn } from "@vueuse/core"; | ||||||
|  | import _ from "lodash"; | ||||||
| 
 | 
 | ||||||
| const props = defineProps({ | const props = defineProps({ | ||||||
|   filterConfig: { |   filterConfig: { | ||||||
| @ -69,9 +72,6 @@ const props = defineProps({ | |||||||
| const emit = defineEmits(["handleFilt"]); | const emit = defineEmits(["handleFilt"]); | ||||||
| 
 | 
 | ||||||
| const filterData = ref({}); | const filterData = ref({}); | ||||||
| // const filterConfig = ref([]); |  | ||||||
| // const columnConfig = ref([]); |  | ||||||
| // const dataList = ref([]); |  | ||||||
| 
 | 
 | ||||||
| const pageState = reactive({ | const pageState = reactive({ | ||||||
|   page: 1, |   page: 1, | ||||||
| @ -86,21 +86,24 @@ watch( | |||||||
|     newVal.forEach((item) => { |     newVal.forEach((item) => { | ||||||
|       filterData.value[item.name] = undefined; |       filterData.value[item.name] = undefined; | ||||||
|     }); |     }); | ||||||
| 
 |  | ||||||
|     for (let i = 0; i < newVal.length; i++) { |  | ||||||
|       console.log( |  | ||||||
|         "props.filterConfig", |  | ||||||
|         newVal[i].label, |  | ||||||
|         newVal[i].name, |  | ||||||
|         newVal[i].type |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| const getData = () => { | const getData = () => { | ||||||
|  |   const cloneFilter = _.cloneDeep(props.filterConfig); | ||||||
|  |   const filter = cloneFilter | ||||||
|  |     .filter((item) => { | ||||||
|  |       return filterData.value[item.name] !== undefined; | ||||||
|  |     }) | ||||||
|  |     .map((item) => { | ||||||
|  |       return { | ||||||
|  |         name: item.name, | ||||||
|  |         type: item.type, | ||||||
|  |         value: filterData.value[item.name], | ||||||
|  |       }; | ||||||
|  |     }); | ||||||
|   emit("toFilt", { |   emit("toFilt", { | ||||||
|     filter: filterData.value, |     filter, | ||||||
|     page: pageState.page, |     page: pageState.page, | ||||||
|     perPage: pageState.perPage, |     perPage: pageState.perPage, | ||||||
|   }); |   }); | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								src/plugins/antv-g2plot/column.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/plugins/antv-g2plot/column.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | <template> | ||||||
|  |   <div :class="className" :style="style" ref="container"></div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { Column } from "@antv/g2plot"; | ||||||
|  | // hooks | ||||||
|  | import useChart from "./useChart"; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  |   className: { | ||||||
|  |     type: String, | ||||||
|  |     default: "", | ||||||
|  |   }, | ||||||
|  |   style: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  |   config: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const { container } = useChart(Column, props.config); | ||||||
|  | </script> | ||||||
							
								
								
									
										26
									
								
								src/plugins/antv-g2plot/line.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/plugins/antv-g2plot/line.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | <template> | ||||||
|  |   <div :class="className" :style="style" ref="container"></div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { Line } from "@antv/g2plot"; | ||||||
|  | // hooks | ||||||
|  | import useChart from "./useChart"; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  |   className: { | ||||||
|  |     type: String, | ||||||
|  |     default: "", | ||||||
|  |   }, | ||||||
|  |   style: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  |   config: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const { container } = useChart(Line, props.config); | ||||||
|  | </script> | ||||||
							
								
								
									
										26
									
								
								src/plugins/antv-g2plot/pie.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/plugins/antv-g2plot/pie.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | <template> | ||||||
|  |   <div :class="className" :style="style" ref="container"></div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { Pie } from "@antv/g2plot"; | ||||||
|  | // hooks | ||||||
|  | import useChart from "./useChart"; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  |   className: { | ||||||
|  |     type: String, | ||||||
|  |     default: "", | ||||||
|  |   }, | ||||||
|  |   style: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  |   config: { | ||||||
|  |     type: Object, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const { container } = useChart(Pie, props.config); | ||||||
|  | </script> | ||||||
							
								
								
									
										91
									
								
								src/plugins/antv-g2plot/useChart.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/plugins/antv-g2plot/useChart.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | |||||||
|  | import { onBeforeUnmount, onMounted, ref, watch } from "vue"; | ||||||
|  | import _ from "lodash"; | ||||||
|  | 
 | ||||||
|  | export default function useChart(ChartClass, config) { | ||||||
|  |   const chart = ref(null); // 表格实例
 | ||||||
|  |   const chartOptions = ref(null); // 图表配置
 | ||||||
|  |   const container = ref(null); // 渲染图表元素
 | ||||||
|  |   const { onReady, onEvent } = config; | ||||||
|  | 
 | ||||||
|  |   // 全局事件侦听器
 | ||||||
|  |   let handler; | ||||||
|  | 
 | ||||||
|  |   onMounted(() => { | ||||||
|  |     chartOptions.value = _.cloneDeep(config); | ||||||
|  | 
 | ||||||
|  |     // 实例化图表
 | ||||||
|  |     const chartInstance = new ChartClass(container.value, { ...config }); | ||||||
|  |     chartInstance.toDataURL = (type, encoderOptions) => { | ||||||
|  |       return toDataURL(type, encoderOptions); | ||||||
|  |     }; | ||||||
|  |     chartInstance.downloadImage = (name, type, encoderOptions) => { | ||||||
|  |       return downloadImage(name, type, encoderOptions); | ||||||
|  |     }; | ||||||
|  |     chartInstance.render(); // 渲染图表
 | ||||||
|  | 
 | ||||||
|  |     chart.value = chartInstance; | ||||||
|  | 
 | ||||||
|  |     // 图表渲染完成回调
 | ||||||
|  |     if (onReady) { | ||||||
|  |       onReady(chartInstance); | ||||||
|  |     } | ||||||
|  |     // 侦听全局事件
 | ||||||
|  |     handler = (event) => { | ||||||
|  |       if (onEvent) { | ||||||
|  |         onEvent(chartInstance, event); | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |     chartInstance.on("*", handler); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   onBeforeUnmount(() => { | ||||||
|  |     chart.value.destroy(); | ||||||
|  |     chart.value.off("*", handler); | ||||||
|  |     chart.value = undefined; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   // 配置更改时更新图表
 | ||||||
|  |   watch( | ||||||
|  |     () => config, | ||||||
|  |     (config) => { | ||||||
|  |       const newConfig = _.cloneDeep(config); | ||||||
|  |       chartOptions.value = newConfig; | ||||||
|  |       chart.value.update(newConfig); | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       deep: true, | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   const toDataURL = (type = "image/png", encoderOptions) => { | ||||||
|  |     return chart.value?.chart.canvas.cfg.el.toDataURL(type, encoderOptions); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   const downloadImage = ( | ||||||
|  |     name = "download", | ||||||
|  |     type = "image/png", | ||||||
|  |     encoderOptions | ||||||
|  |   ) => { | ||||||
|  |     let imageName = name; | ||||||
|  |     if (name.indexOf(".") === -1) { | ||||||
|  |       imageName = `${name}.${type.split("/")[1]}`; | ||||||
|  |     } | ||||||
|  |     const base64 = chart.value?.chart.canvas.cfg.el.toDataURL( | ||||||
|  |       type, | ||||||
|  |       encoderOptions | ||||||
|  |     ); | ||||||
|  |     let a = document.createElement("a"); | ||||||
|  |     a.href = base64; | ||||||
|  |     a.download = imageName; | ||||||
|  |     document.body.appendChild(a); | ||||||
|  |     a.click(); | ||||||
|  |     document.body.removeChild(a); | ||||||
|  |     a = null; | ||||||
|  |     return imageName; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   return { | ||||||
|  |     chart, | ||||||
|  |     container, | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -74,7 +74,7 @@ const routeList: RouteType[] = [ | |||||||
|             path: 'create-view', |             path: 'create-view', | ||||||
|             name: 'create-view', |             name: 'create-view', | ||||||
|             component: () => import('@/views/view-all-manage/create-view/index.vue'), |             component: () => import('@/views/view-all-manage/create-view/index.vue'), | ||||||
|             meta: { title: '创建' }, |             meta: { title: '创建视图' }, | ||||||
|             isMenu: true, |             isMenu: true, | ||||||
|             children: [], |             children: [], | ||||||
|           }, |           }, | ||||||
|  | |||||||
| @ -200,6 +200,7 @@ const handleCancel = (record) => { | |||||||
| 
 | 
 | ||||||
| const handleSave = (record) => { | const handleSave = (record) => { | ||||||
|   const params = { |   const params = { | ||||||
|  |     field_id: record.field_id, | ||||||
|     field_title: record.field_title, |     field_title: record.field_title, | ||||||
|     field_name: record.field_name, |     field_name: record.field_name, | ||||||
|     is_search: record.is_search, |     is_search: record.is_search, | ||||||
|  | |||||||
| @ -13,6 +13,9 @@ | |||||||
|           v-model:value="formData.project_name" |           v-model:value="formData.project_name" | ||||||
|         /> |         /> | ||||||
|       </a-form-item> |       </a-form-item> | ||||||
|  |       <a-form-item label="项目标识" name="mark"> | ||||||
|  |         <a-input placeholder="请输入项目标识,例如:oa" /> | ||||||
|  |       </a-form-item> | ||||||
|       <a-form-item label="展示状态" name="is_show"> |       <a-form-item label="展示状态" name="is_show"> | ||||||
|         <a-switch |         <a-switch | ||||||
|           v-model:checked="formData.is_show" |           v-model:checked="formData.is_show" | ||||||
| @ -85,6 +88,7 @@ const formRules = { | |||||||
|   project_name: [ |   project_name: [ | ||||||
|     { required: true, message: "请输入项目名称", trigger: "submit" }, |     { required: true, message: "请输入项目名称", trigger: "submit" }, | ||||||
|   ], |   ], | ||||||
|  |   mark: [{ required: true, message: "请输入项目标识", trigger: "submit" }], | ||||||
|   database_address: [ |   database_address: [ | ||||||
|     { required: true, message: "请输入数据库地址", trigger: "submit" }, |     { required: true, message: "请输入数据库地址", trigger: "submit" }, | ||||||
|   ], |   ], | ||||||
| @ -105,6 +109,7 @@ const formRules = { | |||||||
| const formRef = ref(); | const formRef = ref(); | ||||||
| const formData = ref({ | const formData = ref({ | ||||||
|   project_name: undefined, |   project_name: undefined, | ||||||
|  |   mark: undefined, | ||||||
|   is_show: 0, |   is_show: 0, | ||||||
|   database_address: undefined, |   database_address: undefined, | ||||||
|   database_port: undefined, |   database_port: undefined, | ||||||
| @ -159,6 +164,7 @@ const validateConnect = () => { | |||||||
| const resetFormData = () => { | const resetFormData = () => { | ||||||
|   formData.value = { |   formData.value = { | ||||||
|     project_name: undefined, |     project_name: undefined, | ||||||
|  |     mark: undefined, | ||||||
|     is_show: 0, |     is_show: 0, | ||||||
|     database_address: undefined, |     database_address: undefined, | ||||||
|     database_port: undefined, |     database_port: undefined, | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| export const projectCfgCols = [ | export const projectCfgCols = [ | ||||||
|   { dataIndex: 'project_id', title: '编号', align: 'center'}, |   { dataIndex: 'project_id', title: '编号', align: 'center'}, | ||||||
|   { dataIndex: 'project_name', title: '项目名称', align: 'center'}, |   { dataIndex: 'project_name', title: '项目名称', align: 'center'}, | ||||||
|  |   { dataIndex: 'mark', title: '项目标识', align: 'center'}, | ||||||
|   { dataIndex: 'database_name', title: '数据库名', align: 'center'}, |   { dataIndex: 'database_name', title: '数据库名', align: 'center'}, | ||||||
|   { dataIndex: 'is_show', title: '展示状态', align: 'center'}, |   { dataIndex: 'is_show', title: '展示状态', align: 'center'}, | ||||||
|   // { dataIndex: 'sort', title: '排序', align: 'center'},
 |   // { dataIndex: 'sort', title: '排序', align: 'center'},
 | ||||||
|  | |||||||
| @ -56,18 +56,16 @@ | |||||||
|                 :options="item.options" |                 :options="item.options" | ||||||
|                 v-model:value="previewData.filterData[item.name]" |                 v-model:value="previewData.filterData[item.name]" | ||||||
|                 placeholder="请选择" |                 placeholder="请选择" | ||||||
|  |                 allow-clear | ||||||
|                 @change="toFilt" |                 @change="toFilt" | ||||||
|               ></a-select> |               ></a-select> | ||||||
|               <a-input |               <a-input | ||||||
|                 v-else |                 v-if="item.type === 'text'" | ||||||
|                 class="input-item" |                 class="input-item" | ||||||
|                 placeholder="请输入" |                 placeholder="请输入" | ||||||
|  |                 allow-clear | ||||||
|                 v-model:value="previewData.filterData[item.name]" |                 v-model:value="previewData.filterData[item.name]" | ||||||
|                 @change=" |                 @change="toFilt" | ||||||
|                   (e) => { |  | ||||||
|                     toFilt(item.name, e.target.value); |  | ||||||
|                   } |  | ||||||
|                 " |  | ||||||
|               /> |               /> | ||||||
|             </div> |             </div> | ||||||
|           </div> |           </div> | ||||||
| @ -76,6 +74,7 @@ | |||||||
|               :columns="previewData.columnConfig" |               :columns="previewData.columnConfig" | ||||||
|               :data-source="previewData.dataList" |               :data-source="previewData.dataList" | ||||||
|               :pagination="false" |               :pagination="false" | ||||||
|  |               :scroll="{ x: 1200 }" | ||||||
|               size="small" |               size="small" | ||||||
|               bordered |               bordered | ||||||
|             ></a-table> |             ></a-table> | ||||||
| @ -90,6 +89,10 @@ | |||||||
|             /> |             /> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|  |         <div class="preview-area" v-else> | ||||||
|  |           <div><BarChartOutlined /></div> | ||||||
|  |           <div>预览区</div> | ||||||
|  |         </div> | ||||||
|       </div> |       </div> | ||||||
|       <a-modal |       <a-modal | ||||||
|         :open="nameVisible" |         :open="nameVisible" | ||||||
| @ -112,6 +115,7 @@ | |||||||
| import { onMounted, reactive, ref } from "vue"; | import { onMounted, reactive, ref } from "vue"; | ||||||
| import { getProModularField, preview, saveView } from "./service"; | import { getProModularField, preview, saveView } from "./service"; | ||||||
| import { message } from "ant-design-vue"; | import { message } from "ant-design-vue"; | ||||||
|  | import { BarChartOutlined } from "@ant-design/icons-vue"; | ||||||
| 
 | 
 | ||||||
| const projectSel = ref([]); | const projectSel = ref([]); | ||||||
| const modularSel = ref([]); | const modularSel = ref([]); | ||||||
| @ -151,16 +155,33 @@ const onProjectChange = (val) => { | |||||||
|   modularId.value = undefined; |   modularId.value = undefined; | ||||||
|   fieldList.value = []; |   fieldList.value = []; | ||||||
|   fieldIds.value = []; |   fieldIds.value = []; | ||||||
|  |   resetPreviewData(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const onModularChange = (val) => { | const onModularChange = (val) => { | ||||||
|   const target = modularSel.value.find((item) => item.value === val); |   const target = modularSel.value.find((item) => item.value === val); | ||||||
|   fieldList.value = target.child; |   fieldList.value = target.child; | ||||||
|  |   resetPreviewData(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const resetPreviewData = () => { | ||||||
|  |   previewData.type = ""; | ||||||
|  |   previewData.filterConfig = []; | ||||||
|  |   previewData.columnConfig = []; | ||||||
|  |   previewData.dataList = []; | ||||||
|  |   previewData.filterData = {}; | ||||||
|  |   previewData.page = 1; | ||||||
|  |   previewData.perPage = 20; | ||||||
|  |   previewData.total = 0; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const toPreview = () => { | const toPreview = () => { | ||||||
|   previewLoading.value = true; |   previewLoading.value = true; | ||||||
|   const filter = previewData.filterConfig.map((item) => { |   const filter = previewData.filterConfig | ||||||
|  |     .filter((item) => { | ||||||
|  |       return previewData.filterData[item.name] !== undefined; | ||||||
|  |     }) | ||||||
|  |     .map((item) => { | ||||||
|       return { |       return { | ||||||
|         name: item.name, |         name: item.name, | ||||||
|         type: item.type, |         type: item.type, | ||||||
| @ -183,7 +204,6 @@ const toPreview = () => { | |||||||
|             ? previewData.filterData[item.name] |             ? previewData.filterData[item.name] | ||||||
|             : undefined; |             : undefined; | ||||||
|         }); |         }); | ||||||
|         console.log("filterData", previewData.filterData); |  | ||||||
|         previewData.columnConfig = res.data.header; |         previewData.columnConfig = res.data.header; | ||||||
|         previewData.dataList = res.data.data; |         previewData.dataList = res.data.data; | ||||||
|         previewData.total = res.data.count; |         previewData.total = res.data.count; | ||||||
| @ -214,8 +234,7 @@ const toSaveView = () => { | |||||||
|   }); |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const toFilt = (key, value) => { | const toFilt = () => { | ||||||
|   previewData.filterData[key] = value; |  | ||||||
|   previewData.page = 1; |   previewData.page = 1; | ||||||
|   toPreview(); |   toPreview(); | ||||||
| }; | }; | ||||||
| @ -224,13 +243,15 @@ const toFilt = (key, value) => { | |||||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||||
| .normal-container { | .normal-container { | ||||||
|   height: calc(100vh - 120px); |   height: calc(100vh - 120px); | ||||||
|  |   padding: 16px; | ||||||
| } | } | ||||||
| .view-create-box { | .view-create-box { | ||||||
|   display: flex; |   display: flex; | ||||||
|   height: 100%; |   height: 100%; | ||||||
| } | } | ||||||
| .left-box { | .left-box { | ||||||
|   width: 400px; |   width: 320px; | ||||||
|  |   flex-shrink: 0; | ||||||
|   height: calc(100% - 20px); |   height: calc(100% - 20px); | ||||||
|   padding: 10px; |   padding: 10px; | ||||||
|   border-right: 1px solid #ddd; |   border-right: 1px solid #ddd; | ||||||
| @ -243,10 +264,24 @@ const toFilt = (key, value) => { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| .right-box { | .right-box { | ||||||
|   padding: 10px; |   padding: 0 0 0 10px; | ||||||
|   flex-grow: 1; |   flex-grow: 1; | ||||||
|   overflow: auto; |   overflow: auto; | ||||||
| } | } | ||||||
|  | .preview-area { | ||||||
|  |   background-color: #f6f6f6; | ||||||
|  |   height: 100%; | ||||||
|  |   width: 100%; | ||||||
|  |   font-size: 20px; | ||||||
|  |   color: #999; | ||||||
|  |   display: flex; | ||||||
|  |   flex-direction: column; | ||||||
|  |   justify-content: center; | ||||||
|  |   align-items: center; | ||||||
|  |   .anticon-bar-chart { | ||||||
|  |     font-size: 100px; | ||||||
|  |   } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| .y-table-filter { | .y-table-filter { | ||||||
|   display: flex; |   display: flex; | ||||||
| @ -264,5 +299,6 @@ const toFilt = (key, value) => { | |||||||
| } | } | ||||||
| .pagination-box { | .pagination-box { | ||||||
|   text-align: center; |   text-align: center; | ||||||
|  |   margin-top: 10px; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  | |||||||
| @ -40,7 +40,26 @@ | |||||||
|           " |           " | ||||||
|           size="small" |           size="small" | ||||||
|           bordered |           bordered | ||||||
|         ></a-table> |         > | ||||||
|  |           <template #bodyCell="{ column, record }"> | ||||||
|  |             <template v-if="column.dataIndex === 'action'"> | ||||||
|  |               <a-popconfirm | ||||||
|  |                 title="确定删除?" | ||||||
|  |                 @confirm="toDelete(record.preview_id)" | ||||||
|  |               > | ||||||
|  |                 <a-button | ||||||
|  |                   type="link" | ||||||
|  |                   @click=" | ||||||
|  |                     (e) => { | ||||||
|  |                       e.stopPropagation(); | ||||||
|  |                     } | ||||||
|  |                   " | ||||||
|  |                   >删除</a-button | ||||||
|  |                 > | ||||||
|  |               </a-popconfirm> | ||||||
|  |             </template> | ||||||
|  |           </template> | ||||||
|  |         </a-table> | ||||||
|         <a-pagination |         <a-pagination | ||||||
|           v-model:current="pageState.page" |           v-model:current="pageState.page" | ||||||
|           :total="pageState.total" |           :total="pageState.total" | ||||||
| @ -64,6 +83,10 @@ | |||||||
|             } |             } | ||||||
|           " |           " | ||||||
|         /> |         /> | ||||||
|  |         <div class="preview-area" v-else> | ||||||
|  |           <div><BarChartOutlined /></div> | ||||||
|  |           <div>展示区</div> | ||||||
|  |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| @ -71,9 +94,11 @@ | |||||||
| 
 | 
 | ||||||
| <script setup> | <script setup> | ||||||
| import { onMounted, ref, reactive } from "vue"; | import { onMounted, ref, reactive } from "vue"; | ||||||
| import { getProModular, getViewList, getViewInfo } from "./service"; | import { getProModular, getViewList, getViewInfo, deleteView } from "./service"; | ||||||
| import { viewListCols } from "./config"; | import { viewListCols } from "./config"; | ||||||
| import yTable from "@/components/common/y-table.vue"; | import yTable from "@/components/common/y-table.vue"; | ||||||
|  | import { message } from "ant-design-vue"; | ||||||
|  | import { BarChartOutlined } from "@ant-design/icons-vue"; | ||||||
| 
 | 
 | ||||||
| const projectSel = ref([]); | const projectSel = ref([]); | ||||||
| const modularSel = ref([]); | const modularSel = ref([]); | ||||||
| @ -83,6 +108,7 @@ const dataList = ref([]); | |||||||
| const selectedRowId = ref(); | const selectedRowId = ref(); | ||||||
| const selectViewInfo = ref({ | const selectViewInfo = ref({ | ||||||
|   type: "", |   type: "", | ||||||
|  |   filter: [], | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| const pageState = reactive({ | const pageState = reactive({ | ||||||
| @ -130,11 +156,19 @@ const onModularChange = () => { | |||||||
|   pageState.page = 1; |   pageState.page = 1; | ||||||
|   toGetList(); |   toGetList(); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | const toDelete = (previewId) => { | ||||||
|  |   deleteView({ previewId }).then(() => { | ||||||
|  |     message.success("删除成功"); | ||||||
|  |     toGetList(); | ||||||
|  |   }); | ||||||
|  | }; | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||||
| .normal-container { | .normal-container { | ||||||
|   height: calc(100vh - 120px); |   height: calc(100vh - 120px); | ||||||
|  |   padding: 16px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .view-list-box { | .view-list-box { | ||||||
| @ -143,14 +177,20 @@ const onModularChange = () => { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .left-box { | .left-box { | ||||||
|   width: 400px; |   width: 320px; | ||||||
|   height: calc(100% - 20px); |   height: calc(100% - 20px); | ||||||
|   padding: 10px; |   padding: 10px; | ||||||
|  |   flex-shrink: 0; | ||||||
|   border-right: 1px solid #ddd; |   border-right: 1px solid #ddd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .selected-row { | :deep(.ant-table-row:hover) { | ||||||
|   background-color: beige; |   cursor: pointer; | ||||||
|  |   background-color: #e6f4ff; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :deep(.selected-row) { | ||||||
|  |   background-color: #e6f4ff; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .pagination-box { | .pagination-box { | ||||||
| @ -158,8 +198,23 @@ const onModularChange = () => { | |||||||
|   margin-top: 10px; |   margin-top: 10px; | ||||||
| } | } | ||||||
| .right-box { | .right-box { | ||||||
|   padding: 10px; |   padding: 0 0 0 10px; | ||||||
|   flex-grow: 1; |   flex-grow: 1; | ||||||
|   overflow: auto; |   overflow: auto; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | .preview-area { | ||||||
|  |   background-color: #f6f6f6; | ||||||
|  |   height: 100%; | ||||||
|  |   width: 100%; | ||||||
|  |   font-size: 20px; | ||||||
|  |   color: #999; | ||||||
|  |   display: flex; | ||||||
|  |   flex-direction: column; | ||||||
|  |   justify-content: center; | ||||||
|  |   align-items: center; | ||||||
|  |   .anticon-bar-chart { | ||||||
|  |     font-size: 100px; | ||||||
|  |   } | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import { get } from "@/utils/request"; | import { get, post } from "@/utils/request"; | ||||||
| 
 | 
 | ||||||
| // 联动下拉
 | // 联动下拉
 | ||||||
| export function getProModular() { | export function getProModular() { | ||||||
| @ -24,15 +24,25 @@ export function getViewInfo({ | |||||||
|   previewId, |   previewId, | ||||||
|   page = 1, |   page = 1, | ||||||
|   perPage = 20, |   perPage = 20, | ||||||
|   filter = {}, |   filter = [], | ||||||
| }) { | }) { | ||||||
|   return get({ |   return post({ | ||||||
|     url: "/api/v1/preview/info", |     url: "/api/v1/preview/info", | ||||||
|     params: { |     data: { | ||||||
|       preview_id: previewId, |       preview_id: previewId, | ||||||
|       page, |       page, | ||||||
|       perPage: perPage, |       per_page: perPage, | ||||||
|       filter, |       filter, | ||||||
|     }, |     }, | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // 删除视图
 | ||||||
|  | export function deleteView({ previewId }) { | ||||||
|  |   return post({ | ||||||
|  |     url: "/api/v1/preview/del", | ||||||
|  |     data: { | ||||||
|  |       preview_id: previewId, | ||||||
|  |     }, | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 sy2084
						sy2084