186 lines
6.8 KiB
Vue
186 lines
6.8 KiB
Vue
<template>
|
|
<section class="acAdd">
|
|
<ai-detail list>
|
|
<ai-title slot="title" :title="pageTitle">
|
|
<template #rightBtn>
|
|
<el-button type="primary" v-if="isEdit" @click="top.handleGetCode($route.query.id)">生成代码</el-button>
|
|
</template>
|
|
</ai-title>
|
|
<template #content>
|
|
<el-form ref="AcForm" :model="form" size="small" label-width="120px" :rules="rules">
|
|
<el-tabs tab-position="left" @tab-click="handleSyncProps">
|
|
<el-tab-pane label="基本信息" lazy>
|
|
<ai-card title="基本信息">
|
|
<template #content>
|
|
<el-row type="flex">
|
|
<div class="fill">
|
|
<el-form-item label="应用名称" prop="name">
|
|
<el-input v-model="form.name" clearable placeholder="请输入"/>
|
|
</el-form-item>
|
|
<el-form-item label="应用模块" prop="appName">
|
|
<el-input v-model="form.appName" clearable placeholder="请输入"/>
|
|
</el-form-item>
|
|
</div>
|
|
<div class="fill">
|
|
<el-form-item label="核心码" prop="rightCode">
|
|
<el-input v-model="form.rightCode" clearable placeholder="请输入"/>
|
|
</el-form-item>
|
|
<el-form-item label="详情方式" prop="detailType">
|
|
<ai-select v-model="form.detailType" :selectList="dict.getDict('detailType')"/>
|
|
</el-form-item>
|
|
</div>
|
|
</el-row>
|
|
<el-form-item label="按钮配置" prop="btns">
|
|
<el-checkbox-group v-model="form.btns">
|
|
<el-checkbox label="insertEnable">添加</el-checkbox>
|
|
<el-checkbox label="importEnable">导入</el-checkbox>
|
|
<el-checkbox label="exportEnalbe">导出</el-checkbox>
|
|
<el-checkbox label="editEnable">编辑</el-checkbox>
|
|
<el-checkbox label="deleteEnable">删除</el-checkbox>
|
|
<el-checkbox label="batchDelEnable">批量删除</el-checkbox>
|
|
</el-checkbox-group>
|
|
</el-form-item>
|
|
</template>
|
|
</ai-card>
|
|
<ai-card title="字段设置">
|
|
<template #right>
|
|
<el-button type="text" @click="handleAddProps">批量添加</el-button>
|
|
<el-button type="text" @click="form.props.push({})">添加</el-button>
|
|
</template>
|
|
<template #content>
|
|
<ai-table :tableData="form.props" :isShowPagination="false" :colConfigs="colConfigs">
|
|
<el-table-column v-for="col in colConfigs" :key="col.slot" v-bind="col">
|
|
<template slot-scope="{row}">
|
|
<el-checkbox v-if="col.type=='checkBox'" v-model="row[col.slot]"/>
|
|
<span v-else-if="col.type=='chbShow'" v-text="row[col.slot]==true?'✔':''"/>
|
|
<el-input v-else size="small" v-model="row[col.slot]" placeholder="请输入" clearable/>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" slot="options" align="center">
|
|
<template slot-scope="{row,$index}">
|
|
<el-button type="text" @click="form.props.splice($index,1)">删除</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</ai-table>
|
|
</template>
|
|
</ai-card>
|
|
</el-tab-pane>
|
|
<el-tab-pane label="详情设计" lazy>
|
|
<detail-layout v-bind="$props" :form="form" v-model="form.detailConfig"/>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
</el-form>
|
|
</template>
|
|
<template #footer>
|
|
<el-button @click="back">取消</el-button>
|
|
<el-button type="primary" @click="submit">提交</el-button>
|
|
</template>
|
|
</ai-detail>
|
|
</section>
|
|
</template>
|
|
|
|
<script>
|
|
import DetailLayout from "./detailLayout";
|
|
|
|
export default {
|
|
name: "acAdd",
|
|
components: {DetailLayout},
|
|
props: {
|
|
instance: Function,
|
|
dict: Object,
|
|
permissions: Function
|
|
},
|
|
inject: {
|
|
top: {}
|
|
},
|
|
computed: {
|
|
isEdit: v => !!v.$route.query.id,
|
|
pageTitle: v => v.isEdit ? "编辑应用" : "新增应用"
|
|
},
|
|
data() {
|
|
return {
|
|
form: {props: [], btns: []},
|
|
rules: {
|
|
name: {required: true, message: "请输入应用名称"},
|
|
appName: {required: true, message: "请输入应用模块"},
|
|
btns: {required: true, message: '请输入按钮配置', trigger: 'change'}
|
|
},
|
|
colConfigs: [
|
|
{slot: 'prop', label: "字段"},
|
|
{slot: 'label', label: "名称"},
|
|
{slot: 'dict', label: "字典"},
|
|
{slot: 'isSearch', label: "搜索字段", align: 'center', type: 'checkBox'},
|
|
{slot: 'isTable', label: "表格字段", align: 'center', type: 'checkBox'},
|
|
{slot: 'isDetail', label: "详情字段", align: 'center', type: 'chbShow'},
|
|
]
|
|
}
|
|
},
|
|
methods: {
|
|
getDetail() {
|
|
let {id} = this.$route.query
|
|
id && this.instance.post("/node/aicode/detail", null, {
|
|
params: {id}
|
|
}).then(res => {
|
|
if (res?.data) {
|
|
this.form = res.data
|
|
this.handleSyncProps()
|
|
}
|
|
})
|
|
},
|
|
back() {
|
|
this.$router.push({})
|
|
},
|
|
submit() {
|
|
this.$refs.AcForm.validate(v => {
|
|
if (v) {
|
|
this.instance.post("/node/aicode/addOrUpdate", this.form).then(res => {
|
|
if (res?.code == 0) {
|
|
this.$message.success("提交成功!")
|
|
this.back()
|
|
}
|
|
})
|
|
}
|
|
})
|
|
},
|
|
handleSyncProps() {
|
|
let detailPorps = this.form.detailConfig?.map(e => e.column)?.flat()?.map(e => e.prop)
|
|
this.form.props = this.form.props.map(e => ({...e, isDetail: !!detailPorps?.includes(e.prop)}))
|
|
},
|
|
handleAddProps() {
|
|
this.$prompt("请输入swagger示例JSON字符串", {
|
|
type: 'warning',
|
|
title: "批量添加字段",
|
|
dangerouslyUseHTMLString: true,
|
|
center: true,
|
|
}).then(({value}) => {
|
|
if (this.$checkJson(value)) {
|
|
Object.keys(JSON.parse(value)).map(prop => {
|
|
this.form.props.push({prop})
|
|
})
|
|
}
|
|
}).catch(() => 0)
|
|
},
|
|
$checkJson(str) {
|
|
if (typeof str == 'string') {
|
|
try {
|
|
let obj = JSON.parse(str);
|
|
return !!(typeof obj == 'object' && obj);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
created() {
|
|
this.getDetail()
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.acAdd {
|
|
height: 100%;
|
|
}
|
|
</style>
|