Commit ec4dd780 by yuwei

项目初始化

parent eebc6381
......@@ -26,8 +26,6 @@ public class ModelColumnDto implements Serializable {
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "模型表主键")
private String modelId;
@ApiModelProperty(value = "列名称")
@NotBlank(message = "列名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String columnName;
......@@ -55,19 +53,14 @@ public class ModelColumnDto implements Serializable {
private String isQuery;
@ApiModelProperty(value = "查询方式(EQ等于、NE不等于、GT大于、GE大于等于、LT小于、LE小于等于、LIKE模糊、BETWEEN范围)")
private String queryType;
@ApiModelProperty(value = "显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件)")
private String htmlType;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "是否绑定数据标准(0否,1是)")
private String isBindDict;
@ApiModelProperty(value = "绑定数据标准类别")
private String bindDictTypeId;
@ApiModelProperty(value = "绑定数据标准字典字段(GB_CODE,GB_NAME)")
private String bindDictColumn;
@ApiModelProperty(value = "显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件)")
private String htmlType;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}
......@@ -33,9 +33,9 @@ public class ModelDto implements Serializable {
@ApiModelProperty(value = "模型名称")
@NotBlank(message = "模型名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String modelName;
@ApiModelProperty(value = "模型编码")
@NotBlank(message = "模型编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String modelCode;
@ApiModelProperty(value = "逻辑表")
@NotBlank(message = "逻辑表不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String modelLogicTable;
@ApiModelProperty(value = "模型列信息")
@Valid
@NotEmpty(message = "模型列信息不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
......
......@@ -31,14 +31,14 @@ public class ModelEntity extends DataScopeBaseEntity {
private String modelName;
/**
* 模型编码
* 逻辑表
*/
private String modelCode;
private String modelLogicTable;
/**
* 模型数据库
* 物理
*/
private String modelTable;
private String modelPhysicalTable;
@TableField(exist = false)
private List<ModelColumnEntity> modelColumns;
......
......@@ -25,7 +25,7 @@ public class ModelVo implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String modelName;
private String modelCode;
private String modelTable;
private String modelLogicTable;
private String modelPhysicalTable;
private List<ModelColumnVo> modelColumns;
}
......@@ -9,12 +9,15 @@ import cn.datax.service.data.masterdata.mapstruct.ModelMapper;
import cn.datax.service.data.masterdata.dao.ModelDao;
import cn.datax.common.base.BaseServiceImpl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
......@@ -42,6 +45,7 @@ public class ModelServiceImpl extends BaseServiceImpl<ModelDao, ModelEntity> imp
@Transactional(rollbackFor = Exception.class)
public ModelEntity saveModel(ModelDto modelDto) {
ModelEntity model = modelMapper.toEntity(modelDto);
model.setModelPhysicalTable("dynamic_" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
modelDao.insert(model);
String modelId = model.getId();
List<ModelColumnEntity> modelColumns = model.getModelColumns();
......
......@@ -13,9 +13,11 @@
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="model_name" property="modelName" />
<result column="model_code" property="modelCode" />
<result column="model_table" property="modelTable" />
<result column="model_logic_table" property="modelLogicTable" />
<result column="model_physical_table" property="modelPhysicalTable" />
</resultMap>
<resultMap id="ExtendResultMap" type="cn.datax.service.data.masterdata.api.entity.ModelEntity" extends="BaseResultMap">
<collection property="modelColumns" column="{modelId=id}" select="getModelColumnList"></collection>
</resultMap>
......@@ -29,7 +31,7 @@
update_by,
update_time,
remark,
model_name, model_code, model_table
model_name, model_logic_table, model_physical_table
</sql>
<select id="getModelColumnList" resultType="cn.datax.service.data.masterdata.api.entity.ModelColumnEntity">
......@@ -42,7 +44,7 @@
</if>
</select>
<select id="selectById" resultMap="BaseResultMap">
<select id="selectById" resultMap="ExtendResultMap">
SELECT
<include refid="Base_Column_List"></include>
FROM masterdata_model
......
......@@ -86,7 +86,7 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
List<MetadataSourceEntity> sourceList = (List<MetadataSourceEntity>) redisService.get(RedisConstant.METADATA_SOURCE_KEY);
Stream<MetadataSourceEntity> stream = Optional.ofNullable(sourceList).orElseGet(ArrayList::new).stream().filter(s -> DataConstant.EnableState.ENABLE.getKey().equals(s.getStatus()));
if (StrUtil.isNotBlank(metadataColumnQuery.getSourceId())) {
stream.filter(s -> metadataColumnQuery.getSourceId().equals(s.getId()));
stream = stream.filter(s -> metadataColumnQuery.getSourceId().equals(s.getId()));
}
List<MetadataTreeVo> list = stream.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo();
......@@ -105,7 +105,7 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
List<MetadataTableEntity> tableList = (List<MetadataTableEntity>) redisService.hget(RedisConstant.METADATA_TABLE_KEY, id);
Stream<MetadataTableEntity> stream = Optional.ofNullable(tableList).orElseGet(ArrayList::new).stream();
if (StrUtil.isNotBlank(tableId)) {
stream.filter(s -> tableId.equals(s.getId()));
stream = stream.filter(s -> tableId.equals(s.getId()));
}
List<MetadataTreeVo> children = stream.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo();
......
import request from '@/utils/request'
export function pageDataModel(data) {
return request({
url: '/data/masterdata/models/page',
method: 'get',
params: data
})
}
export function getDataModel(id) {
return request({
url: '/data/masterdata/models/' + id,
method: 'get'
})
}
export function delDataModel(id) {
return request({
url: '/data/masterdata/models/' + id,
method: 'delete'
})
}
export function delDataModels(ids) {
return request({
url: '/data/masterdata/models/batch/' + ids,
method: 'delete'
})
}
export function addDataModel(data) {
return request({
url: '/data/masterdata/models',
method: 'post',
data: data
})
}
export function updateDataModel(data) {
return request({
url: '/data/masterdata/models/' + data.id,
method: 'put',
data: data
})
}
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-plus" round :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled" @click="submitForm">{{ loadingOptions.loadingText }}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-tabs v-model="activeName">
<el-tab-pane label="基本信息" name="first">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="模型名称" prop="modelName">
<el-input v-model="form.modelName" placeholder="请输入模型名称" />
</el-form-item>
<el-form-item label="逻辑表" prop="modelLogicTable">
<el-input v-model="form.modelLogicTable" placeholder="请输入逻辑表" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="字段信息" name="second">
<el-button @click="addRow">添加</el-button>
<el-form ref="table" :model="form" :rules="rules" size="mini">
<el-table :data="form.modelColumns" border style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" type="index" align="center" width="55" />
<el-table-column label="列名称">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnName'" :rules="rules.columnName">
<el-input v-model="scope.row.columnName" clearable placeholder="请输入列名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列描述">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnComment'" :rules="rules.columnComment">
<el-input v-model="scope.row.columnComment" clearable placeholder="请输入列描述" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列类型">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnType'" :rules="rules.columnType">
<el-input v-model="scope.row.columnType" clearable placeholder="请输入列类型" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="长度" width="70">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnLength'">
<el-input-number v-model="scope.row.columnLength" style="width: 50px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="小数位" width="70">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnScale'">
<el-input-number v-model="scope.row.columnScale" style="width: 50px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="主键" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isPk'">
<el-checkbox v-model="scope.row.isPk" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="必填" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isRequired'">
<el-checkbox v-model="scope.row.isRequired" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="插入" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isInsert'">
<el-checkbox v-model="scope.row.isInsert" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="编辑" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isEdit'">
<el-checkbox v-model="scope.row.isEdit" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列表" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isList'">
<el-checkbox v-model="scope.row.isList" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isQuery'">
<el-checkbox v-model="scope.row.isQuery" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询方式" width="120">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.queryType'">
<el-select v-model="scope.row.queryType" clearable placeholder="请选择">
<el-option
v-for="item in queryTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="显示类型" width="120">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.htmlType'" :rules="rules.htmlType">
<el-select v-model="scope.row.htmlType" clearable placeholder="请选择">
<el-option
v-for="item in htmlTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-form-item>
<el-button :disabled="scope.$index === 0" @click="upRow(scope.$index)" icon="el-icon-arrow-up" circle></el-button>
<el-button :disabled="scope.$index === (form.modelColumns.length - 1)" @click="downRow(scope.$index)" icon="el-icon-arrow-down" circle></el-button>
<el-button @click="delRow(scope.$index)" icon="el-icon-delete" circle></el-button>
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</el-card>
</template>
<script>
import { addDataModel } from '@/api/masterdata/datamodel'
export default {
name: 'DataModelAdd',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '数据模型新增',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {
status: '1',
modelColumns: []
},
// 表单校验
rules: {
modelName: [
{ required: true, message: '模型名称不能为空', trigger: 'blur' }
],
modelLogicTable: [
{ required: true, message: '逻辑表不能为空', trigger: 'blur' }
],
columnName: [
{ required: true, message: '列名称不能为空', trigger: 'blur' }
],
columnComment: [
{ required: true, message: '列描述不能为空', trigger: 'blur' }
],
columnType: [
{ required: true, message: '列类型不能为空', trigger: 'blur' }
],
htmlType: [
{ required: true, message: '显示类型不能为空', trigger: 'change' }
]
},
// 状态数据字典
statusOptions: [],
activeName: 'first',
// 查询方式数据字典
queryTypeOptions: [],
// 显示类型数据字典
htmlTypeOptions: []
}
},
created() {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDicts('data_query_type').then(response => {
if (response.success) {
this.queryTypeOptions = response.data
}
})
this.getDicts('data_html_type').then(response => {
if (response.success) {
this.htmlTypeOptions = response.data
}
})
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
addRow() {
const item = {
columnName: '',
columnComment: '',
columnType: '',
columnLength: '255',
columnScale: '0',
isPk: '0',
isRequired: '0',
isInsert: '0',
isEdit: '0',
isList: '0',
isQuery: '0',
queryType: '',
htmlType: 'input'
}
this.form.modelColumns.push(item)
},
upRow(index) {
if (index > 0) {
const data = this.form.modelColumns[index - 1]
this.form.modelColumns.splice(index - 1, 1)
this.form.modelColumns.splice(index, 0, data)
} else {
this.$message.warning('已经是第一条,不可上移')
return false
}
},
downRow(index) {
if ((index + 1) === this.form.modelColumns.length) {
this.$message.warning('已经是最后一条,不可下移')
return false
} else {
const data = this.form.modelColumns[index + 1]
this.form.modelColumns.splice(index + 1, 1)
this.form.modelColumns.splice(index, 0, data)
}
},
delRow(index) {
this.form.modelColumns.splice(index, 1)
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
addDataModel(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-tabs v-model="activeName">
<el-tab-pane label="基本信息" name="first">
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="模型名称">
<el-input v-model="form.modelName" placeholder="请输入模型名称" />
</el-form-item>
<el-form-item label="逻辑表">
<el-input v-model="form.modelLogicTable" placeholder="请输入逻辑表" />
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="字段信息" name="second">
<el-form ref="table" :model="form" size="mini" disabled>
<el-table :data="form.modelColumns" border style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" type="index" align="center" width="55" />
<el-table-column label="列名称">
<template slot-scope="scope">
<el-form-item>
<el-input v-model="scope.row.columnName" clearable placeholder="请输入列名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列描述">
<template slot-scope="scope">
<el-form-item>
<el-input v-model="scope.row.columnComment" clearable placeholder="请输入列描述" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列类型">
<template slot-scope="scope">
<el-form-item>
<el-input v-model="scope.row.columnType" clearable placeholder="请输入列类型" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="长度" width="70">
<template slot-scope="scope">
<el-form-item>
<el-input-number v-model="scope.row.columnLength" style="width: 50px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="小数位" width="70">
<template slot-scope="scope">
<el-form-item>
<el-input-number v-model="scope.row.columnScale" style="width: 50px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="主键" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isPk" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="必填" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isRequired" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="插入" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isInsert" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="编辑" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isEdit" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列表" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isList" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询" align="center" width="55">
<template slot-scope="scope">
<el-form-item>
<el-checkbox v-model="scope.row.isQuery" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询方式" width="120">
<template slot-scope="scope">
<el-form-item>
<el-select v-model="scope.row.queryType" clearable placeholder="请选择">
<el-option
v-for="item in queryTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="显示类型" width="120">
<template slot-scope="scope">
<el-form-item>
<el-select v-model="scope.row.htmlType" clearable placeholder="请选择">
<el-option
v-for="item in htmlTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</el-card>
</template>
<script>
import { getDataModel } from '@/api/masterdata/datamodel'
export default {
name: 'DataModelDetail',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '数据模型详情',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 表单参数
form: {},
// 状态数据字典
statusOptions: [],
activeName: 'first',
queryTypeOptions: [],
htmlTypeOptions: []
}
},
created() {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDicts('data_query_type').then(response => {
if (response.success) {
this.queryTypeOptions = response.data
}
})
this.getDicts('data_html_type').then(response => {
if (response.success) {
this.htmlTypeOptions = response.data
}
})
},
mounted() {
this.getDataModel(this.data.id)
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataModel: function(id) {
getDataModel(id).then(response => {
if (response.success) {
this.form = response.data
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-plus" round :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled" @click="submitForm">{{ loadingOptions.loadingText }}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-tabs v-model="activeName">
<el-tab-pane label="基本信息" name="first">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="模型名称" prop="modelName">
<el-input v-model="form.modelName" placeholder="请输入模型名称" />
</el-form-item>
<el-form-item label="逻辑表" prop="modelLogicTable">
<el-input v-model="form.modelLogicTable" placeholder="请输入逻辑表" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="字段信息" name="second">
<el-button @click="addRow">添加</el-button>
<el-form ref="table" :model="form" :rules="rules" size="mini">
<el-table :data="form.modelColumns" border style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" type="index" align="center" width="55" />
<el-table-column label="列名称">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnName'" :rules="rules.columnName">
<el-input v-model="scope.row.columnName" clearable placeholder="请输入列名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列描述">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnComment'" :rules="rules.columnComment">
<el-input v-model="scope.row.columnComment" clearable placeholder="请输入列描述" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列类型">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnType'" :rules="rules.columnType">
<el-input v-model="scope.row.columnType" clearable placeholder="请输入列类型" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="长度" width="90">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnLength'">
<el-input-number v-model="scope.row.columnLength" style="width: 70px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="小数位" width="70">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.columnScale'">
<el-input-number v-model="scope.row.columnScale" style="width: 50px;" :controls="false" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="主键" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isPk'">
<el-checkbox v-model="scope.row.isPk" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="必填" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isRequired'">
<el-checkbox v-model="scope.row.isRequired" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="插入" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isInsert'">
<el-checkbox v-model="scope.row.isInsert" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="编辑" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isEdit'">
<el-checkbox v-model="scope.row.isEdit" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="列表" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isList'">
<el-checkbox v-model="scope.row.isList" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询" align="center" width="55">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.isQuery'">
<el-checkbox v-model="scope.row.isQuery" true-label="1" false-label="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="查询方式" width="120">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.queryType'">
<el-select v-model="scope.row.queryType" clearable placeholder="请选择">
<el-option
v-for="item in queryTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="显示类型" width="120">
<template slot-scope="scope">
<el-form-item :prop="'modelColumns.' + scope.$index + '.htmlType'" :rules="rules.htmlType">
<el-select v-model="scope.row.htmlType" clearable placeholder="请选择">
<el-option
v-for="item in htmlTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-form-item>
<el-button :disabled="scope.$index === 0" @click="upRow(scope.$index)" icon="el-icon-arrow-up" circle></el-button>
<el-button :disabled="scope.$index === (form.modelColumns.length - 1)" @click="downRow(scope.$index)" icon="el-icon-arrow-down" circle></el-button>
<el-button @click="delRow(scope.$index)" icon="el-icon-delete" circle></el-button>
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</el-card>
</template>
<script>
import { getDataModel, updateDataModel } from '@/api/masterdata/datamodel'
export default {
name: 'DataModelEdit',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '数据模型编辑',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {},
// 表单校验
rules: {
modelName: [
{ required: true, message: '模型名称不能为空', trigger: 'blur' }
],
modelLogicTable: [
{ required: true, message: '逻辑表不能为空', trigger: 'blur' }
],
columnName: [
{ required: true, message: '列名称不能为空', trigger: 'blur' }
],
columnComment: [
{ required: true, message: '列描述不能为空', trigger: 'blur' }
],
columnType: [
{ required: true, message: '列类型不能为空', trigger: 'blur' }
],
htmlType: [
{ required: true, message: '显示类型不能为空', trigger: 'change' }
]
},
// 状态数据字典
statusOptions: [],
activeName: 'first',
queryTypeOptions: [],
htmlTypeOptions: []
}
},
created() {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDicts('data_query_type').then(response => {
if (response.success) {
this.queryTypeOptions = response.data
}
})
this.getDicts('data_html_type').then(response => {
if (response.success) {
this.htmlTypeOptions = response.data
}
})
},
mounted() {
this.getDataModel(this.data.id)
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataModel: function(id) {
getDataModel(id).then(response => {
if (response.success) {
this.form = response.data
}
})
},
addRow() {
const item = {
columnName: '',
columnComment: '',
columnType: '',
columnLength: '255',
columnScale: '0',
isPk: '0',
isRequired: '0',
isInsert: '0',
isEdit: '0',
isList: '0',
isQuery: '0',
queryType: '',
htmlType: 'input'
}
this.form.modelColumns.push(item)
},
upRow(index) {
if (index > 0) {
const data = this.form.modelColumns[index - 1]
this.form.modelColumns.splice(index - 1, 1)
this.form.modelColumns.splice(index, 0, data)
} else {
this.$message.warning('已经是第一条,不可上移')
return false
}
},
downRow(index) {
if ((index + 1) === this.form.modelColumns.length) {
this.$message.warning('已经是最后一条,不可下移')
return false
} else {
const data = this.form.modelColumns[index + 1]
this.form.modelColumns.splice(index + 1, 1)
this.form.modelColumns.splice(index, 0, data)
}
},
delRow(index) {
this.form.modelColumns.splice(index, 1)
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
updateDataModel(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<el-card class="box-card" shadow="always">
<el-form ref="queryForm" :model="queryParams" :inline="true">
<el-form-item label="模型名称" prop="modelName">
<el-input
v-model="queryParams.modelName"
placeholder="请输入模型名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
<el-button
type="success"
icon="el-icon-edit-outline"
size="mini"
:disabled="single"
@click="handleEdit"
>修改</el-button>
<el-button
type="info"
icon="el-icon-view"
size="mini"
:disabled="single"
@click="handleDetail"
>详情</el-button>
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleBatchDelete"
>删除</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<div class="right-toolbar">
<el-tooltip content="密度" effect="dark" placement="top">
<el-dropdown trigger="click" @command="handleCommand">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="colum-height" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="medium">正常</el-dropdown-item>
<el-dropdown-item command="small">中等</el-dropdown-item>
<el-dropdown-item command="mini">紧凑</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-tooltip>
<el-tooltip content="刷新" effect="dark" placement="top">
<el-button circle size="mini" @click="handleRefresh">
<svg-icon class-name="size-icon" icon-class="shuaxin" />
</el-button>
</el-tooltip>
<el-tooltip content="列设置" effect="dark" placement="top">
<el-popover placement="bottom" width="100" trigger="click">
<el-checkbox-group v-model="checkedTableColumns" @change="handleCheckedColsChange">
<el-checkbox
v-for="(item, index) in tableColumns"
:key="index"
:label="item.prop"
>{{ item.label }}</el-checkbox>
</el-checkbox-group>
<span slot="reference">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="shezhi" />
</el-button>
</span>
</el-popover>
</el-tooltip>
</div>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="tableDataList"
border
tooltip-effect="dark"
:size="tableSize"
:height="tableHeight"
style="width: 100%;margin: 15px 0;"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index +1 }}</span>
</template>
</el-table-column>
<template v-for="(item, index) in tableColumns">
<el-table-column
v-if="item.show"
:key="index"
:prop="item.prop"
:label="item.label"
:formatter="item.formatter"
align="center"
show-overflow-tooltip
/>
</template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-popover
placement="left"
trigger="click"
>
<el-button
size="mini"
type="text"
icon="el-icon-edit-outline"
@click="handleEdit(scope.row)"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleDetail(scope.row)"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
<el-button slot="reference">操作</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="queryParams.pageNum"
:page-size.sync="queryParams.pageSize"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</el-card>
</template>
<script>
import { pageDataModel, delDataModel, delDataModels } from '@/api/masterdata/datamodel'
export default {
name: 'DataModelList',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 表格头
tableColumns: [
{ prop: 'modelName', label: '模型名称', show: true },
{ prop: 'modelLogicTable', label: '模型逻辑表', show: true },
{
prop: 'status',
label: '状态',
show: true,
formatter: this.statusFormatter
},
{ prop: 'createTime', label: '创建时间', show: true }
],
// 默认选择中表格头
checkedTableColumns: [],
tableSize: 'medium',
// 状态数据字典
statusOptions: [],
// 表格数据
tableDataList: [],
// 总数据条数
total: 0,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
modelName: ''
}
}
},
created() {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getList()
},
mounted() {
this.initCols()
},
methods: {
/** 查询数据源列表 */
getList() {
this.loading = true
pageDataModel(this.queryParams).then(response => {
this.loading = false
if (response.success) {
const { data } = response
this.tableDataList = data.data
this.total = data.total
}
})
},
initCols() {
this.checkedTableColumns = this.tableColumns.map(col => col.prop)
},
handleCheckedColsChange(val) {
this.tableColumns.forEach(col => {
if (!this.checkedTableColumns.includes(col.prop)) {
col.show = false
} else {
col.show = true
}
})
},
handleCommand(command) {
this.tableSize = command
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 20,
modelName: ''
}
this.handleQuery()
},
/** 刷新列表 */
handleRefresh() {
this.getList()
},
/** 多选框选中数据 */
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.showOptions.data = {}
this.showOptions.showList = false
this.showOptions.showAdd = true
this.showOptions.showEdit = false
this.showOptions.showDetail = false
this.$emit('showCard', this.showOptions)
},
/** 修改按钮操作 */
handleEdit(row) {
this.showOptions.data.id = row.id || this.ids[0]
this.showOptions.showList = false
this.showOptions.showAdd = false
this.showOptions.showEdit = true
this.showOptions.showDetail = false
this.$emit('showCard', this.showOptions)
},
/** 详情按钮操作 */
handleDetail(row) {
this.showOptions.data.id = row.id || this.ids[0]
this.showOptions.showList = false
this.showOptions.showAdd = false
this.showOptions.showEdit = false
this.showOptions.showDetail = true
this.$emit('showCard', this.showOptions)
},
/** 删除按钮操作 */
handleDelete(row) {
this.$confirm('选中数据将被永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delDataModel(row.id).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getList()
}
})
}).catch(() => {
})
},
/** 批量删除按钮操作 */
handleBatchDelete() {
if (!this.ids.length) {
this.$message({
message: '请先选择需要操作的数据',
type: 'warning'
})
}
this.$message.warning('不支持批量删除')
},
handleSizeChange(val) {
console.log(`每页 ${val} 条`)
this.queryParams.pageNum = 1
this.queryParams.pageSize = val
this.getList()
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`)
this.queryParams.pageNum = val
this.getList()
},
statusFormatter(row, column, cellValue, index) {
const dictLabel = this.selectDictLabel(this.statusOptions, cellValue)
if (cellValue === '1') {
return <el-tag type='success'>{dictLabel}</el-tag>
} else {
return <el-tag type='warning'>{dictLabel}</el-tag>
}
}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<data-model-list v-if="options.showList" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-top">
<data-model-add v-if="options.showAdd" :data="options.data" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-top">
<data-model-edit v-if="options.showEdit" :data="options.data" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-bottom">
<data-model-detail v-if="options.showDetail" :data="options.data" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import DataModelList from './DataModelList'
import DataModelAdd from './DataModelAdd'
import DataModelEdit from './DataModelEdit'
import DataModelDetail from './DataModelDetail'
export default {
name: 'DataModel',
components: { DataModelList, DataModelAdd, DataModelEdit, DataModelDetail },
data() {
return {
options: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container">
Masterdata
</div>
</template>
<script>
export default {
name: 'Masterdata'
}
</script>
<style lang="scss" scoped>
</style>
......@@ -29,7 +29,7 @@
<sql-editor
ref="sqleditor"
:value="sqlText"
style="height: 300px;margin: 20px 0;"
style="height: 300px; margin: 20px 0;"
@changeTextarea="changeTextarea($event)"
/>
</el-col>
......
......@@ -22,7 +22,7 @@ import DataDictEdit from './DataDictEdit'
import DataDictDetail from './DataDictDetail'
export default {
name: 'ChangeRecord',
name: 'DataDict',
components: { DataDictList, DataDictAdd, DataDictEdit, DataDictDetail },
data() {
return {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment