Browse Source

feat: 数据源

luoyali 8 months ago
parent
commit
6a21a88caf

+ 29 - 3
src/api/codeGenerate/database.ts

@@ -8,7 +8,31 @@ const api = {
 	update: '/gen/database/update',
 	delete: '/gen/database/delete',
 	listSelectOptions: '/gen/database/list-select-options',
-	get: '/gen/database/get'
+	get: '/gen/database/get',
+	codePreview: '/gen/table/preview', // 预览代码 post请求
+	codeDownload: '/gen/table/download' // 下载代码 post请求
+}
+
+/**
+ * 代码生成 - 预览代码
+ */
+function codePreviewApi(data: any): AxiosPromise {
+	return request({
+		url: api.codePreview,
+		method: 'post',
+		params: data
+	})
+}
+
+/**
+ * 代码生成 - 下载代码
+ */
+function codeDownloadApi(data: any): AxiosPromise {
+	return request({
+		url: api.codeDownload,
+		method: 'post',
+		params: data
+	})
 }
 
 /**
@@ -69,5 +93,7 @@ export default {
 	databaseAddOrEditSaveApi,
 	databaseDeleteApi,
 	databaseListSelectOptionsApi,
-	databaseGetApi
-}
+	databaseGetApi,
+	codePreviewApi,
+	codeDownloadApi
+}

+ 65 - 0
src/api/codeGenerate/template.ts

@@ -0,0 +1,65 @@
+import request from '@/utils/request'
+
+interface Template {
+  id: string;
+  name: string;
+  [key: string]: any;
+  // Add other relevant fields
+}
+
+interface UpdateTemplatePayload {
+  id: string;
+  // Add fields to update
+}
+
+interface CreateTemplatePayload {
+  name: string;
+  // Add other fields for creation
+}
+
+export function fetchTemplateById(id: string) {
+  return request<Template>({
+    method: 'GET',
+    url: `/gen/template/get`, // Adjust URL if needed
+    params: { id },
+  });
+}
+
+export function updateTemplate(payload: UpdateTemplatePayload) {
+  return request<void>({
+    method: 'POST', // Adjust method if needed
+    url: `/gen/template/update`, // Adjust URL if needed
+    data: payload, // Adjust payload structure if needed
+  });
+}
+
+export function fetchTemplatePage() {
+  return request<Template[]>({
+    method: 'POST', // Adjust method if needed
+    url: `/gen/template/page`, // Adjust URL if needed
+    // Add pagination parameters if needed
+  });
+}
+
+export function fetchAllTemplates() {
+  return request<Template[]>({
+    method: 'POST', // Adjust method if needed
+    url: `/gen/template/list-all`, // Adjust URL if needed
+  });
+}
+
+export function deleteTemplates(ids: string[]) {
+  return request<void>({
+    method: 'POST', // Adjust method if needed
+    url: `/gen/template/delete`, // Adjust URL if needed
+    data: { ids }, // Adjust payload structure if needed
+  });
+}
+
+export function createTemplate(payload: CreateTemplatePayload) {
+  return request<void>({
+    method: 'POST', // Adjust method if needed
+    url: `/gen/template/create`, // Adjust URL if needed
+    data: payload, // Adjust payload structure if needed
+  });
+}

+ 1 - 0
src/assets/icons/processInfo/code-gen.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m17.09 7.974l.23.23c1.789 1.79 2.684 2.684 2.684 3.796s-.895 2.007-2.684 3.796l-.23.23M13.876 5l-3.751 14M6.91 7.974l-.23.23C4.892 9.994 3.997 10.888 3.997 12s.895 2.007 2.685 3.796l.23.23"/></svg>

+ 232 - 0
src/views/codeGenerate/database/CodeGenDrawer.vue

@@ -0,0 +1,232 @@
+<!-- views/codeGenerate/database/components/CodeGenDrawer.vue -->
+
+<template>
+  <el-drawer
+    v-model="drawerVisible"
+		class="local-launch_drawer-wrap"
+		:close-on-click-modal="false"
+    :title="title"
+    :size="size"
+    :direction="direction"
+  >
+    <div class="drawer-content">
+      <!-- 在这里添加抽屉的内容 -->
+      <el-form
+        ref="formRef"
+        :model="form"
+        :rules="rules"
+        label-width="120px"
+				label-position="top"
+        class="code-gen-form"
+      >
+        <el-form-item label="数据源" prop="databaseId">
+          <el-select v-model="form.databaseId" placeholder="请选择数据源">
+            <el-option
+							v-for="option in dataSourceOptions"
+							:key="option.id"
+							:label="option.title"
+							:value="option.id"
+						/>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="作者" prop="author">
+          <el-input v-model="form.author" placeholder="请输入作者名称" />
+        </el-form-item>
+
+        <el-form-item label="项目模块" prop="module">
+          <el-input v-model="form.module" placeholder="请输入项目模块" />
+        </el-form-item>
+
+        <el-form-item label="表名" prop="tableName">
+          <el-input v-model="form.tableName" placeholder="请输入表名" />
+        </el-form-item>
+
+        <el-form-item label="模板" prop="templateIds">
+          <el-checkbox-group v-model="form.templateIds">
+            <el-checkbox
+              v-for="template in templateOptions"
+              :key="template.id"
+              :label="template.id"
+            >
+              {{ template.tplName }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="drawer-footer">
+        <el-button @click="closeDrawer">取消</el-button>
+				<el-button @click="previewCode">预览代码</el-button>
+        <el-button type="primary" @click="generateCode">生成代码</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, watch } from 'vue'
+import database from '@/api/codeGenerate/database'
+import { fetchAllTemplates } from '@/api/codeGenerate/template'
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false
+  },
+  title: {
+    type: String,
+    default: '抽屉标题'
+  },
+  size: {
+    type: [String, Number],
+    default: '30%'
+  },
+  direction: {
+    type: String,
+    default: 'rtl'
+  },
+	rowData: {
+		type: Object,
+		default: () => ({})
+	}
+})
+
+const formRef = ref()
+const form = ref({
+  databaseId: '',
+  author: '',
+  module: '',
+  tableName: '',
+  templateIds: []
+})
+
+const rules = ref({
+  databaseId: [{ required: true, message: '请选择数据源', trigger: 'change' }],
+  module: [{ required: true, message: '请输入项目模块', trigger: 'blur' }],
+  tableName: [{ required: true, message: '请输入表名', trigger: 'blur' }],
+  templateIds: [{ type: 'array', required: true, message: '请选择至少一个模板', trigger: 'change' }]
+})
+const emit = defineEmits(['update:modelValue', 'confirm', 'cancel'])
+
+const drawerVisible = ref(props.modelValue)
+const dataSourceOptions = ref<Array<{ id: string; title: string }>>([])
+
+const closeDrawer = () => {
+	drawerVisible.value = false
+	emit('cancel')
+}
+
+const confirmDrawer = () => {
+	drawerVisible.value = false
+	emit('confirm')
+}
+
+const getDataBaseOptions = async () => {
+	const data = await database.databaseListSelectOptionsApi()
+	dataSourceOptions.value = data as { id: string; title: string }[]
+	console.log(props.rowData)
+		if (props.rowData) {
+		form.value.databaseId = props.rowData.id
+		console.log(form.value.databaseId)
+	}
+}
+
+const templateOptions = ref<Array<{ id: string; name: string }>>([])
+
+const loadTemplates = async () => {
+  try {
+    const templates = await fetchAllTemplates()
+		console.log(templates)
+    templateOptions.value = templates as { id: string; tplName: string }[]
+  } catch (error) {
+    console.error('Failed to fetch templates:', error)
+  }
+}
+
+watch(() => props.modelValue, (newVal) => {
+  drawerVisible.value = newVal
+})
+
+watch(drawerVisible, (newVal) => {
+  emit('update:modelValue', newVal)
+})
+const previewCode = async () => {
+	await formRef.value.validate()
+	const data = await database.codePreviewApi({...form.value, templateIds: form.value.templateIds.join(',')})
+	console.log(data)
+	console.log('预览代码')
+}
+
+const generateCode = async () => {
+	try {
+		await formRef.value.validate()
+    const response = await database.codeDownloadApi({...form.value, templateIds: form.value.templateIds.join(',')})
+    const blob = new Blob([response.data], { type: 'application/octet-stream' })
+    const url = window.URL.createObjectURL(blob)
+    const a = document.createElement('a')
+    a.href = url
+    a.download = 'generated_code.zip' // Adjust the file name as needed
+    document.body.appendChild(a)
+    a.click()
+    a.remove()
+    window.URL.revokeObjectURL(url)
+    console.log('文件下载成功')
+  } catch (error) {
+    console.error('文件下载失败:', error)
+  }
+}
+
+getDataBaseOptions()
+	loadTemplates()
+</script>
+
+<style lang="scss">
+.drawer-footer {
+  text-align: right;
+}
+
+.local-launch_drawer-wrap {
+	.el-drawer__header {
+		display: flex;
+		padding: 16px 24px;
+		align-items: center;
+		justify-content: space-between;
+		background-color: var(--el-color-info-light-9);
+		text-align: left;
+		/* margin-right: 0; */
+		margin-bottom: 0;
+	}
+	.el-drawer__close-btn {
+		padding: 0;
+		margin-right: -12px;
+	}
+	.el-drawer__body {
+		position: relative;
+		display: flex;
+		flex-direction: column;
+	}
+	.el-drawer__footer {
+		border-top: 1px solid var(--el-border-color-lighter);
+		padding: 12px 24px;
+	}
+	.local_loading {
+		position: absolute;
+		left: 0;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		background: rgba(0, 0, 0, 0.05);
+	}
+}
+@media (max-width: 750px) {
+	.local-launch_drawer-wrap {
+		width: 90vw !important;
+	}
+}
+</style>

+ 32 - 5
src/views/codeGenerate/database/index.vue

@@ -14,6 +14,7 @@
 				:columns="activeColumns"
 			>
 				<template #toolLeft>
+					<el-button @click="openDrawer">生成代码</el-button>
 					<el-button
 						plain
 						:icon="Plus"
@@ -30,7 +31,11 @@
 							icon-class="icon-processInfo-mage--edit"
 							@click="table_edit(row)"
 						/>
-
+						<LeIcon
+							class="text-lg text-icon-color cursor-pointer icon-mage--edit ml-2"
+							icon-class="icon-processInfo-code-gen"
+							@click="editCodeGen(row)"
+						/>
 						<LeIcon class="text-lg ml-2 text-rose-700 cursor-pointer" icon-class="icon-processInfo-iconoir--trash" @click="table_del(row)" />
 					</div>
 				</template>
@@ -47,6 +52,16 @@
 			:form-options="formOptions"
 			@submit="submitHandler"
 		/>
+
+		<CodeGenDrawer
+			v-if="drawerVisible"
+      v-model="drawerVisible"
+      title="代码生成"
+      size="50%"
+			:row-data="rowData"
+      @confirm="handleConfirm"
+    >
+    </CodeGenDrawer>
 	</div>
 </template>
 <script lang="tsx" setup>
@@ -55,10 +70,14 @@ import { computed, nextTick, ref, watch } from 'vue'
 import { ElMessage, ElMessageBox, ElTree } from 'element-plus'
 import { useTablePage } from '@/hooks/useTablePage'
 import { Plus, Delete } from '@element-plus/icons-vue'
+import CodeGenDrawer from './CodeGenDrawer.vue'
 
 const visible = ref(false) // 弹窗显示隐藏
 const isCreate = ref(true)
 const activeData = ref({})
+const rowData = ref({})
+const drawerVisible = ref(false)
+
 const formsDialog = [
 	{
 		prop: 'type',
@@ -273,6 +292,12 @@ const table_edit = async row => {
 	visible.value = true
 }
 
+const editCodeGen = async row => {
+	console.log(row, '=====')
+	rowData.value = row
+	openDrawer()
+}
+
 // 弹窗事件
 const submitHandler = async params => {
 	formOptions.value.formConfig.submitLoading = true
@@ -295,13 +320,15 @@ const addHandler = () => {
 	visible.value = true
 }
 
-const getDataBaseOptions = async () => {
-	const { data } = await database.databaseListSelectOptionsApi()
-	console.log(data)
+const openDrawer = () => {
+  drawerVisible.value = true
+}
+
+const handleConfirm = () => {
+  console.log('确认操作')
 }
 
 nextTick(() => {
-	getDataBaseOptions()
 	queryList()
 })