发布v2.7.8Beta1 (#1957)

* beta:2.7.8-a 增加自动化创建树形结构 (#1941)

* feat: 支持创建树形结构

---------

Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>

* 优化user store部分写法

* Update user.js

* feat: 升级版本号

* Dev 278 beta2 (#1954)

* 在关闭详情弹窗后 detailFrom为空对象,arr为undefined 使用slice控制台会报错

* 查询不重置pageSize

* 优化主题模式相关内容

* 优化弹窗手机端显示

* bugfix:PostgreSQL initdb (#1953)

* bugfix:postgresql增加显示指定template

---------

Co-authored-by: PiexlMax(奇淼 <165128580+pixelmaxQm@users.noreply.github.com>

---------

Co-authored-by: zayn <972858472@qq.com>
Co-authored-by: Azir <2075125282@qq.com>
Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com>

* docs:调整部分代码注释以及代码格式

* feat: 自动化代码字典支持多选

* fix:调整值接收器和指针接收器

* feat: 支持导出表格复制,优化增加方法页面。

* chore:初始化代码规范化。

---------

Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>
Co-authored-by: Azir <2075125282@qq.com>
Co-authored-by: zayn <972858472@qq.com>
Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com>
Co-authored-by: cjb <75364055@qq.com>
This commit is contained in:
PiexlMax(奇淼
2024-12-08 21:17:21 +08:00
committed by GitHub
co-authored by piexlMax(奇淼 zayn Azir Qing Liang cjb
parent 80c54ad890
commit 283143e1bf
69 changed files with 3609 additions and 480 deletions
@@ -25,8 +25,7 @@
}
})
const dotColor = computed(() => {
console.log(appStore.theme)
return appStore.theme === 'dark' ? '#333' : '#E5E8EF'
return appStore.isDark ? '#333' : '#E5E8EF'
})
const graphicFactory = (side) => {
return {
+8 -1
View File
@@ -111,6 +111,12 @@
placeholder="请输入sqlite数据库文件存放路径"
/>
</el-form-item>
<el-form-item v-if="form.dbType === 'pgsql'" label="template">
<el-input
v-model="form.template"
placeholder="请输入postgresql指定template"
/>
</el-form-item>
<el-form-item>
<div style="text-align: right">
<el-button type="primary" @click="onSubmit">立即初始化</el-button>
@@ -192,7 +198,8 @@
userName: 'postgres',
password: '',
dbName: 'gva',
dbPath: ''
dbPath: '',
template: 'template0'
})
break
case 'oracle':
+2 -1
View File
@@ -9,7 +9,8 @@
>
<div class="flex items-center cursor-pointer flex-1">
<div
class="flex items-center cursor-pointer min-w-48"
class="flex items-center cursor-pointer"
:class="isMobile ? '' : 'min-w-48'"
@click="router.push({ path: '/' })"
>
<img
+1 -2
View File
@@ -58,10 +58,9 @@
effect="dark"
content="切换主题"
placement="bottom"
:disabled="appStore.theme === 'auto'"
>
<el-icon
v-if="appStore.theme === 'dark'"
v-if="appStore.isDark"
class="w-8 h-8 shadow rounded-full border border-gray-600 cursor-pointer border-solid"
@click="appStore.toggleTheme(false)"
>
+2 -2
View File
@@ -62,7 +62,7 @@
import { useAppStore } from '@/pinia'
import { storeToRefs } from 'pinia'
const appStore = useAppStore()
const { config, theme, device } = storeToRefs(appStore)
const { config, isDark, device } = storeToRefs(appStore)
defineOptions({
name: 'GvaLayout'
@@ -75,7 +75,7 @@
watchEffect(() => {
font.color =
theme.value === 'dark' ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
})
const router = useRouter()
+1 -1
View File
@@ -71,7 +71,7 @@
v-model="config.side_mode"
:options="sideModes"
size="default"
@change="appStore.toggleSideModel"
@change="appStore.toggleSideMode"
/>
<!-- <el-select
v-model="config.side_mode"
+6 -3
View File
@@ -102,7 +102,7 @@
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="200">
<el-table-column align="left" fixed="right" label="操作" :min-width="appStore.operateMinWith">
<template #default="scope">
<el-button
icon="edit"
@@ -138,7 +138,7 @@
<el-drawer
v-model="syncApiFlag"
size="80%"
:size="appStore.drawerSize"
:before-close="closeSyncDialog"
:show-close="false"
>
@@ -341,7 +341,7 @@
<el-drawer
v-model="dialogFormVisible"
size="60%"
:size="appStore.drawerSize"
:before-close="closeDialog"
:show-close="false"
>
@@ -420,11 +420,14 @@
import ExportTemplate from '@/components/exportExcel/exportTemplate.vue'
import ImportExcel from '@/components/exportExcel/importExcel.vue'
import { butler } from '@/api/autoCode'
import { useAppStore } from "@/pinia";
defineOptions({
name: 'Api'
})
const appStore = useAppStore()
const methodFilter = (value) => {
const target = methodOptions.value.filter((item) => item.value === value)[0]
return target && `${target.label}`
@@ -62,7 +62,7 @@
</el-table>
</div>
<!-- 新增角色弹窗 -->
<el-drawer v-model="authorityFormVisible" :show-close="false">
<el-drawer v-model="authorityFormVisible" :size="appStore.drawerSize" :show-close="false">
<template #header>
<div class="flex justify-between items-center">
<span class="text-lg">{{ authorityTitleForm }}</span>
@@ -114,8 +114,7 @@
<el-drawer
v-if="drawer"
v-model="drawer"
:with-header="false"
size="40%"
:size="appStore.drawerSize"
title="角色配置"
>
<el-tabs :before-leave="autoEnter" type="border-card">
@@ -154,6 +153,7 @@
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useAppStore } from "@/pinia"
defineOptions({
name: 'Authority'
@@ -175,6 +175,7 @@
const drawer = ref(false)
const dialogType = ref('add')
const activeRow = ref({})
const appStore = useAppStore()
const authorityTitleForm = ref('新增角色')
const authorityFormVisible = ref(false)
@@ -49,7 +49,7 @@
</div>
<el-drawer
v-model="drawerFormVisible"
size="30%"
:size="appStore.drawerSize"
:show-close="false"
:before-close="closeDrawer"
>
@@ -120,11 +120,14 @@
import sysDictionaryDetail from './sysDictionaryDetail.vue'
import { Edit } from '@element-plus/icons-vue'
import { useAppStore } from "@/pinia";
defineOptions({
name: 'SysDictionary'
})
const appStore = useAppStore()
const selectID = ref(0)
const formData = ref({
@@ -45,7 +45,7 @@
width="120"
/>
<el-table-column align="left" label="操作" width="180">
<el-table-column align="left" label="操作" :min-width="appStore.operateMinWith">
<template #default="scope">
<el-button
type="primary"
@@ -82,7 +82,7 @@
<el-drawer
v-model="drawerFormVisible"
size="30%"
:size="appStore.drawerSize"
:show-close="false"
:before-close="closeDrawer"
>
@@ -156,11 +156,14 @@
import { ref, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { formatBoolean, formatDate } from '@/utils/format'
import { useAppStore } from "@/pinia";
defineOptions({
name: 'SysDictionaryDetail'
})
const appStore = useAppStore()
const props = defineProps({
sysDictionaryID: {
type: Number,
+5 -2
View File
@@ -72,7 +72,7 @@
min-width="360"
prop="component"
/>
<el-table-column align="left" fixed="right" label="操作" width="300">
<el-table-column align="left" fixed="right" label="操作" :min-width="appStore.operateMinWith">
<template #default="scope">
<el-button
type="primary"
@@ -104,7 +104,7 @@
</div>
<el-drawer
v-model="dialogFormVisible"
size="60%"
:size="appStore.drawerSize"
:before-close="handleClose"
:show-close="false"
>
@@ -423,11 +423,14 @@
import ComponentsCascader from '@/view/superAdmin/menu/components/components-cascader.vue'
import pathInfo from '@/pathInfo.json'
import { useAppStore } from "@/pinia";
defineOptions({
name: 'Menus'
})
const appStore = useAppStore()
const rules = reactive({
path: [{ required: true, message: '请输入菜单name', trigger: 'blur' }],
component: [{ required: true, message: '请输入文件路径', trigger: 'blur' }],
+5 -2
View File
@@ -105,7 +105,7 @@
</template>
</el-table-column>
<el-table-column label="操作" min-width="250" fixed="right">
<el-table-column label="操作" :min-width="appStore.operateMinWith" fixed="right">
<template #default="scope">
<el-button
type="primary"
@@ -145,7 +145,7 @@
</div>
<el-drawer
v-model="addUserDialog"
size="60%"
:size="appStore.drawerSize"
:show-close="false"
:close-on-press-escape="false"
:close-on-click-modal="false"
@@ -236,11 +236,14 @@
import { nextTick, ref, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import SelectImage from '@/components/selectImage/selectImage.vue'
import { useAppStore } from "@/pinia";
defineOptions({
name: 'User'
})
const appStore = useAppStore()
const searchInfo = ref({
username: '',
nickname: '',
@@ -84,7 +84,7 @@
<el-select
v-model="middleDate.dictType"
style="width: 100%"
:disabled="middleDate.fieldType !== 'string'"
:disabled="middleDate.fieldType !== 'string' && middleDate.fieldType !== 'array'"
placeholder="请选择字典"
clearable
>
@@ -416,6 +416,26 @@
<el-checkbox v-model="form.onlyTemplate" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item>
<template #label>
<el-tooltip
content="注:会自动创建parentID来进行父子关系关联,仅支持主键为int类型"
placement="bottom"
effect="light"
>
<div>
树型结构 <el-icon><QuestionFilled /></el-icon>
</div>
</el-tooltip>
</template>
<div class="flex gap-2 items-center">
<el-checkbox v-model="form.isTree" />
<el-input v-model="form.treeJson" :disabled="!form.isTree" placeholder="前端展示json属性"></el-input>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
@@ -1024,6 +1044,8 @@
gvaModel: true,
autoCreateResource: false,
onlyTemplate: false,
isTree: false,
treeJson: "",
fields: []
})
const rules = ref({
@@ -1137,6 +1159,13 @@
}
const autoCodeForm = ref(null)
const enterForm = async (isPreview) => {
if (form.value.isTree && !form.value.treeJson){
ElMessage({
type: 'error',
message: '请填写树型结构的前端展示json属性'
})
return false
}
if (!form.value.onlyTemplate) {
if (form.value.fields.length <= 0) {
ElMessage({
@@ -1445,6 +1474,8 @@
gvaModel: true,
autoCreateResource: false,
onlyTemplate: false,
isTree: false,
treeJson: "",
fields: []
}
await nextTick()
@@ -148,49 +148,64 @@
:model="autoFunc"
label-width="80px"
>
<el-form-item label="包名:">
<el-input
v-model="autoFunc.package"
placeholder="请输入包名"
disabled
/>
</el-form-item>
<el-form-item label="结构体名:">
<el-input
v-model="autoFunc.structName"
placeholder="请输入结构体名"
disabled
/>
</el-form-item>
<el-form-item label="前端文件名:">
<el-input
v-model="autoFunc.packageName"
placeholder="请输入文件名"
disabled
/>
</el-form-item>
<el-form-item label="后端文件名:">
<el-input
v-model="autoFunc.humpPackageName"
placeholder="请输入文件名"
disabled
/>
</el-form-item>
<el-form-item label="描述:">
<el-input
v-model="autoFunc.description"
placeholder="请输入描述"
disabled
/>
</el-form-item>
<el-form-item label="缩写:">
<el-input
v-model="autoFunc.abbreviation"
placeholder="请输入缩写"
disabled
/>
</el-form-item>
<el-row :gutter="12">
<el-col :span="8">
<el-form-item label="包名:">
<el-input
v-model="autoFunc.package"
placeholder="请输入包名"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="结构体名:">
<el-input
v-model="autoFunc.structName"
placeholder="请输入结构体名"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="前端文件名:">
<el-input
v-model="autoFunc.packageName"
placeholder="请输入文件名"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="8">
<el-form-item label="后端文件名:">
<el-input
v-model="autoFunc.humpPackageName"
placeholder="请输入文件名"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="描述:">
<el-input
v-model="autoFunc.description"
placeholder="请输入描述"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="缩写:">
<el-input
v-model="autoFunc.abbreviation"
placeholder="请输入缩写"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="是否AI填充:">
<el-switch v-model="autoFunc.isAi" />
<span class="text-sm text-red-600 p-2"
@@ -378,7 +393,7 @@
funcFlag.value = true
}
const funcFlag = ref(false)
const funcFlag = ref(true)
const closeFunc = () => {
funcFlag.value = false
@@ -121,9 +121,18 @@
label="模板信息"
prop="templateInfo"
min-width="120"
show-overflow-tooltip
/>
<el-table-column align="left" label="操作" min-width="120">
<el-table-column align="left" label="操作" min-width="280">
<template #default="scope">
<el-button
type="primary"
link
icon="documentCopy"
class="table-button"
@click="copyFunc(scope.row)"
>复制</el-button
>
<el-button
type="primary"
link
@@ -834,6 +843,28 @@ JOINS模式下不支持导入
// 行为控制标记(弹窗内部需要增还是改)
const type = ref('')
// 复制
const copyFunc = async (row) => {
let copyData
const res = await findSysExportTemplate({ ID: row.ID })
if (res.code === 0) {
copyData = JSON.parse(JSON.stringify(res.data.resysExportTemplate))
if (!copyData.conditions) {
copyData.conditions = []
}
if (!copyData.joinTemplate) {
copyData.joinTemplate = []
}
delete copyData.ID
delete copyData.CreatedAt
delete copyData.UpdatedAt
copyData.templateID = copyData.templateID + '_copy'
copyData.name = copyData.name + '_copy'
formData.value = copyData
dialogFormVisible.value = true
}
}
// 更新行
const updateSysExportTemplateFunc = async (row) => {
const res = await findSysExportTemplate({ ID: row.ID })