Commit 334830ae authored by 董国亮's avatar 董国亮

增加web组件开发、业务组件仓库等模块

parent e285e833
......@@ -13,7 +13,8 @@
"compression-webpack-plugin": "^3.1.0",
"core-js": "^3.6.5",
"vue-cron": "^1.0.9",
"vue-drag-resize": "^1.4.1"
"vue-drag-resize": "^1.4.1",
"yaml": "^1.10.2"
},
"devDependencies": {
"@unistrong/st-cli-service": "^0.1.0"
......
......@@ -111,18 +111,46 @@ export default [
component: (resolve) =>
require(["@/views/app/portalEditor/index"], resolve),
},
{
path: URL.SEARCH,
redirect: URL.SEARCH_DATA,
path: URL.WEB_COMPONENT,
redirect: URL.WEB_COMPONENT_COMPONENT,
},
{
path: URL.WEB_COMPONENT,
component: (resolve) => require(["@/views/web-component/index"], resolve),
children: [
{
path: URL.WEB_COMPONENT_COMPONENT,
component: (resolve) =>
require(["@/views/web-component/component/index"], resolve),
},
{
path: URL.WEB_COMPONENT_TEMPLATE,
component: (resolve) =>
require(["@/views/web-component/template/index"], resolve),
},
{
path: URL.WEB_COMPONENT_PREVIEW,
component: (resolve) =>
require(["@/views/web-component/preview/index"], resolve),
},
],
},
{
path: URL.JAVA,
redirect: URL.JAVA_PUBLIC
},
{
path: URL.JAVA_PUBLIC,
component: resolve => require(["@/views/java/public/index"], resolve)
},
{
path: URL.SEARCH_DATA,
component: (resolve) => require(["@/views/search/data/index"], resolve),
path: URL.JAVA_APP,
component: resolve => require(["@/views/java/app/index"], resolve)
},
{
path: URL.SEARCH_APP,
component: (resolve) => require(["@/views/search/app/index"], resolve),
path: URL.JAVA_RULE,
component: resolve => require(["@/views/java/rule/index"], resolve)
},
{
path: URL.SCHEDULE,
......@@ -136,15 +164,16 @@ export default [
path: URL.SCHEDULE_TASK_DEVELOP,
component: (resolve) =>
require(["@/views/schedule/task/develop/index"], resolve),
},
{
path: URL.SCHEDULE_TASK_PIPELINE,
component: (resolve) =>
require(["@/views/schedule/task/pipeline/index"], resolve),
},
{
path: URL.SCHEDULE_TASK_ACCESS,
component: (resolve) =>
require(["@/views/schedule/task/access/index"], resolve),
},
},
{
path: URL.SCHEDULE_TASK_PIPELINE,
component: (resolve) =>
require(["@/views/schedule/task/pipeline/index"], resolve),
},
{
path: URL.SCHEDULE_TASK_ACCESS,
component: (resolve) =>
require(["@/views/schedule/task/access/index"], resolve),
},
];
......@@ -27,13 +27,15 @@ export const PORTAL_BPMSIMULATION = "/portal/:appId/bpmsimulation";
export const PORTAL_MAP = "/portal/:appId/map";
export const PORTAL_CONTENT = "/portal/:appId/content";
export const WEB_COMPONENT = "/web-component";
export const WEB_COMPONENT_COMPONENT = "/web-component/component";
export const WEB_COMPONENT_TEMPLATE = "/web-component/template";
export const WEB_COMPONENT_PREVIEW = "/web-component/preview";
export const RESOURCE = "/resource";
export const JAVA = "/java";
export const JAVA_PUBLIC = "/java/public";
export const JAVA_APP = "/java/app";
export const JAVA_RULE = "/java/rule";
export const SEARCH = "/search";
export const SEARCH_DATA = "/search/data";
export const SEARCH_APP = "/search/app";
export const SCHEDULE = "/schedule";
export const SCHEDULE_TASK = "/schedule/task";
export const SCHEDULE_TASK_DEVELOP = "/schedule/task/develop";
......
import dao from "./index";
export default dao.create({
findByAll: {
url: "/design/component/componentGroup/byAll"
},
findByCondition: {
url: "/design/component/componentGroup/byCondition",
method: "POST"
},
findDetailAll: {
url: "/design/component/componentGroup/findDetailAll"
},
create: {
url: "/design/component/componentGroup/creating",
method: "POST",
notify: "组件组创建",
},
edit: {
url: "/design/component/componentGroup/updating",
method: "POST",
notify: "组件组修改",
},
delete: {
url: "/design/component/componentGroup/deleting",
notify: "组件组删除",
},
queryComponentTree: {
url: "/design/component/componentGroup/queryComponentTree",
},
componentExport: {
url: "/design/component/componentGroup/componentExport",
method: "POST",
notify: "组件导出",
},
componentImport: {
url: "/design/component/componentGroup/componentImport",
method: "POST",
notify: "组件导入",
}
});
import dao from "./index";
export default dao.create({
findByCondition: {
url: "/design/component/component/byCondition",
method: "POST"
},
create: {
url: "/design/component/component/creating",
method: "POST",
notify: "组件创建"
},
edit: {
url: "/design/component/component/updating",
method: "POST",
notify: "组件编辑"
},
delete: {
url: "/design/component/component/deleting",
notify: "组件删除"
},
});
import dao from "../index";
export default dao.create({
findByPage: {
url: "/design/console/repomoduleparmsrestserver/byPage",
method: "POST"
}
});
import dao from "../index";
export default dao.create({
findByAll: {
url: "/design/console/repomodulerestserver/byCondition",
method: "POST"
},
create: {
url: "/design/console/repomodulerestserver/uploadJar",
method: "POST",
notify: "动作分类创建"
},
findByCondition: {
url: "/design/console/repomodulerestserver/byCondition",
method: "POST"
},
edit: {
url: "/design/console/repomodulerestserver/updating",
method: "POST",
notify: "动作分类编辑"
},
delete: {
url: "/design/console/repomodulerestserver/deleteJar",
notify: "动作分类删除"
},
getActions: {
url: "/design/console/repomodulerestserver/getActions",
method: "POST",
notify: "同步action"
},
online: {
url: "/design/console/repomodulerestserver/online",
notify: "上线"
},
offline: {
url: "/design/console/repomodulerestserver/offline",
notify: "下线"
}
});
import dao from "../index";
export default dao.create({
findByAll: {
url: "/design/console/repomoduletyperestserver/byCondition",
method: "POST"
},
findByCondition: {
url: "/design/console/repomoduletyperestserver/byCondition",
method: "POST"
},
create: {
url: "/design/console/repomoduletyperestserver/creating",
method: "POST",
notify: "规则分类创建"
},
edit: {
url: "/design/console/repomoduletyperestserver/updating",
method: "POST",
notify: "规则分类修改"
},
delete: {
url: "/design/console/repomoduletyperestserver/deleting",
notify: "规则分类删除"
},
getMethod: {
url: "/design/console/repomoduletyperestserver/actionTree"
}
});
import dao from "../index";
export default dao.create({
findByPage: {
url: "/design/rule/constantLibraryParam/byPage",
method: "POST"
},
findByCondition: {
url: "/design/rule/constantLibraryParam/byCondition",
method: "POST"
},
create: {
url: "/design/rule/constantLibraryParam/creating",
method: "POST",
notify: "常量创建"
},
edit: {
url: "/design/rule/constantLibraryParam/updating",
method: "POST",
notify: "常量编辑"
},
delete: {
url: "/design/rule/constantLibraryParam/deleting",
notify: "常量删除"
}
});
import dao from "../index";
export default dao.create({
findByAll: {
url: "/design/rule/constantLibrary/byCondition",
method: "POST"
},
findByCondition: {
url: "/design/rule/constantLibrary/byCondition",
method: "POST"
},
create: {
url: "/design/rule/constantLibrary/creating",
method: "POST",
notify: "常量分类创建"
},
edit: {
url: "/design/rule/constantLibrary/updating",
method: "POST",
notify: "常量分类编辑"
},
delete: {
url: "/design/rule/constantLibrary/deleting",
notify: "常量分类删除"
},
getConstant: {
url: "/design/rule/constantLibrary/constantTree"
}
});
import dao from "../index";
export default dao.create({
finByPage: {
url: "/design/rule/parameterLibraryParam/byPage",
method: "POST"
},
create: {
url: "/design/rule/parameterLibraryParam/creating",
method: "POST",
notify: "参数创建"
},
edit: {
url: "/design/rule/parameterLibraryParam/updating",
method: "POST",
notify: "参数编辑"
},
findByCondition: {
url: "/design/rule/parameterLibraryParam/byCondition",
method: "POST"
},
delete: {
url: "/design/rule/parameterLibraryParam/deleting",
notify: "参数删除"
}
});
import dao from "../index";
export default dao.create({
findByAll: {
url: "/design/rule/parameterLibrary/byCondition",
method: "POST"
},
findByCondition: {
url: "/design/rule/parameterLibrary/byCondition",
method: "POST"
},
create: {
url: "/design/rule/parameterLibrary/creating",
method: "POST",
notify: "参数分类创建"
},
edit: {
url: "/design/rule/parameterLibrary/updating",
method: "POST",
notify: "参数分类编辑"
},
delete: {
url: "/design/rule/parameterLibrary/deleting",
notify: "参数分类删除"
},
getVariable: {
url: "/design/rule/parameterLibrary/parameterTree"
}
});
import dao from "../index";
export default dao.create({
findByPage: {
url: "/design/rule/ruleScript/byPage",
method: "POST"
},
findByCondition: {
url: "/design/rule/ruleScript/byCondition",
method: "POST"
},
create: {
url: "/design/rule/ruleScript/creating",
method: "POST",
notify: "规则创建"
},
edit: {
url: "/design/rule/ruleScript/updating",
method: "POST",
notify: "规则编辑"
},
delete: {
url: "/design/rule/ruleScript/deleting",
notify: "规则删除"
},
releaseScript: {
url: "/design/rule/ruleScript/releaseScript",
method: "POST",
notify: "脚本保存"
},
publish: {
url: "/design/rule/ruleScript/buildAndRelease",
notify: "发布"
}
});
import dao from "./index";
export default dao.create({
online: {
url: "/design/console/repomodulerestserver/online/:id"
},
offline: {
url: "/design/console/repomodulerestserver/offline/:id"
}
});
import dao from "./index";
export default dao.create({
findByAll: {
url: "/design/component/resourceGroup/byAll"
},
findByCondition: {
url: "/design/component/resourceGroup/byCondition",
method: "POST"
},
create: {
url: "/design/component/resourceGroup/creating",
method: "POST",
notify: "资源分类创建",
},
edit: {
url: "/design/component/resourceGroup/updating",
method: "POST",
notify: "资源分类编辑",
},
delete: {
url: "/design/component/resourceGroup/deleting",
notify: "资源分类删除",
}
});
import dao from "./index";
export default dao.create({
findByPage: {
url: "/design/component/resource/byPage",
method: "POST"
},
findByCondition: {
url: "/design/component/resource/byCondition",
method: "POST"
},
edit: {
url: "/design/component/component/updating",
method: "POST"
},
delete: {
url: "/design/component/resource/deleting",
method: "GET"
},
});
import dao from "./index";
export default dao.create({
findByAll: {
url: "/design/component/templateGroup/byAll"
},
findByCondition: {
url: "/design/component/templateGroup/byCondition",
method: "POST"
},
findDetailAll: {
url: "/design/component/templateGroup/findDetailAll"
},
create: {
url: "/design/component/templateGroup/creating",
method: "POST",
notify: "模板组创建",
},
edit: {
url: "/design/component/templateGroup/updating",
method: "POST",
notify: "模板组修改",
},
delete: {
url: "/design/component/templateGroup/deleting",
notify: "模板组删除",
},
queryTemplateTree: {
url: "/design/component/templateGroup/queryTemplateTree",
},
templateExport: {
url: "/design/component/templateGroup/templateExport",
method: "POST",
notify: "模板导出",
},
templateImport: {
url: "/design/component/templateGroup/templateImport",
method: "POST",
notify: "模板导入",
}
});
import dao from "./index";
export default dao.create({
findByPage: {
url: "/design/component/templateVersion/byPage",
method: "POST"
},
findJson: {
url: "/design/component/templateVersion/findJson"
},
create: {
url: "/design/component/templateVersion/creating",
method: "POST",
notify: "模板版本创建"
},
edit: {
url: "/design/component/templateVersion/updating",
method: "POST",
notify: "模板版本编辑"
},
delete: {
url: "/design/component/templateVersion/deleting",
notify: "模板版本删除"
}
});
import dao from "./index";
export default dao.create({
findByCondition: {
url: "/design/component/template/byCondition",
method: "POST"
},
create: {
url: "/design/component/template/creating",
method: "POST",
notify: "模板创建"
},
edit: {
url: "/design/component/template/updating",
method: "POST",
notify: "模板编辑"
},
delete: {
url: "/design/component/template/deleting",
notify: "模板删除"
},
});
<template>
<el-dialog title="查看" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form :model="form" ref="form" class="automargin" label-width="80px" status-icon>
<el-form-item label="名称" prop="name">
<el-input
show-word-limit
v-model="form.name"
placeholder="名称"
maxlength="50"
disabled
></el-input>
</el-form-item>
<el-form-item label="版本" prop="version">
<el-input
show-word-limit
v-model="form.version"
placeholder="版本"
maxlength="10"
disabled
></el-input>
</el-form-item>
<el-form-item label="类路径" prop="spackage">
<el-input
show-word-limit
v-model="form.spackage"
placeholder="类路径"
maxlength="50"
disabled
></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
show-word-limit
type="textarea"
v-model="form.description"
placeholder="描述"
resize="none"
maxlength="100"
disabled
></el-input>
</el-form-item>
<el-form-item label="文件名称" prop="file" class="uploadParent">
<el-input
show-word-limit
v-model="form.fileName"
placeholder="文件名称"
disabled
class="fileStyle"
disabled
>
</el-input>
<!-- <el-upload
:before-upload="beforeUpload"
ref="upload"
:action="uploadUrl"
:on-success="create_upload"
:on-change="changeFile"
:auto-upload="false"
:data="form"
:show-file-list="false"
>
<el-button size="small" class="upload" icon="el-icon-upload" @click="clear"></el-button>
</el-upload> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<!-- <el-button type="primary" @click="submit()">上传</el-button> -->
</span>
</el-dialog>
</template>
<script>
class Form {
constructor(data = {}) {
this.fileName = data.fileName;
this.name = data.name;
this.version = data.version;
this.spackage = data.spackage;
this.description = data.description;
}
}
export default {
data() {
return {
show: false,
form: {}
};
},
methods: {
getPage(data) {
this.form = new Form(data);
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
}
}
};
</script>
<style lang="less"></style>
<template>
<el-dialog
width="52%"
id="cardCreate"
title="配置说明"
:visible.sync="show"
v-drag
append-to-body
>
<div class="configDescription">
<div class="cronHeaderTab">
<ul>
<li>
配置说明
</li>
<li>
示例
</li>
</ul>
</div>
<div class="cronMiddleWarp">
<ul>
<li class="cronMiddleWarpLi">
名称 : 可随意填写<br />
版本 : 可随意填写<br />
类路径 : 是所开发的组件的项目的包路径<br />
描述 : 这个组件的描述<br />
文件名称 : 组件开发后所install的jar包
</li>
<li class="cronMiddleWarpLi">
名称 : actionB<br />
版本 : 1.1<br />
类路径 : com.jonbore.actionb<br />
描述 : 这是一个例子<br />
文件名称 : 相应的jar包在页面下载附件中下载。
</li>
</ul>
</div>
</div>
<span slot="footer" class="dialog-footer"> </span>
</el-dialog>
</template>
<script>
// 构造函数
class Form {
constructor() {}
}
export default {
data() {
return {
show: false,
form: [],
rules: {}
};
},
methods: {
getPage() {
this.form = new Form();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
}
}
};
</script>
<style lang="less">
.configDescription {
position: relative;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border-radius: 6px;
outline: 0;
padding: 0 15px 15px 15px;
.cronHeaderTab {
margin-bottom: 25px;
ul {
width: 100%;
justify-content: space-between;
display: flex;
li {
text-align: center;
width: 50%;
font-weight: bold;
font-size: 16px;
}
}
}
.cronMiddleWarp ul {
width: 100%;
justify-content: space-between;
display: flex;
.cronMiddleWarpLi {
text-align: left;
width: 48%;
border: 1px solid #666666;
padding: 10px;
height: 200px;
overflow: auto;
}
}
}
</style>
<template>
<el-dialog
v-drag
title="编辑"
:visible.sync="show"
id="warehouse"
size="tiny"
width="70%"
:close-on-click-modal="false"
>
<el-collapse v-model="activeName" accordion>
<el-collapse-item name="1">
<template slot="title">
<div class="title">
<div></div>
<div>基本设置</div>
</div>
</template>
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="60px"
status-icon
id="warehouseForm"
>
<el-form-item label="名称" prop="name">
<el-input
show-word-limit
v-model="form.name"
placeholder="名称"
maxlength="50"
></el-input>
</el-form-item>
<el-form-item label="描述" prop="desctrption">
<el-input
show-word-limit
type="textarea"
v-model="form.desctrption"
placeholder="描述"
resize="none"
maxlength="50"
></el-input>
</el-form-item>
</el-form>
</el-collapse-item>
<el-collapse-item name="2">
<template slot="title">
<div class="title">
<div></div>
<div>请求参数设置</div>
</div>
</template>
<div class="template-tab" style="background:rgba(236,238,241,.67);padding:20px;">
<paticipation ref="paticipation" id="paticipation"></paticipation>
</div>
</el-collapse-item>
<el-collapse-item name="3">
<template slot="title">
<div class="title">
<div></div>
<div>返回参数设置</div>
</div>
</template>
<div class="template-tab" style="background:rgba(236,238,241,.67);padding:20px;">
<returnValue ref="returnValue" id="returnValue"></returnValue>
</div>
</el-collapse-item>
</el-collapse>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">确 定</el-button>
</span>
</el-dialog>
</el-dialog>
</template>
<script>
import {
create, // 新建
repeatTabName, // 查重
edit, // 编辑
} from './service';
import paticipation from './paticipation';
import returnValue from './returnValue';
class Form {
constructor() {
this.name = '';
this.paticipation = '';
this.returnValue = '';
this.desctrption = '';
this.moduleId = '';
}
}
export default {
components: {
paticipation,
returnValue,
},
data() {
return {
show: false,
form: [],
activeName: '1',
rules: {
name: [
{
required: true,
message: '请输入名称',
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message,
},
],
},
datas: [],
};
},
methods: {
getPage(data) {
this.datas = data;
this.form = new Form();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
this.echoDisplay();
this.activeName = '1';
},
echoDisplay() {
this.form.name = this.datas.name;
this.form.desctrption = this.datas.desctrption;
const item = [
{
name: 'root',
dataType: 'object',
des: '',
treeId: '-1',
required: '1',
type: '1',
defaultValue: '',
children: [],
},
];
if (this.datas.paticipation != '') {
const body = item.concat(treeToList(JSON.parse(this.datas.paticipation)));
this.$nextTick(() => {
this.$refs.paticipation.paticipation = listToTree(body);
});
}
const data = [
{
name: 'root',
dataType: 'object',
des: '',
treeId: '-1',
required: '1',
type: '1',
defaultValue: '',
children: [],
},
];
if (this.datas.returnValue != '') {
const returnData = data.concat(treeToList(JSON.parse(this.datas.returnValue)));
this.$nextTick(() => {
this.$refs.returnValue.returnValue = listToTree(returnData);
});
}
},
submit() {
this.$refs.form.validate((valid) => {
if (valid) {
const paticipation = treeToList(this.$refs.paticipation.paticipation).splice(1);
const returnValue = treeToList(this.$refs.returnValue.returnValue).splice(1);
this.show = false;
const obj = {
moduleId: this.$parent.jarNode.id,
paticipation: JSON.stringify(paticipation),
returnValue: JSON.stringify(returnValue),
desctrption: this.form.desctrption,
name: this.form.name,
id: this.datas.id,
};
edit(obj).then((res) => {
if (res.status == 'success') {
this.$message({
message: '编辑成功',
type: 'success',
});
} else {
this.$message({
message: res.message,
type: 'error',
});
}
this.$parent.queryData();
});
} else {
return false;
}
});
},
},
};
// tree型数据转一维数组
function treeToList(tree) {
let queen = [];
const out = [];
queen = queen.concat(tree);
while (queen.length) {
const first = queen.shift();
if (first.children) {
queen = queen.concat(first.children);
delete first.children;
}
out.push(first);
}
return out;
}
// 一维数组转tree型数据
function listToTree(list) {
const map = {};
let node;
const tree = [];
let i;
for (i = 0; i < list.length; i++) {
list[i].required = list[i].required == true ? '1' : '0';
map[list[i].treeId] = list[i];
list[i].children = [];
}
for (i = 0; i < list.length; i += 1) {
node = list[i];
if (node.treeId !== '-1') {
map[node.treeParentId].children.push(node);
} else {
tree.push(node);
}
}
return tree;
}
</script>
<style lang="less">
#warehouse .el-collapse {
border-top: 1px solid #fff !important;
border-bottom: 1px solid #fff !important;
}
#warehouse .title {
height: 60px;
display: flex;
align-items: center;
div:nth-of-type(1) {
width: 3px;
height: 30px;
background-color: #2395f1;
}
div:nth-of-type(2) {
font-size: 18px;
margin-left: 10px;
}
}
#warehouse .el-dialog__body {
padding: 10px 41px 0 35px !important;
#warehouseForm {
background: rgba(236, 238, 241, 0.67);
padding: 20px;
}
}
#warehouse .el-collapse-item__header {
border-bottom: 1px solid #fff !important;
border-top-color: #ffffff;
}
#warehouse .el-collapse-item__wrap {
border-bottom: 1px solid #ffff !important;
}
#warehouse .el-collapse-item__content {
padding-bottom: 0px !important;
}</style>
This diff is collapsed.
<template>
<el-dialog title="上传" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="80px"
status-icon
>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="版本" prop="version">
<el-input
show-word-limit
v-model="form.version"
placeholder="版本"
maxlength="10"
></el-input>
</el-form-item>
<el-form-item label="类路径" prop="spackage">
<el-input
show-word-limit
v-model="form.spackage"
placeholder="类路径"
maxlength="50"
></el-input>
</el-form-item>
<el-form-item label="描述" prop="desctrption">
<el-input
show-word-limit
type="textarea"
v-model="form.desctrption"
placeholder="描述"
resize="none"
maxlength="100"
></el-input>
</el-form-item>
<el-form-item label="文件名称" prop="file" class="uploadParent">
<el-input
show-word-limit
v-model="form.file"
placeholder="文件名称"
disabled
class="fileStyle"
>
</el-input>
<el-upload
:before-upload="beforeUpload"
ref="upload"
:action="uploadUrl"
:on-success="create_upload"
:on-change="changeFile"
:auto-upload="false"
:data="form"
:show-file-list="false"
>
<el-button size="small" class="upload" icon="el-icon-upload" @click="clear"></el-button>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">上传</el-button>
</span>
</el-dialog>
</template>
<script>
import { repeatJarName, repeatNameLi } from "./service";
class Form {
constructor() {
this.file = "";
this.name = "";
this.version = "";
this.url = "";
this.spackage = "";
this.desctrption = "";
this.typeId = "";
this.fileName = "";
}
}
export default {
data() {
//名称查重
let nameVal = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入"));
} else if (this.form.version === "") {
callback();
} else {
repeatNameLi({
name: this.form.name,
version: this.form.version
}).then(res => {
if (res.content.length > 0) {
callback(new Error("该名称和版本已被使用"));
} else {
callback();
}
});
}
};
//版本查重
let versionVal = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入"));
} else if (this.form.name === "") {
callback();
} else {
repeatNameLi({
name: this.form.name,
version: this.form.version
}).then(res => {
if (res.content.length > 0) {
callback(new Error("该名称和版本已被使用"));
} else {
callback();
}
});
}
};
return {
show: false,
form: {},
rules: {
name: [
{
required: true,
message: "请输入"
},
{
validator: nameVal,
trigger: "blur"
}
// {
// pattern: __.validate.regular.commonCn.pattern,
// message: __.validate.regular.commonCn.message
// },
],
url: [
{
required: true,
message: "请输入路径"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
}
],
spackage: [
{
required: true,
message: "请输入类路径"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
}
],
version: [
{
required: true,
message: "请输入"
},
{
validator: versionVal,
trigger: "blur"
}
],
file: [
{
required: true,
message: "请选择文件"
},
{
validator: __.validate.unique(repeatJarName)
}
]
},
uploadUrl: "/design/console/repomodulerestserver/uploadJar"
};
},
methods: {
getPage() {
this.form = new Form();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
},
beforeUpload(file) {
const Jar = file.name.toLowerCase().split(".");
if (Jar[Jar.length - 1] === "jar") {
return file;
}
this.$message.error("上传文件只能是 jar 格式!");
return false;
},
create_upload(response) {
if (response.status == "success") {
this.headerList = response.content;
this.$notify({
title: "成功",
message: response.message || "上传成功",
type: "success"
});
} else {
this.headerList = [];
this.$notify.error({
title: "失败",
message: response.message || "上传失败"
});
}
this.$parent.queryData();
},
clear() {
this.$refs.upload.clearFiles();
},
changeFile(file, fileList) {
this.form.file = file.name;
this.form.fileName = file.name;
this.beforeUpload(file);
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
const jar = this.form.file.toLowerCase().split(".");
if (jar[jar.length - 1] === "jar") {
this.form.typeId = this.$parent.selectNode.id;
this.$refs.upload.submit();
this.show = false;
this.$parent.repeatJarName();
} else {
this.$message.error("上传文件只能是 jar 格式!");
}
} else {
return false;
}
});
}
}
};
</script>
<style lang="less">
.uploadParent {
position: relative;
.upload {
position: absolute;
top: 0;
right: 0;
}
.el-form-item__content {
div:nth-of-type(2) {
height: 3px;
}
}
}
</style>
<template>
<div>
<div class="treeScroll">
<el-tree
id="returns"
:data="paticipation"
node-key="treeId"
:default-expand-all="true"
:expand-on-click-node="false"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<el-input v-model="data.name" class="width" :disabled="data.treeId == '-1'"></el-input>
<el-select
v-model="data.dataType"
class="selectWidth"
@change="typeChange(data)"
:disabled="data.treeId == '-1'"
>
<el-option
v-for="item in typeList"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
<el-select
v-model="data.required"
filterable
placeholder="必填"
class="selectWidth"
:disabled="data.treeId == '-1'"
>
<el-option value="1" label="是"></el-option>
<el-option value="0" label="否"></el-option>
</el-select>
<el-input
show-word-limit
type="text"
placeholder="说明"
v-model="data.des"
maxlength="100"
class="width"
:disabled="data.treeId == '-1'"
></el-input>
<!-- 默认input -->
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des != 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<!-- 两个input -->
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des == 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des == 'between'
"
v-model="data.defaultValues"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<!-- 默认日历插件 -->
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des != 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
></el-date-picker>
<!-- 两个日历框 -->
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des == 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
></el-date-picker>
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des == 'between'
"
v-model="data.defaultValues"
:disabled="data.treeId == '-1'"
></el-date-picker>
</span>
<span class="tools">
<i
class="el-icon-plus"
v-if="data.dataType == 'object'"
@click="append(data, paticipation)"
></i>
<i
class="el-icon-close"
@click="() => remove(node, data)"
v-if="data.treeId != '-1'"
></i>
</span>
</span>
</el-tree>
</div>
</div>
</template>
<script>
export default {
mounted() {},
data() {
return {
dataIn: "",
// 数据类型
typeList: [
"string",
"int",
"object",
"char",
"short",
"long",
"float",
"double",
"boolean",
"byte",
"json",
"array",
"file",
"timestamp",
"time",
"date"
],
paramTypeCode: "04", // 默认选中json
show: false,
treeId: "",
radio: "0", // 默认json标签
// json数据
paticipation: [
{
name: "root",
dataType: "object",
des: "",
children: [],
paramTypeCode: "04",
treeId: "-1",
required: "1",
type: "0",
defaultValue: ""
}
]
};
},
methods: {
// 计算请求参数节点最大id
getMaxId(nodes, id = 0) {
return nodes.reduce(
(result, item) =>
item.children && item.children.length > 0
? this.getMaxId(item.children, result)
: result > item.id
? result
: item.treeId + 1,
id
);
},
// 添加json
append(data, all) {
if (!data.children) {
this.$set(data, "children", []);
}
this.funcDisable(this.paticipation);
// 变量接requireName为false则为空
if (this.requireName == false) {
this.$message({
type: "error",
message: "名称必填"
});
} else {
data.children.push({
name: "",
dataType: "object",
treeId: this.getMaxId(all),
treeParentId: data.treeId,
des: "",
serviceId: "",
type: "0",
required: "",
defaultValue: ""
});
}
Vue.set(data, "children", data.children); // 保证修改数组视图渲染
},
// 递归取数据中的name是否为空
funcDisable(data) {
for (let i = 0; i < data.length; i++) {
if (data[i].children) {
if (data[i].name == "") {
this.requireName = false;
} else {
this.requireName = true;
}
}
const { children } = data[i];
if (children) {
this.funcDisable(children);
}
}
},
// 删除json节点
remove(node, data) {
const index = node.parent.data.children.findIndex(d => d.id === data.id);
node.parent.data.children.splice(index, 1);
node.parent.childNodes.splice(index, 1);
},
// 改变数据类型
typeChange(data) {
if (data.dataType != "object") {
Vue.set(data, "children", []); // 保证修改数组视图渲染
}
}
}
};
</script>
<style lang="less">
#paticipation {
height: 390px;
// padding: 20px;
.treeScroll {
overflow-y: auto;
overflow-x: scroll;
height: 370px;
background: #fff;
#returns {
padding-top: 3px;
display: inline-block;
.selectWidth {
width: 100px;
margin-left: 10px;
}
.width {
width: 160px;
margin-left: 10px;
}
.tools {
margin-left: 10px;
width: 40px;
display: inline-flex;
justify-content: space-between;
}
.el-tree-node__content {
height: 32px;
margin: 8px 0;
background: #fff;
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
}
}
}
</style>
<template>
<div>
<el-tree
id="returns"
:data="returnValue"
node-key="treeId"
:default-expand-all="true"
:expand-on-click-node="false"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<el-input v-model="data.name" class="width" :disabled="data.treeId == '-1'"></el-input>
<el-select
v-model="data.dataType"
class="selectWidth"
@change="typeChange(data)"
:disabled="data.treeId == '-1'"
>
<el-option v-for="item in typeList" :key="item" :label="item" :value="item"></el-option>
</el-select>
<el-select
v-model="data.required"
filterable
placeholder="必填"
class="selectWidth"
:disabled="data.treeId == '-1'"
>
<el-option value="1" label="是"></el-option>
<el-option value="0" label="否"></el-option>
</el-select>
<el-input
show-word-limit
type="text"
placeholder="说明"
v-model="data.des"
maxlength="100"
class="width"
:disabled="data.treeId == '-1'"
></el-input>
<!-- 默认input -->
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des != 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<!-- 两个input -->
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des == 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<el-input
show-word-limit
type="text"
maxlength="50"
placeholder="默认值"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) == -1 && data.des == 'between'
"
v-model="data.defaultValues"
:disabled="data.treeId == '-1'"
class="width"
></el-input>
<!-- 默认日历插件 -->
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des != 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
></el-date-picker>
<!-- 两个日历框 -->
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des == 'between'
"
v-model="data.defaultValue"
:disabled="data.treeId == '-1'"
></el-date-picker>
<el-date-picker
type="date"
value-format="yyyy-MM-dd"
class="el-date width"
v-if="
['timestamp', 'time', 'date'].indexOf(data.dataType) != -1 && data.des == 'between'
"
v-model="data.defaultValues"
:disabled="data.treeId == '-1'"
></el-date-picker>
</span>
<span class="tools">
<i
class="el-icon-plus"
v-if="data.dataType == 'object'"
@click="append(data, returnValue)"
></i>
<i class="el-icon-close" @click="() => remove(node, data)" v-if="data.treeId != '-1'"></i>
</span>
</span>
</el-tree>
</div>
</template>
<script>
export default {
mounted() {},
data() {
return {
dataIn: '',
// 数据类型
typeList: [
'string',
'int',
'object',
'char',
'short',
'long',
'float',
'double',
'boolean',
'byte',
'json',
'array',
'file',
'timestamp',
'time',
'date',
],
paramTypeCode: '04', // 默认选中json
show: false,
treeId: '',
radio: '0', // 默认json标签
// json数据
returnValue: [
{
name: 'root',
dataType: 'object',
des: '',
children: [],
paramTypeCode: '04',
treeId: '-1',
required: '1',
type: '0',
defaultValue: '',
},
],
};
},
methods: {
// 计算请求参数节点最大id
getMaxId(nodes, id = 0) {
return nodes.reduce(
(result, item) => (item.children && item.children.length > 0
? this.getMaxId(item.children, result)
: result > item.id
? result
: item.treeId + 1),
id,
);
},
// 添加json
append(data, all) {
if (!data.children) {
this.$set(data, 'children', []);
}
this.funcDisable(this.returnValue);
// 变量接requireName为false则为空
if (this.requireName == false) {
this.$message({
type: 'error',
message: '名称必填',
});
} else {
data.children.push({
name: '',
dataType: 'object',
treeId: this.getMaxId(all),
treeParentId: data.treeId,
des: '',
serviceId: '',
type: '0',
required: '',
defaultValue: '',
});
}
Vue.set(data, 'children', data.children); // 保证修改数组视图渲染
},
// 递归取数据中的name是否为空
funcDisable(data) {
for (let i = 0; i < data.length; i++) {
if (data[i].children) {
if (data[i].name == "") {
this.requireName = false;
} else {
this.requireName = true;
}
}
const { children } = data[i];
if (children) {
this.funcDisable(children);
}
}
},
// 删除json节点
remove(node, data) {
const index = node.parent.data.children.findIndex(d => d.id === data.id);
node.parent.data.children.splice(index, 1);
node.parent.childNodes.splice(index, 1);
},
// 改变数据类型
typeChange(data) {
if (data.dataType != 'object') {
Vue.set(data, 'children', []); // 保证修改数组视图渲染
}
},
},
};
</script>
<style lang="less">
#returnValue {
height: 390px;
// padding: 20px;
#returns {
width: 100%;
height: 390px;
padding-top: 3px;
overflow: auto;
.selectWidth {
width: 100px;
margin-left: 10px;
}
.width {
width: 160px;
margin-left: 10px;
}
.tools {
margin-left: 10px;
width: 40px;
display: inline-flex;
justify-content: space-between;
}
.el-tree-node__content {
height: 32px;
margin: 8px 0;
background: #fff;
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
}
}
</style>
import fetch from "@/utils/fetch";
// 应用列表树
export const getTreeList = () =>
fetch("/design/appmanage/application/findSpecificApplication", {}, "GET");
// 左侧树
export const getTree = (data) =>
fetch("/design/console/repomoduletyperestserver/byCondition", data, "POST");
// 左侧列表新建
export const treeCreate = (data) =>
fetch("/design/console/repomoduletyperestserver/creating", data, "POST");
// 编辑
export const treeEdit = (data) =>
fetch("/design/console/repomoduletyperestserver/updating", data, "POST");
// 删除
export const treeDelete = (data) =>
fetch("/design/console/repomoduletyperestserver/deleting", data, "GET");
// 左侧列表查重
export const repeatName = (data) =>
fetch("/design/console/repomoduletyperestserver/byCondition", data, "POST");
// 表格查询
export const queryData = (data) =>
fetch("/design/console/repomoduleparmsrestserver/byPage", data, "POST");
export const create = (data) =>
fetch("/design/console/repomoduleparmsrestserver/creating", data, "POST");
export const edit = (data) =>
fetch("/design/console/repomoduleparmsrestserver/updating", data, "POST");
export const deleting = (data) =>
fetch("/design/console/repomoduleparmsrestserver/deleting", data, "GET");
export const repeatTabName = (data) =>
fetch("/design/console/repomoduleparmsrestserver/byCondition", data, "POST");
// jar包上传
export const uploadUrl = (data) =>
fetch("/design/console/repomodulerestserver/uploadJar", data, "POST");
// jar包查重
export const repeatJarName = (data) =>
fetch("/design/console/repomodulerestserver/byCondition", data, "POST");
//名称和版本查重
export const repeatNameLi = (data) =>
fetch("/design/console/repomodulerestserver/byCondition", data, "POST");
// jar包删除
export const jarDelete = (data) =>
fetch("/design/console/repomodulerestserver/deleteJar", data, "GET");
// jar上线
export const online = (data) =>
fetch("/design/console/repomodulerestserver/online", data, "GET");
// jar下线
export const offline = (data) =>
fetch("/design/console/repomodulerestserver/offline", data, "GET");
// 同步方法
export const asyncActions = (data) =>
fetch("/design/console/repomodulerestserver/getActions", data, "POST");
<template>
<el-dialog title="新建" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="80px"
status-icon
>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input show-word-limit v-model="form.code" placeholder="编码" maxlength="50"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import {
treeCreate, // 新建
repeatName // 查重
} from "./service";
class Form {
constructor() {
this.name = "";
this.code = "";
this.appId = "";
this.type = "application";
}
}
export default {
data() {
return {
show: false,
form: {},
rules: {
name: [
{
required: true,
message: "请输入名称"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName),
trigger: "change"
}
],
code: [
{
required: true,
message: "请输入编码"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName),
trigger: "change"
}
]
}
};
},
methods: {
getPage(data) {
this.form = new Form();
this.form.appId = data.id;
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
this.show = false;
treeCreate(this.form).then(res => {
if (res.status == "success") {
this.$message({
message: "新建成功",
type: "success"
});
} else {
this.$message({
message: res.message,
type: "error"
});
}
this.$parent.getTree();
});
} else {
return false;
}
});
}
}
};
</script>
<style scoped></style>
<template>
<el-dialog v-drag title="编辑" :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-dialog title="编辑" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
......@@ -8,21 +8,11 @@
label-width="80px"
status-icon
>
<el-form-item label="中文名称" prop="nameCn">
<el-input
show-word-limit
v-model="form.nameCn"
placeholder="请输入中文名称"
maxlength="50"
></el-input>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="英文名称" prop="nameEn">
<el-input
show-word-limit
v-model="form.nameEn"
placeholder="请输入英文名称"
maxlength="50"
></el-input>
<el-form-item label="编码" prop="code">
<el-input show-word-limit v-model="form.code" placeholder="编码" maxlength="50"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
......@@ -30,68 +20,58 @@
</span>
</el-dialog>
</template>
<script>
import { edit, repeatTabName } from "./service";
import {
treeEdit, // 编辑
repeatName // 查重
} from "./service";
class Form {
constructor(data = {}) {
this.id = data.id;
this.nameCn = data.nameCn;
this.nameEn = data.nameEn;
this.name = data.name;
this.code = data.code;
}
}
export default {
data() {
return {
show: false,
form: [],
rules: {},
sataus: ""
form: {},
rules: {}
};
},
methods: {
getPage(data) {
this.form = new Form(data);
this.sataus = data.status;
const nameCn = (rule, value, callback) => {
if (value) {
repeatTabName({
// 调用接口
nameCn: value
}).then(res => {
if (res.content.length > 0 && this.form.id != res.content[0].id) {
callback(new Error("该中文名称已被使用"));
} else {
callback();
}
});
}
};
this.rules = {
nameEn: [
name: [
{
required: true,
message: "填写英文名称"
message: "输入名称"
},
{
pattern: /^[a-zA-Z]{1,50}$/,
message: "请输入纯英文"
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName, this.form.id),
trigger: "change"
}
],
nameCn: [
code: [
{
required: true,
message: "请输入中文名称"
message: "请输入编码"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: nameCn
validator: __.validate.unique(repeatName, this.form.id),
trigger: "change"
}
]
};
......@@ -100,12 +80,11 @@ export default {
}
this.show = true;
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
this.show = false;
edit(this.form).then(res => {
treeEdit(this.form).then(res => {
if (res.status == "success") {
this.$message({
message: "编辑成功",
......@@ -117,7 +96,7 @@ export default {
type: "error"
});
}
this.$parent.queryData();
this.$parent.getTree();
});
} else {
return false;
......@@ -127,3 +106,5 @@ export default {
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="查看" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form :model="form" ref="form" class="automargin" label-width="80px" status-icon>
<el-form-item label="名称" prop="name">
<el-input
show-word-limit
v-model="form.name"
placeholder="名称"
maxlength="50"
disabled
></el-input>
</el-form-item>
<el-form-item label="版本" prop="version">
<el-input
show-word-limit
v-model="form.version"
placeholder="版本"
maxlength="10"
disabled
></el-input>
</el-form-item>
<el-form-item label="类路径" prop="spackage">
<el-input
show-word-limit
v-model="form.spackage"
placeholder="类路径"
maxlength="50"
disabled
></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
show-word-limit
type="textarea"
v-model="form.description"
placeholder="描述"
resize="none"
maxlength="100"
disabled
></el-input>
</el-form-item>
<el-form-item label="文件名称" prop="file" class="uploadParent">
<el-input
show-word-limit
v-model="form.fileName"
placeholder="文件名称"
disabled
class="fileStyle"
disabled
>
</el-input>
<!-- <el-upload
:before-upload="beforeUpload"
ref="upload"
:action="uploadUrl"
:on-success="create_upload"
:on-change="changeFile"
:auto-upload="false"
:data="form"
:show-file-list="false"
>
<el-button size="small" class="upload" icon="el-icon-upload" @click="clear"></el-button>
</el-upload> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<!-- <el-button type="primary" @click="submit()">上传</el-button> -->
</span>
</el-dialog>
</template>
<script>
class Form {
constructor(data = {}) {
this.fileName = data.fileName;
this.name = data.name;
this.version = data.version;
this.spackage = data.spackage;
this.description = data.description;
}
}
export default {
data() {
return {
show: false,
form: {}
};
},
methods: {
getPage(data) {
this.form = new Form(data);
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
}
}
};
</script>
<style lang="less"></style>
<template>
<el-dialog
width="52%"
id="cardCreate"
title="配置说明"
:visible.sync="show"
v-drag
append-to-body
>
<div class="configDescription">
<div class="cronHeaderTab">
<ul>
<li>
配置说明
</li>
<li>
示例
</li>
</ul>
</div>
<div class="cronMiddleWarp">
<ul>
<li class="cronMiddleWarpLi">
名称 : 可随意填写<br />
版本 : 可随意填写<br />
类路径 : 是所开发的组件的项目的包路径<br />
描述 : 这个组件的描述<br />
文件名称 : 组件开发后所install的jar包
</li>
<li class="cronMiddleWarpLi">
名称 : actionB<br />
版本 : 1.1<br />
类路径 : com.jonbore.actionb<br />
描述 : 这是一个例子<br />
文件名称 : 相应的jar包在页面下载附件中下载。
</li>
</ul>
</div>
</div>
<span slot="footer" class="dialog-footer"> </span>
</el-dialog>
</template>
<script>
// 构造函数
class Form {
constructor() {}
}
export default {
data() {
return {
show: false,
form: [],
rules: {}
};
},
methods: {
getPage() {
this.form = new Form();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
}
}
};
</script>
<style lang="less">
.configDescription {
position: relative;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border-radius: 6px;
outline: 0;
padding: 0 15px 15px 15px;
.cronHeaderTab {
margin-bottom: 25px;
ul {
width: 100%;
justify-content: space-between;
display: flex;
li {
text-align: center;
width: 50%;
font-weight: bold;
font-size: 16px;
}
}
}
.cronMiddleWarp ul {
width: 100%;
justify-content: space-between;
display: flex;
.cronMiddleWarpLi {
text-align: left;
width: 48%;
border: 1px solid #666666;
padding: 10px;
height: 200px;
overflow: auto;
}
}
}
</style>
<template>
<el-dialog
v-drag
title="编辑"
:visible.sync="show"
id="warehouse"
size="tiny"
width="70%"
:close-on-click-modal="false"
>
<el-collapse v-model="activeName" accordion>
<el-collapse-item name="1">
<template slot="title">
<div class="title">
<div></div>
<div>基本设置</div>
</div>
</template>
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="60px"
status-icon
id="warehouseForm"
>
<el-form-item label="名称" prop="name">
<el-input
show-word-limit
v-model="form.name"
placeholder="名称"
maxlength="50"
disabled
></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
show-word-limit
type="textarea"
v-model="form.description"
placeholder="描述"
resize="none"
maxlength="50"
></el-input>
</el-form-item>
</el-form>
</el-collapse-item>
<el-collapse-item name="2">
<template slot="title">
<div class="title">
<div></div>
<div>请求参数设置</div>
</div>
</template>
<div class="template-tab" style="background:rgba(236,238,241,.67);padding:20px;">
<stms-api-design-bodys v-model="request.body"></stms-api-design-bodys>
</div>
</el-collapse-item>
<el-collapse-item name="3">
<template slot="title">
<div class="title">
<div></div>
<div>返回参数设置</div>
</div>
</template>
<div class="template-tab" style="background:rgba(236,238,241,.67);padding:20px;">
<stms-api-design-bodys v-model="response.body"></stms-api-design-bodys>
</div>
</el-collapse-item>
</el-collapse>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">确 定</el-button>
</span>
</el-dialog>
</el-dialog>
</template>
<script>
import {
create, // 新建
repeatTabName, // 查重
edit, // 编辑
} from './service';
class Form {
constructor(data={}) {
this.name = data.name;
this.paticipation = '';
this.returnValue = '';
this.description = data.description;
this.moduleId = '';
}
}
export default {
data() {
return {
show: false,
form: [],
activeName: '1',
rules: {
name: [
{
required: true,
message: '请输入名称',
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message,
},
],
},
datas: [],
request: {
body: {
type: "0",
param: []
}
},
response: {
body: {
type: "0",
param: []
},
},
};
},
methods: {
getPage(data) {
this.datas = data;
this.form = new Form(data);
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
this.activeName = '1';
this.requestBackfill(); // 回填请求参数
this.responseBackfill(); // 返回参数回填
},
// 获取编辑请求参数
requestBackfill() {
if(JSON.parse(this.datas.paticipation)&&JSON.parse(this.datas.paticipation).type){
const {type,param} = JSON.parse(this.datas.paticipation)
this.request = {
body: {
type,
param
}
};
}
},
// 获取编辑请求参数
responseBackfill() {
if(JSON.parse(this.datas.returnValue)&&JSON.parse(this.datas.returnValue).type){
const {type,param} = JSON.parse(this.datas.returnValue)
this.response = {
body: {
type,
param
},
};
}
},
submit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.show = false;
const obj = {
moduleId: this.$parent.jarNode.id,
paticipation: JSON.stringify(this.request.body),
returnValue:JSON.stringify(this.response.body),
description: this.form.description,
name: this.form.name,
id: this.datas.id,
};
edit(obj).then((res) => {
if (res.status == 'success') {
this.$message({
message: '编辑成功',
type: 'success',
});
} else {
this.$message({
message: res.message,
type: 'error',
});
}
this.$parent.queryData();
});
} else {
return false;
}
});
},
},
};
</script>
<style lang="less">
#warehouse .el-collapse {
border-top: 1px solid #fff !important;
border-bottom: 1px solid #fff !important;
}
#warehouse .title {
height: 60px;
display: flex;
align-items: center;
div:nth-of-type(1) {
width: 3px;
height: 30px;
background-color: #2395f1;
}
div:nth-of-type(2) {
font-size: 18px;
margin-left: 10px;
}
}
#warehouse .el-dialog__body {
padding: 10px 41px 0 35px !important;
#warehouseForm {
background: rgba(236, 238, 241, 0.67);
padding: 20px;
}
}
#warehouse .el-collapse-item__header {
border-bottom: 1px solid #fff !important;
border-top-color: #ffffff;
}
#warehouse .el-collapse-item__wrap {
border-bottom: 1px solid #ffff !important;
}
#warehouse .el-collapse-item__content {
padding-bottom: 0px !important;
}</style>
This diff is collapsed.
<template>
<el-dialog title="上传" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="80px"
status-icon
>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="版本" prop="version">
<el-input
show-word-limit
v-model="form.version"
placeholder="版本"
maxlength="10"
></el-input>
</el-form-item>
<el-form-item label="类路径" prop="spackage">
<el-input
show-word-limit
v-model="form.spackage"
placeholder="类路径"
maxlength="50"
></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
show-word-limit
type="textarea"
v-model="form.description"
placeholder="描述"
resize="none"
maxlength="100"
></el-input>
</el-form-item>
<el-form-item label="文件名称" prop="file" class="uploadParent">
<el-input
show-word-limit
v-model="form.file"
placeholder="文件名称"
disabled
class="fileStyle"
>
</el-input>
<el-upload
:before-upload="beforeUpload"
ref="upload"
:action="uploadUrl"
:on-success="create_upload"
:on-change="changeFile"
:auto-upload="false"
:data="form"
:show-file-list="false"
>
<el-button size="small" class="upload" icon="el-icon-upload" @click="clear"></el-button>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">上传</el-button>
</span>
</el-dialog>
</template>
<script>
import {repeatJarName, repeatNameLi} from "./service";
class Form {
constructor() {
this.file = "";
this.name = "";
this.version = "";
this.spackage = "";
this.description = "";
this.typeId = "";
this.fileName = "";
}
}
export default {
data() {
//名称查重
let nameVal = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入"));
} else if (this.form.version === "") {
callback();
} else {
repeatNameLi({
name: this.form.name,
version: this.form.version
}).then(res => {
if (res.content.length > 0) {
callback(new Error("该名称和版本已被使用"));
} else {
callback();
}
});
}
};
//版本查重
let versionVal = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入"));
} else if (this.form.name === "") {
callback();
} else {
repeatNameLi({
name: this.form.name,
version: this.form.version
}).then(res => {
if (res.content.length > 0) {
callback(new Error("该名称和版本已被使用"));
} else {
callback();
}
});
}
};
return {
show: false,
form: {},
rules: {
name: [
{
required: true,
message: "请输入"
},
{
validator: nameVal,
trigger: "blur"
},
{
pattern: __.validate.regular.nameEn.pattern,
message: __.validate.regular.nameEn.message
},
],
spackage: [
{
required: true,
message: "请输入类路径"
},
{
pattern: __.validate.regular.commonEn.pattern,
message: __.validate.regular.commonEn.message
}
],
version: [
{
required: true,
message: "请输入"
},
{
validator: versionVal,
trigger: "blur"
},
{
pattern: __.validate.regular.commonEn.pattern,
message: __.validate.regular.commonEn.message
}
],
file: [
{
required: true,
message: "请选择文件"
},
{
validator: __.validate.unique(repeatJarName)
}
]
},
uploadUrl: "/design/console/repomodulerestserver/uploadJar"
};
},
methods: {
getPage() {
this.form = new Form();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
},
beforeUpload(file) {
const Jar = file.name.toLowerCase().split(".");
if (Jar[Jar.length - 1] === "jar") {
return file;
}
this.$message.error("上传文件只能是 jar 格式!");
return false;
},
create_upload(response) {
if (response.status == "success") {
this.headerList = response.content;
this.$notify({
title: "成功",
message: response.message || "上传成功",
type: "success"
});
} else {
this.headerList = [];
this.$notify.error({
title: "失败",
message: response.message || "上传失败"
});
}
this.$parent.repeatJarName();
},
clear() {
this.$refs.upload.clearFiles();
},
changeFile(file, fileList) {
this.form.file = file.name;
this.form.fileName = file.name;
this.beforeUpload(file);
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
const jar = this.form.file.toLowerCase().split(".");
if (jar[jar.length - 1] === "jar") {
this.form.typeId = this.$parent.selectNode.id;
this.$refs.upload.submit();
this.show = false;
} else {
this.$message.error("上传文件只能是 jar 格式!");
}
} else {
return false;
}
});
}
}
};
</script>
<style lang="less">
.uploadParent {
position: relative;
.upload {
position: absolute;
top: 0;
right: 0;
}
.el-form-item__content {
div:nth-of-type(2) {
height: 3px;
}
}
}
</style>
import fetch from "@/utils/fetch";
// 左侧树
export const getTree = (data) =>
fetch("/design/console/repomoduletyperestserver/byCondition", data, "POST");
// 左侧列表新建
export const treeCreate = (data) =>
fetch("/design/console/repomoduletyperestserver/creating", data, "POST");
// 编辑
export const treeEdit = (data) =>
fetch("/design/console/repomoduletyperestserver/updating", data, "POST");
// 删除
export const treeDelete = (data) =>
fetch("/design/console/repomoduletyperestserver/deleting", data, "GET");
// 左侧列表查重
export const repeatName = (data) =>
fetch("/design/console/repomoduletyperestserver/byCondition", data, "POST");
// 表格查询
export const queryData = (data) =>
fetch("/design/console/repomoduleparmsrestserver/byPage", data, "POST");
export const create = (data) =>
fetch("/design/console/repomoduleparmsrestserver/creating", data, "POST");
export const edit = (data) =>
fetch("/design/console/repomoduleparmsrestserver/updating", data, "POST");
export const deleting = (data) =>
fetch("/design/console/repomoduleparmsrestserver/deleting", data, "GET");
export const repeatTabName = (data) =>
fetch("/design/console/repomoduleparmsrestserver/byCondition", data, "POST");
// jar包上传
export const uploadUrl = (data) =>
fetch("/design/console/repomodulerestserver/uploadJar", data, "POST");
// jar包查重
export const repeatJarName = (data) =>
fetch("/design/console/repomodulerestserver/byCondition", data, "POST");
//名称和版本查重
export const repeatNameLi = (data) =>
fetch("/design/console/repomodulerestserver/byCondition", data, "POST");
// jar包删除
export const jarDelete = (data) =>
fetch("/design/console/repomodulerestserver/deleteJar", data, "GET");
// jar上线
export const online = (data) =>
fetch("/design/console/repomodulerestserver/online", data, "GET");
// jar下线
export const offline = (data) =>
fetch("/design/console/repomodulerestserver/offline", data, "GET");
// 同步方法
export const asyncActions = (data) =>
fetch("/design/console/repomodulerestserver/getActions", data, "POST");
<template>
<!-- 新建表单 -->
<el-dialog v-drag title="新建" :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-dialog title="新建" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
......@@ -9,21 +8,11 @@
label-width="80px"
status-icon
>
<el-form-item label="中文名称" prop="nameCn">
<el-input
show-word-limit
v-model="form.nameCn"
placeholder="请输入中文名称"
maxlength="50"
></el-input>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="英文名称" prop="nameEn">
<el-input
show-word-limit
v-model="form.nameEn"
placeholder="请输入英文名称"
maxlength="50"
></el-input>
<el-form-item label="编码" prop="code">
<el-input show-word-limit v-model="form.code" placeholder="编码" maxlength="50"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
......@@ -31,62 +20,51 @@
</span>
</el-dialog>
</template>
<script>
// 引入接口
import { create, repeatTabName } from "./service";
import {
treeCreate, // 新建
repeatName // 查重
} from "./service";
// 构造函数
class Form {
constructor() {
this.nameCn = "";
this.nameEn = "";
this.aapId = "";
this.name = "";
this.code = "";
this.type = "common";
}
}
export default {
data() {
const nameCn = (rule, value, callback) => {
if (value) {
repeatTabName({
// 调用接口
nameCn: value
}).then(res => {
if (res.content.length > 0) {
callback(new Error("该中文名称已被使用"));
} else {
callback();
}
});
}
};
return {
show: false,
form: [],
form: {},
rules: {
nameEn: [
name: [
{
required: true,
message: "填写英文名称"
message: "输入名称"
},
{
pattern: /^[a-zA-Z]{1,50}$/,
message: "请输入纯英文"
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName),
trigger: "change"
}
],
nameCn: [
code: [
{
required: true,
message: "请输入中文名称"
message: "请输入编码"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: nameCn
validator: __.validate.unique(repeatName),
trigger: "change"
}
]
}
......@@ -100,13 +78,11 @@ export default {
}
this.show = true;
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
this.show = false;
this.form.appId = this.$parent.selectNode.id;
create(this.form).then(res => {
treeCreate(this.form).then(res => {
if (res.status == "success") {
this.$message({
message: "新建成功",
......@@ -118,7 +94,7 @@ export default {
type: "error"
});
}
this.$parent.queryData();
this.$parent.getTree();
});
} else {
return false;
......@@ -128,3 +104,5 @@ export default {
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="编辑" v-drag :visible.sync="show" size="tiny" :close-on-click-modal="false">
<el-form
:model="form"
:rules="rules"
ref="form"
class="automargin"
label-width="80px"
status-icon
>
<el-form-item label="名称" prop="name">
<el-input show-word-limit v-model="form.name" placeholder="名称" maxlength="50"></el-input>
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input show-word-limit v-model="form.code" placeholder="编码" maxlength="50"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit()">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import {
treeEdit, // 编辑
repeatName // 查重
} from "./service";
class Form {
constructor(data = {}) {
this.id = data.id;
this.name = data.name;
this.code = data.code;
}
}
export default {
data() {
return {
show: false,
form: {},
rules: {}
};
},
methods: {
getPage(data) {
this.form = new Form(data);
this.rules = {
name: [
{
required: true,
message: "请输入名称"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName, this.form.id),
trigger: "change"
}
],
code: [
{
required: true,
message: "请输入编码"
},
{
pattern: __.validate.regular.commonCn.pattern,
message: __.validate.regular.commonCn.message
},
{
validator: __.validate.unique(repeatName, this.form.id),
trigger: "change"
}
]
};
if (this.$refs.form) {
this.$refs.form.resetFields();
}
this.show = true;
},
submit() {
this.$refs.form.validate(valid => {
if (valid) {
this.show = false;
treeEdit(this.form).then(res => {
if (res.status == "success") {
this.$message({
message: "编辑成功",
type: "success"
});
} else {
this.$message({
message: res.message,
type: "error"
});
}
this.$parent.getTree();
});
} else {
return false;
}
});
}
}
};
</script>
<style scoped></style>
<template>
<stms-layout :options="options">
<div slot="content" class="rule">
<div class="tool">
<div class="template-tab">
<el-tabs class="elTabs" v-model="tableName">
<el-tab-pane label="预警规则" name="0"> </el-tab-pane>
<el-tab-pane label="参数定义" name="1"> </el-tab-pane>
</el-tabs>
</div>
</div>
<waring
v-if="tableName === '0'"
:selectNode="options.list.config.active"
:events="options.list.events"
/>
<params
v-if="tableName === '1'"
:selectNode="options.list.config.active"
:events="options.list.events"
/>
</div>
</stms-layout>
</template>
<script>
import options from "./options";
import params from "./param"; //参数定义
import waring from "./warning"; //规则预警
export default {
components: { params, waring },
data() {
return {
options,
tableName: "0"
};
}
};
</script>
<style lang="less" scoped>
.rule {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
</style>
import RepomoduletyperestserverDao from "@/dao/console/repomoduletyperestserver";
export default {
async queryRuleGroup({ component }) {
let list = [];
const resp = await RepomoduletyperestserverDao.findByAll({
data: {
type: "rule"
}
});
const {
data: { status, content }
} = resp;
if (status == "success") {
list = content;
}
console.log(component("list"))
component("list").action("setData", list);
component("list").action("setActive");
},
async createRuleGroup({ dispatch }, payload) {
await RepomoduletyperestserverDao.create({
data: {
type: "rule",
...payload
}
});
await dispatch("queryRuleGroup");
},
async editRuleGroup({ dispatch }, payload) {
await RepomoduletyperestserverDao.edit({
data: payload
});
await dispatch("queryRuleGroup");
},
async deleteRuleGroup({ dispatch }, payload) {
await RepomoduletyperestserverDao.delete({
params: payload
});
await dispatch("queryRuleGroup");
}
};
import * as URL from "@/config/url";
export default {
"config.data": [
{
name: "Java仓库",
path: URL.JAVA
},
{
name: "规则定义",
path: URL.JAVA_RULE
}
]
};
import breadcrumb from "./breadcrumb";
import list from "./list";
import action from "./action";
const solution = STUI.default.LayoutSolution.use("SingleCategoryTable");
solution.uninstall("table");
solution.bindAction(action);
solution.extends("breadcrumb", breadcrumb);
solution.extends("list", list);
console.log(solution.export());
export default solution.export();
import RepomoduletyperestserverDao from "@/dao/console/repomoduletyperestserver";
export default {
"config.title": "规则分类",
"config.toolbar.edit.disabled": ({ component }) => {
return !component("list").action("getActive");
},
"config.toolbar.delete.disabled": ({ component }) => {
return !component("list").action("getActive");
},
"events.init": async ({ dispatch }) => {
await dispatch("queryRuleGroup");
},
"events.toolbarClick/create": async ({ dispatch, modal }) => {
modal({
data: {},
title: "新建",
schema: [
{
prop: "name",
label: "名称",
type: "input",
props: {
placeholder: "请填写名称",
showWordLimit: true,
maxlength: 20
},
rules: [
{
required: true,
message: "请填写名称"
},
{
validator: (rule, value, callback) => {
// 用户查重
if (value) {
const data = {
name: value,
type: "rule"
};
RepomoduletyperestserverDao.findByCondition({ data }).then(res => {
if (res.data.content.length > 0) {
callback(new Error("该名称已被使用"));
} else {
callback();
}
});
}
},
trigger: "change"
}
]
},
{
prop: "code",
label: "编码",
type: "input",
props: {
placeholder: "请填写编码",
showWordLimit: true,
maxlength: 20
}
}
],
onConfirm: async ({ data, close }) => {
await dispatch("createRuleGroup", data);
await dispatch("queryRuleGroup");
close();
}
});
},
"events.toolbarClick/edit": async ({ dispatch, component, modal }) => {
const active = component("list").action("getActive");
modal({
data: active,
title: "编辑",
schema: [
{
prop: "name",
label: "名称",
type: "input",
props: {
placeholder: "请填写名称",
showWordLimit: true,
maxlength: 20
},
rules: [
{
required: true,
message: "请填写名称"
},
{
validator: (rule, value, callback) => {
if (value) {
const data = {
name: value,
type: "rule",
id: active.id
};
RepomoduletyperestserverDao.findByCondition({ data }).then(res => {
if (res.data.content.length > 0 && active.id != res.data.content[0].id) {
callback(new Error("该名称已被使用"));
} else {
callback();
}
});
}
},
trigger: "change"
}
]
},
{
prop: "code",
label: "编码",
type: "input",
props: {
placeholder: "请填写编码",
showWordLimit: true,
maxlength: 20
}
}
],
onConfirm: async ({ data, close }) => {
await dispatch("editRuleGroup", data);
await dispatch("queryRuletGroup");
close();
}
});
},
"events.toolbarClick/delete": async ({ dispatch, component, confirm }) => {
const active = component("list").action("getActive");
confirm({
title: "是否删除",
content: "即将删除所选数据,是否继续",
confirmButtonText: "删除",
cancelButtonText: "关闭",
onConfirm: async () => {
await dispatch("deleteRuleGroup", {
ids: active.id
});
await dispatch("queryRuleGroup");
}
});
}
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import fetch from '@/utils/fetch';
// 获取搜索类型
export const searchType = () => fetch('/design/console/mansearchtablerestserver/byAll', {}, 'GET');
// 搜索
export const searchData = data => fetch('/design/displaycenter/displaycenter/fuzzySearch', data, 'POST');
// 根据表id,获取所有字段
export const getAllFiledsByTableId = data => fetch('/design/console/mansearchfieldsrestserver/byCondition', data, 'POST');
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import list1 from "./list1";
import list2 from "./list2";
import table from "./table";
import action from "./action";
const solution = STUI.default.LayoutSolution.use("DoubleCategoryTable");
solution.bindAction(action);
solution.uninstall("breadcrumb");
solution.extends("list1", list1);
solution.extends("list2", list2);
solution.extends("table", table);
export default solution.export();
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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