Merge branch 'dev' of https://gitee.com/fessor/yudao-ui-admin-vue3 into dev
commit
a1609e3046
@ -1,57 +1,123 @@
|
|||||||
import request from '@/config/axios'
|
import request from '@/config/axios'
|
||||||
import type { CodegenUpdateReqVO, CodegenCreateListReqVO } from './types'
|
|
||||||
|
export type CodegenTableVO = {
|
||||||
|
id: number
|
||||||
|
tableId: number
|
||||||
|
isParentMenuIdValid: boolean
|
||||||
|
dataSourceConfigId: number
|
||||||
|
scene: number
|
||||||
|
tableName: string
|
||||||
|
tableComment: string
|
||||||
|
remark: string
|
||||||
|
moduleName: string
|
||||||
|
businessName: string
|
||||||
|
className: string
|
||||||
|
classComment: string
|
||||||
|
author: string
|
||||||
|
createTime: Date
|
||||||
|
updateTime: Date
|
||||||
|
templateType: number
|
||||||
|
parentMenuId: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CodegenColumnVO = {
|
||||||
|
id: number
|
||||||
|
tableId: number
|
||||||
|
columnName: string
|
||||||
|
dataType: string
|
||||||
|
columnComment: string
|
||||||
|
nullable: number
|
||||||
|
primaryKey: number
|
||||||
|
autoIncrement: string
|
||||||
|
ordinalPosition: number
|
||||||
|
javaType: string
|
||||||
|
javaField: string
|
||||||
|
dictType: string
|
||||||
|
example: string
|
||||||
|
createOperation: number
|
||||||
|
updateOperation: number
|
||||||
|
listOperation: number
|
||||||
|
listOperationCondition: string
|
||||||
|
listOperationResult: number
|
||||||
|
htmlType: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type DatabaseTableVO = {
|
||||||
|
name: string
|
||||||
|
comment: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CodegenDetailVO = {
|
||||||
|
table: CodegenTableVO
|
||||||
|
columns: CodegenColumnVO[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CodegenPreviewVO = {
|
||||||
|
filePath: string
|
||||||
|
code: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CodegenUpdateReqVO = {
|
||||||
|
table: CodegenTableVO | any
|
||||||
|
columns: CodegenColumnVO[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CodegenCreateListReqVO = {
|
||||||
|
dataSourceConfigId: number
|
||||||
|
tableNames: string[]
|
||||||
|
}
|
||||||
|
|
||||||
// 查询列表代码生成表定义
|
// 查询列表代码生成表定义
|
||||||
export const getCodegenTablePageApi = (params) => {
|
export const getCodegenTablePage = (params: PageParam) => {
|
||||||
return request.get({ url: '/infra/codegen/table/page', params })
|
return request.get({ url: '/infra/codegen/table/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询详情代码生成表定义
|
// 查询详情代码生成表定义
|
||||||
export const getCodegenTableApi = (id: number) => {
|
export const getCodegenTable = (id: number) => {
|
||||||
return request.get({ url: '/infra/codegen/detail?tableId=' + id })
|
return request.get({ url: '/infra/codegen/detail?tableId=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增代码生成表定义
|
// 新增代码生成表定义
|
||||||
export const createCodegenTableApi = (data: CodegenCreateListReqVO) => {
|
export const createCodegenTable = (data: CodegenCreateListReqVO) => {
|
||||||
return request.post({ url: '/infra/codegen/create', data })
|
return request.post({ url: '/infra/codegen/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改代码生成表定义
|
// 修改代码生成表定义
|
||||||
export const updateCodegenTableApi = (data: CodegenUpdateReqVO) => {
|
export const updateCodegenTable = (data: CodegenUpdateReqVO) => {
|
||||||
return request.put({ url: '/infra/codegen/update', data })
|
return request.put({ url: '/infra/codegen/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 基于数据库的表结构,同步数据库的表和字段定义
|
// 基于数据库的表结构,同步数据库的表和字段定义
|
||||||
export const syncCodegenFromDBApi = (id: number) => {
|
export const syncCodegenFromDB = (id: number) => {
|
||||||
return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id })
|
return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 基于 SQL 建表语句,同步数据库的表和字段定义
|
// 基于 SQL 建表语句,同步数据库的表和字段定义
|
||||||
export const syncCodegenFromSQLApi = (id: number, sql: string) => {
|
export const syncCodegenFromSQL = (id: number, sql: string) => {
|
||||||
return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql })
|
return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 预览生成代码
|
// 预览生成代码
|
||||||
export const previewCodegenApi = (id: number) => {
|
export const previewCodegen = (id: number) => {
|
||||||
return request.get({ url: '/infra/codegen/preview?tableId=' + id })
|
return request.get({ url: '/infra/codegen/preview?tableId=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下载生成代码
|
// 下载生成代码
|
||||||
export const downloadCodegenApi = (id: number) => {
|
export const downloadCodegen = (id: number) => {
|
||||||
return request.download({ url: '/infra/codegen/download?tableId=' + id })
|
return request.download({ url: '/infra/codegen/download?tableId=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得表定义
|
// 获得表定义
|
||||||
export const getSchemaTableListApi = (params) => {
|
export const getSchemaTableList = (params) => {
|
||||||
return request.get({ url: '/infra/codegen/db/table/list', params })
|
return request.get({ url: '/infra/codegen/db/table/list', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 基于数据库的表结构,创建代码生成器的表定义
|
// 基于数据库的表结构,创建代码生成器的表定义
|
||||||
export const createCodegenListApi = (data) => {
|
export const createCodegenList = (data) => {
|
||||||
return request.post({ url: '/infra/codegen/create-list', data })
|
return request.post({ url: '/infra/codegen/create-list', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除代码生成表定义
|
// 删除代码生成表定义
|
||||||
export const deleteCodegenTableApi = (id: number) => {
|
export const deleteCodegenTable = (id: number) => {
|
||||||
return request.delete({ url: '/infra/codegen/delete?tableId=' + id })
|
return request.delete({ url: '/infra/codegen/delete?tableId=' + id })
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
export type CodegenTableVO = {
|
|
||||||
id: number
|
|
||||||
tableId: number
|
|
||||||
isParentMenuIdValid: boolean
|
|
||||||
dataSourceConfigId: number
|
|
||||||
scene: number
|
|
||||||
tableName: string
|
|
||||||
tableComment: string
|
|
||||||
remark: string
|
|
||||||
moduleName: string
|
|
||||||
businessName: string
|
|
||||||
className: string
|
|
||||||
classComment: string
|
|
||||||
author: string
|
|
||||||
createTime: Date
|
|
||||||
updateTime: Date
|
|
||||||
templateType: number
|
|
||||||
parentMenuId: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export type CodegenColumnVO = {
|
|
||||||
id: number
|
|
||||||
tableId: number
|
|
||||||
columnName: string
|
|
||||||
dataType: string
|
|
||||||
columnComment: string
|
|
||||||
nullable: number
|
|
||||||
primaryKey: number
|
|
||||||
autoIncrement: string
|
|
||||||
ordinalPosition: number
|
|
||||||
javaType: string
|
|
||||||
javaField: string
|
|
||||||
dictType: string
|
|
||||||
example: string
|
|
||||||
createOperation: number
|
|
||||||
updateOperation: number
|
|
||||||
listOperation: number
|
|
||||||
listOperationCondition: string
|
|
||||||
listOperationResult: number
|
|
||||||
htmlType: string
|
|
||||||
}
|
|
||||||
export type DatabaseTableVO = {
|
|
||||||
name: string
|
|
||||||
comment: string
|
|
||||||
}
|
|
||||||
export type CodegenDetailVO = {
|
|
||||||
table: CodegenTableVO
|
|
||||||
columns: CodegenColumnVO[]
|
|
||||||
}
|
|
||||||
export type CodegenPreviewVO = {
|
|
||||||
filePath: string
|
|
||||||
code: string
|
|
||||||
}
|
|
||||||
export type CodegenUpdateReqVO = {
|
|
||||||
table: CodegenTableVO
|
|
||||||
columns: CodegenColumnVO[]
|
|
||||||
}
|
|
||||||
export type CodegenCreateListReqVO = {
|
|
||||||
dataSourceConfigId: number
|
|
||||||
tableNames: string[]
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 7.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
@ -1,39 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// crudSchemas
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '流程名称',
|
|
||||||
field: 'name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程分类',
|
|
||||||
field: 'category',
|
|
||||||
dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
|
|
||||||
dictClass: 'number',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'category_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程版本',
|
|
||||||
field: 'version',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'version_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程描述',
|
|
||||||
field: 'description'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
title: [required],
|
|
||||||
type: [required],
|
|
||||||
status: [required]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'seq',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '400px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '表名称',
|
|
||||||
field: 'tableName',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '表描述',
|
|
||||||
field: 'tableComment',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '实体',
|
|
||||||
field: 'className',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isForm: false,
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.updateTime'),
|
|
||||||
field: 'updateTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isForm: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,137 +0,0 @@
|
|||||||
<template>
|
|
||||||
<vxe-table
|
|
||||||
ref="dragTable"
|
|
||||||
border
|
|
||||||
:data="info"
|
|
||||||
max-height="600"
|
|
||||||
stripe
|
|
||||||
class="xtable-scrollbar"
|
|
||||||
:column-config="{ resizable: true }"
|
|
||||||
>
|
|
||||||
<vxe-column title="字段列名" field="columnName" fixed="left" width="10%" />
|
|
||||||
<vxe-colgroup title="基础属性">
|
|
||||||
<vxe-column title="字段描述" field="columnComment" width="10%">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-input v-model="row.columnComment" placeholder="请输入字段描述" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="物理类型" field="dataType" width="10%" />
|
|
||||||
<vxe-column title="Java类型" width="10%" field="javaType">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-select v-model="row.javaType" placeholder="请选择Java类型">
|
|
||||||
<vxe-option label="Long" value="Long" />
|
|
||||||
<vxe-option label="String" value="String" />
|
|
||||||
<vxe-option label="Integer" value="Integer" />
|
|
||||||
<vxe-option label="Double" value="Double" />
|
|
||||||
<vxe-option label="BigDecimal" value="BigDecimal" />
|
|
||||||
<vxe-option label="LocalDateTime" value="LocalDateTime" />
|
|
||||||
<vxe-option label="Boolean" value="Boolean" />
|
|
||||||
</vxe-select>
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="java属性" width="8%" field="javaField">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-input v-model="row.javaField" placeholder="请输入java属性" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
</vxe-colgroup>
|
|
||||||
<vxe-colgroup title="增删改查">
|
|
||||||
<vxe-column title="插入" width="40px" field="createOperation">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-checkbox true-label="true" false-label="false" v-model="row.createOperation" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="编辑" width="40px" field="updateOperation">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-checkbox true-label="true" false-label="false" v-model="row.updateOperation" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="列表" width="40px" field="listOperationResult">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-checkbox true-label="true" false-label="false" v-model="row.listOperationResult" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="查询" width="40px" field="listOperation">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-checkbox true-label="true" false-label="false" v-model="row.listOperation" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="允许空" width="40px" field="nullable">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-checkbox true-label="true" false-label="false" v-model="row.nullable" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="查询方式" width="60px" field="listOperationCondition">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-select v-model="row.listOperationCondition" placeholder="请选择查询方式">
|
|
||||||
<vxe-option label="=" value="=" />
|
|
||||||
<vxe-option label="!=" value="!=" />
|
|
||||||
<vxe-option label=">" value=">" />
|
|
||||||
<vxe-option label=">=" value=">=" />
|
|
||||||
<vxe-option label="<" value="<>" />
|
|
||||||
<vxe-option label="<=" value="<=" />
|
|
||||||
<vxe-option label="LIKE" value="LIKE" />
|
|
||||||
<vxe-option label="BETWEEN" value="BETWEEN" />
|
|
||||||
</vxe-select>
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
</vxe-colgroup>
|
|
||||||
<vxe-column title="显示类型" width="10%" field="htmlType">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-select v-model="row.htmlType" placeholder="请选择显示类型">
|
|
||||||
<vxe-option label="文本框" value="input" />
|
|
||||||
<vxe-option label="文本域" value="textarea" />
|
|
||||||
<vxe-option label="下拉框" value="select" />
|
|
||||||
<vxe-option label="单选框" value="radio" />
|
|
||||||
<vxe-option label="复选框" value="checkbox" />
|
|
||||||
<vxe-option label="日期控件" value="datetime" />
|
|
||||||
<vxe-option label="图片上传" value="imageUpload" />
|
|
||||||
<vxe-option label="文件上传" value="fileUpload" />
|
|
||||||
<vxe-option label="富文本控件" value="editor" />
|
|
||||||
</vxe-select>
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="字典类型" width="10%" field="dictType">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-select v-model="row.dictType" clearable filterable placeholder="请选择字典类型">
|
|
||||||
<vxe-option
|
|
||||||
v-for="dict in dictOptions"
|
|
||||||
:key="dict.id"
|
|
||||||
:label="dict.name"
|
|
||||||
:value="dict.type"
|
|
||||||
/>
|
|
||||||
</vxe-select>
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
<vxe-column title="示例" field="example">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<vxe-input v-model="row.example" placeholder="请输入示例" />
|
|
||||||
</template>
|
|
||||||
</vxe-column>
|
|
||||||
</vxe-table>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { PropType } from 'vue'
|
|
||||||
import { DictTypeVO } from '@/api/system/dict/types'
|
|
||||||
import { CodegenColumnVO } from '@/api/infra/codegen/types'
|
|
||||||
import { listSimpleDictType } from '@/api/system/dict/dict.type'
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
info: {
|
|
||||||
type: Array as unknown as PropType<CodegenColumnVO[]>,
|
|
||||||
default: () => null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
/** 查询字典下拉列表 */
|
|
||||||
const dictOptions = ref<DictTypeVO[]>()
|
|
||||||
const getDictOptions = async () => {
|
|
||||||
const res = await listSimpleDictType()
|
|
||||||
dictOptions.value = res
|
|
||||||
}
|
|
||||||
onMounted(async () => {
|
|
||||||
await getDictOptions()
|
|
||||||
})
|
|
||||||
defineExpose({
|
|
||||||
info: props.info
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
@ -0,0 +1,157 @@
|
|||||||
|
<template>
|
||||||
|
<el-table ref="dragTable" :data="formData" row-key="columnId" :max-height="tableHeight">
|
||||||
|
<el-table-column
|
||||||
|
label="字段列名"
|
||||||
|
prop="columnName"
|
||||||
|
min-width="10%"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
/>
|
||||||
|
<el-table-column label="字段描述" min-width="10%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.columnComment" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
label="物理类型"
|
||||||
|
prop="dataType"
|
||||||
|
min-width="10%"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
/>
|
||||||
|
<el-table-column label="Java类型" min-width="11%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.javaType">
|
||||||
|
<el-option label="Long" value="Long" />
|
||||||
|
<el-option label="String" value="String" />
|
||||||
|
<el-option label="Integer" value="Integer" />
|
||||||
|
<el-option label="Double" value="Double" />
|
||||||
|
<el-option label="BigDecimal" value="BigDecimal" />
|
||||||
|
<el-option label="LocalDateTime" value="LocalDateTime" />
|
||||||
|
<el-option label="Boolean" value="Boolean" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="java属性" min-width="10%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.javaField" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="插入" min-width="4%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox true-label="true" false-label="false" v-model="scope.row.createOperation" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="编辑" min-width="4%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox true-label="true" false-label="false" v-model="scope.row.updateOperation" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="列表" min-width="4%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox
|
||||||
|
true-label="true"
|
||||||
|
false-label="false"
|
||||||
|
v-model="scope.row.listOperationResult"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="查询" min-width="4%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox true-label="true" false-label="false" v-model="scope.row.listOperation" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="查询方式" min-width="10%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.listOperationCondition">
|
||||||
|
<el-option label="=" value="=" />
|
||||||
|
<el-option label="!=" value="!=" />
|
||||||
|
<el-option label=">" value=">" />
|
||||||
|
<el-option label=">=" value=">=" />
|
||||||
|
<el-option label="<" value="<>" />
|
||||||
|
<el-option label="<=" value="<=" />
|
||||||
|
<el-option label="LIKE" value="LIKE" />
|
||||||
|
<el-option label="BETWEEN" value="BETWEEN" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="允许空" min-width="5%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox true-label="true" false-label="false" v-model="scope.row.nullable" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="显示类型" min-width="12%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.htmlType">
|
||||||
|
<el-option label="文本框" value="input" />
|
||||||
|
<el-option label="文本域" value="textarea" />
|
||||||
|
<el-option label="下拉框" value="select" />
|
||||||
|
<el-option label="单选框" value="radio" />
|
||||||
|
<el-option label="复选框" value="checkbox" />
|
||||||
|
<el-option label="日期控件" value="datetime" />
|
||||||
|
<el-option label="图片上传" value="imageUpload" />
|
||||||
|
<el-option label="文件上传" value="fileUpload" />
|
||||||
|
<el-option label="富文本控件" value="editor" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="字典类型" min-width="12%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dictOptions"
|
||||||
|
:key="dict.id"
|
||||||
|
:label="dict.name"
|
||||||
|
:value="dict.type"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="示例" min-width="10%">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.example" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { PropType } from 'vue'
|
||||||
|
import { CodegenColumnVO } from '@/api/infra/codegen/types'
|
||||||
|
import { DictTypeVO, listSimpleDictType } from '@/api/system/dict/dict.type'
|
||||||
|
|
||||||
|
const emits = defineEmits(['update:columns'])
|
||||||
|
const props = defineProps({
|
||||||
|
columns: {
|
||||||
|
type: Array as unknown as PropType<CodegenColumnVO[]>,
|
||||||
|
default: () => null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const formData = ref<CodegenColumnVO[]>([])
|
||||||
|
const tableHeight = document.documentElement.scrollHeight - 350 + 'px'
|
||||||
|
|
||||||
|
/** 查询字典下拉列表 */
|
||||||
|
const dictOptions = ref<DictTypeVO[]>()
|
||||||
|
const getDictOptions = async () => {
|
||||||
|
dictOptions.value = await listSimpleDictType()
|
||||||
|
}
|
||||||
|
onMounted(async () => {
|
||||||
|
await getDictOptions()
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.columns,
|
||||||
|
(columns) => {
|
||||||
|
if (!columns) return
|
||||||
|
formData.value = columns
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: true,
|
||||||
|
immediate: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch(
|
||||||
|
() => formData.value,
|
||||||
|
(val) => {
|
||||||
|
emits('update:columns', val)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
@ -1,123 +0,0 @@
|
|||||||
<template>
|
|
||||||
<!-- 导入表 -->
|
|
||||||
<XModal title="导入表" v-model="visible">
|
|
||||||
<el-form :model="queryParams" ref="queryRef" :inline="true">
|
|
||||||
<el-form-item label="数据源" prop="dataSourceConfigId">
|
|
||||||
<el-select v-model="queryParams.dataSourceConfigId" placeholder="请选择数据源" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="config in dataSourceConfigs"
|
|
||||||
:key="config.id"
|
|
||||||
:label="config.name"
|
|
||||||
:value="config.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="表名称" prop="name">
|
|
||||||
<el-input v-model="queryParams.name" placeholder="请输入表名称" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="表描述" prop="comment">
|
|
||||||
<el-input v-model="queryParams.comment" placeholder="请输入表描述" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
|
||||||
<XButton
|
|
||||||
type="primary"
|
|
||||||
preIcon="ep:search"
|
|
||||||
:title="t('common.query')"
|
|
||||||
@click="handleQuery()"
|
|
||||||
/>
|
|
||||||
<XButton preIcon="ep:refresh-right" :title="t('common.reset')" @click="resetQuery()" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<vxe-table
|
|
||||||
ref="xTable"
|
|
||||||
:data="dbTableList"
|
|
||||||
v-loading="dbLoading"
|
|
||||||
:checkbox-config="{ highlight: true, range: true }"
|
|
||||||
height="260px"
|
|
||||||
class="xtable-scrollbar"
|
|
||||||
>
|
|
||||||
<vxe-column type="checkbox" width="60" />
|
|
||||||
<vxe-column field="name" title="表名称" />
|
|
||||||
<vxe-column field="comment" title="表描述" />
|
|
||||||
</vxe-table>
|
|
||||||
<template #footer>
|
|
||||||
<XButton type="primary" :title="t('action.import')" @click="handleImportTable()" />
|
|
||||||
<XButton :title="t('dialog.close')" @click="handleClose()" />
|
|
||||||
</template>
|
|
||||||
</XModal>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { VxeTableInstance } from 'vxe-table'
|
|
||||||
import type { DatabaseTableVO } from '@/api/infra/codegen/types'
|
|
||||||
import { getSchemaTableListApi, createCodegenListApi } from '@/api/infra/codegen'
|
|
||||||
import { getDataSourceConfigList, DataSourceConfigVO } from '@/api/infra/dataSourceConfig'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
const message = useMessage() // 消息弹窗
|
|
||||||
const emit = defineEmits(['ok'])
|
|
||||||
// ======== 显示页面 ========
|
|
||||||
const visible = ref(false)
|
|
||||||
const dbLoading = ref(true)
|
|
||||||
const queryParams = reactive({
|
|
||||||
name: undefined,
|
|
||||||
comment: undefined,
|
|
||||||
dataSourceConfigId: 0 as number | undefined
|
|
||||||
})
|
|
||||||
const dataSourceConfigs = ref<DataSourceConfigVO[]>([])
|
|
||||||
const show = async () => {
|
|
||||||
const res = await getDataSourceConfigList()
|
|
||||||
dataSourceConfigs.value = res
|
|
||||||
queryParams.dataSourceConfigId = dataSourceConfigs.value[0].id as number
|
|
||||||
visible.value = true
|
|
||||||
await getList()
|
|
||||||
}
|
|
||||||
/** 查询表数据 */
|
|
||||||
const dbTableList = ref<DatabaseTableVO[]>([])
|
|
||||||
|
|
||||||
/** 查询表数据 */
|
|
||||||
const getList = async () => {
|
|
||||||
dbLoading.value = true
|
|
||||||
const res = await getSchemaTableListApi(queryParams)
|
|
||||||
dbTableList.value = res
|
|
||||||
dbLoading.value = false
|
|
||||||
}
|
|
||||||
// 查询操作
|
|
||||||
const handleQuery = async () => {
|
|
||||||
await getList()
|
|
||||||
}
|
|
||||||
// 重置操作
|
|
||||||
const resetQuery = async () => {
|
|
||||||
queryParams.name = undefined
|
|
||||||
queryParams.comment = undefined
|
|
||||||
queryParams.dataSourceConfigId = 0
|
|
||||||
await getList()
|
|
||||||
}
|
|
||||||
const xTable = ref<VxeTableInstance>()
|
|
||||||
/** 多选框选中数据 */
|
|
||||||
const tables = ref<string[]>([])
|
|
||||||
|
|
||||||
/** 导入按钮操作 */
|
|
||||||
const handleImportTable = async () => {
|
|
||||||
if (xTable.value?.getCheckboxRecords().length === 0) {
|
|
||||||
message.error('请选择要导入的表')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
xTable.value?.getCheckboxRecords().forEach((item) => {
|
|
||||||
tables.value.push(item.name)
|
|
||||||
})
|
|
||||||
await createCodegenListApi({
|
|
||||||
dataSourceConfigId: queryParams.dataSourceConfigId,
|
|
||||||
tableNames: tables.value
|
|
||||||
})
|
|
||||||
message.success('导入成功')
|
|
||||||
emit('ok')
|
|
||||||
handleClose()
|
|
||||||
}
|
|
||||||
const handleClose = () => {
|
|
||||||
visible.value = false
|
|
||||||
tables.value = []
|
|
||||||
}
|
|
||||||
defineExpose({
|
|
||||||
show
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
@ -1,5 +1,4 @@
|
|||||||
import BasicInfoForm from './BasicInfoForm.vue'
|
import BasicInfoForm from './BasicInfoForm.vue'
|
||||||
import CloumInfoForm from './CloumInfoForm.vue'
|
import ColumInfoForm from './ColumInfoForm.vue'
|
||||||
import ImportTable from './ImportTable.vue'
|
import GenerateInfoForm from './GenerateInfoForm.vue'
|
||||||
import Preview from './Preview.vue'
|
export { BasicInfoForm, ColumInfoForm, GenerateInfoForm }
|
||||||
export { BasicInfoForm, CloumInfoForm, ImportTable, Preview }
|
|
||||||
|
|||||||
@ -1,69 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
name: [required],
|
|
||||||
handlerName: [required],
|
|
||||||
cronExpression: [required],
|
|
||||||
retryCount: [required],
|
|
||||||
retryInterval: [required]
|
|
||||||
})
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '任务编号',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '280px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '任务名称',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.INFRA_JOB_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isForm: false,
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理器的名字',
|
|
||||||
field: 'handlerName',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理器的参数',
|
|
||||||
field: 'handlerParam',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'CRON 表达式',
|
|
||||||
field: 'cronExpression'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '后续执行时间',
|
|
||||||
field: 'nextTimes',
|
|
||||||
isTable: false,
|
|
||||||
isForm: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '重试次数',
|
|
||||||
field: 'retryCount',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '重试间隔',
|
|
||||||
field: 'retryInterval',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '监控超时时间',
|
|
||||||
field: 'monitorTimeout',
|
|
||||||
isTable: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,75 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
// 国际化
|
|
||||||
const { t } = useI18n()
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '日志编号',
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '任务编号',
|
|
||||||
field: 'jobId',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理器的名字',
|
|
||||||
field: 'handlerName',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理器的参数',
|
|
||||||
field: 'handlerParam'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '第几次执行',
|
|
||||||
field: 'executeIndex'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '开始执行时间',
|
|
||||||
field: 'beginTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'beginTime_default'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataPicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '结束执行时间',
|
|
||||||
field: 'endTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isTable: false,
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataPicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '执行时长',
|
|
||||||
field: 'duration',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'duration_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.INFRA_JOB_LOG_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
export const parseTime = (time) => {
|
||||||
|
if (!time) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const format = '{y}-{m}-{d} {h}:{i}:{s}'
|
||||||
|
let date
|
||||||
|
if (typeof time === 'object') {
|
||||||
|
date = time
|
||||||
|
} else {
|
||||||
|
if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
|
||||||
|
time = parseInt(time)
|
||||||
|
} else if (typeof time === 'string') {
|
||||||
|
time = time
|
||||||
|
.replace(new RegExp(/-/gm), '/')
|
||||||
|
.replace('T', ' ')
|
||||||
|
.replace(new RegExp(/\.[\d]{3}/gm), '')
|
||||||
|
}
|
||||||
|
if (typeof time === 'number' && time.toString().length === 10) {
|
||||||
|
time = time * 1000
|
||||||
|
}
|
||||||
|
date = new Date(time)
|
||||||
|
}
|
||||||
|
const formatObj = {
|
||||||
|
y: date.getFullYear(),
|
||||||
|
m: date.getMonth() + 1,
|
||||||
|
d: date.getDate(),
|
||||||
|
h: date.getHours(),
|
||||||
|
i: date.getMinutes(),
|
||||||
|
s: date.getSeconds(),
|
||||||
|
a: date.getDay()
|
||||||
|
}
|
||||||
|
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
||||||
|
let value = formatObj[key]
|
||||||
|
// Note: getDay() returns 0 on Sunday
|
||||||
|
if (key === 'a') {
|
||||||
|
return ['日', '一', '二', '三', '四', '五', '六'][value]
|
||||||
|
}
|
||||||
|
if (result.length > 0 && value < 10) {
|
||||||
|
value = '0' + value
|
||||||
|
}
|
||||||
|
return value || 0
|
||||||
|
})
|
||||||
|
return time_str
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue