Эх сурвалжийг харах

生成代码页面、复制接口参数

picasso 3 жил өмнө
parent
commit
1f5aee1bcf

+ 1 - 1
package-lock.json

@@ -1365,7 +1365,7 @@
       "dependencies": {
         "@popperjs/core": {
           "version": "npm:@sxzz/popperjs-es@2.11.7",
-          "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
           "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
         }
       }

+ 326 - 0
src/views/developTool/codeGeneration/component/buildConfig.vue

@@ -0,0 +1,326 @@
+<template>
+	<el-dialog title="生成配置" v-model="state.dialogVisible" width="769px">
+		<el-form ref="form" :model="state.ruleForm" label-width="80px">
+			<el-form-item label="上级菜单">
+				<el-cascader :options="state.options" :props="state.props" clearable style="width: 100%;"/>
+			</el-form-item>
+		</el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="default" @click="state.dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="state.dialogVisible = false">编 辑</el-button>
+      </div>
+    </template>
+	</el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { reactive, ref } from 'vue';
+import api from '/@/api/device';
+import { ElMessage } from 'element-plus';
+
+const tagOption = ref(['api', 'editVue', 'entity', 'jsApi', 'listVue', 'router', 'service'])
+const state = reactive({
+	dialogVisible: false,
+	props: {
+		checkStrictly: true,
+	},
+	ruleForm: {},
+	options: [
+		{
+			value: 'guide',
+			label: 'Guide',
+			children: [
+				{
+					value: 'disciplines',
+					label: 'Disciplines',
+					children: [
+						{
+							value: 'consistency',
+							label: 'Consistency',
+						},
+						{
+							value: 'feedback',
+							label: 'Feedback',
+						},
+						{
+							value: 'efficiency',
+							label: 'Efficiency',
+						},
+						{
+							value: 'controllability',
+							label: 'Controllability',
+						},
+					],
+				},
+				{
+					value: 'navigation',
+					label: 'Navigation',
+					children: [
+						{
+							value: 'side nav',
+							label: 'Side Navigation',
+						},
+						{
+							value: 'top nav',
+							label: 'Top Navigation',
+						},
+					],
+				},
+			],
+		},
+		{
+			value: 'component',
+			label: 'Component',
+			children: [
+				{
+					value: 'basic',
+					label: 'Basic',
+					children: [
+						{
+							value: 'layout',
+							label: 'Layout',
+						},
+						{
+							value: 'color',
+							label: 'Color',
+						},
+						{
+							value: 'typography',
+							label: 'Typography',
+						},
+						{
+							value: 'icon',
+							label: 'Icon',
+						},
+						{
+							value: 'button',
+							label: 'Button',
+						},
+					],
+				},
+				{
+					value: 'form',
+					label: 'Form',
+					children: [
+						{
+							value: 'radio',
+							label: 'Radio',
+						},
+						{
+							value: 'checkbox',
+							label: 'Checkbox',
+						},
+						{
+							value: 'input',
+							label: 'Input',
+						},
+						{
+							value: 'input-number',
+							label: 'InputNumber',
+						},
+						{
+							value: 'select',
+							label: 'Select',
+						},
+						{
+							value: 'cascader',
+							label: 'Cascader',
+						},
+						{
+							value: 'switch',
+							label: 'Switch',
+						},
+						{
+							value: 'slider',
+							label: 'Slider',
+						},
+						{
+							value: 'time-picker',
+							label: 'TimePicker',
+						},
+						{
+							value: 'date-picker',
+							label: 'DatePicker',
+						},
+						{
+							value: 'datetime-picker',
+							label: 'DateTimePicker',
+						},
+						{
+							value: 'upload',
+							label: 'Upload',
+						},
+						{
+							value: 'rate',
+							label: 'Rate',
+						},
+						{
+							value: 'form',
+							label: 'Form',
+						},
+					],
+				},
+				{
+					value: 'data',
+					label: 'Data',
+					children: [
+						{
+							value: 'table',
+							label: 'Table',
+						},
+						{
+							value: 'tag',
+							label: 'Tag',
+						},
+						{
+							value: 'progress',
+							label: 'Progress',
+						},
+						{
+							value: 'tree',
+							label: 'Tree',
+						},
+						{
+							value: 'pagination',
+							label: 'Pagination',
+						},
+						{
+							value: 'badge',
+							label: 'Badge',
+						},
+					],
+				},
+				{
+					value: 'notice',
+					label: 'Notice',
+					children: [
+						{
+							value: 'alert',
+							label: 'Alert',
+						},
+						{
+							value: 'loading',
+							label: 'Loading',
+						},
+						{
+							value: 'message',
+							label: 'Message',
+						},
+						{
+							value: 'message-box',
+							label: 'MessageBox',
+						},
+						{
+							value: 'notification',
+							label: 'Notification',
+						},
+					],
+				},
+				{
+					value: 'navigation',
+					label: 'Navigation',
+					children: [
+						{
+							value: 'menu',
+							label: 'Menu',
+						},
+						{
+							value: 'tabs',
+							label: 'Tabs',
+						},
+						{
+							value: 'breadcrumb',
+							label: 'Breadcrumb',
+						},
+						{
+							value: 'dropdown',
+							label: 'Dropdown',
+						},
+						{
+							value: 'steps',
+							label: 'Steps',
+						},
+					],
+				},
+				{
+					value: 'others',
+					label: 'Others',
+					children: [
+						{
+							value: 'dialog',
+							label: 'Dialog',
+						},
+						{
+							value: 'tooltip',
+							label: 'Tooltip',
+						},
+						{
+							value: 'popover',
+							label: 'Popover',
+						},
+						{
+							value: 'card',
+							label: 'Card',
+						},
+						{
+							value: 'carousel',
+							label: 'Carousel',
+						},
+						{
+							value: 'collapse',
+							label: 'Collapse',
+						},
+					],
+				},
+			],
+		},
+		{
+			value: 'resource',
+			label: 'Resource',
+			children: [
+				{
+					value: 'axure',
+					label: 'Axure Components',
+				},
+				{
+					value: 'sketch',
+					label: 'Sketch Templates',
+				},
+				{
+					value: 'docs',
+					label: 'Design Documentation',
+				},
+			],
+		},
+	]
+});
+// 打开弹窗
+const openDialog = (row: any) => {
+	if (row) {
+		state.ruleForm = row;
+	}
+	state.dialogVisible = true;
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+
+
+defineExpose({ openDialog });
+</script>
+
+<style scoped lang="scss">
+:deep(.el-dialog__body) {
+	max-height: calc(90vh - 111px)!important;
+	overflow-y: auto;
+	overflow-x: hidden;
+}
+</style>

+ 65 - 0
src/views/developTool/codeGeneration/component/detail.vue

@@ -0,0 +1,65 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog title="换热站详情" v-model="isShowDialog" width="575px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
+				<el-form-item label="换热站名称" prop="name">
+					{{ ruleForm.name }}
+				</el-form-item>
+				<el-form-item label="换热站位置" prop="position">
+					{{ ruleForm.position }}
+				</el-form-item>
+				<el-form-item label="负责人" prop="principalInfo.userNickname">
+					{{ ruleForm.principalInfo.userNickname }}
+				</el-form-item>
+				<el-form-item label="状态" prop="status">
+					{{ ruleForm.status === 1 ? '在线' : '不在线' }}
+				</el-form-item>
+        <el-form-item label="地图展示" prop="">
+					<div>
+						<span>经度:{{ ruleForm.lnt ? `${ruleForm.lnt},` : '' }}</span>
+						<span style="margin-left: 10px">纬度:{{ ruleForm.lat }}</span>
+					</div>
+				</el-form-item>
+			</el-form>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/device';
+import { ElMessage } from 'element-plus';
+
+
+export default defineComponent({
+	name: 'deviceEditPro',
+	setup(prop, { emit }) {
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {}
+		});
+		// 打开弹窗
+		const openDialog = (row: any) => {
+			if (row) {
+				state.ruleForm = row;
+			}
+			state.isShowDialog = true;
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			...toRefs(state),
+		};
+	},
+});
+</script>

+ 273 - 0
src/views/developTool/codeGeneration/component/edit.vue

@@ -0,0 +1,273 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '换热站'" v-model="dialogVisible" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
+				<el-form-item label="所属换热站" prop="">
+					<el-tree-select
+						v-model="ruleForm.parentId"
+						:data="treeData"
+						:props="{
+							label: 'name',
+							children: 'children'
+						}"
+						node-key="id"
+						:clearable="true"
+						check-strictly
+						style="width: 100%;"
+						:render-after-expand="true"
+					/>
+				</el-form-item>
+				<el-form-item label="换热站名称" prop="name">
+					<el-input v-model="ruleForm.name" placeholder="请输入换热站名称" />
+				</el-form-item>
+				<el-form-item label="换热站位置" prop="position">
+					<el-input v-model="ruleForm.position" placeholder="请输入换热站位置" />
+				</el-form-item>
+				<el-form-item label="负责人" prop="principal">
+					<!-- <el-input v-model="ruleForm.principal" placeholder="请输入负责人" /> -->
+					<el-select v-model="ruleForm.principal" clearable style="width: 100%;" placeholder="请选择">
+						<el-option
+							v-for="item in userList"
+							:key="item.id"
+							:label="item.userNickname"
+							:value="item.id">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="状态" prop="status">
+					<el-radio v-model="ruleForm.status" :label="1">在线</el-radio>
+					<el-radio v-model="ruleForm.status" :label="0">不在线</el-radio>
+				</el-form-item>
+				<el-form-item label="数据模型" prop="dataTemplateIds">
+					<el-select v-model="ruleForm.dataTemplateIds" multiple clearable style="width: 100%;" placeholder="请选择">
+						<el-option
+							v-for="item in dataHubList"
+							:key="item.id"
+							:label="item.name"
+							:value="item.id">
+						</el-option>
+					</el-select>
+				</el-form-item>
+        <el-form-item label="地图展示" prop="decade">
+					<div>
+						<span>经度:{{ ruleForm.lnt ? `${ruleForm.lnt},` : '' }}</span>
+						<span style="margin-left: 10px">纬度:{{ ruleForm.lat }}</span>
+					</div>
+					<div class="mb10" style="width: 100%">
+						<el-input v-model="keyword" @change="onLocalChange" placeholder="请输入关键字进行搜索" clearable style="width: 100%;"></el-input>
+					</div>
+					<div style="width: 100%; height: 300px" id="map-container"></div>
+        </el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref, nextTick, onMounted } from 'vue';
+import api from '/@/api/heatStation';
+import userApi from '/@/api/system';
+import datahubApi from '/@/api/datahub';
+import { ElMessage } from 'element-plus';
+import { useStore } from '/@/store/index';
+interface RuleFormState {
+	id: number;
+	parentId: number | string;
+	name: string;
+	position: string;
+	lnt: number;
+	lat: number;
+	principal: string;
+	types: number;
+	status: number;
+}
+
+export default defineComponent({
+	name: 'headStationLoop',
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+		const state = reactive({
+			dialogVisible: false,
+			map: null,
+			ruleForm: {
+				id: 0,
+				parentId: '',
+				name: '',
+				position: '',
+				lnt: '',
+				lat: '',
+				principal: '',
+				types: 1,
+				status: 1
+			},
+			keyword: '',
+			rules: {
+				name: [{ required: true, message: '换热站名称不能为空', trigger: 'blur' }],
+				position: [{ required: true, message: '换热站位置不能为空', trigger: 'blur' }],
+				principal: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
+				status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
+			},
+			treeData: [],
+			dataHubList: [],
+			userList: [],
+			mapLocal: null as any
+		})
+		const store = useStore();
+		// 打开弹窗
+		const openDialog = (row: any, tree: any) => {
+			resetForm()
+			queryDataHubList()
+			queryUserList()
+			state.treeData = tree
+
+			if (row) {
+				(state.ruleForm as any).id = row.id
+				getDetail()
+			}
+			nextTick(() => {
+				initMap()
+			}) 
+			state.dialogVisible = true
+		}
+		
+		const queryDataHubList = () => {
+			datahubApi.template.allList({})
+				.then((res: any) => {
+					state.dataHubList = res.list || [];
+				});
+		};
+		const queryUserList = () => {
+			userApi.user.getAllList({})
+				.then((res: any) => {
+					state.userList = res || [];
+				});
+		};
+		const resetForm = () => {
+			state.ruleForm = {
+				id: 0,
+				parentId: '',
+				name: '',
+				position: '',
+				lnt: '',
+				lat: '',
+				principal: '',
+				types: 1,
+				status: 1
+			}
+		}
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.dialogVisible = false
+		}
+		// 取消
+		const onCancel = () => {
+			closeDialog()
+			state.keyword = ''
+		}
+		const getDetail = () => {
+			api.heatStation.detail(state.ruleForm.id)
+				.then((res: any) => {
+					state.ruleForm = {
+						...res,
+						parentId: res.parentId === -1 ? '' : res.parentId
+					}
+				})
+		}
+		// 新增
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					let params = { ...state.ruleForm };
+					(params.parentId as any) = params.parentId || -1
+					if (state.ruleForm.id) {
+						//修改
+						api.heatStation.edit(params).then(() => {
+							ElMessage.success('换热站修改成功')
+							emit('queryList')
+							closeDialog() // 关闭弹窗
+						})
+					} else {
+						//添加
+						api.heatStation.add(params).then(() => {
+							ElMessage.success('换热站添加成功')
+							emit('queryList')
+							closeDialog() // 关闭弹窗
+						})
+					}
+				}
+			})
+		}
+		const initMap = () => {
+			let BMapGL = (window as any).BMapGL
+			let map = new BMapGL.Map("map-container");
+			// 获取布局配置信息
+			let getThemeConfig =  store.state.themeConfig.themeConfig;
+			// 116.404, 39.915
+			let point = new BMapGL.Point(state.ruleForm.lnt || 116.404, state.ruleForm.lat || 39.915);
+			let zoomCtrl = new BMapGL.ZoomControl();  // 添加缩放控件
+			let cityCtrl = new BMapGL.CityListControl()
+			if(getThemeConfig.isIsDark) {
+				map.setMapStyleV2({     
+					styleId: 'b8d841ee37fd5bd41e742049b6fcd0f5'
+				});
+			}
+
+			map.centerAndZoom(point, 15); 
+			
+			map.enableScrollWheelZoom(true); // 开启滚轮缩放
+			map.addControl(zoomCtrl);
+			map.addControl(cityCtrl);
+			if (state.ruleForm.lnt && state.ruleForm.lat) {
+				let marker = new BMapGL.Marker(new BMapGL.Point(state.ruleForm.lnt, state.ruleForm.lat));
+				// 在地图上添加点标记
+				map.addOverlay(marker);
+			}
+
+			state.mapLocal = new BMapGL.LocalSearch(map, {
+				renderOptions:{map: map}
+			})
+
+			map.addEventListener('click', (e: any) => {
+				console.log('map--click', e)
+				let point = e.latlng
+				state.ruleForm.lnt = point.lng
+				state.ruleForm.lat = point.lat
+			})
+		}
+
+		const onLocalChange = () => {
+			state.mapLocal.search(state.keyword)
+		}
+
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			onLocalChange,
+			// onMapClick,
+			// onMarkersset,
+			// mapReady,
+			...toRefs(state)
+		}
+	}
+})
+</script>
+
+<style scoped lang="scss">
+.mb10 {
+	margin-bottom: 10px;
+}
+.mr10 {
+	margin-right: 10px;
+}
+</style>

+ 421 - 0
src/views/developTool/codeGeneration/component/editParams.vue

@@ -0,0 +1,421 @@
+<template>
+	<el-dialog title="编辑表结构" v-model="state.dialogVisible" width="80%">
+		<el-tabs v-model="state.activeName" @tab-click="onTabClick">
+			<el-tab-pane label="基本信息" name="1">
+				<el-form ref="ruleForm" :model="state.ruleForm" label-width="120px">
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="表名称" prop="tableName">
+								<el-input size="default" v-model="state.ruleForm.tableName"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="表描述" prop="tableComment">
+								<el-input size="default" v-model="state.ruleForm.tableComment"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="实体类名称" prop="className">
+								<el-input size="default" v-model="state.ruleForm.className"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="作者" prop="functionAuthor">
+								<el-input size="default" v-model="state.ruleForm.functionAuthor"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-form-item label="备注" prop="remark">
+						<el-input size="default" type="textarea" :rows="6" v-model="state.ruleForm.remark"></el-input>
+					</el-form-item>
+				</el-form>
+			</el-tab-pane>
+			<el-tab-pane label="字段信息" name="2">
+				<!-- v-loading="state.tableData.loading"  -->
+				<el-table :data="state.columns" style="width: 100%">
+					<el-table-column label="字段描述" align="center" width="150" fixed="left">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.columnComment" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="序号" type="index" width="60" align="center" />
+					<el-table-column label="字段列名" prop="columnName" width="150"> </el-table-column>
+					<el-table-column label="物理类型" prop="columnType" width="120"> </el-table-column>
+					<el-table-column label="go类型" prop="goType" width="120">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.goType" placeholder="">
+								<el-option label="int" value="int" />
+								<el-option label="unit" value="unit" />
+								<el-option label="int64" value="int64" />
+								<el-option label="unit64" value="unit64" />
+								<el-option label="float64" value="float64" />
+								<el-option label="string" value="string" />
+								<el-option label="Time" value="Time" />
+								<el-option label="byte" value="byte" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="go属性" prop="goField" width="150">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.goField" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="json属性" prop="jsonField" width="150">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.jsonField" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="插入" prop="isInsert" width="70">
+						<template #default="{ row }">
+							<!-- 1 0 -->
+							<el-checkbox size="default" v-model="row.isInsert"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="编辑" prop="isEdit" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isEdit"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="列表" prop="isList" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isList"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="查询" prop="isQuery" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isQuery"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="必填" prop="isRequired" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isRequired"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="查询方式" prop="queryType" width="120">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.queryType" placeholder="">
+								<el-option label="=" value="EQ" />
+								<el-option label="!=" value="NE" />
+								<el-option label=">" value="GT" />
+								<el-option label=">=" value="GTE" />
+								<el-option label="<" value="LT" />
+								<el-option label="<=" value="LTE" />
+								<el-option label="LIKE" value="LIKE" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="显示类型" prop="htmlType" width="140">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.htmlType" placeholder="">
+								<el-option label="文本框" value="input" />
+								<el-option label="下拉框" value="select" />
+								<el-option label="开关" value="switch" />
+								<el-option label="单选框" value="radio" />
+								<el-option label="多选框" value="checkbox" />
+								<el-option label="文件选择" value="file" />
+								<el-option label="文本域" value="textarea" />
+								<el-option label="日期控件" value="datetime" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="字典类型" prop="dictType" width="160">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.dictType" placeholder="">
+								<el-option v-for="item in []" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="关系表" prop="linkTableName" width="160">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.linkTableName" placeholder="">
+								<el-option v-for="item in []" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+							</el-select>
+						</template>
+					</el-table-column>
+				</el-table>
+			</el-tab-pane>
+			<el-tab-pane label="生成信息" name="3">
+				<el-form ref="ruleForm" :model="state.ruleForm" label-width="120px">
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="指定应用名" prop="packageName">
+								<el-input size="default" v-model="state.ruleForm.packageName"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="生成模块名" prop="moduleName">
+								<el-input size="default" v-model="state.ruleForm.moduleName"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="生成业务名" prop="businessName">
+								<el-input size="default" v-model="state.ruleForm.businessName"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="生成功能名" prop="functionName">
+								<el-input size="default" v-model="state.ruleForm.functionName"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</el-form>
+			</el-tab-pane>
+		</el-tabs>
+
+		<template #footer>
+			<div class="dialog-footer">
+				<el-button type="default" @click="state.dialogVisible = false">取 消</el-button>
+				<el-button type="primary" @click="state.dialogVisible = false">提 交</el-button>
+			</div>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { reactive, ref } from 'vue';
+import api from '/@/api/device';
+import { ElMessage } from 'element-plus';
+
+const tagOption = ref(['api', 'editVue', 'entity', 'jsApi', 'listVue', 'router', 'service']);
+const state = reactive({
+	dialogVisible: false,
+	activeName: '1',
+	ruleForm: {},
+	columns: [
+		{
+			columnId: 29,
+			tableId: 3,
+			TableName: '',
+			columnName: 'business_type',
+			columnComment: '0其它 1新增 2修改 3删除',
+			columnType: 'varchar(1)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'BusinessType',
+			jsonField: 'businessType',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'datetime',
+			dictType: '',
+			sort: 3,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 31,
+			tableId: 3,
+			TableName: '',
+			columnName: 'method',
+			columnComment: '请求方法',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'Method',
+			jsonField: 'method',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 4,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 33,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_name',
+			columnComment: '操作人员',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperName',
+			jsonField: 'operName',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '1',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'LIKE',
+			htmlType: 'input',
+			dictType: '',
+			sort: 5,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 35,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_url',
+			columnComment: '操作url',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperUrl',
+			jsonField: 'operUrl',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 6,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 37,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_ip',
+			columnComment: '操作IP',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperIp',
+			jsonField: 'operIp',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 7,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 41,
+			tableId: 3,
+			TableName: '',
+			columnName: 'status',
+			columnComment: '0=正常,1=异常',
+			columnType: 'varchar(1)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'Status',
+			jsonField: 'status',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '1',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'radio',
+			dictType: '',
+			sort: 10,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 42,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_id',
+			columnComment: '',
+			columnType: 'bigint(20)',
+			columnKey: '',
+			goType: 'int64',
+			goField: 'OperId',
+			jsonField: 'operId',
+			htmlField: '',
+			isPk: '1',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '0',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 1,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+	],
+});
+// 打开弹窗
+const openDialog = (row: any) => {
+	if (row) {
+		state.ruleForm = row;
+	}
+	state.dialogVisible = true;
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+const onTabClick = () => {};
+
+defineExpose({ openDialog });
+</script>
+
+<style scoped lang="scss">
+:deep(.el-dialog__body) {
+	max-height: calc(90vh - 111px) !important;
+	overflow-y: auto;
+	overflow-x: hidden;
+}
+</style>

+ 56 - 0
src/views/developTool/codeGeneration/component/preview.vue

@@ -0,0 +1,56 @@
+<template>
+	<el-dialog title="预览" v-model="state.dialogVisible" width="80%">
+		<div class="mb-4">
+			<el-button type="primary" size="small" plain v-for="tag in tagOption" :key="tag">{{ tag }}</el-button>
+		</div>
+
+		<div style="background: #000; color: #fff; height: 300px;">
+			代码区域
+		</div>
+		
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button type="primary" @click="state.dialogVisible = false" size="default">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { reactive, ref } from 'vue';
+import api from '/@/api/device';
+import { ElMessage } from 'element-plus';
+
+const tagOption = ref(['api', 'editVue', 'entity', 'jsApi', 'listVue', 'router', 'service'])
+const state = reactive({
+	dialogVisible: false,
+	ruleForm: {}
+});
+// 打开弹窗
+const openDialog = (row: any) => {
+	if (row) {
+		state.ruleForm = row;
+	}
+	state.dialogVisible = true;
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+
+
+defineExpose({ openDialog });
+</script>
+
+<style scoped lang="scss">
+:deep(.el-dialog__body) {
+	max-height: calc(90vh - 111px)!important;
+	overflow-y: auto;
+	overflow-x: hidden;
+}
+</style>

+ 191 - 0
src/views/developTool/codeGeneration/index.vue

@@ -0,0 +1,191 @@
+<template>
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+      <div class="system-user-search mb15">
+        <el-form :model="state.tableData.param" ref="queryRef" :inline="true" label-width="100px">
+          <el-form-item label="表名称" prop="tableName">
+            <el-input v-model="state.tableData.param.tableName" placeholder="请输入表名称" clearable size="default" @keyup.enter="queryList" />
+          </el-form-item>
+		  		<el-form-item label="表描述" prop="tableComment">
+            <el-input v-model="state.tableData.param.tableComment" placeholder="请输入表描述" clearable size="default" @keyup.enter="queryList" />
+          </el-form-item>
+          <el-form-item>
+            <el-button size="default" type="primary" class="ml10" @click="queryList">
+              <el-icon>
+                <ele-Search />
+              </el-icon>
+              查询
+            </el-button>
+            <el-button size="default" @click="resetQuery(queryRef)">
+              <el-icon>
+                <ele-Refresh />
+              </el-icon>
+              重置
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+			
+      <el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="ID" align="center" prop="tableId" width="60" />
+	    	<el-table-column label="表名称" prop="tableName" :show-overflow-tooltip="true" />
+	    	<el-table-column label="表描述" prop="tableComment" :show-overflow-tooltip="true" />
+	    	<el-table-column label="模型名称" prop="className" :show-overflow-tooltip="true" />
+	    	<el-table-column label="创建时间" prop="createTime" min-width="100"/>
+	    	<el-table-column label="更新时间" prop="updateTime" min-width="100"/>
+				<el-table-column label="操作" width="280" align="center" fixed="right">
+          <template #default="scope">
+			 			<el-button size="small" text type="primary" @click="operate('preview', scope.row)">预览</el-button>
+            <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">参数编辑</el-button>
+            <el-button size="small" text type="primary" @click="operate('', scope.row)">代码生成</el-button>
+            <el-button size="small" text type="primary" @click="operate('buildConfig', scope.row)">生成配置</el-button>
+            <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+				v-show="state.tableData.total>0"
+				:total="state.tableData.total"
+				v-model:page="state.tableData.param.pageNum"
+				v-model:limit="state.tableData.param.pageSize"
+				@pagination="queryList"
+			/>
+    </el-card>
+    <!-- <EditDic ref="editDicRef" :treeData="tableData.data" @queryList="queryList" />
+    <Detail ref="detailRef"  /> -->
+		<Preview ref="previewRef"/>
+		<EditParams ref="editParamsRef"/>
+		<BuildConfig ref="buildConfigRef"/>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import EditDic from './component/edit.vue';
+import Detail from './component/detail.vue';
+import Preview from './component/preview.vue';
+import EditParams from './component/editParams.vue';
+import BuildConfig from './component/buildConfig.vue';
+import api from '/@/api/heatStation';
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	id: number;
+	name: string;
+	code: string;
+	stationId: string;
+	loopTypes: number;
+	energyTypes: number;
+	heatingObject: number;
+	heatingTypes: number;
+	heatingArea: string;
+	forRealArea: string;
+	decade: string;
+	status: number;
+}
+interface TableDataState {
+	ids: number[];
+	tableData: {
+		data: Array<TableDataRow>;
+		loading: boolean;
+		param: {
+			name: string;
+			code: string;
+			status: number;
+		};
+	};
+}
+
+const addDicRef = ref();
+const editDicRef = ref();
+const detailRef = ref();
+const previewRef = ref();
+const editParamsRef = ref();
+const buildConfigRef = ref();
+const queryRef = ref();
+const state = reactive({
+	ids: [],
+	tableData: {
+		data: [{
+			"tableId": 3,
+			"tableName": "log_opers",
+			"tableComment": "LogOpers",
+			"className": "LogOpers",
+			"tplCategory": "crud",
+			"packageName": "admin",
+			"moduleName": "log-opers",
+			"businessName": "logOpers",
+			"functionName": "LogOpers",
+			"functionAuthor": "panda",
+			"options": "",
+			"remark": "",
+			"pkColumn": "oper_id",
+			"pkGoField": "OperId",
+			"pkJsonField": "operId",
+			"columns": null,
+			"createTime": "2022-01-06 15:02:45",
+			"updateTime": "2022-01-06 15:02:45"
+		}],
+		loading: false,
+		param: {
+			tableName: '',
+			tableComment: '',
+			status: -1
+		},
+	},
+});
+// 初始化表格数据
+const initTableData = () => {
+	queryList();
+};
+const queryList = () => {
+	// state.tableData.loading = true
+	// api.heatStation.getList(state.tableData.param)
+	// 	.then((res: any) => {
+	// 		state.tableData.data = res || [];
+	// 		state.tableData.loading = false
+	// 	});
+};
+
+// 页面加载时
+onMounted(() => {
+	initTableData();
+});
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+
+const operate = (type: string, row: any) => {
+	switch(type) {
+		case 'preview':
+			console.log(previewRef.value)
+			previewRef.value.openDialog(row)
+			break
+		case 'editParams':
+			editParamsRef.value.openDialog(row)
+			break
+		case 'buildConfig':
+			buildConfigRef.value.openDialog(row)
+			break
+		case 'delete':
+			ElMessageBox.confirm(`是否确认删除TABLE编号为"${row.tableId}"的数据项?`, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(() => {
+					// api.heatStation.del(row.id).then(() => {
+					// 	ElMessage.success('删除成功');
+					// 	queryList();
+					// });
+				})
+				.catch(() => {});
+			break
+	}
+}
+</script>