发布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
parent 80c54ad890
commit 283143e1bf
69 changed files with 3609 additions and 480 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "gin-vue-admin",
"version": "2.7.7",
"version": "2.7.8-beta1",
"private": true,
"scripts": {
"serve": "node openDocument.js && vite --host --mode development",
@@ -17,6 +17,7 @@
"@vue-office/excel": "^1.7.11",
"@vue-office/pdf": "^2.0.2",
"@vueuse/core": "^11.0.3",
"@vueuse/integrations": "^12.0.0",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"ace-builds": "^1.36.4",
@@ -27,7 +28,6 @@
"echarts": "5.5.1",
"element-plus": "^2.8.5",
"highlight.js": "^11.10.0",
"js-cookie": "^3.0.5",
"marked": "14.1.1",
"marked-highlight": "^2.1.4",
"mitt": "^3.0.1",
@@ -39,6 +39,7 @@
"sortablejs": "^1.15.3",
"spark-md5": "^3.0.2",
"tailwindcss": "^3.4.10",
"universal-cookie": "^7",
"vform3-builds": "^3.0.10",
"vite-auto-import-svg": "^1.1.0",
"vue": "^3.5.7",

View File

@@ -90,11 +90,11 @@
const quickArr = [
{
label: '亮色主题',
func: () => changeMode('light')
func: () => changeMode(false)
},
{
label: '暗色主题',
func: () => changeMode('dark')
func: () => changeMode(true)
},
{
label: '退出登录',
@@ -135,12 +135,8 @@
dialogVisible.value = false
}
const changeMode = (e) => {
if (e === null) {
appStore.toggleTheme(false)
return
}
appStore.toggleTheme(true)
const changeMode = (darkMode) => {
appStore.toggleTheme(darkMode)
}
const close = () => {

View File

@@ -23,7 +23,7 @@
/>
</div>
<el-drawer v-model="drawer" title="媒体库" size="650px">
<el-drawer v-model="drawer" title="媒体库" :size="appStore.drawerSize">
<warning-bar title="点击“文件名/备注”可以编辑文件名或者备注内容。" />
<div class="gva-btn-list gap-2">
<upload-common :image-common="imageCommon" @on-success="getImageList" />
@@ -124,6 +124,9 @@
import { ElMessage, ElMessageBox } from 'element-plus'
import { Picture as IconPicture } from '@element-plus/icons-vue'
import selectComponent from '@/components/selectImage/selectComponent.vue'
import { useAppStore } from "@/pinia";
const appStore = useAppStore()
const imageUrl = ref('')
const imageCommon = ref('')

View File

@@ -17,7 +17,7 @@ export const viteLogo = (env) => {
`> 欢迎使用Gin-Vue-Admin开源地址https://github.com/flipped-aurora/gin-vue-admin`
)
)
console.log(greenText(`> 当前版本:v2.7.7`))
console.log(greenText(`> 当前版本:vv2.7.8-beta1`))
console.log(greenText(`> 加群方式:微信shouzi_1994 QQ群470239250`))
console.log(
greenText(`> 项目地址https://github.com/flipped-aurora/gin-vue-admin`)

View File

@@ -10,7 +10,7 @@ export default {
register(app)
console.log(`
欢迎使用 Gin-Vue-Admin
当前版本:v2.7.7
当前版本:v2.7.8-beta1
加群方式:微信shouzi_1994 QQ群622360840
项目地址https://github.com/flipped-aurora/gin-vue-admin
插件市场:https://plugin.gin-vue-admin.com

View File

@@ -7,7 +7,7 @@ import { useAppStore } from '@/pinia'
export default function useChartOption(sourceOption) {
const appStore = useAppStore()
const isDark = computed(() => {
return appStore.theme === 'dark'
return appStore.isDark
})
const chartOption = computed(() => {
return sourceOption(isDark.value)

View File

@@ -64,4 +64,4 @@
"/src/plugin/announcement/form/info.vue": "InfoForm",
"/src/plugin/announcement/view/info.vue": "Info",
"/src/plugin/email/view/index.vue": "Email"
}
}

View File

@@ -1,8 +1,12 @@
import { defineStore } from 'pinia'
import { ref, watchEffect, reactive } from 'vue'
import { setBodyPrimaryColor } from '@/utils/format'
import { useDark, usePreferredDark } from '@vueuse/core'
export const useAppStore = defineStore('app', () => {
const device = ref('')
const drawerSize = ref('')
const operateMinWith = ref('240')
const config = reactive({
weakness: false,
grey: false,
@@ -16,14 +20,17 @@ export const useAppStore = defineStore('app', () => {
side_mode: 'normal'
})
const theme = ref('auto')
const isDark = useDark({
selector: 'html',
attribute: 'class',
valueDark: 'dark',
valueLight: 'light',
})
const toggleTheme = (dark) => {
if (dark) {
theme.value = 'dark'
} else {
theme.value = 'light'
}
const preferredDark = usePreferredDark()
const toggleTheme = (darkMode) => {
isDark.value = darkMode
}
const toggleWeakness = (e) => {
@@ -43,6 +50,13 @@ export const useAppStore = defineStore('app', () => {
}
const toggleDevice = (e) => {
if(e === 'mobile'){
drawerSize.value = '100%'
operateMinWith.value = '80'
}else {
drawerSize.value = '800'
operateMinWith.value = '240'
}
device.value = e
}
@@ -50,15 +64,14 @@ export const useAppStore = defineStore('app', () => {
config.darkMode = e
}
const toggleDarkModeAuto = () => {
// 处理浏览器主题
const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')
const dark = darkQuery.matches
toggleTheme(dark)
darkQuery.addEventListener('change', (e) => {
toggleTheme(e.matches)
})
}
// 监听系统主题变化
watchEffect(() => {
if (config.darkMode === 'auto') {
isDark.value = preferredDark.value
return
}
isDark.value = config.darkMode === 'dark'
})
const toggleConfigSideWidth = (e) => {
config.layout_side_width = e
@@ -76,55 +89,26 @@ export const useAppStore = defineStore('app', () => {
config.show_watermark = e
}
const toggleSideModel = (e) => {
const toggleSideMode = (e) => {
config.side_mode = e
}
// 监听色弱模式和灰色模式
watchEffect(() => {
if (theme.value === 'dark') {
document.documentElement.classList.add('dark')
document.documentElement.classList.remove('light')
} else {
document.documentElement.classList.add('light')
document.documentElement.classList.remove('dark')
}
})
watchEffect(() => {
// 色弱模式监听处理
if (config.weakness) {
document.documentElement.classList.add('html-weakenss')
} else {
document.documentElement.classList.remove('html-weakenss')
}
})
watchEffect(() => {
// 灰色模式监听处理
if (config.grey) {
document.documentElement.classList.add('html-grey')
} else {
document.documentElement.classList.remove('html-grey')
}
document.documentElement.classList.toggle('html-weakenss', config.weakness)
document.documentElement.classList.toggle('html-grey', config.grey)
})
// 监听主题色
watchEffect(() => {
if (config.darkMode === 'auto') {
toggleDarkModeAuto()
}
if (config.darkMode === 'dark') {
toggleTheme(true)
} else {
toggleTheme(false)
}
})
watchEffect(() => {
setBodyPrimaryColor(config.primaryColor, theme.value)
setBodyPrimaryColor(config.primaryColor, isDark.value ? 'dark' : 'light')
})
return {
theme,
isDark,
device,
drawerSize,
operateMinWith,
config,
toggleTheme,
toggleDevice,
@@ -137,6 +121,6 @@ export const useAppStore = defineStore('app', () => {
toggleConfigSideCollapsedWidth,
toggleConfigSideItemHeight,
toggleConfigWatermark,
toggleSideModel
toggleSideMode
}
})

View File

@@ -3,9 +3,10 @@ import { jsonInBlacklist } from '@/api/jwt'
import router from '@/router/index'
import { ElLoading, ElMessage } from 'element-plus'
import { defineStore } from 'pinia'
import { ref, watch } from 'vue'
import { ref, computed } from 'vue'
import { useRouterStore } from './router'
import cookie from 'js-cookie'
import { useCookies } from '@vueuse/integrations/useCookies'
import { useStorage } from '@vueuse/core'
import { useAppStore } from '@/pinia'
@@ -19,9 +20,10 @@ export const useUserStore = defineStore('user', () => {
headerImg: '',
authority: {}
})
const token = ref(
window.localStorage.getItem('token') || cookie.get('x-token') || ''
)
const token = useStorage('token', '')
const xToken = useCookies('x-token')
const currentToken = computed(() => token.value || xToken.value || '')
const setUserInfo = (val) => {
userInfo.value = val
if (val.originSetting) {
@@ -33,11 +35,11 @@ export const useUserStore = defineStore('user', () => {
const setToken = (val) => {
token.value = val
xToken.value = val
}
const NeedInit = async () => {
token.value = ''
window.localStorage.removeItem('token')
await ClearStorage()
await router.push({ name: 'Init', replace: true })
}
@@ -57,49 +59,49 @@ export const useUserStore = defineStore('user', () => {
}
/* 登录*/
const LoginIn = async (loginInfo) => {
loadingInstance.value = ElLoading.service({
fullscreen: true,
text: '登录中,请稍候...'
})
try {
loadingInstance.value = ElLoading.service({
fullscreen: true,
text: '登录中,请稍候...'
})
const res = await login(loginInfo)
const res = await login(loginInfo)
if (res.code !== 0) {
ElMessage.error(res.message || '登录失败')
return false
}
// 登陆成功,设置用户信息和权限相关信息
setUserInfo(res.data.user)
setToken(res.data.token)
// 登陆失败,直接返回
if (res.code !== 0) {
loadingInstance.value.close()
// 初始化路由信息
const routerStore = useRouterStore()
await routerStore.SetAsyncRouter()
const asyncRouters = routerStore.asyncRouters
// 注册到路由表里
asyncRouters.forEach((asyncRouter) => {
router.addRoute(asyncRouter)
})
if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
ElMessage.error('请联系管理员进行授权')
} else {
await router.replace({ name: userInfo.value.authority.defaultRouter })
}
const isWindows = /windows/i.test(navigator.userAgent)
window.localStorage.setItem('osType', isWindows ? 'WIN' : 'MAC')
// 全部操作均结束关闭loading并返回
return true
} catch (error) {
console.error('LoginIn error:', error)
return false
} finally {
loadingInstance.value?.close()
}
// 登陆成功,设置用户信息和权限相关信息
setUserInfo(res.data.user)
setToken(res.data.token)
// 初始化路由信息
const routerStore = useRouterStore()
await routerStore.SetAsyncRouter()
const asyncRouters = routerStore.asyncRouters
// 注册到路由表里
asyncRouters.forEach((asyncRouter) => {
router.addRoute(asyncRouter)
})
if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
ElMessage.error('请联系管理员进行授权')
} else {
await router.replace({ name: userInfo.value.authority.defaultRouter })
}
const isWin = ref(/windows/i.test(navigator.userAgent))
if (isWin.value) {
window.localStorage.setItem('osType', 'WIN')
} else {
window.localStorage.setItem('osType', 'MAC')
}
// 全部操作均结束关闭loading并返回
loadingInstance.value.close()
return true
}
/* 登出*/
const LoginOut = async () => {
@@ -119,22 +121,14 @@ export const useUserStore = defineStore('user', () => {
/* 清理数据 */
const ClearStorage = async () => {
token.value = ''
xToken.value = ''
sessionStorage.clear()
window.localStorage.removeItem('token')
cookie.remove('x-token')
localStorage.removeItem('originSetting')
}
watch(
() => token.value,
() => {
window.localStorage.setItem('token', token.value)
}
)
return {
userInfo,
token,
token: currentToken,
NeedInit,
ResetUserInfo,
GetUserInfo,

View File

@@ -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 {

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':

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

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)"
>

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()

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"

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}`

View File

@@ -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)

View File

@@ -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({

View File

@@ -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,

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' }],

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: '',

View File

@@ -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
>

View File

@@ -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()

View File

@@ -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

View File

@@ -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 })