- 新增 dao.Now() 函数获取数据库毫秒精度时间,避免多实例时钟偏差 - 增量同步查询增加上界(updated_at <= upperBound)防止竞态条件 - 配置创建、更新、删除、回滚统一使用数据库时间替代 time.Now() - 配置历史新增 operate 字段记录操作类型(update/delete/rollback) - 删除配置和回滚操作前增加历史快照记录 - 新增 DeleteHistory 接口支持手动删除单条历史记录 - 移除 GetHistory 的 Limit(5) 限制,返回完整历史列表 - 删除应用时同步更新关联配置的 updated_at 以便增量同步识别 - version 字段改为必填,前后端同步增加校验规则 - 前端历史列表增加操作类型列、删除按钮及表格最大高度限制 - 数据库表结构 datetime 升级为 datetime(3) 支持毫秒精度
110 lines
4.0 KiB
Vue
110 lines
4.0 KiB
Vue
<template>
|
|
<el-card>
|
|
<div slot="header">新建配置</div>
|
|
<el-form :model="form" :rules="rules" ref="form" label-width="100px">
|
|
<el-form-item label="配置类型">
|
|
<el-radio-group v-model="form.global">
|
|
<el-radio :label="true">全局配置</el-radio>
|
|
<el-radio :label="false">应用配置</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
<el-form-item label="所属业务组" v-if="form.global" prop="groupId">
|
|
<el-select v-model="form.groupId" placeholder="请选择">
|
|
<el-option v-for="g in groups" :key="g.value" :label="g.label" :value="parseInt(g.value)"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="所属应用" v-if="!form.global" prop="appId">
|
|
<el-select v-model="form.appId" placeholder="请选择">
|
|
<el-option v-for="a in apps" :key="a.value" :label="a.label" :value="parseInt(a.value)"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="环境" prop="env">
|
|
<el-select v-model="form.env" placeholder="请选择">
|
|
<el-option v-for="p in profiles" :key="p.value" :label="p.label" :value="p.value"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="版本" prop="version">
|
|
<el-input v-model="form.version" placeholder="latest"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="配置格式">
|
|
<el-select v-model="form.type" placeholder="请选择" style="width: 240px">
|
|
<el-option :value="2" label="配置项 (key=value)"></el-option>
|
|
<el-option :value="1" label="文件 (properties/xml/yaml)"></el-option>
|
|
<el-option :value="3" label="JSON"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="配置名称" v-if="form.type === 2 || form.type === 1" prop="name">
|
|
<el-input v-model="form.name" :placeholder="form.type === 2 ? '如: db.host' : '如: application.properties'"></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="配置内容" prop="contents">
|
|
<el-input v-model="form.contents" type="textarea" :rows="15" placeholder="请输入配置内容"></el-input>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" @click="handleSubmit">保存</el-button>
|
|
<el-button @click="$router.back()">取消</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-card>
|
|
</template>
|
|
|
|
<script>
|
|
import { addConfig } from '../../api/config'
|
|
import request from '../../api/request'
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
form: {
|
|
global: false,
|
|
groupId: null,
|
|
appId: null,
|
|
env: '',
|
|
version: 'latest',
|
|
type: 2,
|
|
name: '',
|
|
contents: ''
|
|
},
|
|
rules: {
|
|
env: [{ required: true, message: '请选择环境', trigger: 'change' }],
|
|
version: [{ required: true, message: '请输入版本', trigger: 'blur' }],
|
|
contents: [{ required: true, message: '请输入配置内容', trigger: 'blur' }]
|
|
},
|
|
groups: [],
|
|
apps: [],
|
|
profiles: []
|
|
}
|
|
},
|
|
created() {
|
|
this.loadOptions()
|
|
},
|
|
methods: {
|
|
async loadOptions() {
|
|
try {
|
|
const [groupRes, appRes, profileRes] = await Promise.all([
|
|
request({ url: '/admin/group/options', method: 'get' }),
|
|
request({ url: '/admin/app/options', method: 'get' }),
|
|
request({ url: '/admin/profile/options', method: 'get' })
|
|
])
|
|
this.groups = groupRes.data || []
|
|
this.apps = appRes.data || []
|
|
this.profiles = profileRes.data || []
|
|
} catch (e) {}
|
|
},
|
|
handleSubmit() {
|
|
this.$refs.form.validate(async (valid) => {
|
|
if (!valid) return
|
|
try {
|
|
await addConfig(this.form)
|
|
this.$message.success('保存成功')
|
|
if (this.form.appId) {
|
|
this.$router.push(`/app/${this.form.appId}/config/list`)
|
|
} else {
|
|
this.$router.push('/app/list')
|
|
}
|
|
} catch (e) {}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|