Commit a13adf79 by yuwei

项目初始化

parent 340ababc
......@@ -9,7 +9,6 @@ public class ApiHeader implements Serializable {
private static final long serialVersionUID=1L;
private String authorization;
private String apiKey;
private String secretKey;
}
package cn.datax.service.data.market.api.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class ServiceHeader implements Serializable {
private static final long serialVersionUID=1L;
private String serviceKey;
private String secretKey;
}
......@@ -24,6 +24,7 @@ import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -133,4 +134,10 @@ public class ServiceIntegrationController extends BaseController {
serviceIntegrationService.deleteServiceIntegrationBatch(ids);
return R.ok();
}
@GetMapping("/detail/{id}")
public R getServiceIntegrationDetailById(@PathVariable String id) {
Map<String, Object> map = serviceIntegrationService.getServiceIntegrationDetailById(id);
return R.ok().setData(map);
}
}
......@@ -5,6 +5,7 @@ import cn.datax.service.data.market.api.dto.ServiceIntegrationDto;
import cn.datax.common.base.BaseService;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -25,4 +26,6 @@ public interface ServiceIntegrationService extends BaseService<ServiceIntegratio
void deleteServiceIntegrationById(String id);
void deleteServiceIntegrationBatch(List<String> ids);
Map<String, Object> getServiceIntegrationDetailById(String id);
}
package cn.datax.service.data.market.integration.service.impl;
import cn.datax.common.utils.MD5Util;
import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.data.market.api.entity.ServiceIntegrationEntity;
import cn.datax.service.data.market.api.dto.ServiceIntegrationDto;
import cn.datax.service.data.market.api.vo.ApiHeader;
import cn.datax.service.data.market.api.vo.ServiceHeader;
import cn.datax.service.data.market.integration.service.ServiceIntegrationService;
import cn.datax.service.data.market.integration.mapstruct.ServiceIntegrationMapper;
import cn.datax.service.data.market.integration.dao.ServiceIntegrationDao;
......@@ -12,7 +16,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -67,4 +73,22 @@ public class ServiceIntegrationServiceImpl extends BaseServiceImpl<ServiceIntegr
public void deleteServiceIntegrationBatch(List<String> ids) {
serviceIntegrationDao.deleteBatchIds(ids);
}
@Override
public Map<String, Object> getServiceIntegrationDetailById(String id) {
ServiceIntegrationEntity serviceIntegrationEntity = super.getById(id);
ServiceHeader serviceHeader = new ServiceHeader();
MD5Util mt = null;
try {
mt = MD5Util.getInstance();
serviceHeader.setSecretKey(mt.encode(id));
serviceHeader.setSecretKey(mt.encode(SecurityUtil.getUserId()));
} catch (Exception e) {
e.printStackTrace();
}
Map<String, Object> map = new HashMap<>(2);
map.put("data", serviceIntegrationMapper.toVO(serviceIntegrationEntity));
map.put("header", serviceHeader);
return map;
}
}
package cn.datax.service.data.market.mapping.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.service.data.market.mapping.service.ApiExecuteService;
import cn.datax.service.data.market.api.vo.ApiHeader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/apis")
public class ApiExecuteController extends BaseController {
@Autowired
private ApiExecuteService apiExecuteService;
@GetMapping(value = "/{id}/header")
public R getApiHeader(@PathVariable String id){
ApiHeader apiHeader = apiExecuteService.getApiHeader(id);
return R.ok().setData(apiHeader);
}
}
package cn.datax.service.data.market.mapping.service;
import cn.datax.service.data.market.api.vo.ApiHeader;
public interface ApiExecuteService {
ApiHeader getApiHeader(String id);
}
package cn.datax.service.data.market.mapping.service.impl;
import cn.datax.common.utils.MD5Util;
import cn.datax.common.utils.SecurityUtil;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.market.mapping.service.ApiExecuteService;
import cn.datax.service.data.market.api.vo.ApiHeader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ApiExecuteServiceImpl implements ApiExecuteService {
@Override
public ApiHeader getApiHeader(String id) {
try {
ApiHeader apiHeader = new ApiHeader();
MD5Util mt = MD5Util.getInstance();
apiHeader.setApiKey(mt.encode(id));
apiHeader.setSecretKey(mt.encode(SecurityUtil.getUserId()));
return apiHeader;
} catch (Exception e) {
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
return null;
}
}
}
......@@ -32,6 +32,7 @@ import cn.datax.common.base.BaseController;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -208,4 +209,10 @@ public class DataApiController extends BaseController {
out.flush();
out.close();
}
@GetMapping("/detail/{id}")
public R getDataApiDetailById(@PathVariable String id) {
Map<String, Object> map = dataApiService.getDataApiDetailById(id);
return R.ok().setData(map);
}
}
......@@ -8,6 +8,7 @@ import cn.datax.service.data.market.api.vo.SqlParseVo;
import com.aspose.words.Document;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -38,4 +39,6 @@ public interface DataApiService extends BaseService<DataApiEntity> {
void cancelDataApi(String id);
Document wordDataApi(String id) throws Exception;
Map<String, Object> getDataApiDetailById(String id);
}
......@@ -13,6 +13,7 @@ import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.market.api.dto.*;
import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.api.enums.ConfigType;
import cn.datax.service.data.market.api.vo.ApiHeader;
import cn.datax.service.data.market.api.vo.SqlParseVo;
import cn.datax.service.data.market.service.DataApiService;
import cn.datax.service.data.market.mapstruct.DataApiMapper;
......@@ -450,4 +451,22 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
WordUtil.getInstance().insertWatermarkText(doc, SecurityUtil.getUserName());
return doc;
}
@Override
public Map<String, Object> getDataApiDetailById(String id) {
DataApiEntity dataApiEntity = super.getById(id);
ApiHeader apiHeader = new ApiHeader();
MD5Util mt = null;
try {
mt = MD5Util.getInstance();
apiHeader.setApiKey(mt.encode(id));
apiHeader.setSecretKey(mt.encode(SecurityUtil.getUserId()));
} catch (Exception e) {
e.printStackTrace();
}
Map<String, Object> map = new HashMap<>(2);
map.put("data", dataApiMapper.toVO(dataApiEntity));
map.put("header", apiHeader);
return map;
}
}
package cn.datax.service.data.metadata.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
......@@ -18,7 +19,7 @@ import java.io.Serializable;
*/
@Data
@Accessors(chain = true)
@TableName("metadata_column")
@TableName(value = "metadata_column", autoResultMap = true)
public class MetadataColumnEntity implements Serializable {
private static final long serialVersionUID=1L;
......@@ -88,4 +89,13 @@ public class MetadataColumnEntity implements Serializable {
* 数据默认值
*/
private String dataDefault;
@TableField(exist = false)
private String sourceName;
@TableField(exist = false)
private String tableName;
@TableField(exist = false)
private String tableComment;
}
package cn.datax.service.data.metadata.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
......@@ -18,7 +19,7 @@ import java.io.Serializable;
*/
@Data
@Accessors(chain = true)
@TableName("metadata_table")
@TableName(value = "metadata_table", autoResultMap = true)
public class MetadataTableEntity implements Serializable {
private static final long serialVersionUID=1L;
......@@ -43,4 +44,7 @@ public class MetadataTableEntity implements Serializable {
* 表注释
*/
private String tableComment;
@TableField(exist = false)
private String sourceName;
}
......@@ -30,4 +30,7 @@ public class MetadataColumnVo implements Serializable {
private String dataPrecision;
private String dataScale;
private String dataDefault;
private String sourceName;
private String tableName;
private String tableComment;
}
......@@ -21,4 +21,5 @@ public class MetadataTableVo implements Serializable {
private String sourceId;
private String tableName;
private String tableComment;
private String sourceName;
}
......@@ -85,9 +85,9 @@ public class MetadataColumnController extends BaseController {
@GetMapping("/page")
public R getDataMetadataColumnPage(MetadataColumnQuery metadataColumnQuery) {
QueryWrapper<MetadataColumnEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(metadataColumnQuery.getColumnName()), "column_name", metadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getSourceId()), "source_id", metadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getTableId()), "table_id", metadataColumnQuery.getTableId());
queryWrapper.like(StrUtil.isNotBlank(metadataColumnQuery.getColumnName()), "c.column_name", metadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getSourceId()), "c.source_id", metadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getTableId()), "c.table_id", metadataColumnQuery.getTableId());
IPage<MetadataColumnEntity> page = metadataColumnService.page(new Page<>(metadataColumnQuery.getPageNum(), metadataColumnQuery.getPageSize()), queryWrapper);
List<MetadataColumnVo> collect = page.getRecords().stream().map(metadataColumnMapper::toVO).collect(Collectors.toList());
JsonPage<MetadataColumnVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
......
......@@ -83,8 +83,8 @@ public class MetadataTableController extends BaseController {
@GetMapping("/page")
public R getDataMetadataTablePage(MetadataTableQuery metadataTableQuery) {
QueryWrapper<MetadataTableEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(metadataTableQuery.getTableName()), "table_name", metadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(metadataTableQuery.getSourceId()), "source_id", metadataTableQuery.getSourceId());
queryWrapper.like(StrUtil.isNotBlank(metadataTableQuery.getTableName()), "t.table_name", metadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(metadataTableQuery.getSourceId()), "t.source_id", metadataTableQuery.getSourceId());
IPage<MetadataTableEntity> page = metadataTableService.page(new Page<>(metadataTableQuery.getPageNum(), metadataTableQuery.getPageSize()), queryWrapper);
List<MetadataTableVo> collect = page.getRecords().stream().map(metadataTableMapper::toVO).collect(Collectors.toList());
JsonPage<MetadataTableVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
......
......@@ -2,7 +2,11 @@ package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
......@@ -15,4 +19,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MetadataColumnDao extends BaseDao<MetadataColumnEntity> {
@Override
<E extends IPage<MetadataColumnEntity>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<MetadataColumnEntity> queryWrapper);
}
......@@ -2,7 +2,11 @@ package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
......@@ -15,4 +19,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MetadataTableDao extends BaseDao<MetadataTableEntity> {
@Override
<E extends IPage<MetadataTableEntity>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<MetadataTableEntity> queryWrapper);
}
......@@ -19,10 +19,30 @@
<result column="data_default" property="dataDefault" />
</resultMap>
<resultMap id="ExtendResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataColumnEntity" extends="BaseResultMap">
<result column="source_name" property="sourceName" />
<result column="table_name" property="tableName" />
<result column="table_comment" property="tableComment" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
source_id, table_id, column_name, column_comment, column_key, column_nullable, column_position, data_type, data_length, data_precision, data_scale, data_default
</sql>
<sql id="Column_Column_List">
${alias}.id,
${alias}.source_id, ${alias}.table_id, ${alias}.column_name, ${alias}.column_comment, ${alias}.column_key, ${alias}.column_nullable, ${alias}.column_position, ${alias}.data_type, ${alias}.data_length, ${alias}.data_precision, ${alias}.data_scale, ${alias}.data_default
</sql>
<select id="selectPage" resultMap="ExtendResultMap">
SELECT s.source_name, t.table_name, t.table_comment,
<include refid="Column_Column_List"><property name="alias" value="c"/></include>
FROM metadata_column c
LEFT JOIN metadata_source s ON s.id = c.source_id
LEFT JOIN metadata_table t ON t.id = c.table_id
${ew.customSqlSegment}
</select>
</mapper>
......@@ -34,23 +34,23 @@
db_type, source_name, is_sync
</sql>
<sql id="Extend_Column_List">
id,
status,
create_by,
create_time,
create_dept,
update_by,
update_time,
remark,
db_type, source_name, source_sync, db_schema
<sql id="Source_Column_List">
${alias}.id,
${alias}.status,
${alias}.create_by,
${alias}.create_time,
${alias}.create_dept,
${alias}.update_by,
${alias}.update_time,
${alias}.remark,
${alias}.db_type, ${alias}.source_name, ${alias}.is_sync, ${alias}.db_schema
</sql>
<select id="selectById" resultMap="ExtendResultMap">
SELECT
<include refid="Extend_Column_List"></include>
FROM metadata_source
WHERE 1=1 AND id = #{id}
<include refid="Source_Column_List"><property name="alias" value="s"/></include>
FROM metadata_source s
WHERE 1=1 AND s.id = #{id}
</select>
<select id="selectList" resultMap="BaseResultMap">
......
......@@ -10,10 +10,27 @@
<result column="table_comment" property="tableComment" />
</resultMap>
<resultMap id="ExtendResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataTableEntity" extends="BaseResultMap">
<result column="source_name" property="sourceName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
source_id, table_name, table_comment
</sql>
<sql id="Table_Column_List">
${alias}.id,
${alias}.source_id, ${alias}.table_name, ${alias}.table_comment
</sql>
<select id="selectPage" resultMap="ExtendResultMap">
SELECT s.source_name,
<include refid="Table_Column_List"><property name="alias" value="t"/></include>
FROM metadata_table t
LEFT JOIN metadata_source s ON s.id = t.source_id
${ew.customSqlSegment}
</select>
</mapper>
import request from '@/utils/request'
export function getApiHeader(id) {
return request({
url: '/data/api/apis/' + id + '/header',
method: 'get'
})
}
export function getApiCall(url, header, data) {
return request({
url: '/data/api/' + url,
......
......@@ -89,3 +89,10 @@ export function word(id) {
responseType: 'blob'
})
}
export function getDataApiDetail(id) {
return request({
url: '/data/market/dataApis/detail/' + id,
method: 'get'
})
}
......@@ -44,3 +44,10 @@ export function updateDataService(data) {
data: data
})
}
export function getDataServiceDetail(id) {
return request({
url: `/data/service/services/detail/${id}`,
method: 'get'
})
}
......@@ -161,8 +161,8 @@
</template>
<script>
import { getDataApi } from '@/api/market/dataapi'
import { getApiHeader, getApiCall, postApiCall } from '@/api/market/apimapping'
import { getDataApiDetail } from '@/api/market/dataapi'
import { getApiCall, postApiCall } from '@/api/market/apimapping'
export default {
name: 'DataApiCall',
......@@ -216,7 +216,6 @@ export default {
this.paramTypeOptions = response.data
}
})
this.getApiHeader(this.data.id)
},
mounted() {
this.getDataApi(this.data.id)
......@@ -227,19 +226,13 @@ export default {
},
/** 获取详情 */
getDataApi: function(id) {
getDataApi(id).then(response => {
getDataApiDetail(id).then(response => {
if (response.success) {
this.form = response.data
}
})
},
getApiHeader: function(id) {
getApiHeader(id).then(response => {
if (response.success) {
const data = response.data
this.apiHeader = data
this.apiHeaderList.push({ 'KEY': 'api_key', 'VALUE': this.apiHeader.apiKey, 'DESCRIPTION': '' })
this.apiHeaderList.push({ 'KEY': 'secret_key', 'VALUE': this.apiHeader.secretKey, 'DESCRIPTION': '' })
const { data } = response
this.form = data.data
this.apiHeader = data.header
this.apiHeaderList.push({ 'KEY': 'api_key', 'VALUE': data.header.apiKey, 'DESCRIPTION': '' })
this.apiHeaderList.push({ 'KEY': 'secret_key', 'VALUE': data.header.secretKey, 'DESCRIPTION': '' })
}
})
},
......
......@@ -7,6 +7,26 @@
</el-button-group>
</div>
<div class="body-wrapper">
<el-tabs type="border-card">
<el-tab-pane label="请求头">
<el-table
:data="serviceHeaderList"
stripe
border
:max-height="300"
style="width: 100%; margin: 15px 0;"
>
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index +1 }}</span>
</template>
</el-table-column>
<el-table-column prop="KEY" label="键" align="center" show-overflow-tooltip />
<el-table-column prop="VALUE" label="值" align="center" show-overflow-tooltip />
<el-table-column prop="DESCRIPTION" label="描述" align="center" show-overflow-tooltip />
</el-table>
</el-tab-pane>
</el-tabs>
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="服务名称">
<el-input v-model="form.serviceName" placeholder="请输入服务名称" />
......@@ -77,7 +97,7 @@
</template>
<script>
import { getDataService } from '@/api/market/dataservice'
import { getDataServiceDetail } from '@/api/market/dataservice'
export default {
name: 'DataServiceDetail',
......@@ -105,7 +125,8 @@ export default {
// 状态数据字典
statusOptions: [],
serviceTypeOptions: [],
httpMethodOptions: []
httpMethodOptions: [],
serviceHeaderList: []
}
},
created() {
......@@ -135,9 +156,12 @@ export default {
},
/** 获取详情 */
getDataService: function(id) {
getDataService(id).then(response => {
getDataServiceDetail(id).then(response => {
if (response.success) {
this.form = response.data
const { data } = response
this.form = data.data
this.serviceHeaderList.push({ 'KEY': 'service_key', 'VALUE': data.header.serviceKey, 'DESCRIPTION': '' })
this.serviceHeaderList.push({ 'KEY': 'secret_key', 'VALUE': data.header.secretKey, 'DESCRIPTION': '' })
}
})
}
......
<template>
<div class="app-container">
ColumnPane
<div v-for="(item, index) in data" :key="index">
{{item.id}}
</div>
</div>
<ul class="list-group">
<li v-for="(item, index) in data" :key="index" class="list-group-item">
<span class="list-group-item-heading">{{item.columnName}}({{item.columnComment}})</span>
<p class="list-group-item-text">数据源: {{item.sourceName}} 数据表: {{item.tableName}}({{item.tableComment}})</p>
</li>
</ul>
</template>
<script>
......@@ -13,7 +13,7 @@ export default {
props: {
data: {
type: Array,
default: function () {
default: function() {
return []
}
}
......@@ -22,5 +22,34 @@ export default {
</script>
<style lang="scss" scoped>
.list-group {
margin-bottom: 20px;
padding-left: 0;
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
border: 1px solid #ddd;
&:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
&:last-child {
margin-bottom: 0;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
font-size: 14px;
}
}
}
</style>
<template>
<div class="app-container">
SourcePane
<div v-for="(item, index) in data" :key="index">
{{item.id}}
</div>
</div>
<ul class="list-group">
<li v-for="(item, index) in data" :key="index" class="list-group-item">
<span class="list-group-item-heading">{{item.sourceName}}
<el-badge v-if="item.isSync === '0'" value="未同步" type="danger"/>
<el-badge v-if="item.isSync === '1'" value="已同步" type="success"/>
</span>
<p class="list-group-item-text">数据源类型: {{item.dbTypeName}}</p>
</li>
</ul>
</template>
<script>
......@@ -13,14 +16,62 @@ export default {
props: {
data: {
type: Array,
default: function () {
default: function() {
return []
}
}
},
data() {
return {
// 数据源类型数据字典
dbTypeOptions: []
}
},
created() {
this.getDicts('data_db_type').then(response => {
if (response.success) {
this.dbTypeOptions = response.data
this.data.map(d => {
const item = this.dbTypeOptions.find((item, index, arr) => {
return item.itemText === d.dbType
})
d.dbTypeName = item ? item.itemValue : ''
})
}
})
}
}
</script>
<style lang="scss" scoped>
.list-group {
margin-bottom: 20px;
padding-left: 0;
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
border: 1px solid #ddd;
&:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
&:last-child {
margin-bottom: 0;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
font-size: 14px;
}
}
}
</style>
<template>
<div class="app-container">
TablePane
<div v-for="(item, index) in data" :key="index">
{{item.id}}
</div>
</div>
<ul class="list-group">
<li v-for="(item, index) in data" :key="index" class="list-group-item">
<span class="list-group-item-heading">{{item.tableName}}({{item.tableComment}})</span>
<p class="list-group-item-text">数据源: {{item.sourceName}}</p>
</li>
</ul>
</template>
<script>
......@@ -13,7 +13,7 @@ export default {
props: {
data: {
type: Array,
default: function () {
default: function() {
return []
}
}
......@@ -22,5 +22,34 @@ export default {
</script>
<style lang="scss" scoped>
.list-group {
margin-bottom: 20px;
padding-left: 0;
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
border: 1px solid #ddd;
&:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
&:last-child {
margin-bottom: 0;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
font-size: 14px;
}
}
}
</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