mirror of
https://github.com/flipped-aurora/gin-vue-admin.git
synced 2026-10-16 13:40:26 +00:00
feat: 使用prettierrc对代码进行格式化
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<warning-bar title="id , created_at , updated_at , deleted_at 会自动生成请勿重复创建。搜索时如果条件为LIKE只支持字符串" />
|
||||
<warning-bar
|
||||
title="id , created_at , updated_at , deleted_at 会自动生成请勿重复创建。搜索时如果条件为LIKE只支持字符串"
|
||||
/>
|
||||
<el-form
|
||||
ref="fieldDialogForm"
|
||||
:model="middleDate"
|
||||
@@ -9,65 +11,32 @@
|
||||
:rules="rules"
|
||||
class="grid grid-cols-2"
|
||||
>
|
||||
<el-form-item
|
||||
label="字段名称"
|
||||
prop="fieldName"
|
||||
>
|
||||
<el-form-item label="字段名称" prop="fieldName">
|
||||
<el-input
|
||||
v-model="middleDate.fieldName"
|
||||
autocomplete="off"
|
||||
style="width:80%"
|
||||
style="width: 80%"
|
||||
/>
|
||||
<el-button
|
||||
style="width:18%;margin-left:2%"
|
||||
@click="autoFill"
|
||||
>
|
||||
<el-button style="width: 18%; margin-left: 2%" @click="autoFill">
|
||||
<span style="font-size: 12px">自动填充</span>
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="字段中文名"
|
||||
prop="fieldDesc"
|
||||
>
|
||||
<el-input
|
||||
v-model="middleDate.fieldDesc"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="字段中文名" prop="fieldDesc">
|
||||
<el-input v-model="middleDate.fieldDesc" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="字段JSON"
|
||||
prop="fieldJson"
|
||||
>
|
||||
<el-input
|
||||
v-model="middleDate.fieldJson"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="字段JSON" prop="fieldJson">
|
||||
<el-input v-model="middleDate.fieldJson" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="数据库字段名"
|
||||
prop="columnName"
|
||||
>
|
||||
<el-input
|
||||
v-model="middleDate.columnName"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="数据库字段名" prop="columnName">
|
||||
<el-input v-model="middleDate.columnName" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="数据库字段描述"
|
||||
prop="comment"
|
||||
>
|
||||
<el-input
|
||||
v-model="middleDate.comment"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="数据库字段描述" prop="comment">
|
||||
<el-input v-model="middleDate.comment" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="字段类型"
|
||||
prop="fieldType"
|
||||
>
|
||||
<el-form-item label="字段类型" prop="fieldType">
|
||||
<el-select
|
||||
v-model="middleDate.fieldType"
|
||||
style="width:100%"
|
||||
style="width: 100%"
|
||||
placeholder="请选择字段类型"
|
||||
clearable
|
||||
@change="clearOther"
|
||||
@@ -87,17 +56,18 @@
|
||||
>
|
||||
<el-input
|
||||
v-model="middleDate.dataTypeLong"
|
||||
:placeholder="middleDate.fieldType === 'enum'?`例:'北京','天津'`:'数据库类型长度'"
|
||||
:placeholder="
|
||||
middleDate.fieldType === 'enum'
|
||||
? `例:'北京','天津'`
|
||||
: '数据库类型长度'
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="字段查询条件"
|
||||
prop="fieldSearchType"
|
||||
>
|
||||
<el-form-item label="字段查询条件" prop="fieldSearchType">
|
||||
<el-select
|
||||
v-model="middleDate.fieldSearchType"
|
||||
:disabled="middleDate.fieldType === 'json'"
|
||||
style="width:100%"
|
||||
style="width: 100%"
|
||||
placeholder="请选择字段查询条件"
|
||||
clearable
|
||||
>
|
||||
@@ -110,14 +80,11 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="关联字典"
|
||||
prop="dictType"
|
||||
>
|
||||
<el-form-item label="关联字典" prop="dictType">
|
||||
<el-select
|
||||
v-model="middleDate.dictType"
|
||||
style="width:100%"
|
||||
:disabled="middleDate.fieldType!=='string'"
|
||||
style="width: 100%"
|
||||
:disabled="middleDate.fieldType !== 'string'"
|
||||
placeholder="请选择字典"
|
||||
clearable
|
||||
>
|
||||
@@ -138,14 +105,11 @@
|
||||
<el-form-item label="主键">
|
||||
<el-checkbox v-model="middleDate.primaryKey" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="索引类型"
|
||||
prop="fieldIndexType"
|
||||
>
|
||||
<el-form-item label="索引类型" prop="fieldIndexType">
|
||||
<el-select
|
||||
v-model="middleDate.fieldIndexType"
|
||||
:disabled="middleDate.fieldType === 'json'"
|
||||
style="width:100%"
|
||||
style="width: 100%"
|
||||
placeholder="请选择字段索引类型"
|
||||
clearable
|
||||
>
|
||||
@@ -180,7 +144,10 @@
|
||||
<el-switch v-model="middleDate.clearable" />
|
||||
</el-form-item>
|
||||
<el-form-item label="隐藏查询条件">
|
||||
<el-switch v-model="middleDate.fieldSearchHide" :disabled="!middleDate.fieldSearchType" />
|
||||
<el-switch
|
||||
v-model="middleDate.fieldSearchHide"
|
||||
:disabled="!middleDate.fieldSearchType"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="校验失败文案">
|
||||
<el-input v-model="middleDate.errorText" />
|
||||
@@ -192,100 +159,124 @@
|
||||
name="1"
|
||||
>
|
||||
<el-row :gutter="8">
|
||||
<el-col
|
||||
:span="4"
|
||||
>
|
||||
<el-col :span="4">
|
||||
<el-select
|
||||
v-model="middleDate.dataSource.dbName"
|
||||
placeholder="数据库【不填则为GVA库】"
|
||||
@change="dbNameChange"
|
||||
clearable
|
||||
v-model="middleDate.dataSource.dbName"
|
||||
placeholder="数据库【不填则为GVA库】"
|
||||
@change="dbNameChange"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dbList"
|
||||
:key="item.aliasName"
|
||||
:value="item.aliasName"
|
||||
:label="item.aliasName"
|
||||
:disabled="item.disable"
|
||||
v-for="item in dbList"
|
||||
:key="item.aliasName"
|
||||
:value="item.aliasName"
|
||||
:label="item.aliasName"
|
||||
:disabled="item.disable"
|
||||
>
|
||||
<div>
|
||||
<span>{{ item.aliasName }}</span>
|
||||
<span style="float:right;color:#8492a6;font-size:13px">{{ item.dbName }}</span>
|
||||
<span style="float: right; color: #8492a6; font-size: 13px">{{
|
||||
item.dbName
|
||||
}}</span>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col
|
||||
:span="4"
|
||||
>
|
||||
<el-col :span="4">
|
||||
<el-select
|
||||
v-model="middleDate.dataSource.association"
|
||||
placeholder="关联模式"
|
||||
@change="associationChange"
|
||||
>
|
||||
<el-option
|
||||
label="一对一"
|
||||
:value="1"
|
||||
/>
|
||||
<el-option
|
||||
label="一对多"
|
||||
:value="2"
|
||||
/>
|
||||
<el-option label="一对一" :value="1" />
|
||||
<el-option label="一对多" :value="2" />
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="5">
|
||||
<el-select
|
||||
v-model="middleDate.dataSource.table" placeholder="请选择数据源表"
|
||||
filterable allow-create @focus="getDBTableList" @change="selectDB"
|
||||
v-model="middleDate.dataSource.table"
|
||||
placeholder="请选择数据源表"
|
||||
filterable
|
||||
allow-create
|
||||
@focus="getDBTableList"
|
||||
@change="selectDB"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dbTableList" :key="item.tableName" :label="item.tableName"
|
||||
v-for="item in dbTableList"
|
||||
:key="item.tableName"
|
||||
:label="item.tableName"
|
||||
:value="item.tableName"
|
||||
/>
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="5">
|
||||
<el-select v-model="middleDate.dataSource.value" placeholder="请先选择需要存储的数据">
|
||||
<el-select
|
||||
v-model="middleDate.dataSource.value"
|
||||
placeholder="请先选择需要存储的数据"
|
||||
>
|
||||
<template #label="{ value }">
|
||||
<span>存储: </span>
|
||||
<span style="font-weight: bold">{{ value }}</span>
|
||||
</template>
|
||||
<el-option v-for="item in dbColumnList" :key="item.columnName" :value="item.columnName">
|
||||
<span style="float: left"> <el-tag :type="item.isPrimary ? 'primary' : 'info'">
|
||||
{{ item.isPrimary ? "主 键" : "非主键" }}
|
||||
</el-tag> {{ item.columnName }}</span>
|
||||
<el-option
|
||||
v-for="item in dbColumnList"
|
||||
:key="item.columnName"
|
||||
:value="item.columnName"
|
||||
>
|
||||
<span style="float: left">
|
||||
<el-tag :type="item.isPrimary ? 'primary' : 'info'">
|
||||
{{ item.isPrimary ? '主 键' : '非主键' }}
|
||||
</el-tag>
|
||||
{{ item.columnName }}</span
|
||||
>
|
||||
<span
|
||||
style="
|
||||
float: right;
|
||||
margin-left:5px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
"
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
"
|
||||
>
|
||||
类型:{{ item.type }} <block v-if="item.comment != ''">,字段说明:{{ item.comment }}</block>
|
||||
类型:{{ item.type }}
|
||||
<block v-if="item.comment != ''"
|
||||
>,字段说明:{{ item.comment }}</block
|
||||
>
|
||||
</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="5">
|
||||
<el-select v-model="middleDate.dataSource.label" placeholder="请先选择需要展示的数据">
|
||||
<el-select
|
||||
v-model="middleDate.dataSource.label"
|
||||
placeholder="请先选择需要展示的数据"
|
||||
>
|
||||
<template #label="{ value }">
|
||||
<span>展示: </span>
|
||||
<span style="font-weight: bold">{{ value }}</span>
|
||||
</template>
|
||||
<el-option v-for="item in dbColumnList" :key="item.columnName" :value="item.columnName">
|
||||
<span style="float: left"> <el-tag :type="item.isPrimary ? 'primary' : 'info'">
|
||||
{{ item.isPrimary ? "主 键" : "非主键" }}
|
||||
</el-tag> {{ item.columnName }}</span>
|
||||
<span
|
||||
style="
|
||||
float: right;
|
||||
margin-left:5px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
"
|
||||
<el-option
|
||||
v-for="item in dbColumnList"
|
||||
:key="item.columnName"
|
||||
:value="item.columnName"
|
||||
>
|
||||
<span style="float: left">
|
||||
<el-tag :type="item.isPrimary ? 'primary' : 'info'">
|
||||
{{ item.isPrimary ? '主 键' : '非主键' }}
|
||||
</el-tag>
|
||||
{{ item.columnName }}</span
|
||||
>
|
||||
类型:{{ item.type }} <span v-if="item.comment != ''">,字段说明:{{ item.comment }}</span>
|
||||
<span
|
||||
style="
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
"
|
||||
>
|
||||
类型:{{ item.type }}
|
||||
<span v-if="item.comment != ''"
|
||||
>,字段说明:{{ item.comment }}</span
|
||||
>
|
||||
</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
@@ -298,201 +289,203 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { toLowerCase, toSQLLine } from '@/utils/stringFun'
|
||||
import { getSysDictionaryList } from '@/api/sysDictionary'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { ref,onMounted } from 'vue'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
import {getColumn, getDB, getTable} from "@/api/autoCode";
|
||||
import { toLowerCase, toSQLLine } from '@/utils/stringFun'
|
||||
import { getSysDictionaryList } from '@/api/sysDictionary'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
import { getColumn, getDB, getTable } from '@/api/autoCode'
|
||||
|
||||
defineOptions({
|
||||
name: 'FieldDialog'
|
||||
})
|
||||
|
||||
const props = defineProps({
|
||||
dialogMiddle: {
|
||||
type: Object,
|
||||
default: function() {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
typeOptions: {
|
||||
type: Array,
|
||||
default: function() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
typeSearchOptions: {
|
||||
type: Array,
|
||||
default: function() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
typeIndexOptions: {
|
||||
type: Array,
|
||||
default: function() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const activeNames = ref([])
|
||||
|
||||
const middleDate = ref({})
|
||||
const dictOptions = ref([])
|
||||
|
||||
const dbList = ref([])
|
||||
|
||||
const getDbFunc = async() => {
|
||||
const res = await getDB()
|
||||
if (res.code === 0) {
|
||||
dbList.value = res.data.dbList
|
||||
}
|
||||
}
|
||||
|
||||
const validateDataTypeLong = (rule, value, callback) => {
|
||||
const regex = /^('([^']*)'(?:,'([^']+)'*)*)$/;
|
||||
if (middleDate.value.fieldType == "enum" && !regex.test(value)) {
|
||||
callback(new Error("枚举值校验错误"));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
|
||||
const rules = ref({
|
||||
fieldName: [
|
||||
{ required: true, message: '请输入字段英文名', trigger: 'blur' }
|
||||
],
|
||||
fieldDesc: [
|
||||
{ required: true, message: '请输入字段中文名', trigger: 'blur' }
|
||||
],
|
||||
fieldJson: [
|
||||
{ required: true, message: '请输入字段格式化json', trigger: 'blur' }
|
||||
],
|
||||
columnName: [
|
||||
{ required: true, message: '请输入数据库字段', trigger: 'blur' }
|
||||
],
|
||||
fieldType: [
|
||||
{ required: true, message: '请选择字段类型', trigger: 'blur' }
|
||||
],
|
||||
dataTypeLong: [
|
||||
{ validator: validateDataTypeLong, trigger: "blur" }
|
||||
],
|
||||
})
|
||||
|
||||
const init = async() => {
|
||||
middleDate.value = props.dialogMiddle
|
||||
const dictRes = await getSysDictionaryList({
|
||||
page: 1,
|
||||
pageSize: 999999
|
||||
defineOptions({
|
||||
name: 'FieldDialog'
|
||||
})
|
||||
|
||||
dictOptions.value = dictRes.data
|
||||
}
|
||||
init()
|
||||
|
||||
const autoFill = () => {
|
||||
middleDate.value.fieldJson = toLowerCase(middleDate.value.fieldName)
|
||||
middleDate.value.columnName = toSQLLine(middleDate.value.fieldJson)
|
||||
}
|
||||
|
||||
const canSelect = (item) => {
|
||||
const fieldType = middleDate.value.fieldType
|
||||
if (fieldType !== 'string' && item === 'LIKE') {
|
||||
return true
|
||||
}
|
||||
|
||||
if ((fieldType !== 'int' && fieldType !== 'time.Time' && fieldType !== 'float64') && (item === 'BETWEEN' || item === 'NOT BETWEEN')) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const clearOther = () => {
|
||||
middleDate.value.fieldSearchType = ''
|
||||
middleDate.value.dictType = ''
|
||||
}
|
||||
|
||||
const associationChange = (val) => {
|
||||
if (val === 2) {
|
||||
ElMessageBox.confirm(
|
||||
'一对多关联模式下,数据类型会改变为数组,后端表现为json,具体表现为数组模式,是否继续?',
|
||||
'提示',
|
||||
{
|
||||
confirmButtonText: '继续',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
const props = defineProps({
|
||||
dialogMiddle: {
|
||||
type: Object,
|
||||
default: function () {
|
||||
return {}
|
||||
}
|
||||
).then(() => {
|
||||
middleDate.value.fieldType = 'array'
|
||||
}).catch(() => {
|
||||
middleDate.value.dataSource.association = 1
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const dbNameChange = () => {
|
||||
getDBTableList()
|
||||
middleDate.value.dataSource.table = ''
|
||||
middleDate.value.dataSource.value = ''
|
||||
middleDate.value.dataSource.label = ''
|
||||
}
|
||||
|
||||
|
||||
const dbTableList = ref([])
|
||||
|
||||
const getDBTableList = async () => {
|
||||
const res = await getTable({ businessDB: middleDate.value.dataSource.dbName })
|
||||
if (res.code === 0) {
|
||||
let list = res.data.tables; // 确保这里正确获取到 tables 数组
|
||||
dbTableList.value = list.map(item => ({
|
||||
tableName: item.tableName,
|
||||
value: item.tableName // 这里假设 value 也是 tableName,如果不同请调整
|
||||
}));
|
||||
}
|
||||
middleDate.value.dataSource.value = ''
|
||||
middleDate.value.dataSource.label = ''
|
||||
}
|
||||
|
||||
const dbColumnList = ref([])
|
||||
const selectDB = async (val,isInit) => {
|
||||
middleDate.value.dataSource.hasDeletedAt = false
|
||||
middleDate.value.dataSource.table = val
|
||||
const res = await getColumn({
|
||||
businessDB: middleDate.value.dataSource.dbName,
|
||||
tableName: val
|
||||
},
|
||||
typeOptions: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
typeSearchOptions: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
typeIndexOptions: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (res.code === 0) {
|
||||
let list = res.data.columns; // 确保这里正确获取到 tables 数组
|
||||
dbColumnList.value = list.map(item => {
|
||||
if(item.columnName === 'deleted_at'){
|
||||
const activeNames = ref([])
|
||||
|
||||
const middleDate = ref({})
|
||||
const dictOptions = ref([])
|
||||
|
||||
const dbList = ref([])
|
||||
|
||||
const getDbFunc = async () => {
|
||||
const res = await getDB()
|
||||
if (res.code === 0) {
|
||||
dbList.value = res.data.dbList
|
||||
}
|
||||
}
|
||||
|
||||
const validateDataTypeLong = (rule, value, callback) => {
|
||||
const regex = /^('([^']*)'(?:,'([^']+)'*)*)$/
|
||||
if (middleDate.value.fieldType == 'enum' && !regex.test(value)) {
|
||||
callback(new Error('枚举值校验错误'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
const rules = ref({
|
||||
fieldName: [
|
||||
{ required: true, message: '请输入字段英文名', trigger: 'blur' }
|
||||
],
|
||||
fieldDesc: [
|
||||
{ required: true, message: '请输入字段中文名', trigger: 'blur' }
|
||||
],
|
||||
fieldJson: [
|
||||
{ required: true, message: '请输入字段格式化json', trigger: 'blur' }
|
||||
],
|
||||
columnName: [
|
||||
{ required: true, message: '请输入数据库字段', trigger: 'blur' }
|
||||
],
|
||||
fieldType: [{ required: true, message: '请选择字段类型', trigger: 'blur' }],
|
||||
dataTypeLong: [{ validator: validateDataTypeLong, trigger: 'blur' }]
|
||||
})
|
||||
|
||||
const init = async () => {
|
||||
middleDate.value = props.dialogMiddle
|
||||
const dictRes = await getSysDictionaryList({
|
||||
page: 1,
|
||||
pageSize: 999999
|
||||
})
|
||||
|
||||
dictOptions.value = dictRes.data
|
||||
}
|
||||
init()
|
||||
|
||||
const autoFill = () => {
|
||||
middleDate.value.fieldJson = toLowerCase(middleDate.value.fieldName)
|
||||
middleDate.value.columnName = toSQLLine(middleDate.value.fieldJson)
|
||||
}
|
||||
|
||||
const canSelect = (item) => {
|
||||
const fieldType = middleDate.value.fieldType
|
||||
if (fieldType !== 'string' && item === 'LIKE') {
|
||||
return true
|
||||
}
|
||||
|
||||
if (
|
||||
fieldType !== 'int' &&
|
||||
fieldType !== 'time.Time' &&
|
||||
fieldType !== 'float64' &&
|
||||
(item === 'BETWEEN' || item === 'NOT BETWEEN')
|
||||
) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const clearOther = () => {
|
||||
middleDate.value.fieldSearchType = ''
|
||||
middleDate.value.dictType = ''
|
||||
}
|
||||
|
||||
const associationChange = (val) => {
|
||||
if (val === 2) {
|
||||
ElMessageBox.confirm(
|
||||
'一对多关联模式下,数据类型会改变为数组,后端表现为json,具体表现为数组模式,是否继续?',
|
||||
'提示',
|
||||
{
|
||||
confirmButtonText: '继续',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
middleDate.value.fieldType = 'array'
|
||||
})
|
||||
.catch(() => {
|
||||
middleDate.value.dataSource.association = 1
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const dbNameChange = () => {
|
||||
getDBTableList()
|
||||
middleDate.value.dataSource.table = ''
|
||||
middleDate.value.dataSource.value = ''
|
||||
middleDate.value.dataSource.label = ''
|
||||
}
|
||||
|
||||
const dbTableList = ref([])
|
||||
|
||||
const getDBTableList = async () => {
|
||||
const res = await getTable({
|
||||
businessDB: middleDate.value.dataSource.dbName
|
||||
})
|
||||
if (res.code === 0) {
|
||||
let list = res.data.tables // 确保这里正确获取到 tables 数组
|
||||
dbTableList.value = list.map((item) => ({
|
||||
tableName: item.tableName,
|
||||
value: item.tableName // 这里假设 value 也是 tableName,如果不同请调整
|
||||
}))
|
||||
}
|
||||
middleDate.value.dataSource.value = ''
|
||||
middleDate.value.dataSource.label = ''
|
||||
}
|
||||
|
||||
const dbColumnList = ref([])
|
||||
const selectDB = async (val, isInit) => {
|
||||
middleDate.value.dataSource.hasDeletedAt = false
|
||||
middleDate.value.dataSource.table = val
|
||||
const res = await getColumn({
|
||||
businessDB: middleDate.value.dataSource.dbName,
|
||||
tableName: val
|
||||
})
|
||||
|
||||
if (res.code === 0) {
|
||||
let list = res.data.columns // 确保这里正确获取到 tables 数组
|
||||
dbColumnList.value = list.map((item) => {
|
||||
if (item.columnName === 'deleted_at') {
|
||||
middleDate.value.dataSource.hasDeletedAt = true
|
||||
}
|
||||
return{
|
||||
columnName: item.columnName,
|
||||
value: item.columnName,
|
||||
type: item.dataType,
|
||||
isPrimary: item.primaryKey,
|
||||
comment: item.columnComment
|
||||
return {
|
||||
columnName: item.columnName,
|
||||
value: item.columnName,
|
||||
type: item.dataType,
|
||||
isPrimary: item.primaryKey,
|
||||
comment: item.columnComment
|
||||
}
|
||||
});
|
||||
if (dbColumnList.value.length > 0 && !isInit) {
|
||||
middleDate.value.dataSource.label = dbColumnList.value[0].columnName
|
||||
middleDate.value.dataSource.value = dbColumnList.value[0].columnName
|
||||
})
|
||||
if (dbColumnList.value.length > 0 && !isInit) {
|
||||
middleDate.value.dataSource.label = dbColumnList.value[0].columnName
|
||||
middleDate.value.dataSource.value = dbColumnList.value[0].columnName
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const fieldDialogForm = ref(null)
|
||||
defineExpose({ fieldDialogForm })
|
||||
|
||||
const fieldDialogForm = ref(null)
|
||||
defineExpose({ fieldDialogForm })
|
||||
|
||||
onMounted(()=>{
|
||||
getDbFunc()
|
||||
if(middleDate.value.dataSource.table){
|
||||
selectDB(middleDate.value.dataSource.table,true)
|
||||
}
|
||||
})
|
||||
onMounted(() => {
|
||||
getDbFunc()
|
||||
if (middleDate.value.dataSource.table) {
|
||||
selectDB(middleDate.value.dataSource.table, true)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,116 +1,119 @@
|
||||
<template>
|
||||
<el-tabs v-model="activeName" tab-position="left" class="h-[calc(100vh-110px)]">
|
||||
<el-tabs
|
||||
v-model="activeName"
|
||||
tab-position="left"
|
||||
class="h-[calc(100vh-110px)]"
|
||||
>
|
||||
<el-tab-pane
|
||||
v-for="(item, key) in useCode"
|
||||
:key="key"
|
||||
:label="key"
|
||||
:name="key"
|
||||
>
|
||||
<div
|
||||
:id="key"
|
||||
class="h-[calc(100vh-110px)] px-5 overflow-y-scroll"
|
||||
></div>
|
||||
<div :id="key" class="h-[calc(100vh-110px)] px-5 overflow-y-scroll"></div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Marked } from "marked";
|
||||
import { markedHighlight } from "marked-highlight";
|
||||
import hljs from 'highlight.js'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { onMounted, ref, watchEffect } from 'vue'
|
||||
import {useAppStore} from "@/pinia";
|
||||
import { Marked } from 'marked'
|
||||
import { markedHighlight } from 'marked-highlight'
|
||||
import hljs from 'highlight.js'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { onMounted, ref, watchEffect } from 'vue'
|
||||
import { useAppStore } from '@/pinia'
|
||||
|
||||
const appStore = useAppStore()
|
||||
const appStore = useAppStore()
|
||||
|
||||
const useCode = ref({})
|
||||
const useCode = ref({})
|
||||
|
||||
const createKey = [
|
||||
"enter.go",
|
||||
"gorm_biz.go",
|
||||
"router_biz.go",
|
||||
"api",
|
||||
"router",
|
||||
"initialize",
|
||||
"gen.go",
|
||||
]
|
||||
const createKey = [
|
||||
'enter.go',
|
||||
'gorm_biz.go',
|
||||
'router_biz.go',
|
||||
'api',
|
||||
'router',
|
||||
'initialize',
|
||||
'gen.go'
|
||||
]
|
||||
|
||||
onMounted(() => {
|
||||
const isDarkMode = appStore.config.darkMode === 'dark';
|
||||
if (isDarkMode) {
|
||||
import('highlight.js/styles/atom-one-dark.css');
|
||||
} else {
|
||||
import('highlight.js/styles/atom-one-light.css');
|
||||
}
|
||||
});
|
||||
|
||||
const props = defineProps({
|
||||
previewCode: {
|
||||
type: Object,
|
||||
default() {
|
||||
return {}
|
||||
onMounted(() => {
|
||||
const isDarkMode = appStore.config.darkMode === 'dark'
|
||||
if (isDarkMode) {
|
||||
import('highlight.js/styles/atom-one-dark.css')
|
||||
} else {
|
||||
import('highlight.js/styles/atom-one-light.css')
|
||||
}
|
||||
},
|
||||
isAdd: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
watchEffect(() => {
|
||||
for (const key in props.previewCode) {
|
||||
if (props.isAdd && createKey.some(createKeyItem => key.includes(createKeyItem))) {
|
||||
continue;
|
||||
const props = defineProps({
|
||||
previewCode: {
|
||||
type: Object,
|
||||
default() {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
isAdd: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
useCode.value[key] = props.previewCode[key]
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
const activeName = ref('')
|
||||
onMounted(() => {
|
||||
const marked = new Marked(
|
||||
watchEffect(() => {
|
||||
for (const key in props.previewCode) {
|
||||
if (
|
||||
props.isAdd &&
|
||||
createKey.some((createKeyItem) => key.includes(createKeyItem))
|
||||
) {
|
||||
continue
|
||||
}
|
||||
useCode.value[key] = props.previewCode[key]
|
||||
}
|
||||
})
|
||||
|
||||
const activeName = ref('')
|
||||
onMounted(() => {
|
||||
const marked = new Marked(
|
||||
markedHighlight({
|
||||
langPrefix: 'hljs language-',
|
||||
highlight(code, lang) {
|
||||
const language = hljs.getLanguage(lang) ? lang : 'plaintext';
|
||||
const language = hljs.getLanguage(lang) ? lang : 'plaintext'
|
||||
if (lang === 'vue') {
|
||||
return hljs.highlight(code, { language: 'html' }).value;
|
||||
return hljs.highlight(code, { language: 'html' }).value
|
||||
}
|
||||
return hljs.highlight(code, { language }).value;
|
||||
return hljs.highlight(code, { language }).value
|
||||
}
|
||||
})
|
||||
);
|
||||
for (const key in useCode.value) {
|
||||
if (activeName.value === '') {
|
||||
activeName.value = key
|
||||
)
|
||||
for (const key in useCode.value) {
|
||||
if (activeName.value === '') {
|
||||
activeName.value = key
|
||||
}
|
||||
document.getElementById(key).innerHTML = marked.parse(useCode.value[key])
|
||||
}
|
||||
})
|
||||
|
||||
const selectText = () => {
|
||||
const element = document.getElementById(activeName.value)
|
||||
if (document.body.createTextRange) {
|
||||
const range = document.body.createTextRange()
|
||||
range.moveToElementText(element)
|
||||
range.select()
|
||||
} else if (window.getSelection) {
|
||||
const selection = window.getSelection()
|
||||
const range = document.createRange()
|
||||
range.selectNodeContents(element)
|
||||
selection.removeAllRanges()
|
||||
selection.addRange(range)
|
||||
} else {
|
||||
alert('none')
|
||||
}
|
||||
document.getElementById(key).innerHTML = marked.parse(useCode.value[key])
|
||||
}
|
||||
})
|
||||
|
||||
const selectText = () => {
|
||||
const element = document.getElementById(activeName.value)
|
||||
if (document.body.createTextRange) {
|
||||
const range = document.body.createTextRange()
|
||||
range.moveToElementText(element)
|
||||
range.select()
|
||||
} else if (window.getSelection) {
|
||||
const selection = window.getSelection()
|
||||
const range = document.createRange()
|
||||
range.selectNodeContents(element)
|
||||
selection.removeAllRanges()
|
||||
selection.addRange(range)
|
||||
} else {
|
||||
alert('none')
|
||||
const copy = () => {
|
||||
selectText()
|
||||
document.execCommand('copy')
|
||||
ElMessage.success('复制成功')
|
||||
}
|
||||
}
|
||||
const copy = () => {
|
||||
selectText()
|
||||
document.execCommand('copy')
|
||||
ElMessage.success('复制成功')
|
||||
}
|
||||
|
||||
defineExpose({ copy })
|
||||
|
||||
defineExpose({ copy })
|
||||
</script>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,9 +11,7 @@
|
||||
<el-table-column align="left" label="id" width="60" prop="ID" />
|
||||
<el-table-column align="left" label="日期" width="180">
|
||||
<template #default="scope">
|
||||
{{
|
||||
formatDate(scope.row.CreatedAt)
|
||||
}}
|
||||
{{ formatDate(scope.row.CreatedAt) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
@@ -44,9 +42,7 @@
|
||||
<el-tag v-if="scope.row.flag" type="danger" effect="dark">
|
||||
已回滚
|
||||
</el-tag>
|
||||
<el-tag v-else type="success" effect="dark">
|
||||
未回滚
|
||||
</el-tag>
|
||||
<el-tag v-else type="success" effect="dark"> 未回滚 </el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" label="操作" min-width="240">
|
||||
@@ -60,7 +56,7 @@
|
||||
>
|
||||
增加方法
|
||||
</el-button>
|
||||
<el-button type="primary" link @click="goAutoCode(scope.row,1)">
|
||||
<el-button type="primary" link @click="goAutoCode(scope.row, 1)">
|
||||
增加字段
|
||||
</el-button>
|
||||
<el-button
|
||||
@@ -101,14 +97,8 @@
|
||||
>
|
||||
<el-form :inline="true" :model="formData" label-width="80px">
|
||||
<el-form-item label="选项:">
|
||||
<el-checkbox
|
||||
v-model="formData.deleteApi"
|
||||
label="删除接口"
|
||||
/>
|
||||
<el-checkbox
|
||||
v-model="formData.deleteMenu"
|
||||
label="删除菜单"
|
||||
/>
|
||||
<el-checkbox v-model="formData.deleteApi" label="删除接口" />
|
||||
<el-checkbox v-model="formData.deleteMenu" label="删除菜单" />
|
||||
<el-checkbox
|
||||
v-model="formData.deleteTable"
|
||||
label="删除表"
|
||||
@@ -118,24 +108,19 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="closeDialog">
|
||||
取 消
|
||||
</el-button>
|
||||
<el-button @click="closeDialog"> 取 消 </el-button>
|
||||
<el-popconfirm
|
||||
title="此操作将回滚生成文件和勾选项目, 是否继续?"
|
||||
@confirm="enterDialog"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button type="primary">
|
||||
确 定
|
||||
</el-button>
|
||||
<el-button type="primary"> 确 定 </el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
|
||||
<el-drawer
|
||||
v-model="funcFlag"
|
||||
size="60%"
|
||||
@@ -146,74 +131,134 @@
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-lg">操作栏</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="runFunc"
|
||||
:loading="aiLoading"
|
||||
>
|
||||
<el-button type="primary" @click="runFunc" :loading="aiLoading">
|
||||
生成
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="closeFunc"
|
||||
:loading="aiLoading"
|
||||
>
|
||||
<el-button type="primary" @click="closeFunc" :loading="aiLoading">
|
||||
取消
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="">
|
||||
<el-form v-loading="aiLoading" label-position="top" element-loading-text="小淼正在思考,请稍候..." :model="autoFunc" label-width="80px">
|
||||
<el-form
|
||||
v-loading="aiLoading"
|
||||
label-position="top"
|
||||
element-loading-text="小淼正在思考,请稍候..."
|
||||
:model="autoFunc"
|
||||
label-width="80px"
|
||||
>
|
||||
<el-form-item label="包名:">
|
||||
<el-input v-model="autoFunc.package" placeholder="请输入包名" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.package"
|
||||
placeholder="请输入包名"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="结构体名:">
|
||||
<el-input v-model="autoFunc.structName" placeholder="请输入结构体名" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.structName"
|
||||
placeholder="请输入结构体名"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="前端文件名:">
|
||||
<el-input v-model="autoFunc.packageName" placeholder="请输入文件名" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.packageName"
|
||||
placeholder="请输入文件名"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="后端文件名:">
|
||||
<el-input v-model="autoFunc.humpPackageName" placeholder="请输入文件名" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.humpPackageName"
|
||||
placeholder="请输入文件名"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input v-model="autoFunc.description" placeholder="请输入描述" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.description"
|
||||
placeholder="请输入描述"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="缩写:">
|
||||
<el-input v-model="autoFunc.abbreviation" placeholder="请输入缩写" disabled />
|
||||
<el-input
|
||||
v-model="autoFunc.abbreviation"
|
||||
placeholder="请输入缩写"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item label="是否AI填充:">
|
||||
<el-switch v-model="autoFunc.isAi" /> <span class="text-sm text-red-600 p-2">当前ai帮写存在不稳定因素,生成代码后请注意手动调整部分内容</span>
|
||||
<el-switch v-model="autoFunc.isAi" />
|
||||
<span class="text-sm text-red-600 p-2"
|
||||
>当前ai帮写存在不稳定因素,生成代码后请注意手动调整部分内容</span
|
||||
>
|
||||
</el-form-item>
|
||||
<template v-if="autoFunc.isAi">
|
||||
<el-form-item label="Ai帮写:">
|
||||
<div class="relative w-full">
|
||||
<el-input type="textarea" placeholder="AI帮写功能,输入提示信息,自动生成代码" v-model="autoFunc.prompt" :rows="5" @input="autoFunc.router = autoFunc.router.replace(/\//g, '')" />
|
||||
<el-button @click="aiAddFunc" type="primary" class="absolute right-2 bottom-2"><ai-gva />帮写</el-button>
|
||||
<el-input
|
||||
type="textarea"
|
||||
placeholder="AI帮写功能,输入提示信息,自动生成代码"
|
||||
v-model="autoFunc.prompt"
|
||||
:rows="5"
|
||||
@input="autoFunc.router = autoFunc.router.replace(/\//g, '')"
|
||||
/>
|
||||
<el-button
|
||||
@click="aiAddFunc"
|
||||
type="primary"
|
||||
class="absolute right-2 bottom-2"
|
||||
><ai-gva />帮写</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="Api方法:">
|
||||
<v-ace-editor v-model:value="autoFunc.apiFunc" lang="golang" theme="github_dark" class="h-80 w-full" />
|
||||
<v-ace-editor
|
||||
v-model:value="autoFunc.apiFunc"
|
||||
lang="golang"
|
||||
theme="github_dark"
|
||||
class="h-80 w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="Server方法:">
|
||||
<v-ace-editor v-model:value="autoFunc.serverFunc" lang="golang" theme="github_dark" class="h-80 w-full" />
|
||||
<v-ace-editor
|
||||
v-model:value="autoFunc.serverFunc"
|
||||
lang="golang"
|
||||
theme="github_dark"
|
||||
class="h-80 w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="前端JSAPI方法:">
|
||||
<v-ace-editor v-model:value="autoFunc.jsFunc" lang="javascript" theme="github_dark" class="h-80 w-full" />
|
||||
<v-ace-editor
|
||||
v-model:value="autoFunc.jsFunc"
|
||||
lang="javascript"
|
||||
theme="github_dark"
|
||||
class="h-80 w-full"
|
||||
/>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<el-form-item label="方法介绍:">
|
||||
<div class="flex w-full gap-2">
|
||||
<el-input class="flex-1" v-model="autoFunc.funcDesc" placeholder="请输入方法介绍" />
|
||||
<el-button type="primary" @click="autoComplete"><ai-gva />补全</el-button>
|
||||
<el-input
|
||||
class="flex-1"
|
||||
v-model="autoFunc.funcDesc"
|
||||
placeholder="请输入方法介绍"
|
||||
/>
|
||||
<el-button type="primary" @click="autoComplete"
|
||||
><ai-gva />补全</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="方法名:">
|
||||
<el-input @blur="autoFunc.funcName = toUpperCase(autoFunc.funcName)" v-model="autoFunc.funcName" placeholder="请输入方法名" />
|
||||
<el-input
|
||||
@blur="autoFunc.funcName = toUpperCase(autoFunc.funcName)"
|
||||
v-model="autoFunc.funcName"
|
||||
placeholder="请输入方法名"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="方法:">
|
||||
<el-select v-model="autoFunc.method" placeholder="请选择方法">
|
||||
@@ -226,11 +271,23 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否鉴权:">
|
||||
<el-switch v-model="autoFunc.isAuth" active-text="是" inactive-text="否" />
|
||||
<el-switch
|
||||
v-model="autoFunc.isAuth"
|
||||
active-text="是"
|
||||
inactive-text="否"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="路由path:">
|
||||
<el-input v-model="autoFunc.router" placeholder="路由path" @input="autoFunc.router = autoFunc.router.replace(/\//g, '')" />
|
||||
<div>API路径: [{{ autoFunc.method }}] /{{ autoFunc.abbreviation }}/{{ autoFunc.router }}</div>
|
||||
<el-input
|
||||
v-model="autoFunc.router"
|
||||
placeholder="路由path"
|
||||
@input="autoFunc.router = autoFunc.router.replace(/\//g, '')"
|
||||
/>
|
||||
<div>
|
||||
API路径: [{{ autoFunc.method }}] /{{ autoFunc.abbreviation }}/{{
|
||||
autoFunc.router
|
||||
}}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
@@ -239,305 +296,310 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getSysHistory, rollback, delSysHistory,addFunc,butler } from "@/api/autoCode.js";
|
||||
import { useRouter } from "vue-router";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { ref } from "vue";
|
||||
import { formatDate } from "@/utils/format";
|
||||
import { toUpperCase } from "@/utils/stringFun"
|
||||
import {
|
||||
getSysHistory,
|
||||
rollback,
|
||||
delSysHistory,
|
||||
addFunc,
|
||||
butler
|
||||
} from '@/api/autoCode.js'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ref } from 'vue'
|
||||
import { formatDate } from '@/utils/format'
|
||||
import { toUpperCase } from '@/utils/stringFun'
|
||||
|
||||
import { VAceEditor } from "vue3-ace-editor"
|
||||
import 'ace-builds/src-noconflict/mode-javascript';
|
||||
import 'ace-builds/src-noconflict/mode-golang';
|
||||
import 'ace-builds/src-noconflict/theme-github_dark';
|
||||
import { VAceEditor } from 'vue3-ace-editor'
|
||||
import 'ace-builds/src-noconflict/mode-javascript'
|
||||
import 'ace-builds/src-noconflict/mode-golang'
|
||||
import 'ace-builds/src-noconflict/theme-github_dark'
|
||||
|
||||
defineOptions({
|
||||
name: 'AutoCodeAdmin'
|
||||
})
|
||||
|
||||
defineOptions({
|
||||
name: "AutoCodeAdmin",
|
||||
});
|
||||
const aiLoading = ref(false)
|
||||
|
||||
const aiLoading = ref(false)
|
||||
|
||||
const formData = ref({
|
||||
id: undefined,
|
||||
deleteApi: true,
|
||||
deleteMenu: true,
|
||||
deleteTable: false,
|
||||
});
|
||||
|
||||
const router = useRouter();
|
||||
const dialogFormVisible = ref(false);
|
||||
const dialogFormTitle = ref("");
|
||||
|
||||
const page = ref(1);
|
||||
const total = ref(0);
|
||||
const pageSize = ref(10);
|
||||
const tableData = ref([]);
|
||||
|
||||
const activeInfo = ref("")
|
||||
|
||||
const autoFunc = ref({
|
||||
package:"",
|
||||
funcName:"",
|
||||
structName:"",
|
||||
packageName:"",
|
||||
description:"",
|
||||
abbreviation:"",
|
||||
humpPackageName:"",
|
||||
businessDB:"",
|
||||
method:"",
|
||||
funcDesc: "",
|
||||
isAuth:false,
|
||||
isAi:false,
|
||||
apiFunc:"",
|
||||
serverFunc:"",
|
||||
jsFunc:"",
|
||||
})
|
||||
|
||||
const addFuncBtn = (row) => {
|
||||
const req = JSON.parse(row.request)
|
||||
activeInfo.value = row.request
|
||||
autoFunc.value.package = req.package
|
||||
autoFunc.value.structName = req.structName
|
||||
autoFunc.value.packageName = req.packageName
|
||||
autoFunc.value.description = req.description
|
||||
autoFunc.value.abbreviation = req.abbreviation
|
||||
autoFunc.value.humpPackageName = req.humpPackageName
|
||||
autoFunc.value.businessDB = req.businessDB
|
||||
autoFunc.value.method = ""
|
||||
autoFunc.value.funcName = ""
|
||||
autoFunc.value.router = ""
|
||||
autoFunc.value.funcDesc = ""
|
||||
autoFunc.value.isAuth = false
|
||||
autoFunc.value.isAi = false
|
||||
autoFunc.value.apiFunc = ""
|
||||
autoFunc.value.serverFunc = ""
|
||||
autoFunc.value.jsFunc = ""
|
||||
funcFlag.value = true;
|
||||
};
|
||||
|
||||
const funcFlag = ref(false);
|
||||
|
||||
const closeFunc = () => {
|
||||
funcFlag.value = false;
|
||||
};
|
||||
|
||||
const runFunc = async () =>{
|
||||
// 首字母自动转换为大写
|
||||
autoFunc.value.funcName = toUpperCase(autoFunc.value.funcName)
|
||||
|
||||
if (!autoFunc.value.funcName) {
|
||||
ElMessage.error("请输入方法名")
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.method) {
|
||||
ElMessage.error("请选择方法")
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.router) {
|
||||
ElMessage.error("请输入路由")
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.funcDesc) {
|
||||
ElMessage.error("请输入方法介绍")
|
||||
return
|
||||
}
|
||||
|
||||
if (autoFunc.value.isAi){
|
||||
if (!autoFunc.value.apiFunc || !autoFunc.value.serverFunc || !autoFunc.value.jsFunc) {
|
||||
ElMessage.error("请先使用AI帮写完成基础代码,如果生成失败请重新调用")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const res = await addFunc(autoFunc.value)
|
||||
if (res.code === 0) {
|
||||
ElMessage.success("增加方法成功");
|
||||
closeFunc()
|
||||
}
|
||||
}
|
||||
|
||||
// 分页
|
||||
const handleSizeChange = (val) => {
|
||||
pageSize.value = val;
|
||||
getTableData();
|
||||
};
|
||||
|
||||
const handleCurrentChange = (val) => {
|
||||
page.value = val;
|
||||
getTableData();
|
||||
};
|
||||
|
||||
// 查询
|
||||
const getTableData = async () => {
|
||||
const table = await getSysHistory({
|
||||
page: page.value,
|
||||
pageSize: pageSize.value,
|
||||
});
|
||||
if (table.code === 0) {
|
||||
tableData.value = table.data.list;
|
||||
total.value = table.data.total;
|
||||
page.value = table.data.page;
|
||||
pageSize.value = table.data.pageSize;
|
||||
}
|
||||
};
|
||||
|
||||
getTableData();
|
||||
|
||||
const deleteRow = async (row) => {
|
||||
ElMessageBox.confirm("此操作将删除本历史, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
}).then(async () => {
|
||||
const res = await delSysHistory({ id: Number(row.ID) });
|
||||
if (res.code === 0) {
|
||||
ElMessage.success("删除成功");
|
||||
getTableData();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (row) => {
|
||||
dialogFormTitle.value = "回滚:" + row.structName;
|
||||
formData.value.id = row.ID;
|
||||
dialogFormVisible.value = true;
|
||||
};
|
||||
|
||||
// 关闭弹窗
|
||||
const closeDialog = () => {
|
||||
dialogFormVisible.value = false;
|
||||
formData.value = {
|
||||
const formData = ref({
|
||||
id: undefined,
|
||||
deleteApi: true,
|
||||
deleteMenu: true,
|
||||
deleteTable: false,
|
||||
};
|
||||
};
|
||||
deleteTable: false
|
||||
})
|
||||
|
||||
// 确认删除表
|
||||
const deleteTableCheck = (flag) => {
|
||||
if (flag) {
|
||||
ElMessageBox.confirm(
|
||||
`此操作将删除自动创建的文件和api(会删除表!!!), 是否继续?`,
|
||||
"提示",
|
||||
{
|
||||
closeOnClickModal: false,
|
||||
distinguishCancelAndClose: true,
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
const router = useRouter()
|
||||
const dialogFormVisible = ref(false)
|
||||
const dialogFormTitle = ref('')
|
||||
|
||||
const page = ref(1)
|
||||
const total = ref(0)
|
||||
const pageSize = ref(10)
|
||||
const tableData = ref([])
|
||||
|
||||
const activeInfo = ref('')
|
||||
|
||||
const autoFunc = ref({
|
||||
package: '',
|
||||
funcName: '',
|
||||
structName: '',
|
||||
packageName: '',
|
||||
description: '',
|
||||
abbreviation: '',
|
||||
humpPackageName: '',
|
||||
businessDB: '',
|
||||
method: '',
|
||||
funcDesc: '',
|
||||
isAuth: false,
|
||||
isAi: false,
|
||||
apiFunc: '',
|
||||
serverFunc: '',
|
||||
jsFunc: ''
|
||||
})
|
||||
|
||||
const addFuncBtn = (row) => {
|
||||
const req = JSON.parse(row.request)
|
||||
activeInfo.value = row.request
|
||||
autoFunc.value.package = req.package
|
||||
autoFunc.value.structName = req.structName
|
||||
autoFunc.value.packageName = req.packageName
|
||||
autoFunc.value.description = req.description
|
||||
autoFunc.value.abbreviation = req.abbreviation
|
||||
autoFunc.value.humpPackageName = req.humpPackageName
|
||||
autoFunc.value.businessDB = req.businessDB
|
||||
autoFunc.value.method = ''
|
||||
autoFunc.value.funcName = ''
|
||||
autoFunc.value.router = ''
|
||||
autoFunc.value.funcDesc = ''
|
||||
autoFunc.value.isAuth = false
|
||||
autoFunc.value.isAi = false
|
||||
autoFunc.value.apiFunc = ''
|
||||
autoFunc.value.serverFunc = ''
|
||||
autoFunc.value.jsFunc = ''
|
||||
funcFlag.value = true
|
||||
}
|
||||
|
||||
const funcFlag = ref(false)
|
||||
|
||||
const closeFunc = () => {
|
||||
funcFlag.value = false
|
||||
}
|
||||
|
||||
const runFunc = async () => {
|
||||
// 首字母自动转换为大写
|
||||
autoFunc.value.funcName = toUpperCase(autoFunc.value.funcName)
|
||||
|
||||
if (!autoFunc.value.funcName) {
|
||||
ElMessage.error('请输入方法名')
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.method) {
|
||||
ElMessage.error('请选择方法')
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.router) {
|
||||
ElMessage.error('请输入路由')
|
||||
return
|
||||
}
|
||||
if (!autoFunc.value.funcDesc) {
|
||||
ElMessage.error('请输入方法介绍')
|
||||
return
|
||||
}
|
||||
|
||||
if (autoFunc.value.isAi) {
|
||||
if (
|
||||
!autoFunc.value.apiFunc ||
|
||||
!autoFunc.value.serverFunc ||
|
||||
!autoFunc.value.jsFunc
|
||||
) {
|
||||
ElMessage.error('请先使用AI帮写完成基础代码,如果生成失败请重新调用')
|
||||
return
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
ElMessageBox.confirm(
|
||||
`此操作将删除自动创建的文件和api(会删除表!!!), 请继续确认!!!`,
|
||||
"会删除表",
|
||||
{
|
||||
closeOnClickModal: false,
|
||||
distinguishCancelAndClose: true,
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
}
|
||||
).catch(() => {
|
||||
formData.value.deleteTable = false;
|
||||
});
|
||||
}
|
||||
|
||||
const res = await addFunc(autoFunc.value)
|
||||
if (res.code === 0) {
|
||||
ElMessage.success('增加方法成功')
|
||||
closeFunc()
|
||||
}
|
||||
}
|
||||
|
||||
// 分页
|
||||
const handleSizeChange = (val) => {
|
||||
pageSize.value = val
|
||||
getTableData()
|
||||
}
|
||||
|
||||
const handleCurrentChange = (val) => {
|
||||
page.value = val
|
||||
getTableData()
|
||||
}
|
||||
|
||||
// 查询
|
||||
const getTableData = async () => {
|
||||
const table = await getSysHistory({
|
||||
page: page.value,
|
||||
pageSize: pageSize.value
|
||||
})
|
||||
if (table.code === 0) {
|
||||
tableData.value = table.data.list
|
||||
total.value = table.data.total
|
||||
page.value = table.data.page
|
||||
pageSize.value = table.data.pageSize
|
||||
}
|
||||
}
|
||||
|
||||
getTableData()
|
||||
|
||||
const deleteRow = async (row) => {
|
||||
ElMessageBox.confirm('此操作将删除本历史, 是否继续?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
const res = await delSysHistory({ id: Number(row.ID) })
|
||||
if (res.code === 0) {
|
||||
ElMessage.success('删除成功')
|
||||
getTableData()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (row) => {
|
||||
dialogFormTitle.value = '回滚:' + row.structName
|
||||
formData.value.id = row.ID
|
||||
dialogFormVisible.value = true
|
||||
}
|
||||
|
||||
// 关闭弹窗
|
||||
const closeDialog = () => {
|
||||
dialogFormVisible.value = false
|
||||
formData.value = {
|
||||
id: undefined,
|
||||
deleteApi: true,
|
||||
deleteMenu: true,
|
||||
deleteTable: false
|
||||
}
|
||||
}
|
||||
|
||||
// 确认删除表
|
||||
const deleteTableCheck = (flag) => {
|
||||
if (flag) {
|
||||
ElMessageBox.confirm(
|
||||
`此操作将删除自动创建的文件和api(会删除表!!!), 是否继续?`,
|
||||
'提示',
|
||||
{
|
||||
closeOnClickModal: false,
|
||||
distinguishCancelAndClose: true,
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
ElMessageBox.confirm(
|
||||
`此操作将删除自动创建的文件和api(会删除表!!!), 请继续确认!!!`,
|
||||
'会删除表',
|
||||
{
|
||||
closeOnClickModal: false,
|
||||
distinguishCancelAndClose: true,
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
).catch(() => {
|
||||
formData.value.deleteTable = false
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
formData.value.deleteTable = false
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const enterDialog = async () => {
|
||||
const res = await rollback(formData.value)
|
||||
if (res.code === 0) {
|
||||
ElMessage.success('回滚成功')
|
||||
getTableData()
|
||||
}
|
||||
}
|
||||
|
||||
const goAutoCode = (row, isAdd) => {
|
||||
if (row) {
|
||||
router.push({
|
||||
name: 'autoCodeEdit',
|
||||
params: {
|
||||
id: row.ID
|
||||
},
|
||||
query: {
|
||||
isAdd: isAdd
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
formData.value.deleteTable = false;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const enterDialog = async () => {
|
||||
const res = await rollback(formData.value);
|
||||
if (res.code === 0) {
|
||||
ElMessage.success("回滚成功");
|
||||
getTableData();
|
||||
}
|
||||
};
|
||||
|
||||
const goAutoCode = (row,isAdd) => {
|
||||
if (row) {
|
||||
router.push({
|
||||
name: "autoCodeEdit",
|
||||
params: {
|
||||
id: row.ID,
|
||||
},
|
||||
query: {
|
||||
isAdd: isAdd
|
||||
},
|
||||
});
|
||||
} else {
|
||||
router.push({ name: "autoCode" });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const aiAddFunc = async () =>{
|
||||
aiLoading.value = true
|
||||
autoFunc.value.apiFunc = ""
|
||||
autoFunc.value.serverFunc = ""
|
||||
autoFunc.value.jsFunc = ""
|
||||
|
||||
if (!autoFunc.value.prompt) {
|
||||
ElMessage.error("请输入提示信息")
|
||||
return
|
||||
} else {
|
||||
router.push({ name: 'autoCode' })
|
||||
}
|
||||
}
|
||||
|
||||
const res = await addFunc({...autoFunc.value,isPreview:true})
|
||||
if (res.code !== 0) {
|
||||
const aiAddFunc = async () => {
|
||||
aiLoading.value = true
|
||||
autoFunc.value.apiFunc = ''
|
||||
autoFunc.value.serverFunc = ''
|
||||
autoFunc.value.jsFunc = ''
|
||||
|
||||
if (!autoFunc.value.prompt) {
|
||||
ElMessage.error('请输入提示信息')
|
||||
return
|
||||
}
|
||||
|
||||
const res = await addFunc({ ...autoFunc.value, isPreview: true })
|
||||
if (res.code !== 0) {
|
||||
aiLoading.value = false
|
||||
ElMessage.error(res.msg)
|
||||
return
|
||||
}
|
||||
|
||||
const aiRes = await butler({
|
||||
structInfo: activeInfo.value,
|
||||
template: JSON.stringify(res.data),
|
||||
prompt: autoFunc.value.prompt,
|
||||
command: 'addFunc'
|
||||
})
|
||||
aiLoading.value = false
|
||||
ElMessage.error(res.msg)
|
||||
return
|
||||
}
|
||||
|
||||
const aiRes = await butler({
|
||||
structInfo:activeInfo.value,
|
||||
template:JSON.stringify(res.data),
|
||||
prompt: autoFunc.value.prompt,
|
||||
command: "addFunc"
|
||||
})
|
||||
aiLoading.value = false
|
||||
if (aiRes.code === 0) {
|
||||
try{
|
||||
const aiData = JSON.parse(aiRes.data)
|
||||
autoFunc.value.apiFunc = aiData.api
|
||||
autoFunc.value.serverFunc = aiData.server
|
||||
autoFunc.value.jsFunc = aiData.js
|
||||
autoFunc.value.method = aiData.method
|
||||
autoFunc.value.funcName = aiData.funcName
|
||||
const routerArr = aiData.router.split("/")
|
||||
autoFunc.value.router = routerArr[routerArr.length - 1]
|
||||
autoFunc.value.funcDesc = autoFunc.value.prompt
|
||||
} catch (_) {
|
||||
ElMessage.error("小淼忙碌,请重新调用")
|
||||
if (aiRes.code === 0) {
|
||||
try {
|
||||
const aiData = JSON.parse(aiRes.data)
|
||||
autoFunc.value.apiFunc = aiData.api
|
||||
autoFunc.value.serverFunc = aiData.server
|
||||
autoFunc.value.jsFunc = aiData.js
|
||||
autoFunc.value.method = aiData.method
|
||||
autoFunc.value.funcName = aiData.funcName
|
||||
const routerArr = aiData.router.split('/')
|
||||
autoFunc.value.router = routerArr[routerArr.length - 1]
|
||||
autoFunc.value.funcDesc = autoFunc.value.prompt
|
||||
} catch (_) {
|
||||
ElMessage.error('小淼忙碌,请重新调用')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const autoComplete = async () =>{
|
||||
aiLoading.value = true
|
||||
const aiRes = await butler({
|
||||
prompt: autoFunc.value.funcDesc,
|
||||
command: "autoCompleteFunc"
|
||||
})
|
||||
aiLoading.value = false
|
||||
if (aiRes.code === 0) {
|
||||
try{
|
||||
const aiData = JSON.parse(aiRes.data)
|
||||
autoFunc.value.method = aiData.method
|
||||
autoFunc.value.funcName = aiData.funcName
|
||||
autoFunc.value.router = aiData.router
|
||||
autoFunc.value.prompt = autoFunc.value.funcDesc
|
||||
} catch (_) {
|
||||
ElMessage.error("小淼开小差了,请重新调用")
|
||||
const autoComplete = async () => {
|
||||
aiLoading.value = true
|
||||
const aiRes = await butler({
|
||||
prompt: autoFunc.value.funcDesc,
|
||||
command: 'autoCompleteFunc'
|
||||
})
|
||||
aiLoading.value = false
|
||||
if (aiRes.code === 0) {
|
||||
try {
|
||||
const aiData = JSON.parse(aiRes.data)
|
||||
autoFunc.value.method = aiData.method
|
||||
autoFunc.value.funcName = aiData.funcName
|
||||
autoFunc.value.router = aiData.router
|
||||
autoFunc.value.prompt = autoFunc.value.funcDesc
|
||||
} catch (_) {
|
||||
ElMessage.error('小淼开小差了,请重新调用')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
@@ -6,40 +6,25 @@
|
||||
/>
|
||||
<div class="gva-table-box">
|
||||
<div class="gva-btn-list gap-3 flex items-center">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="plus"
|
||||
@click="openDialog('addApi')"
|
||||
>
|
||||
<el-button type="primary" icon="plus" @click="openDialog('addApi')">
|
||||
新增
|
||||
</el-button>
|
||||
|
||||
</div>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="id"
|
||||
width="120"
|
||||
prop="ID"
|
||||
/>
|
||||
<el-table-column align="left" label="id" width="120" prop="ID" />
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="包名"
|
||||
width="150"
|
||||
prop="packageName"
|
||||
/>
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="模板"
|
||||
width="150"
|
||||
prop="template"
|
||||
/>
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="展示名"
|
||||
label="模板"
|
||||
width="150"
|
||||
prop="label"
|
||||
prop="template"
|
||||
/>
|
||||
<el-table-column align="left" label="展示名" width="150" prop="label" />
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="描述"
|
||||
@@ -47,11 +32,7 @@
|
||||
prop="desc"
|
||||
/>
|
||||
|
||||
<el-table-column
|
||||
align="left"
|
||||
label="操作"
|
||||
width="200"
|
||||
>
|
||||
<el-table-column align="left" label="操作" width="200">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
icon="delete"
|
||||
@@ -66,70 +47,38 @@
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<el-drawer
|
||||
v-model="dialogFormVisible"
|
||||
size="40%"
|
||||
:show-close="false"
|
||||
>
|
||||
<warning-bar title="模板package会创建集成于项目本体中的代码包,模板plugin会创建插件包" />
|
||||
<el-form
|
||||
ref="pkgForm"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="80px"
|
||||
>
|
||||
<el-form-item
|
||||
label="包名"
|
||||
prop="packageName"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.packageName"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-drawer v-model="dialogFormVisible" size="40%" :show-close="false">
|
||||
<warning-bar
|
||||
title="模板package会创建集成于项目本体中的代码包,模板plugin会创建插件包"
|
||||
/>
|
||||
<el-form ref="pkgForm" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="包名" prop="packageName">
|
||||
<el-input v-model="form.packageName" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="模板"
|
||||
prop="template"
|
||||
>
|
||||
<el-select
|
||||
v-model="form.template"
|
||||
>
|
||||
<el-option v-for="template in templatesOptions" :label="template" :value="template" :key="template"/>
|
||||
<el-form-item label="模板" prop="template">
|
||||
<el-select v-model="form.template">
|
||||
<el-option
|
||||
v-for="template in templatesOptions"
|
||||
:label="template"
|
||||
:value="template"
|
||||
:key="template"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
label="展示名"
|
||||
prop="label"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.label"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="展示名" prop="label">
|
||||
<el-input v-model="form.label" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="描述"
|
||||
prop="desc"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.desc"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<el-form-item label="描述" prop="desc">
|
||||
<el-input v-model="form.desc" autocomplete="off" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #header>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-lg">创建Package</span>
|
||||
<div>
|
||||
<el-button @click="closeDialog">
|
||||
取 消
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="enterDialog"
|
||||
>
|
||||
确 定
|
||||
</el-button>
|
||||
<el-button @click="closeDialog"> 取 消 </el-button>
|
||||
<el-button type="primary" @click="enterDialog"> 确 定 </el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -138,106 +87,109 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
createPackageApi,
|
||||
getPackageApi,
|
||||
deletePackageApi,
|
||||
getTemplatesApi
|
||||
} from '@/api/autoCode'
|
||||
import { ref } from 'vue'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import {
|
||||
createPackageApi,
|
||||
getPackageApi,
|
||||
deletePackageApi,
|
||||
getTemplatesApi
|
||||
} from '@/api/autoCode'
|
||||
import { ref } from 'vue'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
|
||||
defineOptions({
|
||||
name: 'AutoPkg',
|
||||
})
|
||||
defineOptions({
|
||||
name: 'AutoPkg'
|
||||
})
|
||||
|
||||
const form = ref({
|
||||
packageName: '',
|
||||
template: '',
|
||||
label: '',
|
||||
desc: '',
|
||||
})
|
||||
const templatesOptions = ref([])
|
||||
|
||||
const getTemplates = async ()=>{
|
||||
const res = await getTemplatesApi()
|
||||
if (res.code === 0){
|
||||
templatesOptions.value = res.data
|
||||
}
|
||||
}
|
||||
|
||||
getTemplates()
|
||||
|
||||
const validateData = (rule, value, callback) => {
|
||||
if (/[\u4E00-\u9FA5]/g.test(value)) {
|
||||
callback(new Error('不能为中文'))
|
||||
} else if ((/^\d+$/.test(value[0]))) {
|
||||
callback(new Error('不能够以数字开头'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
const rules = ref({
|
||||
packageName: [
|
||||
{ required: true, message: '请输入包名', trigger: 'blur' },
|
||||
{ validator: validateData, trigger: 'blur' }
|
||||
],
|
||||
template:[
|
||||
{ required: true, message: '请选择模板', trigger: 'change' },
|
||||
{ validator: validateData, trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
|
||||
const dialogFormVisible = ref(false)
|
||||
const openDialog = () => {
|
||||
dialogFormVisible.value = true
|
||||
}
|
||||
|
||||
const closeDialog = () => {
|
||||
dialogFormVisible.value = false
|
||||
form.value = {
|
||||
const form = ref({
|
||||
packageName: '',
|
||||
template: '',
|
||||
label: '',
|
||||
desc: '',
|
||||
}
|
||||
}
|
||||
desc: ''
|
||||
})
|
||||
const templatesOptions = ref([])
|
||||
|
||||
const pkgForm = ref(null)
|
||||
const enterDialog = async() => {
|
||||
pkgForm.value.validate(async valid => {
|
||||
if (valid) {
|
||||
const res = await createPackageApi(form.value)
|
||||
if (res.code === 0) {
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '添加成功',
|
||||
showClose: true
|
||||
})
|
||||
}
|
||||
getTableData()
|
||||
closeDialog()
|
||||
const getTemplates = async () => {
|
||||
const res = await getTemplatesApi()
|
||||
if (res.code === 0) {
|
||||
templatesOptions.value = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const tableData = ref([])
|
||||
const getTableData = async() => {
|
||||
const table = await getPackageApi()
|
||||
if (table.code === 0) {
|
||||
tableData.value = table.data.pkgs
|
||||
}
|
||||
}
|
||||
|
||||
const deleteApiFunc = async(row) => {
|
||||
ElMessageBox.confirm('此操作仅删除数据库中的pkg存储,后端相应目录结构请自行删除与数据库保持一致!', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
getTemplates()
|
||||
|
||||
const validateData = (rule, value, callback) => {
|
||||
if (/[\u4E00-\u9FA5]/g.test(value)) {
|
||||
callback(new Error('不能为中文'))
|
||||
} else if (/^\d+$/.test(value[0])) {
|
||||
callback(new Error('不能够以数字开头'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
const rules = ref({
|
||||
packageName: [
|
||||
{ required: true, message: '请输入包名', trigger: 'blur' },
|
||||
{ validator: validateData, trigger: 'blur' }
|
||||
],
|
||||
template: [
|
||||
{ required: true, message: '请选择模板', trigger: 'change' },
|
||||
{ validator: validateData, trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
.then(async() => {
|
||||
|
||||
const dialogFormVisible = ref(false)
|
||||
const openDialog = () => {
|
||||
dialogFormVisible.value = true
|
||||
}
|
||||
|
||||
const closeDialog = () => {
|
||||
dialogFormVisible.value = false
|
||||
form.value = {
|
||||
packageName: '',
|
||||
template: '',
|
||||
label: '',
|
||||
desc: ''
|
||||
}
|
||||
}
|
||||
|
||||
const pkgForm = ref(null)
|
||||
const enterDialog = async () => {
|
||||
pkgForm.value.validate(async (valid) => {
|
||||
if (valid) {
|
||||
const res = await createPackageApi(form.value)
|
||||
if (res.code === 0) {
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '添加成功',
|
||||
showClose: true
|
||||
})
|
||||
}
|
||||
getTableData()
|
||||
closeDialog()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const tableData = ref([])
|
||||
const getTableData = async () => {
|
||||
const table = await getPackageApi()
|
||||
if (table.code === 0) {
|
||||
tableData.value = table.data.pkgs
|
||||
}
|
||||
}
|
||||
|
||||
const deleteApiFunc = async (row) => {
|
||||
ElMessageBox.confirm(
|
||||
'此操作仅删除数据库中的pkg存储,后端相应目录结构请自行删除与数据库保持一致!',
|
||||
'提示',
|
||||
{
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
).then(async () => {
|
||||
const res = await deletePackageApi(row)
|
||||
if (res.code === 0) {
|
||||
ElMessage({
|
||||
@@ -247,7 +199,7 @@ const deleteApiFunc = async(row) => {
|
||||
getTableData()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
getTableData()
|
||||
getTableData()
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export const getCode = (templateID) => {
|
||||
return `<template>
|
||||
return `<template>
|
||||
<!-- 导出组件 -->
|
||||
<ExportExcel templateId="${templateID}" :condition="condition" :limit="limit" :offset="offset" :order="order" />
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,20 +1,18 @@
|
||||
<template>
|
||||
<fc-designer ref="designer" :config="config" height="calc(100vh - 160px)" />
|
||||
<fc-designer ref="designer" :config="config" height="calc(100vh - 160px)" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import FcDesigner from '@form-create/designer'
|
||||
|
||||
import {ref} from "vue";
|
||||
import FcDesigner from '@form-create/designer'
|
||||
defineOptions({
|
||||
name: 'FormGenerator'
|
||||
})
|
||||
|
||||
defineOptions({
|
||||
name: 'FormGenerator'
|
||||
})
|
||||
|
||||
const designer = ref(null)
|
||||
|
||||
const config = {
|
||||
fieldReadonly: false
|
||||
}
|
||||
const designer = ref(null)
|
||||
|
||||
const config = {
|
||||
fieldReadonly: false
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<router-view v-slot="{ Component }">
|
||||
<transition
|
||||
mode="out-in"
|
||||
name="el-fade-in-linear"
|
||||
>
|
||||
<transition mode="out-in" name="el-fade-in-linear">
|
||||
<keep-alive :include="routerStore.keepAliveRouters">
|
||||
<component :is="Component" />
|
||||
</keep-alive>
|
||||
@@ -14,10 +11,10 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useRouterStore } from '@/pinia/modules/router'
|
||||
const routerStore = useRouterStore()
|
||||
import { useRouterStore } from '@/pinia/modules/router'
|
||||
const routerStore = useRouterStore()
|
||||
|
||||
defineOptions({
|
||||
name: 'System'
|
||||
})
|
||||
defineOptions({
|
||||
name: 'System'
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="gva-form-box">
|
||||
<div class="gva-form-box">
|
||||
<el-upload
|
||||
drag
|
||||
:action="`${getBaseUrl()}/autoCode/installPlugin`"
|
||||
@@ -9,31 +9,28 @@
|
||||
name="plug"
|
||||
>
|
||||
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
|
||||
<div class="el-upload__text">
|
||||
拖拽或<em>点击上传</em>
|
||||
</div>
|
||||
<div class="el-upload__text">拖拽或<em>点击上传</em></div>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip">
|
||||
请把安装包的zip拖拽至此处上传
|
||||
</div>
|
||||
<div class="el-upload__tip">请把安装包的zip拖拽至此处上传</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getBaseUrl } from '@/utils/format'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getBaseUrl } from '@/utils/format'
|
||||
|
||||
const handleSuccess = (res) => {
|
||||
if (res.code === 0) {
|
||||
let msg = ``
|
||||
res.data && res.data.forEach((item, index) => {
|
||||
msg += `${index + 1}.${item.msg}\n`
|
||||
})
|
||||
alert(msg)
|
||||
} else {
|
||||
ElMessage.error(res.msg)
|
||||
const handleSuccess = (res) => {
|
||||
if (res.code === 0) {
|
||||
let msg = ``
|
||||
res.data &&
|
||||
res.data.forEach((item, index) => {
|
||||
msg += `${index + 1}.${item.msg}\n`
|
||||
})
|
||||
alert(msg)
|
||||
} else {
|
||||
ElMessage.error(res.msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
<template>
|
||||
<div class="gva-form-box">
|
||||
<div class="p-4 bg-white dark:bg-slate-900">
|
||||
<WarningBar title="目前只支持标准插件(通过插件模板生成的标准目录插件),非标准插件请自行打包" />
|
||||
<WarningBar
|
||||
title="目前只支持标准插件(通过插件模板生成的标准目录插件),非标准插件请自行打包"
|
||||
/>
|
||||
<div class="flex items-center gap-3">
|
||||
<el-input
|
||||
v-model="plugName"
|
||||
placeholder="插件模板处填写的【插件名】"
|
||||
/>
|
||||
<el-input v-model="plugName" placeholder="插件模板处填写的【插件名】" />
|
||||
</div>
|
||||
<el-card class="mt-2 text-center">
|
||||
<WarningBar title="穿梭框请只选择子级菜单即可" />
|
||||
<el-input v-model="parentMenu" placeholder="请输入菜单组名,例:公告管理" class="mb-2"></el-input>
|
||||
<el-input
|
||||
v-model="parentMenu"
|
||||
placeholder="请输入菜单组名,例:公告管理"
|
||||
class="mb-2"
|
||||
></el-input>
|
||||
<el-transfer
|
||||
v-model="menus"
|
||||
:props="{
|
||||
key: 'ID',
|
||||
key: 'ID'
|
||||
}"
|
||||
class="plugin-transfer"
|
||||
:data="menusData"
|
||||
filterable
|
||||
:filter-method="filterMenuMethod"
|
||||
filter-placeholder="请输入菜单名称/路径"
|
||||
:titles="['可选菜单','使用菜单']"
|
||||
:titles="['可选菜单', '使用菜单']"
|
||||
:button-texts="['移除', '选中']"
|
||||
>
|
||||
<template #default="{option}">
|
||||
<template #default="{ option }">
|
||||
{{ option.meta.title }} {{ option.component }}
|
||||
</template>
|
||||
</el-transfer>
|
||||
<div class="flex justify-end mt-2">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="fmtInitMenu"
|
||||
>
|
||||
<el-button type="primary" @click="fmtInitMenu">
|
||||
定义安装菜单
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -41,102 +41,95 @@
|
||||
<el-transfer
|
||||
v-model="apis"
|
||||
:props="{
|
||||
key: 'ID',
|
||||
key: 'ID'
|
||||
}"
|
||||
class="plugin-transfer"
|
||||
:data="apisData"
|
||||
filterable
|
||||
:filter-method="filterApiMethod"
|
||||
filter-placeholder="请输入API描述/PATH"
|
||||
:titles="['可选API','使用API']"
|
||||
:titles="['可选API', '使用API']"
|
||||
:button-texts="['移除', '选中']"
|
||||
>
|
||||
<template #default="{option}">
|
||||
<template #default="{ option }">
|
||||
{{ option.description }} {{ option.path }}
|
||||
</template>
|
||||
</el-transfer>
|
||||
<div class="flex justify-end mt-2">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="fmtInitAPI"
|
||||
>
|
||||
<el-button type="primary" @click="fmtInitAPI">
|
||||
定义安装API
|
||||
</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
<div class="flex justify-end">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="pubPlugin"
|
||||
>
|
||||
打包插件
|
||||
</el-button>
|
||||
<el-button type="primary" @click="pubPlugin"> 打包插件 </el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { pubPlug,initMenu,initAPI } from '@/api/autoCode.js'
|
||||
import {ElMessage, ElMessageBox} from 'element-plus'
|
||||
import {getAllApis} from "@/api/api";
|
||||
import {getMenuList} from "@/api/menu";
|
||||
import { ref } from 'vue'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { pubPlug, initMenu, initAPI } from '@/api/autoCode.js'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { getAllApis } from '@/api/api'
|
||||
import { getMenuList } from '@/api/menu'
|
||||
|
||||
const plugName = ref('')
|
||||
const plugName = ref('')
|
||||
|
||||
const menus = ref([])
|
||||
const menusData = ref([])
|
||||
const apis = ref([])
|
||||
const apisData = ref([])
|
||||
const parentMenu = ref('')
|
||||
const menus = ref([])
|
||||
const menusData = ref([])
|
||||
const apis = ref([])
|
||||
const apisData = ref([])
|
||||
const parentMenu = ref('')
|
||||
|
||||
const fmtMenu = (menus) => {
|
||||
// 如果menu存在children,递归展开到一级
|
||||
const res = []
|
||||
menus.forEach(item => {
|
||||
if (item.children) {
|
||||
res.push(...fmtMenu(item.children))
|
||||
} else {
|
||||
res.push(item)
|
||||
const fmtMenu = (menus) => {
|
||||
// 如果menu存在children,递归展开到一级
|
||||
const res = []
|
||||
menus.forEach((item) => {
|
||||
if (item.children) {
|
||||
res.push(...fmtMenu(item.children))
|
||||
} else {
|
||||
res.push(item)
|
||||
}
|
||||
})
|
||||
return res
|
||||
}
|
||||
|
||||
const initData = async () => {
|
||||
const menuRes = await getMenuList()
|
||||
if (menuRes.code === 0) {
|
||||
menusData.value = fmtMenu(menuRes.data)
|
||||
}
|
||||
const apiRes = await getAllApis()
|
||||
if (apiRes.code === 0) {
|
||||
apisData.value = apiRes.data.apis
|
||||
}
|
||||
})
|
||||
return res
|
||||
}
|
||||
|
||||
const initData = async() => {
|
||||
const menuRes = await getMenuList()
|
||||
if (menuRes.code === 0) {
|
||||
menusData.value = fmtMenu(menuRes.data)
|
||||
}
|
||||
const apiRes = await getAllApis()
|
||||
if (apiRes.code === 0) {
|
||||
apisData.value = apiRes.data.apis
|
||||
|
||||
const filterMenuMethod = (query, item) => {
|
||||
return (
|
||||
item.meta.title.indexOf(query) > -1 || item.component.indexOf(query) > -1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const filterMenuMethod = (query, item) => {
|
||||
return item.meta.title.indexOf(query) > -1 || item.component.indexOf(query) > -1
|
||||
}
|
||||
const filterApiMethod = (query, item) => {
|
||||
return item.description.indexOf(query) > -1 || item.path.indexOf(query) > -1
|
||||
}
|
||||
|
||||
const filterApiMethod = (query, item) => {
|
||||
return item.description.indexOf(query) > -1 || item.path.indexOf(query) > -1
|
||||
}
|
||||
initData()
|
||||
|
||||
initData()
|
||||
|
||||
const pubPlugin = async() => {
|
||||
|
||||
ElMessageBox.confirm(
|
||||
const pubPlugin = async () => {
|
||||
ElMessageBox.confirm(
|
||||
`请检查server下的/plugin/${plugName.value}/plugin.go是否已放开需要的 initialize.Api(ctx) 和 initialize.Menu(ctx)?`,
|
||||
'打包',
|
||||
{
|
||||
confirmButtonText: '打包',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
type: 'warning'
|
||||
}
|
||||
)
|
||||
)
|
||||
.then(async () => {
|
||||
const res = await pubPlug({ plugName: plugName.value })
|
||||
if (res.code === 0) {
|
||||
@@ -146,34 +139,33 @@ const pubPlugin = async() => {
|
||||
.catch(() => {
|
||||
ElMessage({
|
||||
type: 'info',
|
||||
message: '关闭打包',
|
||||
message: '关闭打包'
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const fmtInitMenu = () => {
|
||||
if (!parentMenu.value) {
|
||||
ElMessage.error('请填写菜单组名')
|
||||
return
|
||||
}
|
||||
if (menus.value.length === 0) {
|
||||
ElMessage.error('请至少选择一个菜单')
|
||||
return
|
||||
}
|
||||
if (plugName.value === '') {
|
||||
ElMessage.error('请填写插件名')
|
||||
return
|
||||
}
|
||||
ElMessageBox.confirm(
|
||||
const fmtInitMenu = () => {
|
||||
if (!parentMenu.value) {
|
||||
ElMessage.error('请填写菜单组名')
|
||||
return
|
||||
}
|
||||
if (menus.value.length === 0) {
|
||||
ElMessage.error('请至少选择一个菜单')
|
||||
return
|
||||
}
|
||||
if (plugName.value === '') {
|
||||
ElMessage.error('请填写插件名')
|
||||
return
|
||||
}
|
||||
ElMessageBox.confirm(
|
||||
`点击后将会覆盖server下的/plugin/${plugName.value}/initialize/menu. 是否继续?`,
|
||||
'生成初始菜单',
|
||||
{
|
||||
confirmButtonText: '生成',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
type: 'warning'
|
||||
}
|
||||
)
|
||||
)
|
||||
.then(() => {
|
||||
const req = {
|
||||
plugName: plugName.value,
|
||||
@@ -185,28 +177,28 @@ const fmtInitMenu = () => {
|
||||
.catch(() => {
|
||||
ElMessage({
|
||||
type: 'info',
|
||||
message: '关闭生成菜单',
|
||||
message: '关闭生成菜单'
|
||||
})
|
||||
})
|
||||
}
|
||||
const fmtInitAPI = () => {
|
||||
if (apis.value.length === 0) {
|
||||
ElMessage.error('请至少选择一个API')
|
||||
return
|
||||
}
|
||||
if (plugName.value === '') {
|
||||
ElMessage.error('请填写插件名')
|
||||
return
|
||||
}
|
||||
ElMessageBox.confirm(
|
||||
const fmtInitAPI = () => {
|
||||
if (apis.value.length === 0) {
|
||||
ElMessage.error('请至少选择一个API')
|
||||
return
|
||||
}
|
||||
if (plugName.value === '') {
|
||||
ElMessage.error('请填写插件名')
|
||||
return
|
||||
}
|
||||
ElMessageBox.confirm(
|
||||
`点击后将会覆盖server下的/plugin/${plugName.value}/initialize/api. 是否继续?`,
|
||||
'生成初始API',
|
||||
{
|
||||
confirmButtonText: '生成',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
type: 'warning'
|
||||
}
|
||||
)
|
||||
)
|
||||
.then(() => {
|
||||
const req = {
|
||||
plugName: plugName.value,
|
||||
@@ -218,17 +210,16 @@ const fmtInitAPI = () => {
|
||||
.catch(() => {
|
||||
ElMessage({
|
||||
type: 'info',
|
||||
message: '关闭生成API',
|
||||
message: '关闭生成API'
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.plugin-transfer{
|
||||
.el-transfer-panel{
|
||||
width: 400px !important;
|
||||
.plugin-transfer {
|
||||
.el-transfer-panel {
|
||||
width: 400px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user