fix
This commit is contained in:
62
project/oms/apps/develop/AppAiCode/AppAiCode.vue
Normal file
62
project/oms/apps/develop/AppAiCode/AppAiCode.vue
Normal file
@@ -0,0 +1,62 @@
|
||||
<template>
|
||||
<section class="AppAiCode">
|
||||
<component :is="currentPage" v-bind="$props"/>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import AcList from "./acList";
|
||||
import AcAdd from "./acAdd";
|
||||
|
||||
export default {
|
||||
name: "AppAiCode",
|
||||
components: {AcAdd, AcList},
|
||||
label: "低代码生成平台",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
currentPage() {
|
||||
let {hash} = this.$route
|
||||
return hash == "#add" ? AcAdd : AcList
|
||||
}
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
top: this
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleGetCode(id) {
|
||||
id && this.instance.post("/node/aicode/getCode", null, {
|
||||
params: {id},
|
||||
responseType: "blob"
|
||||
}).then(res => {
|
||||
if (res?.code == 1) {
|
||||
this.$message.error(res.err)
|
||||
} else {
|
||||
const link = document.createElement('a')
|
||||
let blob = new Blob([res], {type: 'application/zip'})
|
||||
link.style.display = 'none'
|
||||
link.href = URL.createObjectURL(blob)
|
||||
link.setAttribute('download', 'aicode.zip')
|
||||
document.body.appendChild(link)
|
||||
link.click()
|
||||
document.body.removeChild(link)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.dict.load("detailType")
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppAiCode {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
185
project/oms/apps/develop/AppAiCode/acAdd.vue
Normal file
185
project/oms/apps/develop/AppAiCode/acAdd.vue
Normal file
@@ -0,0 +1,185 @@
|
||||
<template>
|
||||
<section class="acAdd">
|
||||
<ai-detail list>
|
||||
<ai-title slot="title" :title="pageTitle">
|
||||
<template #rightBtn>
|
||||
<el-button type="primary" v-if="isEdit" @click="top.handleGetCode($route.query.id)">生成代码</el-button>
|
||||
</template>
|
||||
</ai-title>
|
||||
<template #content>
|
||||
<el-form ref="AcForm" :model="form" size="small" label-width="120px" :rules="rules">
|
||||
<el-tabs tab-position="left" @tab-click="handleSyncProps">
|
||||
<el-tab-pane label="基本信息" lazy>
|
||||
<ai-card title="基本信息">
|
||||
<template #content>
|
||||
<el-row type="flex">
|
||||
<div class="fill">
|
||||
<el-form-item label="应用名称" prop="name">
|
||||
<el-input v-model="form.name" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="应用模块" prop="appName">
|
||||
<el-input v-model="form.appName" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="fill">
|
||||
<el-form-item label="核心码" prop="rightCode">
|
||||
<el-input v-model="form.rightCode" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="详情方式" prop="detailType">
|
||||
<ai-select v-model="form.detailType" :selectList="dict.getDict('detailType')"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-form-item label="按钮配置" prop="btns">
|
||||
<el-checkbox-group v-model="form.btns">
|
||||
<el-checkbox label="insertEnable">添加</el-checkbox>
|
||||
<el-checkbox label="importEnable">导入</el-checkbox>
|
||||
<el-checkbox label="exportEnalbe">导出</el-checkbox>
|
||||
<el-checkbox label="editEnable">编辑</el-checkbox>
|
||||
<el-checkbox label="deleteEnable">删除</el-checkbox>
|
||||
<el-checkbox label="batchDelEnable">批量删除</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</ai-card>
|
||||
<ai-card title="字段设置">
|
||||
<template #right>
|
||||
<el-button type="text" @click="handleAddProps">批量添加</el-button>
|
||||
<el-button type="text" @click="form.props.push({})">添加</el-button>
|
||||
</template>
|
||||
<template #content>
|
||||
<ai-table :tableData="form.props" :isShowPagination="false" :colConfigs="colConfigs">
|
||||
<el-table-column v-for="col in colConfigs" :key="col.slot" v-bind="col">
|
||||
<template slot-scope="{row}">
|
||||
<el-checkbox v-if="col.type=='checkBox'" v-model="row[col.slot]"/>
|
||||
<span v-else-if="col.type=='chbShow'" v-text="row[col.slot]==true?'✔':''"/>
|
||||
<el-input v-else size="small" v-model="row[col.slot]" placeholder="请输入" clearable/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" slot="options" align="center">
|
||||
<template slot-scope="{row,$index}">
|
||||
<el-button type="text" @click="form.props.splice($index,1)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-card>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="详情设计" lazy>
|
||||
<detail-layout v-bind="$props" :form="form" v-model="form.detailConfig"/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
</template>
|
||||
<template #footer>
|
||||
<el-button @click="back">取消</el-button>
|
||||
<el-button type="primary" @click="submit">提交</el-button>
|
||||
</template>
|
||||
</ai-detail>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import DetailLayout from "./detailLayout";
|
||||
|
||||
export default {
|
||||
name: "acAdd",
|
||||
components: {DetailLayout},
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
inject: {
|
||||
top: {}
|
||||
},
|
||||
computed: {
|
||||
isEdit: v => !!v.$route.query.id,
|
||||
pageTitle: v => v.isEdit ? "编辑应用" : "新增应用"
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
form: {props: [], btns: []},
|
||||
rules: {
|
||||
name: {required: true, message: "请输入应用名称"},
|
||||
appName: {required: true, message: "请输入应用模块"},
|
||||
btns: {required: true, message: '请输入按钮配置', trigger: 'change'}
|
||||
},
|
||||
colConfigs: [
|
||||
{slot: 'prop', label: "字段"},
|
||||
{slot: 'label', label: "名称"},
|
||||
{slot: 'dict', label: "字典"},
|
||||
{slot: 'isSearch', label: "搜索字段", align: 'center', type: 'checkBox'},
|
||||
{slot: 'isTable', label: "表格字段", align: 'center', type: 'checkBox'},
|
||||
{slot: 'isDetail', label: "详情字段", align: 'center', type: 'chbShow'},
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getDetail() {
|
||||
let {id} = this.$route.query
|
||||
id && this.instance.post("/node/aicode/detail", null, {
|
||||
params: {id}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.form = res.data
|
||||
this.handleSyncProps()
|
||||
}
|
||||
})
|
||||
},
|
||||
back() {
|
||||
this.$router.push({})
|
||||
},
|
||||
submit() {
|
||||
this.$refs.AcForm.validate(v => {
|
||||
if (v) {
|
||||
this.instance.post("/node/aicode/addOrUpdate", this.form).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("提交成功!")
|
||||
this.back()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleSyncProps() {
|
||||
let detailPorps = this.form.detailConfig?.map(e => e.column)?.flat()?.map(e => e.prop)
|
||||
this.form.props = this.form.props.map(e => ({...e, isDetail: !!detailPorps?.includes(e.prop)}))
|
||||
},
|
||||
handleAddProps() {
|
||||
this.$prompt("请输入swagger示例JSON字符串", {
|
||||
type: 'warning',
|
||||
title: "批量添加字段",
|
||||
dangerouslyUseHTMLString: true,
|
||||
center: true,
|
||||
}).then(({value}) => {
|
||||
if (this.$checkJson(value)) {
|
||||
Object.keys(JSON.parse(value)).map(prop => {
|
||||
this.form.props.push({prop})
|
||||
})
|
||||
}
|
||||
}).catch(() => 0)
|
||||
},
|
||||
$checkJson(str) {
|
||||
if (typeof str == 'string') {
|
||||
try {
|
||||
let obj = JSON.parse(str);
|
||||
return !!(typeof obj == 'object' && obj);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.getDetail()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.acAdd {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
90
project/oms/apps/develop/AppAiCode/acList.vue
Normal file
90
project/oms/apps/develop/AppAiCode/acList.vue
Normal file
@@ -0,0 +1,90 @@
|
||||
<template>
|
||||
<section class="acList">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="低代码生成平台" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #left>
|
||||
<el-button type="primary" icon="iconfont iconAdd" @click="handleAdd()">添加</el-button>
|
||||
</template>
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索应用" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict">
|
||||
<el-table-column slot="options" label="操作" fixed="right" align="center" width="300">
|
||||
<template slot-scope="{row}">
|
||||
<el-button type="text" @click="handleAdd(row.id)">编辑</el-button>
|
||||
<el-button type="text" @click="handleDelete(row.id)">删除</el-button>
|
||||
<el-button type="text" @click="top.handleGetCode(row.id)">下载</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-list>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "acList",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
inject: {
|
||||
top: {}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{label: "应用名称", prop: "name", width: 200},
|
||||
{label: "应用模块", prop: "appName"},
|
||||
{label: "权限码", prop: "rightCode"},
|
||||
{label: "详情展示方式", prop: "detailType", dict: "detailType"},
|
||||
],
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/aicode/list", null, {
|
||||
params: {...this.page, ...this.search}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data.records
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
},
|
||||
handleAdd(id) {
|
||||
this.$router.push({hash: "#add", query: {id}})
|
||||
},
|
||||
handleDelete(ids) {
|
||||
this.$confirm("是否要删除该应用?").then(() => {
|
||||
this.instance.post("/node/aicode/delete", null, {
|
||||
params: {ids}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("删除成功")
|
||||
this.getTableData()
|
||||
}
|
||||
})
|
||||
}).catch(() => 0)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.acList {
|
||||
}
|
||||
</style>
|
||||
274
project/oms/apps/develop/AppAiCode/config.json
Normal file
274
project/oms/apps/develop/AppAiCode/config.json
Normal file
@@ -0,0 +1,274 @@
|
||||
{
|
||||
"config": [
|
||||
{
|
||||
"type": "info",
|
||||
"tips": "(不能重复添加同一元素)",
|
||||
"label": "信息",
|
||||
"children": [
|
||||
{
|
||||
"type": "name",
|
||||
"fieldName": "姓名",
|
||||
"fieldTips": "请输入姓名",
|
||||
"fixedLabel": "姓名",
|
||||
"disable": "0",
|
||||
"grid": 0.5,
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_box",
|
||||
"mustFill": "1",
|
||||
"maxLength": 20
|
||||
},
|
||||
{
|
||||
"type": "idNumber",
|
||||
"fieldName": "身份证号",
|
||||
"fixedLabel": "身份证号",
|
||||
"fieldTips": "请输入身份证号",
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"maxLength": 20,
|
||||
"disable": "0",
|
||||
"grid": 0.5
|
||||
},
|
||||
{
|
||||
"type": "phone",
|
||||
"fieldName": "联系方式",
|
||||
"fixedLabel": "联系方式",
|
||||
"fieldTips": "请输入联系方式",
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"maxLength": 20,
|
||||
"disable": "0",
|
||||
"grid": 0.5
|
||||
},
|
||||
{
|
||||
"type": "area",
|
||||
"fieldName": "地区",
|
||||
"fixedLabel": "地区",
|
||||
"fieldTips": "请选择地区",
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"areaPattern": "",
|
||||
"disable": "0",
|
||||
"grid": 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "options",
|
||||
"tips": "(可重复添加)",
|
||||
"label": "选项",
|
||||
"children": [
|
||||
{
|
||||
"type": "radio",
|
||||
"fieldName": "单选",
|
||||
"fixedLabel": "单选",
|
||||
"fieldTips": "请选择",
|
||||
"grid": 0.5,
|
||||
"icon": "iconradio",
|
||||
"mustFill": "1",
|
||||
"disable": "0",
|
||||
"defaultValue": "",
|
||||
"options": [
|
||||
{
|
||||
"label": "选项1",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "选项2",
|
||||
"value": ""
|
||||
}
|
||||
],
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "checkbox",
|
||||
"fieldName": "多选",
|
||||
"fixedLabel": "多选",
|
||||
"fieldTips": "请选择",
|
||||
"icon": "iconcheck_box",
|
||||
"mustFill": "1",
|
||||
"grid": 0.5,
|
||||
"disable": "0",
|
||||
"defaultValue": [],
|
||||
"options": [
|
||||
{
|
||||
"label": "选项1",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "选项2",
|
||||
"value": ""
|
||||
}
|
||||
],
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "select",
|
||||
"fieldName": "单下拉框",
|
||||
"fixedLabel": "单下拉框",
|
||||
"grid": 0.5,
|
||||
"fieldTips": "请选择",
|
||||
"icon": "iconSelect",
|
||||
"mustFill": "1",
|
||||
"defaultValue": "",
|
||||
"disable": "0",
|
||||
"options": [
|
||||
{
|
||||
"label": "选项1",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"label": "选项2",
|
||||
"value": ""
|
||||
}
|
||||
],
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "onOff",
|
||||
"fieldName": "开关",
|
||||
"fixedLabel": "开关",
|
||||
"grid": 0.5,
|
||||
"fieldTips": "请选择开关",
|
||||
"icon": "iconSelect",
|
||||
"mustFill": "1",
|
||||
"defaultValue": "0",
|
||||
"disable": "0",
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "date",
|
||||
"fieldName": "日期",
|
||||
"fixedLabel": "日期",
|
||||
"grid": 0.5,
|
||||
"datetimePattern": "yyyy-MM-dd",
|
||||
"fieldTips": "请选择日期",
|
||||
"icon": "iconSelect",
|
||||
"mustFill": "1",
|
||||
"disable": "0",
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "time",
|
||||
"fieldName": "时间",
|
||||
"fixedLabel": "时间",
|
||||
"grid": 0.5,
|
||||
"datetimePattern": "HH:mm:ss",
|
||||
"fieldTips": "请选择时间",
|
||||
"icon": "iconSelect",
|
||||
"mustFill": "1",
|
||||
"disable": "0",
|
||||
"title": ""
|
||||
},
|
||||
{
|
||||
"type": "datetime",
|
||||
"fieldName": "日期时间",
|
||||
"fixedLabel": "日期时间",
|
||||
"grid": 0.5,
|
||||
"datetimePattern": "yyyy-MM-dd HH:mm:ss",
|
||||
"fieldTips": "请选择日期时间",
|
||||
"icon": "iconSelect",
|
||||
"mustFill": "1",
|
||||
"disable": "0",
|
||||
"title": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input",
|
||||
"tips": "(可重复添加)",
|
||||
"label": "填空",
|
||||
"children": [
|
||||
{
|
||||
"type": "input",
|
||||
"fieldName": "单行填空",
|
||||
"fieldTips": "请输入",
|
||||
"fixedLabel": "单行填空",
|
||||
"disable": "0",
|
||||
"grid": 0.5,
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_box",
|
||||
"mustFill": "1",
|
||||
"maxLength": 50
|
||||
},
|
||||
{
|
||||
"type": "textarea",
|
||||
"fieldName": "多行填空",
|
||||
"fixedLabel": "多行填空",
|
||||
"fieldTips": "请输入",
|
||||
"lineNumber": 4,
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"maxLength": 500,
|
||||
"disable": "0",
|
||||
"grid": 1
|
||||
},
|
||||
{
|
||||
"type": "number",
|
||||
"fieldName": "数字输入",
|
||||
"fixedLabel": "数字输入",
|
||||
"fieldTips": "请输入数字",
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"maxValue": 10000,
|
||||
"decimalPlaces": 0,
|
||||
"minValue": 0,
|
||||
"maxLength": 500,
|
||||
"disable": "0",
|
||||
"grid": 0.5
|
||||
},
|
||||
{
|
||||
"type": "rtf",
|
||||
"fieldName": "富文本",
|
||||
"fixedLabel": "富文本",
|
||||
"fieldTips": "请输入",
|
||||
"defaultValue": "",
|
||||
"icon": "icontext_area",
|
||||
"mustFill": "1",
|
||||
"maxLength": 5000,
|
||||
"disable": "0",
|
||||
"grid": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "annex",
|
||||
"tips": "(可重复添加)",
|
||||
"label": "附件",
|
||||
"children": [
|
||||
{
|
||||
"type": "upload",
|
||||
"fieldTips": "请上传",
|
||||
"fieldName": "上传附件",
|
||||
"fixedLabel": "上传附件",
|
||||
"disable": "0",
|
||||
"fileChoseSize": 10,
|
||||
"fileMaxCount": 9,
|
||||
"defaultValue": "",
|
||||
"icon": "iconpic",
|
||||
"mustFill": "1",
|
||||
"grid": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "layout",
|
||||
"tips": "(可重复添加)",
|
||||
"label": "分组",
|
||||
"children": [
|
||||
{
|
||||
"type": "group",
|
||||
"fieldName": "卡片",
|
||||
"fixedLabel": "卡片",
|
||||
"icon": "iconpic",
|
||||
"groupName": "分组标题",
|
||||
"column": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
1049
project/oms/apps/develop/AppAiCode/detailLayout.vue
Normal file
1049
project/oms/apps/develop/AppAiCode/detailLayout.vue
Normal file
File diff suppressed because it is too large
Load Diff
262
project/oms/apps/develop/AppDeploy/AppDeploy.vue
Normal file
262
project/oms/apps/develop/AppDeploy/AppDeploy.vue
Normal file
@@ -0,0 +1,262 @@
|
||||
<template>
|
||||
<section class="AppDeploy">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="部署发布" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #left>
|
||||
<el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">增加</el-button>
|
||||
</template>
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索项目/系统" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict">
|
||||
<el-table-column type="expand" slot="expand">
|
||||
<template slot-scope="{row}">
|
||||
<ai-wrapper>
|
||||
<ai-info-item labelWidth="200px" v-for="op in desConfigs" :key="op.prop" :value="row[op.prop]"
|
||||
v-bind="op"/>
|
||||
</ai-wrapper>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column slot="process" label="打包进度">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.count==0" v-text="getProcessMsg(row)"/>
|
||||
<el-progress v-else :percentage="row.count"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column slot="options" label="操作" fixed="right" align="center" width="300">
|
||||
<template slot-scope="{row}">
|
||||
<el-button type="text" @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button type="text" @click="handleDelete(row.id)">删除</el-button>
|
||||
<el-button type="text" @click="handleZip(row)" v-if="row.count==0">打包更新</el-button>
|
||||
<el-button type="text" @click="handleCancelZip(row)" v-else>停止打包</el-button>
|
||||
<el-button type="text" v-if="row.target" @click="handleDownload(row)">下载</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-list>
|
||||
<ai-dialog :visible.sync="dialog" title="部署任务设置" width="700px" @close="form={}" @onConfirm="submit">
|
||||
<el-form ref="DialogForm" :model="form" size="small" label-width="100px" :rules="rules">
|
||||
<el-form-item label="项目/系统" prop="name">
|
||||
<el-input v-model="form.name" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="系统类型" prop="type">
|
||||
<ai-select v-model="form.type" :selectList="dict.getDict('systemType')"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="打包脚本" prop="libShell">
|
||||
<el-input v-model="form.libShell" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="更新脚本" prop="updateShell">
|
||||
<el-input v-model="form.updateShell" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目URL" prop="webUrl">
|
||||
<el-input v-model="form.webUrl" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="打包地址" prop="webUrl">
|
||||
<el-input v-model="form.zipPath" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="nginx路径" prop="target">
|
||||
<el-input v-model="form.target" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="node版本" prop="nodeVersion">
|
||||
<el-input v-model="form.nodeVersion" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</ai-dialog>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppDeploy",
|
||||
label: "部署发布",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
desConfigs() {
|
||||
let isLine = true
|
||||
return [
|
||||
{prop: "libShell", label: "打包脚本", width: 100},
|
||||
{prop: "updateShell", label: "更新脚本", width: 100},
|
||||
{prop: "zipPath", label: "打包地址", width: 100, isLine},
|
||||
{prop: "target", label: "nginx路径", width: 100, isLine},
|
||||
{prop: "webUrl", label: "项目URL", width: 100},
|
||||
{prop: "nodeVersion", label: "node打包版本", width: 100},
|
||||
]
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{slot: "expand"},
|
||||
{label: "项目/系统名称", prop: "name", width: 200},
|
||||
{label: "系统类型", prop: "type", dict: "systemType", width: 80},
|
||||
{label: "nginx路径", prop: "target"},
|
||||
{slot: "process"},
|
||||
{slot: "options"}
|
||||
],
|
||||
dialog: false,
|
||||
form: {},
|
||||
rules: {
|
||||
name: {required: true, message: "请输入项目/系统名称"},
|
||||
},
|
||||
timer: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/autodeploy/list", null, {
|
||||
params: {...this.page, ...this.search}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data?.records.map(e => ({...e, count: 0}))
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDownload(row) {
|
||||
let {id} = row
|
||||
this.instance.post("/node/autodeploy/download", null, {
|
||||
params: {id},
|
||||
responseType: "blob"
|
||||
}).then(res => {
|
||||
if (res?.code == 1) {
|
||||
this.$message.error(res.err)
|
||||
} else {
|
||||
const link = document.createElement('a')
|
||||
let blob = new Blob([res], {type: 'application/zip'})
|
||||
link.style.display = 'none'
|
||||
link.href = URL.createObjectURL(blob)
|
||||
link.setAttribute('download', row.name + '.zip')
|
||||
document.body.appendChild(link)
|
||||
link.click()
|
||||
document.body.removeChild(link)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleZip(row) {
|
||||
let {id} = row, {timer} = this
|
||||
this.instance.post("/node/autodeploy/getZip", null, {
|
||||
params: {id}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
row.count = 1
|
||||
timer[id] = setInterval(() => {
|
||||
if (row.count >= 100) {
|
||||
clearInterval(timer[id])
|
||||
row.count = 0
|
||||
this.$message.error("打包失败!")
|
||||
} else if (row.count <= 10 && row.target) {
|
||||
row.count++
|
||||
} else this.handleConfirmZip(row).then(v => {
|
||||
if (v.error) {
|
||||
clearInterval(timer[id])
|
||||
this.$message.error("打包失败!")
|
||||
this.refreshRow(row, v)
|
||||
row.count = 0
|
||||
} else if (v.download) {
|
||||
clearInterval(timer[id])
|
||||
this.refreshRow(row, v)
|
||||
row.count = 0
|
||||
} else row.count++
|
||||
})
|
||||
}, 3000)
|
||||
}
|
||||
})
|
||||
},
|
||||
refreshRow(row, v) {
|
||||
row.error = v.error
|
||||
row.download = v.download
|
||||
row.zipTime = v.zipTime
|
||||
},
|
||||
handleCancelZip(row) {
|
||||
let {id} = row
|
||||
return this.instance.post("/node/autodeploy/cancelZip", null, {
|
||||
params: {id}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
clearInterval(this.timer[id])
|
||||
row.count = 0
|
||||
this.handleConfirmZip(row).then(v => this.refreshRow(row, v))
|
||||
}
|
||||
})
|
||||
},
|
||||
handleEdit(row) {
|
||||
this.form = JSON.parse(JSON.stringify(row))
|
||||
this.dialog = true
|
||||
},
|
||||
submit() {
|
||||
this.$refs.DialogForm.validate(v => {
|
||||
if (v) {
|
||||
this.instance.post("/node/autodeploy/addOrUpdate", this.form).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("提交成功")
|
||||
this.getTableData()
|
||||
this.dialog = false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDelete(ids) {
|
||||
this.$confirm("是否要删除该项目/系统?").then(() => {
|
||||
this.instance.post("/node/autodeploy/delete", null, {
|
||||
params: {ids}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("删除成功")
|
||||
this.getTableData()
|
||||
}
|
||||
})
|
||||
}).catch(() => 0)
|
||||
},
|
||||
handleConfirmZip(row) {
|
||||
let {id} = row
|
||||
return this.instance.post("/node/autodeploy/confirmZip", null, {
|
||||
params: {id}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) return res.data
|
||||
})
|
||||
},
|
||||
getProcessMsg(row) {
|
||||
let time = row.zipTime ? this.$moment(row.download).diff(row.zipTime, 's', true) : ""
|
||||
return row.error || (row.download ? `最近打包时间:${row.download}(用时:${time}秒)` :
|
||||
row.zipTime ? `正在打包,开始于:${row.zipTime}` : `暂无打包`)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.dict.load("systemType")
|
||||
this.getTableData()
|
||||
},
|
||||
beforeDestroy() {
|
||||
Object.values(this.timer).map(t => clearInterval(t))
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppDeploy {
|
||||
height: 100%;
|
||||
|
||||
::v-deep.textRight {
|
||||
direction: rtl;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
233
project/oms/apps/develop/AppDeployWxmp/AppDeployWxmp.vue
Normal file
233
project/oms/apps/develop/AppDeployWxmp/AppDeployWxmp.vue
Normal file
@@ -0,0 +1,233 @@
|
||||
<template>
|
||||
<section class="AppDeployWxmp">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="小程序部署发布" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<!-- <template #left>-->
|
||||
<!-- <el-button type="primary" icon="iconfont iconAdd" @click="dialog=true">增加</el-button>-->
|
||||
<!-- </template>-->
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索项目/系统/appId/上传版本" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict">
|
||||
<el-table-column type="expand" slot="expand">
|
||||
<template slot-scope="{row}">
|
||||
<ai-wrapper>
|
||||
<ai-info-item labelWidth="200px" v-for="op in desConfigs" :key="op.prop" :value="row[op.prop]"
|
||||
v-bind="op"/>
|
||||
</ai-wrapper>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column slot="process" label="打包进度">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.count==0" v-text="getProcessMsg(row)"/>
|
||||
<el-progress v-else :percentage="row.count"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column slot="options" label="操作" fixed="right" align="center" width="300">
|
||||
<template slot-scope="{row}">
|
||||
<el-button type="text" @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button type="text" @click="handleZip(row)">打包</el-button>
|
||||
<el-button type="text" v-if="/^打包时间/.test(row.error)" @click="handleDownload(row)">下载</el-button>
|
||||
<el-button v-if="row.target" type="text" @click="handleUpdateSystem(row)">更新部署</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-list>
|
||||
<ai-dialog :visible.sync="dialog" title="部署设置" width="600px" @close="form={}" @onConfirm="submit">
|
||||
<el-form ref="DialogForm" :model="form" size="small" label-width="120px" :rules="rules">
|
||||
<el-form-item label="项目/系统" prop="name">
|
||||
{{ form.name }}(appid:<b v-text="form.miniapp_appid"/>)
|
||||
</el-form-item>
|
||||
<el-form-item label="小程序上传私钥" prop="privateKey">
|
||||
<el-input v-model="form.privateKey" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目地址" prop="projectPath">
|
||||
<el-input v-model="form.projectPath" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="版本号" prop="version">
|
||||
<el-input v-model="form.version" clearable placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</ai-dialog>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppDeployWxmp",
|
||||
label: "小程序发布",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
desConfigs() {
|
||||
let isLine = true
|
||||
return [
|
||||
{prop: "corp_address_book_secret", label: "企业微信通讯录SECRET", width: 200},
|
||||
{prop: "corp_agent_id", label: "企业微信AGENTID", width: 150},
|
||||
{prop: "corp_secret", label: "企业微信SECRET", isLine},
|
||||
{prop: "corp_token", label: "企业微信TOKEN", width: 150},
|
||||
{prop: "corp_aeskey", label: "企业微信AESKEY", width: 150},
|
||||
{prop: "miniapp_secret", label: "小程序SECRET", width: 150},
|
||||
{prop: "area_id", label: "地区编码", width: 150, isLine},
|
||||
{prop: "lat", label: "纬度", width: 100},
|
||||
{prop: "lng", label: "经度", width: 100},
|
||||
{prop: "address", label: "中心点", width: 100, isLine},
|
||||
{prop: "web_url", label: "管理端地址", width: 100},
|
||||
{prop: "dvcp_url", label: "企微端地址", width: 100},
|
||||
]
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{slot: "expand"},
|
||||
{label: "项目/系统名称", prop: "name", width: 300},
|
||||
{label: "corpId", prop: "corp_id", width: 180},
|
||||
{label: "管理后台", prop: "web_url"},
|
||||
{label: "appId", prop: "miniapp_appid", width: 180},
|
||||
{label: "上传版本", prop: "version"},
|
||||
{slot: "process"},
|
||||
{slot: "options"}
|
||||
],
|
||||
dialog: false,
|
||||
form: {},
|
||||
rules: {
|
||||
// privateKey: {required: true, message: "请输入 小程序上传私钥"},
|
||||
// projectPath: {required: true, message: "请输入 项目地址"},
|
||||
version: {required: true, message: "请输入 版本号"},
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/wxmp/list", null, {
|
||||
params: {...this.page, ...this.search}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data?.records.map(e => ({...e, count: 0}))
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDownload(row) {
|
||||
let {appid} = row
|
||||
this.instance.post("/node/wxmp/download", null, {
|
||||
params: {appid},
|
||||
responseType: "blob"
|
||||
}).then(res => {
|
||||
if (res?.code == 1) {
|
||||
this.$message.error(res.err)
|
||||
} else {
|
||||
const link = document.createElement('a')
|
||||
let blob = new Blob([res], {type: 'application/zip'})
|
||||
link.style.display = 'none'
|
||||
link.href = URL.createObjectURL(blob)
|
||||
link.setAttribute('download', row.name + '.zip')
|
||||
document.body.appendChild(link)
|
||||
link.click()
|
||||
document.body.removeChild(link)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleZip(row) {
|
||||
let {miniapp_appid: appid, version} = row
|
||||
if (!version) return this.$message.error("请先维护要上传的版本!")
|
||||
appid && this.instance.post("/node/wxmp/getZip", null, {
|
||||
params: {appid}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
row.count = 1
|
||||
let timer = setInterval(() => {
|
||||
if (row.count >= 100) {
|
||||
clearInterval(timer)
|
||||
this.$message.error("打包失败!")
|
||||
} else if (row.count <= 25) {
|
||||
row.count++
|
||||
} else this.handleConfirmZip(row).then(v => {
|
||||
if (v.error) {
|
||||
clearInterval(timer)
|
||||
row.error = v.error
|
||||
row.count = 0
|
||||
} else row.count++
|
||||
})
|
||||
}, 3000)
|
||||
}
|
||||
}).catch(() => this.$message.error("打包失败!"))
|
||||
},
|
||||
handleUpdateSystem(row) {
|
||||
let {appid} = row
|
||||
return this.instance.post("/node/wxmp/updateSystem", null, {
|
||||
params: {appid}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
|
||||
}
|
||||
})
|
||||
},
|
||||
handleEdit(row) {
|
||||
this.form = JSON.parse(JSON.stringify(row))
|
||||
this.dialog = true
|
||||
},
|
||||
submit() {
|
||||
this.$refs.DialogForm.validate(v => {
|
||||
if (v) {
|
||||
this.instance.post("/node/wxmp/addOrUpdate", this.form).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("提交成功")
|
||||
this.getTableData()
|
||||
this.dialog = false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDelete(ids) {
|
||||
this.$confirm("是否要删除该项目/系统?").then(() => {
|
||||
this.instance.post("/node/autodeploy/delete", null, {
|
||||
params: {ids}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) {
|
||||
this.$message.success("删除成功")
|
||||
this.getTableData()
|
||||
}
|
||||
})
|
||||
}).catch(() => 0)
|
||||
},
|
||||
handleConfirmZip(row) {
|
||||
let {appid} = row
|
||||
return this.instance.post("/node/wxmp/confirmZip", null, {
|
||||
params: {appid}
|
||||
}).then(res => {
|
||||
if (res?.code == 0) return res.data
|
||||
})
|
||||
},
|
||||
getProcessMsg(row) {
|
||||
return row.error || `暂无打包`
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppDeployWxmp {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
66
project/oms/apps/develop/AppForm/AppForm.vue
Normal file
66
project/oms/apps/develop/AppForm/AppForm.vue
Normal file
@@ -0,0 +1,66 @@
|
||||
<template>
|
||||
<div class="doc-circulation">
|
||||
<keep-alive :include="['List']">
|
||||
<component ref="component" :is="component" @change="onChange" :params="params" :instance="instance" :dict="dict"/>
|
||||
</keep-alive>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import List from './components/List'
|
||||
import Add from './components/Add'
|
||||
|
||||
export default {
|
||||
name: 'AppForm',
|
||||
label: '配置表单',
|
||||
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
component: 'List',
|
||||
params: {},
|
||||
include: []
|
||||
}
|
||||
},
|
||||
|
||||
components: {
|
||||
Add,
|
||||
List
|
||||
},
|
||||
|
||||
mounted () {
|
||||
},
|
||||
|
||||
methods: {
|
||||
onChange (data) {
|
||||
if (data.type === 'Add') {
|
||||
this.component = 'Add'
|
||||
this.params = data.params
|
||||
}
|
||||
|
||||
if (data.type === 'list') {
|
||||
this.component = 'List'
|
||||
this.params = data.params
|
||||
|
||||
this.$nextTick(() => {
|
||||
if (data.isRefresh) {
|
||||
this.$refs.component.getList()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.doc-circulation {
|
||||
height: 100%;
|
||||
background: #F3F6F9;
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
281
project/oms/apps/develop/AppForm/components/Add.vue
Normal file
281
project/oms/apps/develop/AppForm/components/Add.vue
Normal file
@@ -0,0 +1,281 @@
|
||||
<template>
|
||||
<ai-detail class="form-add" :class="[currIndex === 1 ? 'form-add__active' : '']">
|
||||
<ai-title title="表单配置" slot="title" isShowBottomBorder isShowBack @onBackClick="cancel(false)"></ai-title>
|
||||
<template #content>
|
||||
<div class="ai-step">
|
||||
<div class="ai-step__item"
|
||||
:class="[currIndex >= index ? 'ai-step__item--active' : '']"
|
||||
v-for="(item, index) in statusList"
|
||||
:key="index">
|
||||
<div class="ai-step__item--icon" v-if="currIndex <= index">
|
||||
<i v-if="currIndex === index"></i>
|
||||
</div>
|
||||
<div class="el-icon-success" v-if="currIndex > index">
|
||||
</div>
|
||||
<span>{{ item }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<basic-info ref="basicInfo" v-model="basicInfo" v-show="currIndex === 0" :dict="dict" :instance="instance"></basic-info>
|
||||
<form-layout :appType="basicInfo.appType" :currIndex="currIndex" class="form-config__wrapper" v-model="tableInfos" ref="form" v-show="currIndex === 1" :dict="dict" :instance="instance"></form-layout>
|
||||
<form-config
|
||||
ref="config"
|
||||
:showListFields="showListFields"
|
||||
:btns="btns"
|
||||
:fuzzyQueryFields="fuzzyQueryFields"
|
||||
:tableInfos="tableInfos"
|
||||
:orderFields="orderFields"
|
||||
v-if="currIndex === 2">
|
||||
</form-config>
|
||||
</template>
|
||||
<template #footer>
|
||||
<el-button @click="cancel">取消</el-button>
|
||||
<el-button @click="back" v-if="currIndex > 0">上一步</el-button>
|
||||
<el-button @click="next" type="primary">{{ currIndex === 2 ? '完成' : '下一步' }}</el-button>
|
||||
</template>
|
||||
</ai-detail>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import BasicInfo from './BasicInfo.vue'
|
||||
import FormLayout from './FormLayout.vue'
|
||||
import FormConfig from './FormConfig.vue'
|
||||
export default {
|
||||
name: 'add',
|
||||
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
params: Object,
|
||||
type: String
|
||||
},
|
||||
|
||||
components: {
|
||||
FormLayout,
|
||||
BasicInfo,
|
||||
FormConfig
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
currIndex: 0,
|
||||
basicInfo: {
|
||||
saasPlatformId: '',
|
||||
menuLeve1Style: '',
|
||||
saasPlatformName: '',
|
||||
menuLevel1Name: '',
|
||||
menuLevel3Name: '',
|
||||
menuLevel2Name: '',
|
||||
appType: ''
|
||||
},
|
||||
orderFields: [],
|
||||
showListFields: [],
|
||||
fuzzyQueryFields: [],
|
||||
btns: [],
|
||||
btnKeys: ['insertEnable', 'importEnable', 'exportEnalbe', 'editEnable', 'deleteEnable', 'batchDelEnable'],
|
||||
configInfo: {
|
||||
btns: [],
|
||||
orderType: '0',
|
||||
fieldName: ''
|
||||
},
|
||||
info: {},
|
||||
tableInfos: [],
|
||||
statusList: ['基础设置', '表单设计', '列表设计']
|
||||
}
|
||||
},
|
||||
|
||||
mounted () {
|
||||
if (this.params.id) {
|
||||
this.getInfo()
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
cancel (isRefresh) {
|
||||
this.$emit('change', {
|
||||
type: 'list',
|
||||
isRefresh: isRefresh ? true : false,
|
||||
isQuote: this.params.isQuote ? true : false
|
||||
})
|
||||
},
|
||||
|
||||
confirm () {
|
||||
|
||||
},
|
||||
|
||||
back () {
|
||||
this.currIndex = this.currIndex - 1
|
||||
},
|
||||
|
||||
confirmBasicInfo () {
|
||||
return this.$refs.basicInfo.validate()
|
||||
},
|
||||
|
||||
getInfo () {
|
||||
this.instance.post(`/app/appapplicationinfo/queryDetailById?id=${this.params.id}`).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.info = res.data
|
||||
this.basicInfo = {
|
||||
saasPlatformId: res.data.saasPlatformId,
|
||||
menuLeve1Style: res.data.menuLeve1Style,
|
||||
saasPlatformName: res.data.saasPlatformName,
|
||||
menuLevel1Name: res.data.menuLevel1Name,
|
||||
menuLevel3Name: res.data.menuLevel3Name,
|
||||
menuLevel2Name: res.data.menuLevel2Name,
|
||||
appType: res.data.appType,
|
||||
corpId: res.data.corpId,
|
||||
corpName: res.data.corpName
|
||||
}
|
||||
this.fuzzyQueryFields = res.data.fuzzyQueryFields
|
||||
this.tableInfos = res.data.tableInfos
|
||||
this.showListFields = res.data.showListFields
|
||||
this.orderFields = res.data.orderFields
|
||||
this.btns = Object.keys(res.data).filter(v => {
|
||||
return this.btnKeys.indexOf(v) > -1 && res.data[v] === '1'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
submit (info) {
|
||||
this.instance.post(`/app/appapplicationinfo/addOrUpdate`, {
|
||||
...this.info,
|
||||
...this.basicInfo,
|
||||
tableInfos: this.tableInfos,
|
||||
...info.btns,
|
||||
id: this.params.id,
|
||||
applicationName: this.basicInfo.menuLevel3Name || this.basicInfo.menuLevel2Name,
|
||||
fuzzyQueryFields: info.fuzzyQueryFields,
|
||||
orderType: info.orderType,
|
||||
orderFields: info.orderFields,
|
||||
showListFields: info.showListFields
|
||||
}).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(this.params.id ? '编辑成功' : '添加成功')
|
||||
this.cancel(true)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
next () {
|
||||
if (this.currIndex === 0) {
|
||||
if (!this.$refs.basicInfo.validate()) return
|
||||
}
|
||||
|
||||
if (this.currIndex === 1) {
|
||||
this.$refs.form.onConfirm()
|
||||
}
|
||||
|
||||
if (this.currIndex === 2) {
|
||||
const info = this.$refs.config.validate()
|
||||
if (!info) return
|
||||
|
||||
this.submit(info)
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
this.currIndex = this.currIndex + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-add {
|
||||
&.form-add__active {
|
||||
::v-deep .ai-detail__content--wrapper {
|
||||
max-width: 100%!important;
|
||||
height: 100%!important;
|
||||
background: #F5F6F9;
|
||||
}
|
||||
|
||||
.form-config__wrapper {
|
||||
height: calc(100% - 52px);
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
::v-deep .ai-detail__content {
|
||||
height: calc(100% - 114px)!important;
|
||||
padding: 0!important;
|
||||
overflow: hidden!important;
|
||||
}
|
||||
}
|
||||
|
||||
.ai-step {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 24px;
|
||||
|
||||
.ai-step__item {
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
margin-right: 216px;
|
||||
|
||||
&.ai-step__item--active {
|
||||
span {
|
||||
color: #2266FF;
|
||||
}
|
||||
|
||||
.ai-step__item--icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-color: #2266FF;
|
||||
|
||||
i {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 50%;
|
||||
background: #2266FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:after {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: -208px;
|
||||
width: 200px;
|
||||
height: 2px;
|
||||
background: #D0D4DC;
|
||||
content: ' ';
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.ai-step__item--icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 8px;
|
||||
border-radius: 50%;
|
||||
background: #FFFFFF;
|
||||
border: 2px solid #D0D4DC;
|
||||
}
|
||||
|
||||
.el-icon-success {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
font-size: 24px;
|
||||
margin-right: 8px;
|
||||
color: #2266FF;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
span {
|
||||
color: #666666;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
151
project/oms/apps/develop/AppForm/components/BasicInfo.vue
Normal file
151
project/oms/apps/develop/AppForm/components/BasicInfo.vue
Normal file
@@ -0,0 +1,151 @@
|
||||
<template>
|
||||
<div class="basicInfo">
|
||||
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
||||
<ai-card title="基本信息">
|
||||
<template #content>
|
||||
<div class="ai-form">
|
||||
<el-form-item label="所属平台" prop="saasPlatformId" style="width: 100%;" :rules="[{ required: true, message: '请选择所属平台', trigger: 'change' }]">
|
||||
<el-select
|
||||
size="small"
|
||||
style="width: 100%;"
|
||||
placeholder="请选择所属平台"
|
||||
clearable
|
||||
@change="onChange"
|
||||
v-model="form.saasPlatformId">
|
||||
<el-option
|
||||
v-for="(item, index) in sassList"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.saasPlatformId" style="width: 100%;" label="所属企业" prop="corpId" :rules="[{ required: true, message: '请选择所属企业', trigger: 'change' }]">
|
||||
<ai-select
|
||||
v-model="form.corpId"
|
||||
placeholder="请选择所属企业"
|
||||
clearable
|
||||
@change="onCompanyChange"
|
||||
:selectList="companyList">
|
||||
</ai-select>
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 100%;" label="一级菜单名称" prop="menuLevel1Name" :rules="[{ required: true, message: '请输入一级菜单名称', trigger: 'change' }]">
|
||||
<el-input size="small" placeholder="请输入一级菜单名称" :maxlength="8" v-model="form.menuLevel1Name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 100%;" label="二级菜单名称" prop="menuLevel2Name" :rules="[{ required: true, message: '请输入二级菜单名称', trigger: 'change' }]">
|
||||
<el-input size="small" placeholder="请输入二级菜单名称" :maxlength="8" v-model="form.menuLevel2Name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 100%;" label="三级菜单名称" prop="menuLevel3Name">
|
||||
<el-input size="small" placeholder="请输入三级菜单名称" :maxlength="8" v-model="form.menuLevel3Name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 100%;" label="应用类型" prop="appType">
|
||||
<ai-select
|
||||
v-model="form.appType"
|
||||
placeholder="请选择应用类型"
|
||||
clearable
|
||||
:selectList="dict.getDict('diyAppType')">
|
||||
</ai-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</template>
|
||||
</ai-card>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'basicInfo',
|
||||
|
||||
model: {
|
||||
prop: 'value',
|
||||
event: 'change',
|
||||
},
|
||||
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
value: Object
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
form: {
|
||||
saasPlatformId: '',
|
||||
menuLeve1Style: '',
|
||||
saasPlatformName: '',
|
||||
menuLevel1Name: '',
|
||||
menuLevel2Name: '',
|
||||
menuLevel3Name: '',
|
||||
appType: '',
|
||||
corpId: '',
|
||||
corpName: ''
|
||||
},
|
||||
companyList: [],
|
||||
sassList: []
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
value (v) {
|
||||
this.form = JSON.parse(JSON.stringify(v))
|
||||
if (this.form.saasPlatformId) {
|
||||
this.getCompanyList()
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
created () {
|
||||
this.dict.load('diyAppType')
|
||||
},
|
||||
|
||||
mounted () {
|
||||
this.getSassList()
|
||||
this.form = JSON.parse(JSON.stringify(this.value))
|
||||
},
|
||||
|
||||
methods: {
|
||||
onChange (e) {
|
||||
this.form.saasPlatformName = this.sassList.filter(v => v.id === e)[0].name
|
||||
this.form.saasPlatformId && this.getCompanyList()
|
||||
},
|
||||
|
||||
validate () {
|
||||
let result = false
|
||||
this.$refs.form.validate(valid => {
|
||||
result = valid
|
||||
})
|
||||
this.$emit('change', this.form)
|
||||
return result
|
||||
},
|
||||
|
||||
onCompanyChange (e) {
|
||||
this.form.corpName = this.companyList.filter(v => v.dictValue === e)[0].dictName
|
||||
},
|
||||
|
||||
getCompanyList () {
|
||||
this.instance.post(`/app/appCorp/page?current=1&size=1000&saasId=${this.form.saasPlatformId}`).then(res => {
|
||||
if (res.data.records.length) {
|
||||
this.companyList = res.data.records.map(v => {
|
||||
return {
|
||||
dictValue: v.corpId,
|
||||
dictName: v.name
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
getSassList () {
|
||||
this.instance.post(`/app/appSaas/listAll`).then(res => {
|
||||
if (res.data) {
|
||||
this.sassList = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
</style>
|
||||
244
project/oms/apps/develop/AppForm/components/FormConfig.vue
Normal file
244
project/oms/apps/develop/AppForm/components/FormConfig.vue
Normal file
@@ -0,0 +1,244 @@
|
||||
<template>
|
||||
<div class="basicInfo">
|
||||
<ai-card title="搜索字段" class="search-wrapper">
|
||||
<template #content>
|
||||
<el-checkbox-group v-model="queryFields">
|
||||
<el-checkbox
|
||||
:label="`${item.fieldDbName}~${item.fieldName}`"
|
||||
v-for="(item, index) in tableInfos"
|
||||
:key="index">
|
||||
{{ item.fieldName }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</template>
|
||||
</ai-card>
|
||||
<ai-card title="表格字段">
|
||||
<template #content>
|
||||
<div class="ai-table">
|
||||
<div class="el-table el-table--border ai-header__border">
|
||||
<el-scrollbar>
|
||||
<table cellspacing="0" cellpadding="0" border="0" class="el-table__body">
|
||||
<draggable element="thead" animation="500" class="el-table__header is-leaf ai-table__header" :sort="true" v-model="showFields">
|
||||
<th v-for="(item, index) in showFields" style="background: #f3f4f5; text-align: center;" class="ai-table__header" :key="index">{{ item.fieldName }}</th>
|
||||
</draggable>
|
||||
<tbody element="tbody">
|
||||
<tr>
|
||||
<td @click="handleShow(index, item.isShow)" v-for="(item, index) in showFields" :key="index">{{ item.isShow ? '已显示' : '已隐藏' }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</ai-card>
|
||||
<ai-card title="排序和操作按钮">
|
||||
<template #content>
|
||||
<el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right">
|
||||
<el-form-item label="排序字段" prop="field">
|
||||
<el-select
|
||||
size="small"
|
||||
placeholder="默认按创建时间排序"
|
||||
clearable
|
||||
v-model="form.field">
|
||||
<el-option
|
||||
v-for="(filed, index) in tableInfos"
|
||||
:key="index"
|
||||
:label="filed.fieldName"
|
||||
:value="`${filed.fieldDbName}~${filed.fieldName}`">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序类型" prop="orderType" :rules="[{ required: true, message: '请输入排序类型', trigger: 'change' }]">
|
||||
<el-radio-group v-model="form.orderType">
|
||||
<el-radio label="asc">升序</el-radio>
|
||||
<el-radio label="desc">降序</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="按钮配置" prop="btns" style="width: 100%;" :rules="[{ required: true, message: '请输入按钮配置', trigger: 'change' }]">
|
||||
<el-checkbox-group v-model="form.btns">
|
||||
<el-checkbox label="insertEnable">添加</el-checkbox>
|
||||
<el-checkbox label="importEnable">导入</el-checkbox>
|
||||
<el-checkbox label="exportEnalbe">导出</el-checkbox>
|
||||
<el-checkbox label="editEnable">编辑</el-checkbox>
|
||||
<el-checkbox label="deleteEnable">删除</el-checkbox>
|
||||
<el-checkbox label="batchDelEnable">批量删除</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
</ai-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import draggable from 'vuedraggable'
|
||||
export default {
|
||||
name: 'configForm',
|
||||
|
||||
props: {
|
||||
tableInfos: Array,
|
||||
btns: Array,
|
||||
showListFields: Array,
|
||||
orderFields: Array,
|
||||
fuzzyQueryFields: Array
|
||||
},
|
||||
|
||||
components: {
|
||||
draggable
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
queryFields: [],
|
||||
tableData: [{}],
|
||||
btnKeys: ['insertEnable', 'importEnable', 'exportEnalbe', 'editEnable', 'deleteEnable', 'batchDelEnable'],
|
||||
form: {
|
||||
btns: [],
|
||||
orderType: 'asc',
|
||||
field: ''
|
||||
},
|
||||
showFields: []
|
||||
}
|
||||
},
|
||||
|
||||
mounted () {
|
||||
const showIds = this.showListFields.map(v => v.fieldDbName)
|
||||
this.showFields = JSON.parse(JSON.stringify(this.tableInfos)).map(item => {
|
||||
item.isShow = showIds.indexOf(item.fieldDbName) > -1 ? true : false
|
||||
|
||||
return item
|
||||
})
|
||||
|
||||
if (!this.showListFields.length) {
|
||||
this.showFields.map(v => {
|
||||
v.isShow = true
|
||||
return v
|
||||
})
|
||||
}
|
||||
|
||||
this.tableInfos.map(item => {
|
||||
this.tableData[0][item.fieldDbName] = '删除'
|
||||
})
|
||||
|
||||
if (this.btns.length) {
|
||||
this.form.btns = this.btns
|
||||
}
|
||||
|
||||
const tableInfosIds = this.tableInfos.map(v => v.fieldDbName)
|
||||
|
||||
if (this.orderFields.length) {
|
||||
let arr = this.orderFields.filter(v => {
|
||||
return tableInfosIds.indexOf(v.fieldDbName) > -1
|
||||
}).map(item => {
|
||||
return `${item.fieldDbName}~${item.fieldName}`
|
||||
})
|
||||
|
||||
if (arr.length) {
|
||||
this.form.field = arr[0]
|
||||
}
|
||||
}
|
||||
if (this.fuzzyQueryFields.length) {
|
||||
this.queryFields = this.fuzzyQueryFields.filter(v => {
|
||||
return tableInfosIds.indexOf(v.fieldDbName) > -1
|
||||
}).map(item => {
|
||||
return `${item.fieldDbName}~${item.fieldName}`
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
validate () {
|
||||
let result = false
|
||||
this.$refs.form.validate(valid => {
|
||||
result = valid
|
||||
})
|
||||
|
||||
if (!result) {
|
||||
return false
|
||||
}
|
||||
|
||||
const btns = {}
|
||||
this.btnKeys.forEach(item => {
|
||||
btns[item] = this.form.btns.indexOf(item) > -1 ? 1 : 0
|
||||
})
|
||||
|
||||
return {
|
||||
btns,
|
||||
orderFields: [{
|
||||
fieldName: this.form.field.split('~')[1],
|
||||
fieldDbName: this.form.field.split('~')[0],
|
||||
orderType: this.form.orderType
|
||||
}],
|
||||
showListFields: this.showFields.filter(v => v.isShow).map((v, index) => {
|
||||
return {
|
||||
fieldName: v.fieldName,
|
||||
fieldDbName: v.fieldDbName,
|
||||
showListIndex: index
|
||||
}
|
||||
}),
|
||||
fuzzyQueryFields: this.queryFields.map(v => {
|
||||
return {
|
||||
fieldName: v.split('~')[1],
|
||||
fieldDbName: v.split('~')[0]
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
handleShow (index, isShow) {
|
||||
const total = this.showFields.map(v => v.isShow).filter(v => !!v)
|
||||
if (total.length <= 1 && isShow) {
|
||||
return this.$message.error('表格列数不能小于1')
|
||||
}
|
||||
|
||||
this.$set(this.showFields[index], 'isShow', !isShow)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.basicInfo {
|
||||
.search-wrapper {
|
||||
::v-deep .el-checkbox-group {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.el-checkbox {
|
||||
width: 16.66%;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ai-table {
|
||||
.el-table--border {
|
||||
border: 1px solid #d0d4dc;
|
||||
border-bottom: none;
|
||||
border-right: none;
|
||||
}
|
||||
table {
|
||||
min-width: 100%;
|
||||
}
|
||||
|
||||
th, tr {
|
||||
min-width: 100px;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
tr {
|
||||
td {
|
||||
cursor: pointer;
|
||||
color: #26f;
|
||||
text-align: center;
|
||||
user-select: none;
|
||||
|
||||
&:hover {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
1198
project/oms/apps/develop/AppForm/components/FormLayout.vue
Normal file
1198
project/oms/apps/develop/AppForm/components/FormLayout.vue
Normal file
File diff suppressed because it is too large
Load Diff
182
project/oms/apps/develop/AppForm/components/List.vue
Normal file
182
project/oms/apps/develop/AppForm/components/List.vue
Normal file
@@ -0,0 +1,182 @@
|
||||
<template>
|
||||
<ai-list class="appform">
|
||||
<template slot="title">
|
||||
<ai-title title="表单配置" isShowBottomBorder></ai-title>
|
||||
</template>
|
||||
<template slot="content">
|
||||
<ai-search-bar class="search-bar">
|
||||
<template #left>
|
||||
<el-button size="small" type="primary" icon="iconfont iconAdd" @click="toAdd('')">添加</el-button>
|
||||
</template>
|
||||
<template slot="right">
|
||||
<el-input
|
||||
v-model="search.applicationName"
|
||||
size="small"
|
||||
v-throttle="() => {search.current = 1, getList()}"
|
||||
placeholder="请输入菜单名称"
|
||||
clearable
|
||||
@clear="search.current = 1, search.applicationName = '', getList()"
|
||||
suffix-icon="iconfont iconSearch">
|
||||
</el-input>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table
|
||||
:tableData="tableData"
|
||||
:col-configs="colConfigs"
|
||||
:total="total"
|
||||
v-loading="loading"
|
||||
style="margin-top: 6px;"
|
||||
:current.sync="search.current"
|
||||
:size.sync="search.size"
|
||||
@getList="getList">
|
||||
<el-table-column slot="options" width="180px" fixed="right" label="操作" align="center">
|
||||
<template slot-scope="{ row }">
|
||||
<div class="table-options">
|
||||
<el-button type="text" @click="push(row.id)" v-if="row.pushStatus === '0'">推送</el-button>
|
||||
<el-button type="text" @click="operate(row.id, row.status)">{{ row.status === '1' ? '停用' : '启用' }}</el-button>
|
||||
<el-button type="text" @click="toAdd(row.id)">编辑</el-button>
|
||||
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</ai-table>
|
||||
</template>
|
||||
</ai-list>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
name: 'List',
|
||||
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
search: {
|
||||
current: 1,
|
||||
size: 10,
|
||||
applicationName: ''
|
||||
},
|
||||
loading: false,
|
||||
total: 10,
|
||||
colConfigs: [
|
||||
{ prop: 'saasPlatformName', label: '所属平台' },
|
||||
{ prop: 'menuLevel1Name', label: '一级菜单名称'},
|
||||
{ prop: 'menuLevel2Name', label: '二级菜单名称'},
|
||||
{ prop: 'menuLevel3Name', label: '三级菜单名称'},
|
||||
{ prop: 'createUserName', label: '编辑人' },
|
||||
{ prop: 'createTime', label: '编辑时间' },
|
||||
{
|
||||
prop: 'status',
|
||||
label: '状态',
|
||||
align: 'center',
|
||||
render (h, {row}) {
|
||||
return h('span',{
|
||||
style: {
|
||||
color: row.status === '1' ? '#2EA222' : '#F46'
|
||||
}
|
||||
}, row.status === '1' ? '启用' : '停用')
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'pushStatus',
|
||||
label: '推送状态',
|
||||
align: 'center',
|
||||
render (h, {row}) {
|
||||
return h('span',{
|
||||
style: {
|
||||
color: row.pushStatus === '1' ? '#2EA222' : '#F46'
|
||||
}
|
||||
}, row.pushStatus === '1' ? '成功' : '失败')
|
||||
}
|
||||
}
|
||||
],
|
||||
tableData: [],
|
||||
ids: ''
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['user'])
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.getList()
|
||||
},
|
||||
|
||||
methods: {
|
||||
getList () {
|
||||
this.loading = true
|
||||
this.instance.post(`/app/appapplicationinfo/list`, null, {
|
||||
params: {
|
||||
...this.search
|
||||
}
|
||||
}).then(res => {
|
||||
if (res.code == 0) {
|
||||
this.tableData = res.data.records
|
||||
this.total = res.data.total
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.loading = false
|
||||
})
|
||||
} else {
|
||||
this.loading = false
|
||||
}
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
|
||||
removeAll () {
|
||||
if (!this.ids) return
|
||||
|
||||
this.remove(this.ids)
|
||||
},
|
||||
|
||||
push (id) {
|
||||
this.instance.post(`/app/appapplicationinfo/push?id=${id}`).then(res => {
|
||||
if (res.code == 0) {
|
||||
this.$message.success(`推送成功`)
|
||||
this.getList()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
operate (id, status) {
|
||||
this.instance.post(`/app/appapplicationinfo/enable?id=${id}`).then(res => {
|
||||
if (res.code == 0) {
|
||||
this.$message.success(`${status === '1' ? '停用成功' : '启用成功'}`)
|
||||
this.getList()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
remove (id) {
|
||||
this.$confirm('确定删除该数据?').then(() => {
|
||||
this.instance.post(`/app/appapplicationinfo/delete?ids=${id}`).then(res => {
|
||||
if (res.code == 0) {
|
||||
this.$message.success('删除成功!')
|
||||
this.getList()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
toAdd(id) {
|
||||
this.$emit('change', {
|
||||
type: 'Add',
|
||||
params: {
|
||||
id: id || ''
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
272
project/oms/apps/develop/AppForm/components/config.js
Normal file
272
project/oms/apps/develop/AppForm/components/config.js
Normal file
@@ -0,0 +1,272 @@
|
||||
export const components = [
|
||||
{
|
||||
type: 'info',
|
||||
tips: '(不能重复添加同一元素)',
|
||||
label: '信息',
|
||||
children: [
|
||||
{
|
||||
type: 'name',
|
||||
fieldName: '姓名',
|
||||
fieldTips: '请输入姓名',
|
||||
fixedLabel: '姓名',
|
||||
disable: '0',
|
||||
grid: 0.5,
|
||||
defaultValue: '',
|
||||
icon: 'icontext_box',
|
||||
mustFill: '1',
|
||||
maxLength: 20
|
||||
},
|
||||
{
|
||||
type: 'idNumber',
|
||||
fieldName: '身份证号',
|
||||
fixedLabel: '身份证号',
|
||||
fieldTips: '请输入身份证号',
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
maxLength: 20,
|
||||
disable: '0',
|
||||
grid: 0.5
|
||||
},
|
||||
{
|
||||
type: 'phone',
|
||||
fieldName: '联系方式',
|
||||
fixedLabel: '联系方式',
|
||||
fieldTips: '请输入联系方式',
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
maxLength: 20,
|
||||
disable: '0',
|
||||
grid: 0.5
|
||||
},
|
||||
{
|
||||
type: 'area',
|
||||
fieldName: '地区',
|
||||
fixedLabel: '地区',
|
||||
fieldTips: '请选择地区',
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
areaPattern: '',
|
||||
disable: '0',
|
||||
grid: 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'options',
|
||||
tips: '(可重复添加)',
|
||||
label: '选项',
|
||||
children: [
|
||||
{
|
||||
type: 'radio',
|
||||
fieldName: '单选',
|
||||
fixedLabel: '单选',
|
||||
fieldTips: '请选择',
|
||||
grid: 0.5,
|
||||
icon: 'iconradio',
|
||||
mustFill: '1',
|
||||
disable: '0',
|
||||
defaultValue: '',
|
||||
options: [
|
||||
{
|
||||
label: '选项1',
|
||||
value: ''
|
||||
},
|
||||
{
|
||||
label: '选项2',
|
||||
value: ''
|
||||
}
|
||||
],
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'checkbox',
|
||||
fieldName: '多选',
|
||||
fixedLabel: '多选',
|
||||
fieldTips: '请选择',
|
||||
icon: 'iconcheck_box',
|
||||
mustFill: '1',
|
||||
grid: 0.5,
|
||||
disable: '0',
|
||||
defaultValue: [],
|
||||
options: [
|
||||
{
|
||||
label: '选项1',
|
||||
value: ''
|
||||
},
|
||||
{
|
||||
label: '选项2',
|
||||
value: ''
|
||||
}
|
||||
],
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'select',
|
||||
fieldName: '单下拉框',
|
||||
fixedLabel: '单下拉框',
|
||||
grid: 0.5,
|
||||
fieldTips: '请选择',
|
||||
icon: 'iconSelect',
|
||||
mustFill: '1',
|
||||
defaultValue: '',
|
||||
disable: '0',
|
||||
options: [
|
||||
{
|
||||
label: '选项1',
|
||||
value: ''
|
||||
},
|
||||
{
|
||||
label: '选项2',
|
||||
value: ''
|
||||
}
|
||||
],
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'onOff',
|
||||
fieldName: '开关',
|
||||
fixedLabel: '开关',
|
||||
grid: 0.5,
|
||||
fieldTips: '请选择开关',
|
||||
icon: 'iconSelect',
|
||||
mustFill: '1',
|
||||
defaultValue: '0',
|
||||
disable: '0',
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'date',
|
||||
fieldName: '日期',
|
||||
fixedLabel: '日期',
|
||||
grid: 0.5,
|
||||
datetimePattern: 'yyyy-MM-dd',
|
||||
fieldTips: '请选择日期',
|
||||
icon: 'iconSelect',
|
||||
mustFill: '1',
|
||||
disable: '0',
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'time',
|
||||
fieldName: '时间',
|
||||
fixedLabel: '时间',
|
||||
grid: 0.5,
|
||||
datetimePattern: 'HH:mm:ss',
|
||||
fieldTips: '请选择时间',
|
||||
icon: 'iconSelect',
|
||||
mustFill: '1',
|
||||
disable: '0',
|
||||
title: ''
|
||||
},
|
||||
{
|
||||
type: 'datetime',
|
||||
fieldName: '日期时间',
|
||||
fixedLabel: '日期时间',
|
||||
grid: 0.5,
|
||||
datetimePattern: 'yyyy-MM-dd HH:mm:ss',
|
||||
fieldTips: '请选择日期时间',
|
||||
icon: 'iconSelect',
|
||||
mustFill: '1',
|
||||
disable: '0',
|
||||
title: ''
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
tips: '(可重复添加)',
|
||||
label: '填空',
|
||||
children: [
|
||||
{
|
||||
type: 'input',
|
||||
fieldName: '单行填空',
|
||||
fieldTips: '请输入',
|
||||
fixedLabel: '单行填空',
|
||||
disable: '0',
|
||||
grid: 0.5,
|
||||
defaultValue: '',
|
||||
icon: 'icontext_box',
|
||||
mustFill: '1',
|
||||
maxLength: 50
|
||||
},
|
||||
{
|
||||
type: 'textarea',
|
||||
fieldName: '多行填空',
|
||||
fixedLabel: '多行填空',
|
||||
fieldTips: '请输入',
|
||||
lineNumber: 4,
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
maxLength: 500,
|
||||
disable: '0',
|
||||
grid: 1
|
||||
},
|
||||
{
|
||||
type: 'number',
|
||||
fieldName: '数字输入',
|
||||
fixedLabel: '数字输入',
|
||||
fieldTips: '请输入数字',
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
maxValue: 10000,
|
||||
decimalPlaces: 0,
|
||||
minValue: 0,
|
||||
maxLength: 500,
|
||||
disable: '0',
|
||||
grid: 0.5
|
||||
},
|
||||
{
|
||||
type: 'rtf',
|
||||
fieldName: '富文本',
|
||||
fixedLabel: '富文本',
|
||||
fieldTips: '请输入',
|
||||
defaultValue: '',
|
||||
icon: 'icontext_area',
|
||||
mustFill: '1',
|
||||
maxLength: 5000,
|
||||
disable: '0',
|
||||
grid: 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'annex',
|
||||
tips: '(可重复添加)',
|
||||
label: '附件',
|
||||
children: [
|
||||
{
|
||||
type: 'upload',
|
||||
fieldTips: '请上传',
|
||||
fieldName: '上传附件',
|
||||
fixedLabel: '上传附件',
|
||||
disable: '0',
|
||||
fileChoseSize: 10,
|
||||
fileMaxCount: 9,
|
||||
defaultValue: '',
|
||||
icon: 'iconpic',
|
||||
mustFill: '1',
|
||||
grid: 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'layout',
|
||||
tips: '(可重复添加)',
|
||||
label: '分组',
|
||||
children: [
|
||||
{
|
||||
type: 'group',
|
||||
fieldName: '卡片',
|
||||
fixedLabel: '卡片',
|
||||
icon: 'iconpic',
|
||||
groupName: '分组标题',
|
||||
column: []
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
66
project/oms/apps/develop/AppWebApps/AppWebApps.vue
Normal file
66
project/oms/apps/develop/AppWebApps/AppWebApps.vue
Normal file
@@ -0,0 +1,66 @@
|
||||
<template>
|
||||
<section class="AppWebApps">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="web产品库" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索应用" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict"/>
|
||||
</template>
|
||||
</ai-list>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppWebApps",
|
||||
label: "web产品库",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user'])
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{label: "应用名称", prop: "label", width: 200},
|
||||
{label: "应用模块名", prop: "name", width: 200},
|
||||
{label: "产品库目录", prop: "libPath"},
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/wechatapps/list", null, {
|
||||
params: {...this.page, ...this.search,type:'web'}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data?.records.map(e => ({...e, count: 0}))
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppWebApps {
|
||||
}
|
||||
</style>
|
||||
67
project/oms/apps/develop/AppWechatApps/AppWechatApps.vue
Normal file
67
project/oms/apps/develop/AppWechatApps/AppWechatApps.vue
Normal file
@@ -0,0 +1,67 @@
|
||||
<template>
|
||||
<section class="AppWechatApps">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="小程序产品库" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索应用" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict"/>
|
||||
</template>
|
||||
</ai-list>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppWechatApps",
|
||||
label: "小程序产品库",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user'])
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{label: "应用名称", prop: "label", width: 200},
|
||||
{label: "应用模块名", prop: "name", width: 200},
|
||||
{label: "生产环境路径", prop: "path"},
|
||||
{label: "产品库目录", prop: "libPath"},
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/wechatapps/list", null, {
|
||||
params: {...this.page, ...this.search,type:'mp'}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data?.records.map(e => ({...e, count: 0}))
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppWechatApps {
|
||||
}
|
||||
</style>
|
||||
68
project/oms/apps/develop/AppWxworkApps/AppWxworkApps.vue
Normal file
68
project/oms/apps/develop/AppWxworkApps/AppWxworkApps.vue
Normal file
@@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<section class="AppWxworkApps">
|
||||
<ai-list>
|
||||
<ai-title slot="title" title="企微应用产品库" isShowBottomBorder/>
|
||||
<template #content>
|
||||
<ai-search-bar>
|
||||
<template #right>
|
||||
<el-input size="small" placeholder="搜索应用" v-model="search.name" clearable
|
||||
@change="page.current=1,getTableData()"/>
|
||||
</template>
|
||||
</ai-search-bar>
|
||||
<ai-table :tableData="tableData" :total="page.total" :current.sync="page.current" :size.sync="page.size"
|
||||
@getList="getTableData" :col-configs="colConfigs" :dict="dict"/>
|
||||
</template>
|
||||
</ai-list>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppWxworkApps",
|
||||
label: "企微应用产品库",
|
||||
props: {
|
||||
instance: Function,
|
||||
dict: Object,
|
||||
permissions: Function
|
||||
},
|
||||
computed: {
|
||||
...mapState(['user'])
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
search: {name: ""},
|
||||
page: {current: 1, size: 10, total: 0},
|
||||
tableData: [],
|
||||
colConfigs: [
|
||||
{label: "应用名称", prop: "label", width: 200},
|
||||
{label: "应用模块名", prop: "name", width: 200},
|
||||
{label: "生产环境路径", prop: "path"},
|
||||
{label: "产品库目录", prop: "libPath"},
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTableData() {
|
||||
this.instance.post("/node/wechatapps/list", null, {
|
||||
params: {...this.page, ...this.search, type: 'wxwork'}
|
||||
}).then(res => {
|
||||
if (res?.data) {
|
||||
this.tableData = res.data?.records.map(e => ({...e, count: 0}))
|
||||
this.page.total = res.data.total
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.AppWxworkApps {
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user