Commit 99cb89cd by yuwei

项目初始化

parent 2022dbb0
......@@ -29,5 +29,10 @@
<artifactId>redisson</artifactId>
<version>${redisson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package cn.datax.common.redis.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisCacheAop {
// 缓存名
String cacheName() default "";
// 过期时间(秒) time要大于0 如果time小于等于0 将设置无限期
long expire() default -1;
// 缓存反序列化获取的对象
Class clazz() default Object.class;
// 序列化后的对象是否是数组 比如 List<Object>
boolean isArray() default false;
}
package cn.datax.common.redis.aspectj;
import cn.datax.common.redis.annotation.RedisCacheAop;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Aspect
@Slf4j
public class RedisCacheAspect {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ObjectMapper objectMapper;
/**
* 分隔符 生成key 格式为 类全类名|方法名|参数所属类全类名
**/
private static final String DELIMITER = ":";
/**
* Service层切点 使用到了我们定义的 RedisCacheAspect 作为切点表达式。
* 而且我们可以看出此表达式基于 annotation。
* 并且用于内建属性为查询的方法之上
*/
@Pointcut("@annotation(cn.datax.common.redis.annotation.RedisCacheAop)")
public void redisCacheAspect() {
}
/**
* Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
* <p>
* 注意:当核心业务抛异常后,立即退出,转向AfterAdvice 执行完AfterAdvice,再转到ThrowingAdvice
*/
@Around(value = "redisCacheAspect()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
// 得到类名、方法名和参数
String clazzName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
// 根据类名、方法名和参数生成Key
log.info("key参数: " + clazzName + "." + methodName);
String key = getKey(clazzName, methodName, args);
if (log.isInfoEnabled()) {
log.info("生成key: " + key);
}
// 得到被代理的方法
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
String cacheName = method.getAnnotation(RedisCacheAop.class).cacheName();
long expire = method.getAnnotation(RedisCacheAop.class).expire();
Class objectType = method.getAnnotation(RedisCacheAop.class).clazz();
boolean isArray = method.getAnnotation(RedisCacheAop.class).isArray();
// 检查Redis中是否有缓存
String value = (String) redisTemplate.opsForValue().get(key + DELIMITER + cacheName);
// result是方法的最终返回结果
Object result = null;
try {
if (null == value) {
log.info("缓存未命中");
// 调用数据库查询方法
result = joinPoint.proceed(args);
// 结果放入缓存
if (expire > 0) {
redisTemplate.opsForValue().set(key + DELIMITER + cacheName, objectMapper.writeValueAsString(result), expire, TimeUnit.SECONDS);
} else {
redisTemplate.opsForValue().set(key + DELIMITER + cacheName, objectMapper.writeValueAsString(result));
}
} else {
/**
* 可以直接针对mapper进行缓存,如果mapper查询返回的List<Objec> 需要isArray 为true 否则转换异常
*/
if (isArray){
return JSON.parseArray(value, objectType);
}else {
return JSON.parseObject(value,objectType);
}
}
} catch (Throwable e) {
log.error("程序异常", e.getMessage());
throw e;
}
return result;
}
/**
* 根据类名、方法名和参数生成Key
* @param clazzName
* @param methodName
* @param args
* @return key格式:全类名:方法名:参数类型
*/
private String getKey(String clazzName, String methodName, Object[] args) {
StringBuilder key = new StringBuilder(clazzName);
key.append(DELIMITER);
key.append(methodName);
key.append(DELIMITER);
key.append(Arrays.stream(args).map(x -> x.toString()).collect(Collectors.joining(DELIMITER)));
return key.toString();
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.common.redis.config.RedisConfig,\
cn.datax.common.redis.config.RedissonConfig
cn.datax.common.redis.config.RedissonConfig,\
cn.datax.common.redis.aspectj.RedisCacheAspect
......@@ -32,6 +32,9 @@ public class DataSourceDto implements Serializable {
@ApiModelProperty(value = "数据源名称")
@NotBlank(message = "数据源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceName;
@ApiModelProperty(value = "数据主题")
@NotBlank(message = "数据主题不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String themeId;
@ApiModelProperty(value = "数据源连接信息")
@Valid
private DbSchema dbSchema;
......
package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 数据主题信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@ApiModel(value = "数据主题信息表Model")
@Data
public class DataThemeDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "主题名称")
@NotBlank(message = "主题名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String themeName;
}
......@@ -36,6 +36,11 @@ public class DataSourceEntity extends DataScopeBaseEntity {
private String sourceName;
/**
* 数据主题
*/
private String themeId;
/**
* 数据源连接信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
......
package cn.datax.service.data.factory.api.entity;
import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 数据主题信息表
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("data_theme")
public class DataThemeEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L;
/**
* 数据主题
*/
private String themeName;
}
......@@ -19,4 +19,6 @@ public class DataSourceQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String sourceName;
private String themeId;
}
package cn.datax.service.data.factory.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 数据主题信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DataThemeQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String themeName;
}
......@@ -27,5 +27,6 @@ public class DataSourceVo implements Serializable {
private String remark;
private String dbType;
private String sourceName;
private String themeId;
private DbSchema dbSchema;
}
package cn.datax.service.data.factory.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 数据主题信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
public class DataThemeVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String themeName;
}
......@@ -90,6 +90,7 @@ public class DataSourceController extends BaseController {
public R getDataSourcePage(DataSourceQuery dataSourceQuery) {
QueryWrapper<DataSourceEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataSourceQuery.getSourceName()), "source_name", dataSourceQuery.getSourceName());
queryWrapper.eq(StrUtil.isNotBlank(dataSourceQuery.getThemeId()), "theme_id", dataSourceQuery.getThemeId());
IPage<DataSourceEntity> page = dataSourceService.page(new Page<>(dataSourceQuery.getPageNum(), dataSourceQuery.getPageSize()), queryWrapper);
List<DataSourceVo> collect = page.getRecords().stream().map(dataSourceMapper::toVO).collect(Collectors.toList());
JsonPage<DataSourceVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
......
package cn.datax.service.data.factory.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.vo.DataSourceVo;
import cn.datax.service.data.factory.api.vo.DataThemeVo;
import cn.datax.service.data.factory.api.query.DataThemeQuery;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper;
import cn.datax.service.data.factory.service.DataThemeService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 数据主题信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Api(tags = {"数据主题信息表"})
@RestController
@RequestMapping("/dataThemes")
public class DataThemeController extends BaseController {
@Autowired
private DataThemeService dataThemeService;
@Autowired
private DataThemeMapper dataThemeMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getDataThemeById(@PathVariable String id) {
DataThemeEntity dataThemeEntity = dataThemeService.getDataThemeById(id);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity));
}
@ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list")
public R getDataThemeList() {
QueryWrapper<DataThemeEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<DataThemeEntity> list = dataThemeService.list(queryWrapper);
List<DataThemeVo> collect = list.stream().map(dataThemeMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
/**
* 分页查询信息
*
* @param dataThemeQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "dataThemeQuery", value = "查询实体dataThemeQuery", required = true, dataTypeClass = DataThemeQuery.class)
})
@GetMapping("/page")
public R getDataThemePage(DataThemeQuery dataThemeQuery) {
QueryWrapper<DataThemeEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataThemeQuery.getThemeName()), "theme_name", dataThemeQuery.getThemeName());
IPage<DataThemeEntity> page = dataThemeService.page(new Page<>(dataThemeQuery.getPageNum(), dataThemeQuery.getPageSize()), queryWrapper);
List<DataThemeVo> collect = page.getRecords().stream().map(dataThemeMapper::toVO).collect(Collectors.toList());
JsonPage<DataThemeVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param dataTheme
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据dataTheme对象添加信息")
@ApiImplicitParam(name = "dataTheme", value = "详细实体dataTheme", required = true, dataType = "DataThemeDto")
@PostMapping()
public R saveDataTheme(@RequestBody @Validated({ValidationGroups.Insert.class}) DataThemeDto dataTheme) {
DataThemeEntity dataThemeEntity = dataThemeService.saveDataTheme(dataTheme);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity));
}
/**
* 修改
* @param dataTheme
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataTheme", value = "详细实体dataTheme", required = true, dataType = "DataThemeDto")
})
@PutMapping("/{id}")
public R updateDataTheme(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataThemeDto dataTheme) {
DataThemeEntity dataThemeEntity = dataThemeService.updateDataTheme(dataTheme);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteDataThemeById(@PathVariable String id) {
dataThemeService.deleteDataThemeById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteDataThemeBatch(@PathVariable List<String> ids) {
dataThemeService.deleteDataThemeBatch(ids);
return R.ok();
}
}
package cn.datax.service.data.factory.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 数据主题信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Mapper
public interface DataThemeDao extends BaseDao<DataThemeEntity> {
}
package cn.datax.service.data.factory.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.vo.DataThemeVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据主题信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Mapper(componentModel = "spring")
public interface DataThemeMapper extends EntityMapper<DataThemeDto, DataThemeEntity, DataThemeVo> {
}
package cn.datax.service.data.factory.service;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 数据主题信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
public interface DataThemeService extends BaseService<DataThemeEntity> {
DataThemeEntity saveDataTheme(DataThemeDto dataTheme);
DataThemeEntity updateDataTheme(DataThemeDto dataTheme);
DataThemeEntity getDataThemeById(String id);
void deleteDataThemeById(String id);
void deleteDataThemeBatch(List<String> ids);
}
package cn.datax.service.data.factory.service.impl;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.service.DataThemeService;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper;
import cn.datax.service.data.factory.dao.DataThemeDao;
import cn.datax.common.base.BaseServiceImpl;
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.List;
/**
* <p>
* 数据主题信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataThemeServiceImpl extends BaseServiceImpl<DataThemeDao, DataThemeEntity> implements DataThemeService {
@Autowired
private DataThemeDao dataThemeDao;
@Autowired
private DataThemeMapper dataThemeMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public DataThemeEntity saveDataTheme(DataThemeDto dataThemeDto) {
DataThemeEntity dataTheme = dataThemeMapper.toEntity(dataThemeDto);
dataThemeDao.insert(dataTheme);
return dataTheme;
}
@Override
@Transactional(rollbackFor = Exception.class)
public DataThemeEntity updateDataTheme(DataThemeDto dataThemeDto) {
DataThemeEntity dataTheme = dataThemeMapper.toEntity(dataThemeDto);
dataThemeDao.updateById(dataTheme);
return dataTheme;
}
@Override
public DataThemeEntity getDataThemeById(String id) {
DataThemeEntity dataThemeEntity = super.getById(id);
return dataThemeEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataThemeById(String id) {
dataThemeDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataThemeBatch(List<String> ids) {
dataThemeDao.deleteBatchIds(ids);
}
}
......@@ -11,9 +11,9 @@
<result column="create_dept" property="createDept" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="source_id" property="sourceId" />
<result column="set_name" property="setName" />
<result column="remark" property="remark" />
<result column="set_sql" property="setSql" />
<result column="schema_json" property="schemaConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
......@@ -28,7 +28,8 @@
create_dept,
update_by,
update_time,
source_id, set_name, remark, set_sql, schema_json
remark,
source_id, set_name, set_sql, schema_json
</sql>
</mapper>
......@@ -11,9 +11,10 @@
<result column="create_dept" property="createDept" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="db_type" property="dbType" />
<result column="source_name" property="sourceName" />
<result column="remark" property="remark" />
<result column="theme_id" property="themeId" />
<result column="db_schema" property="dbSchema" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap>
......@@ -26,7 +27,8 @@
create_dept,
update_by,
update_time,
db_type, source_name, source_desc, remark, db_schema
remark,
db_type, source_name, theme_id, db_schema
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.factory.dao.DataThemeDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.factory.api.entity.DataThemeEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="create_dept" property="createDept" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="theme_name" property="themeName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
create_dept,
update_by,
update_time,
remark,
theme_name
</sql>
</mapper>
import request from '@/utils/request'
export function listDataTheme (data) {
return request({
url: '/data/factory/dataThemes/list',
method: 'get',
params: data
})
}
export function pageDataTheme (data) {
return request({
url: '/data/factory/dataThemes/page',
method: 'get',
params: data
})
}
export function getDataTheme (id) {
return request({
url: '/data/factory/dataThemes/' + id,
method: 'get'
})
}
export function delDataTheme (id) {
return request({
url: '/data/factory/dataThemes/' + id,
method: 'delete'
})
}
export function delDataThemes (ids) {
return request({
url: '/data/factory/dataThemes/batch/' + ids,
method: 'delete'
})
}
export function addDataTheme (data) {
return request({
url: '/data/factory/dataThemes',
method: 'post',
data: data
})
}
export function updateDataTheme (data) {
return request({
url: '/data/factory/dataThemes/' + data.id,
method: 'put',
data: data
})
}
......@@ -24,6 +24,17 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据主题" prop="themeId">
<el-select v-model="form.themeId" placeholder="请选择数据主题">
<el-option
v-for="item in themeOptions"
:key="item.id"
:label="item.themeName"
:value="item.id"
:disabled="item.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
</el-form-item>
......@@ -72,6 +83,7 @@
<script>
import { addDataSource, checkConnection } from '@/api/factory/datasource'
import { listDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataSourceAdd',
......@@ -109,6 +121,7 @@ export default {
form: {
id: undefined,
dbType: undefined,
themeId: undefined,
sourceName: undefined,
dbSchema: {},
status: '1',
......@@ -117,7 +130,10 @@ export default {
// 表单校验
rules: {
dbType: [
{ required: true, message: '数据源类型不能为空', trigger: 'blur' }
{ required: true, message: '数据源类型不能为空', trigger: 'change' }
],
themeId: [
{ required: true, message: '数据主题不能为空', trigger: 'change' }
],
sourceName: [
{ required: true, message: '数据源名称不能为空', trigger: 'blur' }
......@@ -154,7 +170,9 @@ export default {
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
dbTypeOptions: [],
// 数据主题数据字典
themeOptions: []
}
},
created () {
......@@ -168,11 +186,19 @@ export default {
this.dbTypeOptions = response.data
}
})
this.getDataThemeList()
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataThemeList () {
listDataTheme().then(response => {
if (response.success) {
this.themeOptions = response.data
}
})
},
/** 步骤条下一步 */
handleNextStep () {
this.$refs['form'].validate(valid => {
......
......@@ -24,6 +24,17 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据主题" prop="themeId">
<el-select v-model="form.themeId">
<el-option
v-for="item in themeOptions"
:key="item.id"
:label="item.themeName"
:value="item.id"
:disabled="item.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
</el-form-item>
......@@ -69,6 +80,7 @@
<script>
import { getDataSource, checkConnection } from '@/api/factory/datasource'
import { listDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataSourceDetail',
......@@ -102,7 +114,9 @@ export default {
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
dbTypeOptions: [],
// 数据主题数据字典
themeOptions: []
}
},
created () {
......@@ -117,6 +131,7 @@ export default {
this.dbTypeOptions = response.data
}
})
this.getDataThemeList ()
},
mounted () {
this.getDataSource(this.data.id)
......@@ -125,6 +140,13 @@ export default {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataThemeList () {
listDataTheme().then(response => {
if (response.success) {
this.themeOptions = response.data
}
})
},
/** 获取详情 */
getDataSource: function (id) {
getDataSource(id).then(response => {
......
......@@ -24,6 +24,17 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据主题" prop="themeId">
<el-select v-model="form.themeId" placeholder="请选择数据主题">
<el-option
v-for="item in themeOptions"
:key="item.id"
:label="item.themeName"
:value="item.id"
:disabled="item.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
</el-form-item>
......@@ -72,6 +83,7 @@
<script>
import { getDataSource, updateDataSource, checkConnection } from '@/api/factory/datasource'
import { listDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataSourceEdit',
......@@ -110,7 +122,10 @@ export default {
// 表单校验
rules: {
dbType: [
{ required: true, message: '数据源类型不能为空', trigger: 'blur' }
{ required: true, message: '数据源类型不能为空', trigger: 'change' }
],
themeId: [
{ required: true, message: '数据主题不能为空', trigger: 'change' }
],
sourceName: [
{ required: true, message: '数据源名称不能为空', trigger: 'blur' }
......@@ -140,7 +155,9 @@ export default {
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
dbTypeOptions: [],
// 数据主题数据字典
themeOptions: []
}
},
created () {
......@@ -155,6 +172,7 @@ export default {
this.dbTypeOptions = response.data
}
})
this.getDataThemeList ()
},
mounted () {
this.getDataSource(this.data.id)
......@@ -163,6 +181,13 @@ export default {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataThemeList () {
listDataTheme().then(response => {
if (response.success) {
this.themeOptions = response.data
}
})
},
/** 获取详情 */
getDataSource: function (id) {
getDataSource(id).then(response => {
......
<template>
<div>
<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 @click="submitForm" :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled">{{loadingOptions.loadingText}}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div :style="classCardbody">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主题名称" prop="themeName">
<el-input v-model="form.themeName" 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>
</div>
</el-card>
</div>
</template>
<script>
import { addDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataThemeAdd',
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据主题新增',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {
status: '1'
},
// 表单校验
rules: {
themeName: [
{ required: true, message: '主题名称不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: []
}
},
created () {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
addDataTheme(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>
</style>
<template>
<div>
<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 :style="classCardbody">
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="主题名称" prop="themeName">
<el-input v-model="form.themeName" />
</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" />
</el-form-item>
</el-form>
</div>
</el-card>
</div>
</template>
<script>
import { getDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataThemeDetail',
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据主题详情',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 表单参数
form: {},
// 状态数据字典
statusOptions: []
}
},
created () {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
},
mounted () {
this.getDataTheme(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataTheme: function (id) {
getDataTheme(id).then(response => {
if (response.success) {
this.form = response.data
}
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div>
<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 @click="submitForm" :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled">{{loadingOptions.loadingText}}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div :style="classCardbody">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主题名称" prop="themeName">
<el-input v-model="form.themeName" 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>
</div>
</el-card>
</div>
</template>
<script>
import { getDataTheme, updateDataTheme } from '@/api/factory/datatheme'
export default {
name: 'DataThemeEdit',
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据主题编辑',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {},
// 表单校验
rules: {
themeName: [
{ required: true, message: '主题名称不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: []
}
},
created () {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
},
mounted () {
this.getDataTheme(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataTheme: function (id) {
getDataTheme(id).then(response => {
if (response.success) {
this.form = response.data
}
})
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
updateDataTheme(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>
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<data-theme-list v-if="options.showList" @showCard="showCard"></data-theme-list>
</transition>
<transition name="el-zoom-in-top">
<data-theme-add v-if="options.showAdd" :data="options.data" @showCard="showCard"></data-theme-add>
</transition>
<transition name="el-zoom-in-top">
<data-theme-edit v-if="options.showEdit" :data="options.data" @showCard="showCard"></data-theme-edit>
</transition>
<transition name="el-zoom-in-bottom">
<data-theme-detail v-if="options.showDetail" :data="options.data" @showCard="showCard"></data-theme-detail>
</transition>
</div>
</template>
<script>
import DataThemeList from './DataThemeList'
import DataThemeAdd from './DataThemeAdd'
import DataThemeEdit from './DataThemeEdit'
import DataThemeDetail from './DataThemeDetail'
export default {
name: 'DataTheme',
components: { DataThemeList, DataThemeAdd, DataThemeEdit, DataThemeDetail },
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>
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