Commit d8499088 by wq

8.20

parent 7db8bd4e
...@@ -2,14 +2,16 @@ import axios from '../axios' ...@@ -2,14 +2,16 @@ import axios from '../axios'
export function updateSysmenu({ id, enable, type }) { export function updateSysmenu({ id, enable, type }) {
return axios.post('/sysMenu/update', null, { return axios.post('/sysMenu/update', null, {
params: { id, enable, type }, params: { id, enable, type }
}) })
} }
export function getAllMenusTree() { export function getAllMenusTree() {
return axios.get('sysSaasMenu/getAllMenusTree') return axios.get('sysSaasMenu/getAllMenusTree')
} }
export function getApplication() {
return axios.get('businessAppInfo/getAppInfo')
}
export function addMenu(data) { export function addMenu(data) {
return axios.post('sysSaasMenu/add', data) return axios.post('sysSaasMenu/add', data)
} }
...@@ -24,6 +26,6 @@ export function deleteMenu(id) { ...@@ -24,6 +26,6 @@ export function deleteMenu(id) {
export function getSimpleByPage() { export function getSimpleByPage() {
return axios.post('sys/domain/getSimpleByPage', { return axios.post('sys/domain/getSimpleByPage', {
currentPage: 1, currentPage: 1,
pageSize: 100, pageSize: 100
}) })
} }
<template> <template>
<div class='system-menu card'> <div class="system-menu card">
<div class='header'> <div class="header">
<el-form <el-form size="mini" :inline="true" label-width="80px">
size='mini'
:inline='true'
label-width='80px'
>
<el-form-item label> <el-form-item label>
<el-button <el-button type="primary" @click="showDialog({ id: 0 }, 2)">
type='primary'
@click='showDialog({ id: 0 }, 2)'
>
新增 新增
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class='table-wrap' v-loading='loading'> <div class="table-wrap" v-loading="loading">
<table-view <table-view
:tableColumns='tableColumns' :tableColumns="tableColumns"
rowKey='id' rowKey="id"
:serialNumber='false' :serialNumber="false"
:treeConfig="{ :treeConfig="{
children: 'children', children: 'children',
reserve: true, reserve: true
}" }"
:sourceData='sourceData' :sourceData="sourceData"></table-view>
></table-view>
</div> </div>
<el-dialog <el-dialog
:title="isEdit ? '修改' : '新增'" :title="isEdit ? '修改' : '新增'"
:visible.sync='dialogVisible' :visible.sync="dialogVisible"
:close-on-click-modal='false' :close-on-click-modal="false"
:before-close='beforeClose' :before-close="beforeClose"
width='820px' width="820px">
>
<el-form <el-form
size='mini' size="mini"
:inline='true' :inline="true"
label-width='120px' label-width="120px"
:rules='rules' :rules="rules"
ref='editForm' ref="editForm"
:model='editForm' :model="editForm">
> <el-form-item label="菜单名称" prop="name" required>
<el-form-item label='菜单名称' prop='name' required> <el-input style="width: 220px" v-model="editForm.name"></el-input>
<el-input
style='width: 220px'
v-model='editForm.name'
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='父级菜单'> <el-form-item label="父级菜单">
<el-cascader <el-cascader
:show-all-levels='false' :show-all-levels="false"
v-model='editForm.pid' v-model="editForm.pid"
:disabled='editForm.type === 1' :disabled="editForm.type === 1"
style='width: 220px' style="width: 220px"
:options='showMenu' :options="showMenu"
:props="{ :props="{
checkStrictly: true, checkStrictly: true,
label: 'name', label: 'name',
value: 'id', value: 'id',
emitPath: false, emitPath: false
}" }"
clearable clearable></el-cascader>
></el-cascader>
</el-form-item> </el-form-item>
<el-form-item label='类型' prop='type' required> <el-form-item label="类型" prop="type" required>
<div style='width: 220px; display: inline-block' class='radioGroup'> <div style="width: 220px; display: inline-block" class="radioGroup">
<el-radio <el-radio v-model="editForm.type" :label="0">菜单</el-radio>
v-model='editForm.type' <el-radio v-model="editForm.type" :label="1">按钮</el-radio>
:label='0' <el-radio v-model="editForm.type" :label="2">左边栏</el-radio>
>菜单
</el-radio
>
<el-radio
v-model='editForm.type'
:label='1'
>按钮
</el-radio
>
<el-radio
v-model='editForm.type'
:label='2'
>左边栏
</el-radio
>
</div> </div>
<!-- <el-select--> <!-- <el-select-->
<!-- style="width: 220px"--> <!-- style="width: 220px"-->
...@@ -102,118 +73,89 @@ ...@@ -102,118 +73,89 @@
<!-- </el-select>--> <!-- </el-select>-->
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label='路径名称' label="路径名称"
:required='editForm.pid !== 0' :required="editForm.pid !== 0"
prop='path' prop="path">
>
<el-input <el-input
style='width: 220px' style="width: 220px"
:disabled='isEdit' :disabled="isEdit"
v-model='editForm.path' v-model="editForm.path"></el-input>
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='路径地址'> <el-form-item label="路径地址">
<el-input <el-input style="width: 220px" v-model="editForm.route"></el-input>
style='width: 220px'
v-model='editForm.route'
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='接口路径'> <el-form-item label="接口路径">
<el-input <el-input style="width: 220px" v-model="editForm.url"></el-input>
style='width: 220px'
v-model='editForm.url'
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='等级' prop='level'> <el-form-item label="等级" prop="level">
<el-input <el-input style="width: 220px" v-model="editForm.level" />
style='width: 220px'
v-model='editForm.level'
/>
</el-form-item> </el-form-item>
<el-form-item label='启用状态'> <el-form-item label="启用状态">
<div style='width: 220px; display: inline-block'> <div style="width: 220px; display: inline-block">
<el-radio <el-radio v-model="editForm.enable" :label="true">启用</el-radio>
v-model='editForm.enable' <el-radio v-model="editForm.enable" :label="false">禁用</el-radio>
:label='true'
>启用
</el-radio
>
<el-radio
v-model='editForm.enable'
:label='false'
>禁用
</el-radio
>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label=' 排序'> <el-form-item label=" 排序">
<el-input <el-input
style='width: 220px' style="width: 220px"
v-model='editForm.sortNo' v-model="editForm.sortNo"
placeholder placeholder></el-input>
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='标题'> <el-form-item label="标题">
<el-input <el-input style="width: 220px" v-model="editForm.title"></el-input>
style='width: 220px'
v-model='editForm.title'
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='备注'> <el-form-item label="备注">
<el-input <el-input style="width: 220px" v-model="editForm.describe"></el-input>
style='width: 220px'
v-model='editForm.describe'
></el-input>
</el-form-item> </el-form-item>
<el-form-item label='包含的namespace'> <el-form-item label="应用名称">
<el-select <el-select
v-model='editForm.includeNamespace' v-model="editForm.appId"
style="width: 400px"
clearable
placeholder="请选择">
<el-option
v-for="(item, index) in applicationList"
:key="index"
filterable
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="包含的namespace">
<el-select
v-model="editForm.includeNamespace"
multiple multiple
style='width: 400px' style="width: 400px"
clearable clearable
placeholder='请选择' placeholder="请选择">
>
<el-option <el-option
v-for='(item, index) in simpleList' v-for="(item, index) in simpleList"
:key='index' :key="index"
filterable filterable
:label='item.companyName' :label="item.companyName"
:value='item.apiName' :value="item.apiName"></el-option>
>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label='排除的namespace'> <el-form-item label="排除的namespace">
<el-select <el-select
v-model='editForm.excludeNamespace' v-model="editForm.excludeNamespace"
multiple multiple
style='width: 400px' style="width: 400px"
clearable clearable
filterable filterable
placeholder='请选择' placeholder="请选择">
>
<el-option <el-option
v-for='(item, index) in simpleList' v-for="(item, index) in simpleList"
:key='index' :key="index"
:label='item.companyName' :label="item.companyName"
:value='item.apiName' :value="item.apiName"></el-option>
>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot='footer'> <div slot="footer">
<el-button size='small' @click='clone' <el-button size="small" @click="clone">取 消</el-button>
>取 消 <el-button size="small" type="primary" @click="submit">保 存</el-button>
</el-button
>
<el-button
size='small'
type='primary'
@click='submit'
>保 存
</el-button
>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
...@@ -228,16 +170,18 @@ import { ...@@ -228,16 +170,18 @@ import {
addMenu, addMenu,
deleteMenu, deleteMenu,
getSimpleByPage, getSimpleByPage,
getApplication
} from '../common/api/sys' } from '../common/api/sys'
export default { export default {
name: 'saasMenu', name: 'saasMenu',
components: { components: {
tableView, tableView
// myLayout, // myLayout,
}, },
data() { data() {
return { return {
applicationList: [],
loading: false, loading: false,
sourceData: [], sourceData: [],
dialogVisible: false, dialogVisible: false,
...@@ -252,18 +196,19 @@ export default { ...@@ -252,18 +196,19 @@ export default {
enable: true, enable: true,
includeNamespace: '', includeNamespace: '',
excludeNamespace: '', excludeNamespace: '',
appId: ''
}, },
rules: { rules: {
type: [ type: [
{ {
required: true, required: true,
message: ' ', message: ' ',
trigger: 'change', trigger: 'change'
}, }
], ]
}, },
isEdit: false, isEdit: false,
simpleList: [], simpleList: []
} }
}, },
computed: { computed: {
...@@ -274,101 +219,91 @@ export default { ...@@ -274,101 +219,91 @@ export default {
key: 'name', key: 'name',
width: '', width: '',
align: 'left', align: 'left',
treeNode: true, treeNode: true
}, },
{ {
label: '类型', label: '类型',
key: 'type', key: 'type',
width: '', width: '',
render: item => render: (item) =>
item.type === 0 item.type === 0 ? '菜单' : item.type === 1 ? '按钮' : '左边栏'
? '菜单'
: item.type === 1
? '按钮'
: '左边栏',
}, },
{ {
label: '路径名称', label: '路径名称',
key: 'path', key: 'path',
width: '', width: ''
}, },
{ {
label: '路径地址', label: '路径地址',
key: 'route', key: 'route',
width: '', width: ''
}, },
{ {
label: '接口路径', label: '接口路径',
key: 'url', key: 'url',
width: '', width: ''
}, },
{ {
label: '排序', label: '排序',
key: 'sortNo', key: 'sortNo',
width: '', width: ''
}, },
{ {
label: '启动状态', label: '启动状态',
key: 'url', key: 'url',
width: '', width: '',
render: item => ( render: (item) => (
<el-checkbox <el-checkbox
value={item.enable} value={item.enable}
onChange={v => this.enableChange(item, v)} onChange={(v) => this.enableChange(item, v)}
label='' label=""></el-checkbox>
></el-checkbox> )
),
}, },
{ {
label: '标题', label: '标题',
key: 'title', key: 'title',
width: '', width: ''
}, },
{ {
label: '备注', label: '备注',
key: 'describe', key: 'describe',
width: '', width: ''
}, },
{ {
label: '操作', label: '操作',
key: '', key: '',
width: '', width: '',
align: 'left', align: 'left',
render: item => ( render: (item) => (
<div> <div>
<el-button <el-button
size='mini' size="mini"
type='text' type="text"
onClick={() => this.showDialog(item, 1)} onClick={() => this.showDialog(item, 1)}>
>
修改 修改
</el-button> </el-button>
<el-button <el-button
size='mini' size="mini"
type='text' type="text"
onClick={() => this.remove(item)} onClick={() => this.remove(item)}>
>
删除 删除
</el-button> </el-button>
{item.type !== 1 && ( {item.type !== 1 && (
<el-button <el-button
size='mini' size="mini"
type='text' type="text"
onClick={() => this.showDialog(item, 2)} onClick={() => this.showDialog(item, 2)}>
>
新增下级 新增下级
</el-button> </el-button>
)} )}
</div> </div>
), )
}, }
] ]
}, },
showMenu() { showMenu() {
const data = JSON.parse( const data = JSON.parse(JSON.stringify(this.sourceData))
JSON.stringify(this.sourceData),
)
const arr = [] const arr = []
for (const iterator of data) { for (const iterator of data) {
const children = [] const children = []
...@@ -394,10 +329,10 @@ export default { ...@@ -394,10 +329,10 @@ export default {
sortNo: 0, sortNo: 0,
title: '', title: '',
type: 0, type: 0,
url: '', url: ''
}, }
] ]
}, }
}, },
mounted() { mounted() {
this.getlist() this.getlist()
...@@ -405,7 +340,7 @@ export default { ...@@ -405,7 +340,7 @@ export default {
}, },
methods: { methods: {
getSimpleByPage() { getSimpleByPage() {
getSimpleByPage().then(res => { getSimpleByPage().then((res) => {
if (res.code === 200) { if (res.code === 200) {
this.simpleList = res.data.records this.simpleList = res.data.records
} }
...@@ -416,7 +351,7 @@ export default { ...@@ -416,7 +351,7 @@ export default {
const res = await updateSysmenu({ const res = await updateSysmenu({
id: item.id, id: item.id,
enable: v, enable: v,
type: item.type, type: item.type
}) })
if (res.code === 200) { if (res.code === 200) {
this.$message.success(res.message) this.$message.success(res.message)
...@@ -449,38 +384,32 @@ export default { ...@@ -449,38 +384,32 @@ export default {
this.editForm[key] = '' this.editForm[key] = ''
} }
}, },
showDialog(item, t) { async showDialog(item, t) {
if (t === 2) { if (t === 2) {
this.editForm.pid = item.id this.editForm.pid = item.id
this.isEdit = false this.isEdit = false
} else { } else {
this.isEdit = true this.isEdit = true
if ( if (item.excludeNamespace && item.excludeNamespace.length > 0) {
item.excludeNamespace && item.excludeNamespace = item.excludeNamespace.split(',')
item.excludeNamespace.length > 0
) {
item.excludeNamespace = item.excludeNamespace.split(
',',
)
} }
if ( if (item.includeNamespace && item.includeNamespace.length > 0) {
item.includeNamespace && item.includeNamespace = item.includeNamespace.split(',')
item.includeNamespace.length > 0
) {
item.includeNamespace = item.includeNamespace.split(
',',
)
} }
this.editForm = { this.editForm = {
...item, ...item,
enable: true, enable: true
} }
} }
this.$nextTick(() => { getApplication().then((res) => {
this.$refs.editForm && if (res.code === 200) {
this.$refs.editForm.clearValidate() this.applicationList = res.data || []
this.$nextTick(() => {
this.$refs.editForm && this.$refs.editForm.clearValidate()
})
this.dialogVisible = true
}
}) })
this.dialogVisible = true
}, },
async submit() { async submit() {
try { try {
...@@ -495,9 +424,8 @@ export default { ...@@ -495,9 +424,8 @@ export default {
this.editForm.includeNamespace && this.editForm.includeNamespace &&
this.editForm.includeNamespace.length > 0 this.editForm.includeNamespace.length > 0
) { ) {
this.editForm.includeNamespace = this.editForm.includeNamespace.join( this.editForm.includeNamespace =
',', this.editForm.includeNamespace.join(',')
)
} else { } else {
this.editForm.includeNamespace = '' this.editForm.includeNamespace = ''
} }
...@@ -505,9 +433,8 @@ export default { ...@@ -505,9 +433,8 @@ export default {
this.editForm.excludeNamespace && this.editForm.excludeNamespace &&
this.editForm.excludeNamespace.length > 0 this.editForm.excludeNamespace.length > 0
) { ) {
this.editForm.excludeNamespace = this.editForm.excludeNamespace.join( this.editForm.excludeNamespace =
',', this.editForm.excludeNamespace.join(',')
)
} else { } else {
this.editForm.excludeNamespace = '' this.editForm.excludeNamespace = ''
} }
...@@ -528,7 +455,7 @@ export default { ...@@ -528,7 +455,7 @@ export default {
await this.$confirm('确认删除?', '提示', { await this.$confirm('确认删除?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning'
}) })
} catch { } catch {
return return
...@@ -550,11 +477,11 @@ export default { ...@@ -550,11 +477,11 @@ export default {
beforeClose(clone) { beforeClose(clone) {
this.resetForm() this.resetForm()
clone() clone()
}, }
}, }
} }
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.system-menu { .system-menu {
height: 100%; height: 100%;
display: flex; display: flex;
...@@ -572,5 +499,4 @@ export default { ...@@ -572,5 +499,4 @@ export default {
margin-right: 15px !important; margin-right: 15px !important;
} }
} }
</style> </style>
<template> <template>
<layout class="row" :leftStyle="{ width: '330px' }"> <layout class="row" :leftStyle="{ width: '330px' }">
<template #page_left> <template #page_left>
<el-tree :data="folders" ref="tree" :props="{ children: 'children', label: 'categoryName' }" highlight-current <el-tree
:node-key="'id'" default-expand-all :expand-on-click-node="false" @node-click="handleNodeClick"> :data="typeList"
ref="tree"
:props="{ children: 'children', label: 'categoryName' }"
highlight-current
:node-key="'id'"
default-expand-all
:expand-on-click-node="false"
@node-click="handleNodeClick">
<div class="customize-tree-node" slot-scope="{ node, data }"> <div class="customize-tree-node" slot-scope="{ node, data }">
<div @click.stop="toggleNodeExpanded(node)" class="custom-tree-node-arrow" <div
@click.stop="toggleNodeExpanded(node)"
class="custom-tree-node-arrow"
:style="{ transform: node.expanded ? 'rotate(90deg)' : '' }" :style="{ transform: node.expanded ? 'rotate(90deg)' : '' }"
v-if="data.children && data.children.length > 0"> v-if="data.children && data.children.length > 0">
<!-- <icon :name="node.expanded ? 'xe61e' : 'xe659'"></icon> --> <!-- <icon :name="node.expanded ? 'xe61e' : 'xe659'"></icon> -->
<i :class="node.expanded ? 'iconfont icon-shouqi' : 'iconfont icon-tongyong-biaogezhankaitubiao'"></i> <i
:class="
node.expanded
? 'iconfont icon-shouqi'
: 'iconfont icon-tongyong-biaogezhankaitubiao'
"></i>
</div> </div>
<div class="customize-tree-node__label"> <div class="customize-tree-node__label">
<span>{{ data.categoryName }}</span> <span>{{ data.categoryName }}</span>
</div> </div>
<div class="customize-tree-node__operate"> <div class="customize-tree-node__operate">
<i title="新增分类" class="el-icon-circle-plus" style="color: rgb(140 195 75); margin-right: 5px" <i
title="新增分类"
class="el-icon-circle-plus"
style="color: rgb(140 195 75); margin-right: 5px"
@click="addFolder(data)"></i> @click="addFolder(data)"></i>
<i title="修改分类" class="el-icon-edit-outline" style="color: #ff9800; margin-right: 5px" <i
title="修改分类"
class="el-icon-edit-outline"
style="color: #ff9800; margin-right: 5px"
@click="editFolder(data)"></i> @click="editFolder(data)"></i>
<i title="删除分类" class="el-icon-remove-outline" style="color: red" @click="removeFolder(data)"></i> <i
title="删除分类"
class="el-icon-remove-outline"
style="color: red"
@click="removeFolder(data)"></i>
</div> </div>
</div> </div>
</el-tree> </el-tree>
</template> </template>
<template #page_right> <template #page_right>
<el-form ref="form" :model="searchForm" size="mini" v-enter-submit="search" @submit.native.prevent :inline="true"> <el-form
ref="form"
:model="searchForm"
size="mini"
v-enter-submit="search"
@submit.native.prevent
:inline="true">
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<choose-time-period v-model="period"></choose-time-period> <choose-time-period v-model="period"></choose-time-period>
</el-form-item> </el-form-item>
<el-form-item label="应用名称"> <el-form-item label="应用名称">
<el-input style="width: 120px" clearable v-model="searchForm.name" placeholder="应用名称"></el-input> <el-input
style="width: 120px"
clearable
v-model="searchForm.name"
placeholder="应用名称"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="应用类型"> <el-form-item label="应用类型">
<el-select v-model="searchForm.type" placeholder="请选择" clearable filterable> <el-select
<el-option v-for="item in applicationTypeData" :key="item.id" :label="item.value" v-model="searchForm.type"
placeholder="请选择"
clearable
filterable>
<el-option
v-for="item in applicationTypeData"
:key="item.id"
:label="item.value"
:value="item.id"></el-option> :value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label> <el-form-item label>
<el-button type="primary" native-type="submit" @click="search()" icon="el-icon-search"> <el-button
type="primary"
native-type="submit"
@click="search()"
icon="el-icon-search">
查询 查询
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item label> <el-form-item label>
<el-button type="success" @click="addInfo()" icon="el-icon-plus">新增 <el-button type="success" @click="addInfo()" icon="el-icon-plus">
新增
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item label> <el-form-item label>
<el-button type="danger" @click="deleteSection()" icon="el-icon-delete">批量删除 <el-button
type="danger"
@click="deleteSection()"
icon="el-icon-delete">
批量删除
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="table_wrap" style="min-height: 50%; max-height: 80%; padding: 0"> <div
<table-view :sourceData="sourceData" :serialNumber="true" :tableColumns="tableColumns" ref='multipleTable' class="table_wrap"
@selectionChange='selectionChange' :selection='true'></table-view> style="min-height: 50%; max-height: 82%; padding: 0">
<table-view
:sourceData="sourceData"
:serialNumber="true"
:tableColumns="tableColumns"
ref="multipleTable"
@selectionChange="selectionChange"
:selection="true"></table-view>
</div> </div>
<div slot="footer" style="display:flex;justify-content: center;"> <div slot="footer" style="display: flex; justify-content: center">
<!-- <pagination :setValue="setpaginationOptions" :options="paginationOptions" /> --> <!-- <pagination :setValue="setpaginationOptions" :options="paginationOptions" /> -->
<el-pagination layout="sizes, total, prev, pager, next, jumper" background :total="paginationOptions.total" <el-pagination
:page-size="paginationOptions.pageSize" :current-page="paginationOptions.currentPage" layout="sizes, total, prev, pager, next, jumper"
@size-change="sizeChange" @current-change="onCurrentChange"> background
</el-pagination> :total="paginationOptions.total"
:page-size="paginationOptions.pageSize"
:current-page="paginationOptions.currentPage"
@size-change="sizeChange"
@current-change="onCurrentChange"></el-pagination>
</div> </div>
</template> </template>
<!-- 新增、修改应用 --> <!-- 新增、修改应用 -->
<el-dialog :title="isEdit ? '编辑' : '新增'" :visible.sync="editShowing" width="1000px" :close-on-click-modal="false"> <el-dialog
:title="isEdit ? '编辑' : '新增'"
:visible.sync="editShowing"
width="1000px"
:close-on-click-modal="false">
<div class="edit-form"> <div class="edit-form">
<el-form ref="editForm" :model="editForm" label-width="auto"> <el-form ref="editForm" :model="editForm" label-width="auto">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="应用图标"> <el-form-item label="应用图标">
<div class="my-flex-1"> <div class="my-flex-1">
<upload-images sortField="sort" businessType="other" uploadApiUrl="upload/oss" :type="limitFileType" <upload-images
:isFloat="false" :width="300" :hasWidth="true" :hasOss="true" :length="editFlag ? 1 : 50" sortField="sort"
v-model="editForm.icon" @selectImg="selectImg"> businessType="other"
uploadApiUrl="upload/oss"
:type="limitFileType"
:isFloat="false"
:width="300"
:hasWidth="true"
:hasOss="true"
:length="editFlag ? 1 : 50"
v-model="editForm.icon"
@selectImg="selectImg">
<!-- <template #other="{ index }"> <!-- <template #other="{ index }">
<div class="other-msg" style="display: flex"> <div class="other-msg" style="display: flex">
<span class="other-label" style="margin-right: 4px"> <span class="other-label" style="margin-right: 4px">
...@@ -90,21 +164,38 @@ ...@@ -90,21 +164,38 @@
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="应用分类" prop="categoryId" :rules="[{ message: '请选择应用分类', required: true }]"> <el-form-item
<el-cascader style="width: 100%" v-model="editForm.categoryId" size="mini" :options="folders" clearable label="应用分类"
prop="categoryId"
:rules="[{ message: '请选择应用分类', required: true }]">
<el-cascader
style="width: 100%"
v-model="editForm.categoryId"
size="mini"
:options="typeList"
clearable
:props="{ :props="{
label: 'categoryName', label: 'categoryName',
value: 'id', value: 'id',
emitPath: false, emitPath: false,
checkStrictly: true checkStrictly: true
}" :show-all-levels="false"></el-cascader> }"
:show-all-levels="false"></el-cascader>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="11"> <el-col :span="11">
<el-form-item label="应用名称" prop="name" :rules="[{ message: '请输入应用名称', required: true }]"> <el-form-item
<el-input v-model="editForm.name" placeholder="请输入应用名称" maxlength="120" size="mini" clearable label="应用名称"
prop="name"
:rules="[{ message: '请输入应用名称', required: true }]">
<el-input
v-model="editForm.name"
placeholder="请输入应用名称"
maxlength="120"
size="mini"
clearable
show-word-limit /> show-word-limit />
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -118,39 +209,74 @@ ...@@ -118,39 +209,74 @@
</el-col> </el-col>
</el-row> </el-row>
<div v-if="editForm.isCollectFee"> <div v-if="editForm.isCollectFee">
<el-row :gutter="20" v-for="(item, index) in editForm.salePriceList" :key="index"> <el-row
:gutter="20"
v-for="(item, index) in editForm.salePriceList"
:key="index">
<el-col :span="11"> <el-col :span="11">
<el-form-item label="应用价格"> <el-form-item label="应用价格">
<el-input v-model="item.price" placeholder="请输入应用价格" maxlength="120" size="mini" clearable <el-input
v-model="item.price"
placeholder="请输入应用价格"
maxlength="120"
size="mini"
clearable
show-word-limit /> show-word-limit />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item label="应用周期"> <el-form-item label="应用周期">
<el-select v-model="item.validDays" size="mini" filterable clearable style="width: 100%"> <el-select
<el-option v-for="item in applyCycleList" :key="item.value" :label="item.name" v-model="item.validDays"
size="mini"
filterable
clearable
style="width: 100%">
<el-option
v-for="item in applyCycleList"
:key="item.value"
:label="item.name"
:value="item.value"></el-option> :value="item.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col style="display: flex;margin-top: 8px;" :span="3"> <el-col style="display: flex; margin-top: 8px" :span="3">
<el-button size="mini" type="success" icon="el-icon-plus" @click="addDomain"></el-button> <el-button
<el-button style="margin-left: 15px" size="mini" type="danger" icon="el-icon-minus" size="mini"
type="success"
icon="el-icon-plus"
@click="addDomain"></el-button>
<el-button
style="margin-left: 15px"
size="mini"
type="danger"
icon="el-icon-minus"
@click.prevent="removeDomain(index)"></el-button> @click.prevent="removeDomain(index)"></el-button>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="应用简述" size="small" prop="description" <el-form-item
label="应用简述"
size="small"
prop="description"
:rules="[{ message: '请输入应用简述', required: true }]"> :rules="[{ message: '请输入应用简述', required: true }]">
<el-input style="width: 100%" type="textarea" :rows="4" v-model="editForm.description" <el-input
style="width: 100%"
type="textarea"
:rows="4"
v-model="editForm.description"
placeholder="请输入应用简述"></el-input> placeholder="请输入应用简述"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="应用详情" size="small"> <el-form-item label="应用详情" size="small">
<v-editor filename="files" style="width: 100%" v-model="editForm.details" ref="wangeditor" <v-editor
filename="files"
style="width: 100%"
v-model="editForm.details"
ref="wangeditor"
height="300px" /> height="300px" />
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -159,29 +285,61 @@ ...@@ -159,29 +285,61 @@
</div> </div>
<span slot="footer"> <span slot="footer">
<el-button @click="editShowing = false" size="medium">取消</el-button> <el-button @click="editShowing = false" size="medium">取消</el-button>
<el-button @click="saveApplication" type="primary" size="medium">确认</el-button> <el-button @click="saveApplication" type="primary" size="medium">
确认
</el-button>
</span> </span>
</el-dialog> </el-dialog>
<!-- 暂定 --> <!-- 暂定 -->
<el-dialog :visible.sync="releaseVisible" :close-on-click-modal="false" title="发布" width="600px"> <el-dialog
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全选 :visible.sync="releaseVisible"
:close-on-click-modal="false"
title="发布"
width="600px">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange">
全选
</el-checkbox> </el-checkbox>
<div style="margin: 15px 0"></div> <div style="margin: 15px 0"></div>
<el-checkbox-group v-model="checkedCompany" @change="handleCheckedCompanyChange"> <el-checkbox-group
<el-checkbox style="width: 100px" v-for="c in releaseList" :label="c.id" :key="c.id">{{ c.apiName }} v-model="checkedCompany"
@change="handleCheckedCompanyChange">
<el-checkbox
style="width: 100px"
v-for="c in releaseList"
:label="c.id"
:key="c.id">
{{ c.apiName }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<span slot="footer"> <span slot="footer">
<el-button size="mini" @click="releaseVisible = false">取消</el-button> <el-button size="mini" @click="releaseVisible = false">取消</el-button>
<el-button size="mini" @click="confirmRelease" type="primary">确认</el-button> <el-button size="mini" @click="confirmRelease" type="primary">
确认
</el-button>
</span> </span>
</el-dialog> </el-dialog>
<!-- 新增、修改分类 --> <!-- 新增、修改分类 -->
<el-dialog :title="editFolderId ? '编辑分类' : '新增分类'" :visible.sync="folderVisible" :close-on-click-modal="false" <el-dialog
:title="editFolderId ? '编辑分类' : '新增分类'"
:visible.sync="folderVisible"
:close-on-click-modal="false"
width="600px"> width="600px">
<el-form ref="folderForm" :model="folderForm" label-position="top" label-width="80px"> <el-form
<el-form-item label="名称" prop="folderName" :rules="[{ required: true, message: '请输入分类名称' }]"> ref="folderForm"
<el-input v-model="folderForm.folderName" clearable placeholder="分类名称"></el-input> :model="folderForm"
label-position="top"
label-width="80px">
<el-form-item
label="名称"
prop="folderName"
:rules="[{ required: true, message: '请输入分类名称' }]">
<el-input
v-model="folderForm.folderName"
clearable
placeholder="分类名称"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer"> <span slot="footer">
...@@ -207,7 +365,7 @@ export default { ...@@ -207,7 +365,7 @@ export default {
'v-editor': Editor, 'v-editor': Editor,
tableView, tableView,
layout, layout,
ChooseTimePeriod, ChooseTimePeriod
// ImageView // ImageView
}, },
mixins: [pagination], mixins: [pagination],
...@@ -226,10 +384,10 @@ export default { ...@@ -226,10 +384,10 @@ export default {
salePriceList: [ salePriceList: [
{ {
price: '', price: '',
validDays: '', validDays: ''
}, }
], ],
isCollectFee: true, // 是否收费 isCollectFee: true // 是否收费
}, },
deepCloneForm: {}, deepCloneForm: {},
limitFileType: ['jpg', 'png'], limitFileType: ['jpg', 'png'],
...@@ -239,7 +397,7 @@ export default { ...@@ -239,7 +397,7 @@ export default {
children: 'children', children: 'children',
label: 'name' label: 'name'
}, },
folders: [], typeList: [],
folderIds: '', folderIds: '',
parentFolderId: '', parentFolderId: '',
folderVisible: false, folderVisible: false,
...@@ -248,13 +406,16 @@ export default { ...@@ -248,13 +406,16 @@ export default {
folderForm: { folderForm: {
folderName: '' folderName: ''
}, },
applicationTypeData: [{ applicationTypeData: [
id: 1, {
value: '免费' id: 1,
}, { value: '免费'
id: 2, },
value: '收费' {
}], id: 2,
value: '收费'
}
],
categoryId: '', categoryId: '',
applyCycleList: [], applyCycleList: [],
checkAll: false, checkAll: false,
...@@ -268,7 +429,8 @@ export default { ...@@ -268,7 +429,8 @@ export default {
}, },
sourceData: [], sourceData: [],
searchForm: { searchForm: {
type: '' type: '',
name: ''
}, },
isEdit: false, isEdit: false,
editShowing: false, editShowing: false,
...@@ -278,7 +440,7 @@ export default { ...@@ -278,7 +440,7 @@ export default {
}, },
mounted() { mounted() {
this.deepCloneForm = JSON.parse(JSON.stringify(this.editForm)) this.deepCloneForm = JSON.parse(JSON.stringify(this.editForm))
this.loadFoldersData() this.loadTypesData()
}, },
computed: { computed: {
tableColumns() { tableColumns() {
...@@ -288,18 +450,21 @@ export default { ...@@ -288,18 +450,21 @@ export default {
type: '', type: '',
key: 'icon', key: 'icon',
// render: (item) => <image-view imgUrl={item.icon}></image-view>, // render: (item) => <image-view imgUrl={item.icon}></image-view>,
render: (item) => ( render: (item) =>
item.icon ? ( item.icon ? (
<img src={item.icon} alt="应用图标" style={{ width: '40px', height: 'auto' }} /> <img
src={item.icon}
alt="应用图标"
style={{ width: '40px', height: 'auto' }}
/>
) : ( ) : (
<span>无图标</span> <span>无图标</span>
) ),
),
width: 80 width: 80
}, },
{ {
label: '应用名称', label: '应用名称',
key: 'name', key: 'name'
}, },
{ {
label: '应用分类', label: '应用分类',
...@@ -308,9 +473,7 @@ export default { ...@@ -308,9 +473,7 @@ export default {
{ {
label: '应用类型', label: '应用类型',
key: 'isCollectFee', key: 'isCollectFee',
render: (item) => ( render: (item) => <span>{item.isCollectFee ? '收费' : '免费'}</span>
<span>{item.isCollectFee ? '收费' : '免费'}</span>
),
}, },
{ {
label: '应用简述', label: '应用简述',
...@@ -332,15 +495,13 @@ export default { ...@@ -332,15 +495,13 @@ export default {
<span <span
class="icon-view icon-edit-view" class="icon-view icon-edit-view"
title="编辑" title="编辑"
onClick={() => this.editInfo(item)} onClick={() => this.editInfo(item)}>
>
<i class="el-icon-edit"></i> <i class="el-icon-edit"></i>
</span> </span>
<span <span
class="icon-view icon-del-view" class="icon-view icon-del-view"
title="删除" title="删除"
onClick={() => this.deleteSection(item)} onClick={() => this.deleteSection(item)}>
>
<i class="el-icon-delete"></i> <i class="el-icon-delete"></i>
</span> </span>
</div> </div>
...@@ -366,7 +527,7 @@ export default { ...@@ -366,7 +527,7 @@ export default {
addDomain() { addDomain() {
this.editForm.salePriceList.push({ this.editForm.salePriceList.push({
price: '', price: '',
validDays: '', validDays: ''
}) })
}, },
selectionChange(selection) { selectionChange(selection) {
...@@ -375,11 +536,11 @@ export default { ...@@ -375,11 +536,11 @@ export default {
deleteSection(v) { deleteSection(v) {
const arr = v ? [v] : this.selection const arr = v ? [v] : this.selection
if (arr.length === 0) return this.$message('请勾选至少一条记录') if (arr.length === 0) return this.$message('请勾选至少一条记录')
const ids = arr.map(item => item.id).join() const ids = arr.map((item) => item.id).join()
this.$confirm('确定删除选中的信息?', '提示', { this.$confirm('确定删除选中的信息?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning'
}) })
.then(() => { .then(() => {
const url = `businessAppInfo/deleteAppInfoByIds?ids=${ids}` const url = `businessAppInfo/deleteAppInfoByIds?ids=${ids}`
...@@ -387,14 +548,14 @@ export default { ...@@ -387,14 +548,14 @@ export default {
if (res.code === 200) { if (res.code === 200) {
this.$message({ this.$message({
type: 'success', type: 'success',
message: '删除成功!', message: '删除成功!'
}) })
this.getList() this.getList()
this.selection = [] this.selection = []
this.$refs.multipleTable.clearSelectionBox() this.$refs.multipleTable.clearSelectionBox()
} else { } else {
this.$alert(res.message, '错误提示', { this.$alert(res.message, '错误提示', {
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true
}) })
} }
}) })
...@@ -433,22 +594,18 @@ export default { ...@@ -433,22 +594,18 @@ export default {
try { try {
const data = JSON.parse(JSON.stringify(this.editForm)) const data = JSON.parse(JSON.stringify(this.editForm))
data.icon = this.handleImage(data.icon) data.icon = this.handleImage(data.icon)
// if (!this.editId) { const res = await post('businessAppInfo/addOrUpdateAppInfo', data)
// data.categoryId = this.categoryId if (res.code !== 200) return
// } else { this.$message.success(res.message)
// data.categoryId = this.editForm.categoryId
// }
await post('businessAppInfo/addOrUpdateAppInfo', data)
this.getList() this.getList()
} catch (e) {
throw new Error(e)
} finally {
this.editShowing = false this.editShowing = false
} catch (e) {
this.editShowing = true
} }
}, },
handleImage(data) { handleImage(data) {
if (Array.isArray(data) && data.length > 0) { if (Array.isArray(data) && data.length > 0) {
return data.map(item => item.imagePath).join(',') return data.map((item) => item.imagePath).join(',')
} }
return null return null
}, },
...@@ -461,7 +618,10 @@ export default { ...@@ -461,7 +618,10 @@ export default {
try { try {
const res = await get('businessAppSalePrice/getSalePriceValidDays') const res = await get('businessAppSalePrice/getSalePriceValidDays')
if (res.code !== 200) return if (res.code !== 200) return
this.applyCycleList = Object.entries(res.data).map(([name, value]) => ({ name, value })) this.applyCycleList = Object.entries(res.data).map(([name, value]) => ({
name,
value
}))
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
...@@ -485,7 +645,9 @@ export default { ...@@ -485,7 +645,9 @@ export default {
this.editId = item.id this.editId = item.id
this.getapplyCycle() this.getapplyCycle()
try { try {
const res = await get('businessAppInfo/getAppInfoById', { id: item.id }) const res = await get('businessAppInfo/getAppInfoById', {
id: item.id
})
if (res.code !== 200) return if (res.code !== 200) return
// this.productionFile = [res.data.productionFile] // this.productionFile = [res.data.productionFile]
// res.data.labelNames = res.data.labelNames?.split(',') // res.data.labelNames = res.data.labelNames?.split(',')
...@@ -501,17 +663,16 @@ export default { ...@@ -501,17 +663,16 @@ export default {
}) })
this.editShowing = true this.editShowing = true
} catch (e) { } catch (e) {
console.error(e)
this.$message.error(e) this.$message.error(e)
} }
} }
}, },
// 获取左侧树数据 // 获取左侧树数据
async loadFoldersData() { async loadTypesData() {
try { try {
const res = await get('businessAppCategory/getCategoryList') const res = await get('businessAppCategory/getCategoryList')
if (res.code !== 200) return if (res.code !== 200) return
this.folders = this.recursiveFolder(res.data) this.typeList = this.recursiveFolder(res.data)
this.categoryId = res.data[0].id this.categoryId = res.data[0].id
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.categoryId || res.data[0].id) this.$refs.tree.setCurrentKey(this.categoryId || res.data[0].id)
...@@ -563,15 +724,12 @@ export default { ...@@ -563,15 +724,12 @@ export default {
return return
} }
try { try {
const res = await get( const res = await get('businessAppCategory/deleteCategoryById', {
'businessAppCategory/deleteCategoryById', id: data.id
{ })
id: data.id
}
)
if (res.code !== 200) return if (res.code !== 200) return
this.$message.success(res.message) this.$message.success(res.message)
this.loadFoldersData() this.loadTypesData()
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
...@@ -591,14 +749,17 @@ export default { ...@@ -591,14 +749,17 @@ export default {
categoryName: this.folderForm.folderName, // 分类名称 categoryName: this.folderForm.folderName, // 分类名称
id: this.editFolderId id: this.editFolderId
} }
console.log('111', params)
try { try {
const res = await post('businessAppCategory/addOrUpdateCategory', params) const res = await post(
'businessAppCategory/addOrUpdateCategory',
params
)
if (res.code !== 200) return if (res.code !== 200) return
this.loadFoldersData() this.$message.success(res.message)
this.loadTypesData()
this.folderVisible = false this.folderVisible = false
} catch (e) { } catch (e) {
console.error(e) this.folderVisible = true
} }
}, },
// 左侧树每个节点点击 // 左侧树每个节点点击
...@@ -610,18 +771,14 @@ export default { ...@@ -610,18 +771,14 @@ export default {
this.getList() this.getList()
}, },
handleCheckAllChange(val) { handleCheckAllChange(val) {
this.checkedCompany = val this.checkedCompany = val ? this.releaseList.map((e) => e.id) : []
? this.releaseList.map((e) => e.id)
: []
this.isIndeterminate = false this.isIndeterminate = false
}, },
handleCheckedCompanyChange(value) { handleCheckedCompanyChange(value) {
const checkedCount = value.length const checkedCount = value.length
this.checkAll = this.checkAll = checkedCount === this.releaseList.length
checkedCount === this.releaseList.length
this.isIndeterminate = this.isIndeterminate =
checkedCount > 0 && checkedCount > 0 && checkedCount < this.releaseList.length
checkedCount < this.releaseList.length
}, },
search() { search() {
this.getList() this.getList()
...@@ -634,23 +791,20 @@ export default { ...@@ -634,23 +791,20 @@ export default {
}, },
async getList() { async getList() {
try { try {
const { const { pageSize, currentPage } = this.paginationOptions
pageSize,
currentPage
} =
this.paginationOptions
const res = await post('businessAppInfo/getAppInfoList', { const res = await post('businessAppInfo/getAppInfoList', {
categoryId: this.categoryId === 1 ? undefined : this.categoryId, categoryId: this.categoryId === 1 ? undefined : this.categoryId,
pageSize, pageSize,
currentPage, currentPage,
isCollectFee: this.searchForm.type === '' ? '' : this.searchForm.type === 2, isCollectFee:
this.searchForm.type === '' ? '' : this.searchForm.type === 2,
name: this.searchForm.name, name: this.searchForm.name,
startTime: this.period && this.period[0], startTime: this.period && this.period[0],
endTime: this.period && this.period[1], endTime: this.period && this.period[1]
}) })
if (res.code !== 200) return if (res.code !== 200) return
this.sourceData = res.data.records || [] this.sourceData = res?.data?.records ?? []
this.paginationOptions.total = res.data.total || 0 this.paginationOptions.total = res?.data?.total || 0
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
...@@ -745,7 +899,10 @@ export default { ...@@ -745,7 +899,10 @@ export default {
transform: unset !important; transform: unset !important;
} }
.row::v-deep .el-tree-node.is-current>.el-tree-node__content .customize-tree-node__operate { .row::v-deep
.el-tree-node.is-current
> .el-tree-node__content
.customize-tree-node__operate {
display: block; display: block;
} }
...@@ -774,7 +931,8 @@ export default { ...@@ -774,7 +931,8 @@ export default {
flex-wrap: wrap; flex-wrap: wrap;
} }
.customsize-label.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after { .customsize-label.el-select-dropdown.is-multiple
.el-select-dropdown__item.selected::after {
content: ''; content: '';
display: none; display: none;
} }
...@@ -795,11 +953,11 @@ export default { ...@@ -795,11 +953,11 @@ export default {
flex-shrink: 0; flex-shrink: 0;
} }
.variant_list>>>.el-dialog__body { .variant_list >>> .el-dialog__body {
border-top: 1px solid #ebeef5; border-top: 1px solid #ebeef5;
} }
.variant_list>>>.el-dialog__headerbtn { .variant_list >>> .el-dialog__headerbtn {
top: 11px; top: 11px;
} }
...@@ -849,9 +1007,7 @@ export default { ...@@ -849,9 +1007,7 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
} }
} }
.el-row { .el-row {
...@@ -861,4 +1017,4 @@ export default { ...@@ -861,4 +1017,4 @@ export default {
.customize-tree-node__operate { .customize-tree-node__operate {
display: none; display: none;
} }
</style> </style>
\ No newline at end of file
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